📄 24c01-16.c
字号:
//24c01-24c16读写驱动程序,
#include <intrins.h>
#include <REG764.H>
#define i2c_addr 0xa0 //器件地址 如有须要可作为外变量
sbit SDA=P1^3;
sbit SCL=P1^2;
sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
void I2C_s(void) {_nop_();SCL=0;SDA=1;SCL=1;_nop_();SDA=0;_nop_();SCL=0;}
void I2C_p(void) {SDA=0;SCL=1;_nop_();SDA=1;}
/*
unsigned char I2C_r(bit i)
{
unsigned char s,dat=0;
SDA=1;
for(s=0;s<8;s++)
{
SCL=1;
if(SDA) dat++;
dat<<=1;
SCL=0;
}
if(i) SDA=0;
else SDA=1;
SCL=1;SCL=0;
return(dat);
}
*/
unsigned char I2C_r(bit i)
{
SDA=1;
SCL=1;a7=SDA;SCL=0;
SCL=1;a6=SDA;SCL=0;
SCL=1;a5=SDA;SCL=0;
SCL=1;a4=SDA;SCL=0;
SCL=1;a3=SDA;SCL=0;
SCL=1;a2=SDA;SCL=0;
SCL=1;a1=SDA;SCL=0;
SCL=1;a0=SDA;SCL=0;
if(i) SDA=0;
else SDA=1;
SCL=1;SCL=0;
return(ACC);
}
/*
void I2C_w(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(dat&0x80) SDA=1;
else SDA=0;
SCL=1; SCL=0;
dat<<=1;
}
SDA=1;SCL=1;
}
*/
void I2C_w(unsigned char dat)
{
ACC=dat;
SDA=a7;SCL=1;SCL=0;
SDA=a6;SCL=1;SCL=0;
SDA=a5;SCL=1;SCL=0;
SDA=a4;SCL=1;SCL=0;
SDA=a3;SCL=1;SCL=0;
SDA=a2;SCL=1;SCL=0;
SDA=a1;SCL=1;SCL=0;
SDA=a0;SCL=1;SCL=0;
SDA=1;SCL=1;
}
void I2C_delay(unsigned char addr)
{
unsigned char i,s=0;
while(1)
{
I2C_s(); //启动总线
I2C_w(i2c_addr|addr);
if(SDA==0) break; //有应答返回
if(s>50) break; //EEPROM器件损坏返回
for(i=100;i;i--); //延时200us
s++; SCL=0;
}
SCL=0; I2C_s(); //结束总线
}
unsigned char I2C_qut(unsigned int address)
{
unsigned char dat;
dat=((address&0x77f)/128);
I2C_s();
I2C_w(i2c_addr|dat); SCL=0;
I2C_w(address); SCL=0;
return dat;
}
unsigned char I2C_read(unsigned int address) //读取字节
{
unsigned char dat;
dat=I2C_qut(address);
I2C_s();
I2C_w((i2c_addr+1)|dat); SCL=0;
dat=I2C_r(0);
I2C_p();
return dat;
}
void I2C_write(unsigned int address,unsigned char da) //写入字节
{
unsigned char dat;
dat=I2C_qut(address);
I2C_w(da); SCL=0;
I2C_p();
I2C_delay(dat);
}
void I2C_write_much(unsigned int address,unsigned char *da,unsigned char s) //写入多字节
{
unsigned char dat;
dat=I2C_qut(address);
while(s--) { I2C_w(*da); SCL=0; da++; }
I2C_p();
I2C_delay(dat);
}
void I2C_read_much(unsigned int address,unsigned char *da,unsigned char s) //读取多字节
{
unsigned char dat;
dat=I2C_qut(address);
I2C_s();
I2C_w((i2c_addr+1)|dat); SCL=0;
while(s--) { *da=I2C_r(s==0?0:1); da++; }
I2C_p();
I2C_delay(dat);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -