[cpp]view plaincopy
print?
- #include
- #defineucharunsignedchar
- sbitsda=P2^0;
- sbitscl=P2^1;//用单片机的两个I/O口模仿I2C接口
- uchara;
- ***************************************************************************
- voiddelay()//简略延时函数
- {;;}
- ***************************************************************************
- voidstart()//开端信号SCL在高电平期间,SDA一个下降沿则表明发动信号
- {
- sda=1;//开释SDA总线
- delay();
- scl=1;
- delay();
- sda=0;
- delay();
- }
- ***************************************************************************
- voidstop()//中止SCL在高电平期间,SDA一个上升沿则表明中止信号
- {
- sda=0;
- delay();
- scl=1;
- delay();
- sda=1;
- delay();
- }***************************************************************************
- voidrespons()//应对SCL在高电平期间,SDA被从设备拉为低电平表明应对
- {
- uchari;
- scl=1;
- delay();
- while((sda==1)&&(i<250))i++;
- scl=0;
- delay();
- }
- ***************************************************************************
- voidinit()//总线初始化将总线都拉高一开释总线发送发动信号前,要先初始化总线。即总有检测到总线闲暇才开端发送发动信号
- {
- sda=1;
- delay();
- scl=1;
- delay();
- }
- ***************************************************************************
- voidwrite_byte(uchardate)//写一个字节
- {
- uchari,temp;
- temp=date;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- scl=0;//拉低SCL,由于只要在时钟信号为低电平期间按数据线上的凹凸电平状况才答应改变;并在此刻和上一个循环的scl=1一同构成一个上升沿
- delay();
- sda=CY;
- delay();
- scl=1;//拉高SCL,此刻SDA上的数据安稳
- delay();
- }
- scl=0;//拉低SCL,为下次数据传输做好预备
- delay();
- sda=1;//开释SDA总线,接下因由从设备操控,比如从设备接纳完数据后,在SCL为高时,拉低SDA作为应对信号
- delay();
- }
- ***************************************************************************
- ucharread_byte()//读一个字节
- {
- uchari,k;
- scl=0;
- delay();
- sda=1;
- delay();
- for(i=0;i<8;i++)
- {
- scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据现已安稳,能够接纳啦
- delay();
- k=(k<<1)|sda;
- scl=0;//拉低SCL,使发送端能够把数据放在SDA上
- delay();
- }
- returnk;
- }
- ***************************************************************************
- voidwrite_add(ucharaddress,uchardate)//恣意地址写一个字节
- {
- start();//发动
- write_byte(0xa0);//发送从设备地址
- respons();//等候从设备的呼应
- write_byte(address);//宣布芯片内地址
- respons();//等候从设备的呼应
- write_byte(date);//发送数据
- respons();//等候从设备的呼应
- stop();//中止
- }
- ***************************************************************************
- ucharread_add(ucharaddress)//读取一个自己
- {
- uchardate;
- start();//发动
- write_byte(0xa0);//发送发送从设备地址写操作
- respons();//等候从设备的呼应
- write_byte(address);//发送芯片内地址
- respons();//等候从设备的呼应
- start();//发动
- write_byte(0xa1);//发送发送从设备地址读操作
- respons();//等候从设备的呼应
- date=read_byte();//获取数据
- stop();//中止
- returndate;//回来数据
- }