I2C 总线上,PCF8591 可以直接在1602上显示, 数据变化正常,但是PCF8591接入E2PROM后,读取出来的数据一直都是0XFF,哪位大神帮忙看看什么原因?
#include
#include "i2c.h"
#define DATA P0
***it rs=P1^3;
***it rw=P1^4;
***it en=P1^5;
u8 lcd1602[5];
void write_1602com(u8 com)
{
rs=0;
rw=0;
en=0;
en=1;
DATA=com;
delay(5);
en=0;
}
void write_1602dat(u8 dat)
{
rs=1;
rw=0;
en=0;
en=1;
DATA=dat;
delay(5);
en=0;
}
void init()
{
write_1602com(0x02);
write_1602com(0x06);
write_1602com(0x0c);
write_1602com(0x38);
write_1602com(0x01);
}
void display(u8 dat)
{
u16 t;
t=dat*(50000.0/255)*2; // 不知道为什么要乘上2,不然最大值只有一半
lcd1602[4]=t/10000;
lcd1602[3]=(t-lcd1602[4]*10000)/1000;
lcd1602[2]=(t-lcd1602[4]*10000-lcd1602[3]*1000)/100;
lcd1602[1]=(t-lcd1602[4]*10000-lcd1602[3]*1000-lcd1602[2]*100)/10;
lcd1602[0]=t%10;
write_1602com(0x83);
write_1602dat(lcd1602[4]+'0');
delay(2);
write_1602com(0x84);
write_1602dat(lcd1602[3]+'0');
delay(2);
write_1602com(0x85);
write_1602dat(lcd1602[2]+'0');
delay(2);
write_1602com(0x86);
write_1602dat(lcd1602[1]+'0');
delay(2);
write_1602com(0x87);
write_1602dat(lcd1602[0]+'0');
delay(2);
}
u8 read_PCF8591()
{
u8 fun;
start_i2c();
write_i2c(0x90);
i2c_wait_ack();
// return 1;
write_i2c(0x00);
i2c_wait_ack();
//return 1;
start_i2c();
write_i2c(0x91);
i2c_wait_ack();
//return 1;
fun=read_i2c();
ack_i2c(0);
stop_i2c();
return fun;
}
void main()
{
init();
while(1)
{
write_i2c_address( 532 ,read_PCF8591());
display(read_i2c_address( 532 ));
// display(read_PCF8591());
//delay(1000);
}
}
#include "i2c.h"
void delay(u8 n)
{
u8 x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void nops() //5ns延时
{
do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0);
}
void start_i2c()
{
sda=1;
nops();
scl=1;
nops();
sda=0;
nops();
}
void stop_i2c()
{
sda=0;
nops();
scl=1;
nops();
sda=1;
nops();
}
void ack_i2c(bit ck)
{
if(ck)
sda=0;
else
sda=1;
nops();
scl=1;
nops();
scl=0;
nops();
sda=1;
nops();
}
void i2c_wait_ack()
{
u8 i;
scl=1;
nops();
while((sda==1)&&(i<250)) i++;
scl=0;
nops();
}
void write_i2c(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
scl=0;
nops();
if(dat&0x80)
sda=1;
else
sda=0;
nops();
scl=1;
dat<<=1;
nops();
}
}
u8 read_i2c()
{
u8 i,temp=0;
scl=0;
nops();
sda=1;
nops();
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=1;
nops();
temp=temp|sda;
scl=0;
nops();
}
return (temp);
}
void write_i2c_address(u8 add,u8 dat_byte)
{
start_i2c();
write_i2c(0xa2);
i2c_wait_ack();
write_i2c(add/256);
i2c_wait_ack();
write_i2c(add%256);
i2c_wait_ack();
write_i2c(dat_byte);
i2c_wait_ack();
stop_i2c();
delay(5000);
}
u8 read_i2c_address(u8 read_add)
{
u8 read_byte=0;
start_i2c();
write_i2c(0xa2);
i2c_wait_ack();
write_i2c(read_add/256);
i2c_wait_ack();
write_i2c(read_add%256);
i2c_wait_ack();
start_i2c();
write_i2c(0xa3);
i2c_wait_ack();
read_byte=read_i2c();
// ack_i2c(0);
stop_i2c();
return read_byte;
}
2018-1-8 17:39:37
引用: iczoom188 发表于 2018-1-8 16:14
STC很多系列的单片机片内都集成了EEPROM存储器(其实是Data Flash),方便用户使用,想得真周到!今天拍明芯城专业写了个小程序,测试了一下,工作正常。下面就上我自己写的源程序。本人在STC89C52RC单片机上试验成功。
用串口看看,也可以先把num1写入,再接着读出来然后显示看看是不是之前的数据,确保数据被正确写入
楼 ...
我外接的E2PROM at24c512 add之前是用的uint型的,后面找错误的时候改成uchar ,忘了改回来!串口接收回来的数据也不对。我感觉应该是read_i2c函数有问题!
引用: iczoom188 发表于 2018-1-8 16:14
STC很多系列的单片机片内都集成了EEPROM存储器(其实是Data Flash),方便用户使用,想得真周到!今天拍明芯城专业写了个小程序,测试了一下,工作正常。下面就上我自己写的源程序。本人在STC89C52RC单片机上试验成功。
用串口看看,也可以先把num1写入,再接着读出来然后显示看看是不是之前的数据,确保数据被正确写入
楼 ...
我外接的E2PROM at24c512 add之前是用的uint型的,后面找错误的时候改成uchar ,忘了改回来!串口接收回来的数据也不对。我感觉应该是read_i2c函数有问题!
举报