本代码功能:向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]
 
  |