向江协科技学习,自己敲一遍的思路和命名都很乱,一直不理解iic的接受应答和发送应答,自己写完一遍后,一直显示255,检查了很久,在接受数据那一函数里if循环外加上SCL=0就可以了,不明白为什么,由于储存的数据是unsigned char类型,储存上限是255,存入300显示的就是45,加深了对iic协议的理解,在后面运用也有更大的启发
iic函数模块
#include <REGX52.H>
sbit SCL=P2^1;
sbit SDA=P2^0;
void start(void){
SCL=1;
SDA=1;
SDA=0;
SCL=0;
}
//发送数据
void send(unsigned char byte){
unsigned char i;
SDA=1;
SCL=0;
for(i=0;i<8;i++){
SDA=byte&(0x80>>i);
SCL=1;
SCL=0;
}
}
//读取数据
unsigned char receive(void){
int i;unsigned char byte=0x00;
SDA=1;
SCL=0;
for(i=0;i<8;i++){
SCL=1;
if(SDA){byte|=(0x80>>i);}
SCL=0;
}
return byte;
}
void stop(void){
SDA=0;
SCL=1;
SDA=1;
}
//发送应答
void sendREX(unsigned char sendREX){
SDA=sendREX;
SCL=1;
SCL=0;
}
//接受应答
unsigned char receiveREX(void){
unsigned char receiveREX;
SDA=1;
receiveREX=SDA;
SCL=1;
SCL=0;
return receiveREX;
}
主函数模块
#include <REGX52.H>
#include <LCD1602.H>
#include <IIC.H>
#define address 0xA0
void Delay5ms(void) //@12.000MHz
{
unsigned char data i, j;
i = 59;
j = 90;
do
{
while (--j);
} while (--i);
}
void write(unsigned char b,byte){
start();
send(address);
receiveREX();
send(b);
receiveREX();
send(byte);
receiveREX();
stop();
}
unsigned char read(unsigned char b){
unsigned char byte;
start();
send(address);
receiveREX();
send(b);
receiveREX();
start();
send(address|0x01);
receiveREX();
byte=receive();
sendREX(1);
stop();
return byte;
}
void main(){
unsigned char byte;
LCD_Init();
write(1,255);
Delay5ms();
byte=read(1);
Delay5ms();
LCD_ShowNum(1,1,byte,3);
while(1);
}