?? 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 + -