本代码功能:向EEPROM中写入数字132,然后读取出来再显示到LCD1602当中。
问题是:IIC读取到的数据赋给main()函数中的pic,然后显示pic,
但是LCD显示的内容始终是000,但如果代码中直接让pic=132,则可以
正常显示,因此断定LCD驱动代码没有问题。
问题应该是模拟IIC代码,但是我始终找不到问题所在,求大神解答
[mw_shl_code=c,true]
/*
本代码功能:向EEPROM中写入数字132,然后读取出来再显示到LCD1602当中。
问题是:IIC读取到的数据赋给main()函数中的pic,然后显示pic,
但是LCD显示的内容始终是000,但如果代码中直接让pic=132,则可以
正常显示,因此断定LCD驱动代码没有问题。
问题应该是模拟IIC代码,但是我始终找不到问题所在,求大神解答
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define LCDIO P0
sbit RS=P2^6;
sbit RW=P2^5;
sbit LCDE=P2^7;
void delay(unsigned int x); //延时x毫秒
void LCDinit(void); //LCD初始化
void LCDwrtcom(unsigned char); //向LCD发送指令
void LCDwrtdata(unsigned char); //向LCD发送数据
sbit SCL=P2^1;
sbit SDA=P2^0;
void i2cinit(); //I2C总线初始化
void i2cstart(); //起始信号
void i2cstop(); //终止信号
void i2csend(uchar); //主机发送字节
uchar i2cresponse(); //从机应答
uchar i2creceive(); //主机接收字节
void delay10us(); //延时10微秒
void main()
{
uchar pic;
i2cinit();
LCDinit();
while(1)
{
//向EEPROM写一个数据
i2cstart();
i2csend(0xa0); //器件地址
i2cresponse();
i2csend(0x02); //发送要写入数据的地址
i2cresponse();
i2csend(132); //发送数据(写入数字132)
i2cresponse();
i2cstop();
//读取刚才写入的数据
i2cstart();
i2csend(0xa0); //器件地址
i2cresponse();
i2csend(0x02); //发送要读取数据的地址
i2cresponse();
i2cstart();
i2csend(0xa1); //器件地址
i2cresponse();
pic=i2creceive(); //接收字节,赋值给pic
i2cstop();
//显示读到的数据
LCDwrtcom(0x80);
LCDwrtdata('0'+pic/100);
LCDwrtdata('0'+pic%100/10);
LCDwrtdata('0'+pic%10);
}
}
void i2cinit()//I2C总线初始化
{
SDA=1;
SCL=1;
}
void i2cstart()//起始信号
{
SDA=1;
delay10us();
SCL=1;
delay10us();
SDA=0;
delay10us();
SCL=0;
delay10us();
}
void i2cstop() //终止信号
{
SDA=0;
delay10us();
SCL=1;
delay10us();
SDA=1;
delay10us();
}
void i2csend(uchar dat) //发送字节
{
uchar i;
for(i=0;i<8;i++)
{
dat<<=1;//先读高位
SCL=0;
delay10us();
SDA=CY;
delay10us();
SCL=1;
delay10us();
}
SCL=0;
delay10us();
SDA=1;
delay10us();
}
uchar i2cresponse(void)//从机应答
{
uchar i;
SCL=1;
i=0;
while(SDA==1)
{
i++;
if(i==250)
{
SCL=0;
delay10us();
return 0;
}
}
SCL=0;
delay10us();
return 1;
}
uchar i2creceive(void)//接收字节
{
uchar i,dat2;
dat2=0;
SCL=0;
delay10us();
SDA=1;
delay10us();
for(i=0;i<8;i++)
{
dat2<<=1;
SCL=1;
delay10us();
dat2|=SDA;
SCL=0;
delay10us();
}
return dat2;
}
void LCDwrtcom(unsigned char com)
{
RS=0;
RW=0;
LCDIO=com;
delay(1);
LCDE=1;
delay(1);
LCDE=0;
}
void LCDwrtdata(unsigned char dat1)
{
RS=1;
RW=0;
LCDIO=dat1;
delay(1);
LCDE=1;
delay(1);
LCDE=0;
}
void LCDinit(void)
{
LCDwrtcom(0x38);
LCDwrtcom(0x0c);
LCDwrtcom(0x06);
LCDwrtcom(0x01);
LCDwrtcom(0x80);
}
void delay10us(void)//延时10us
{
uchar a, b;
for(b=1; b>0; b--)
{
for(a=2; a>0; a--);
}
}
void delay(unsigned int x)//延时x毫秒
{
unsigned char y,z;
for(x;x>0;x--)
{
for(y=5;y>0;y--)
{
for(z=96;z>0;z--)
{}
}
}
}
[/mw_shl_code]
|