eprom芯片,一次存储40个数字问题
2013年12月27日 12:58 发布者:loveqloveq
现在做的就是,使用eprom芯片,让数码管从0~99显示,工作原理就是,从单片机里写一个数字给eprom芯片,然后再从eprom芯片里读刚才单片机给的数字,把这数字在数码管显示出来。如此循环下去,就能看到数码管从0~99显示了。
现在我就想一次传输10个数字给eprom,然后再从eprom里读出数据来显示在数码管里,这样是没问题的。但现在我要传输多一点数字,比如40个,按照这样就会出现乱码了,读不了40个那么多数字,读到第13个就开始乱了。请问,这怎么解决,谢谢啦
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;
sbit SDA=P2^1;
sbit shi=P2^6;
sbit ge=P2^7;
uchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar table[]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37,38,39};
uchar x=13; //一次读取多少个数字
uchar temp;
void delay(uchar w) //delay
{
uchar j;
for(;w>0;w--)
for(j=0;j<125;j--);
}
void delay_nop(void) //机器周期延时函数
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void init()//总线初始化
{
SDA=1;
delay_nop();
SCL=1;
delay_nop();
}
void start() //总线起始信号
{
SDA=1;
SCL=1;
delay_nop();
SDA=0;
delay_nop();
SCL=0;
}
void stop() //总线停止信号
{
SDA=0;
SCL=1;
delay_nop();
SDA=1;
delay_nop();
SCL=0;
}
void ack() //总线应答信号
{
SDA=0;
SCL=1;
delay_nop();
SCL=0;
SDA=1;
}
void noack() //总线非应答信号
{
SDA=1;
SCL=1;
delay_nop();
SCL=0;
SDA=0;
}
bit detectack() //检测ACK信号
{
bit b_ack;
SDA=1;
SCL=1;
delay_nop();
b_ack=SDA;
SCL=0;
return b_ack;
}
void write(uchar input) //向IC总线发送一个字节数据
{
uchar i;
for(i=0;i<8;i++)
{
if(input & 0x80)
SDA=1;
else
SDA=0;
SCL=1;
delay_nop();
SCL=0;
delay_nop();
input=input<<1;
}
}
uchar read(void) //向IC总线接收一个字节数据
{
uchar tempdata=0,i;
SDA=1;
for(i=0;i<8;i++)
{
tempdata=tempdata<<1;
tempdata=tempdata | ((uchar) SDA);
SCL=1;
delay_nop();
SCL=0;
}
return tempdata;
}
void write_str(uchar add,uchar *str,uchar num) //向IC器件指定地址写N节数据
{
uchar i;
start();
write(0xa0);
while(detectack());
write(add);
while(detectack());
for(i=0;i
write(*str);
while(detectack());
str++;
/*if(i>13)
{
write(add++);
while(detectack());
}*/
}
stop();
delay(20);
}
uchar read_str(uchar add,uchar *str,uchar num)//从指定IC器件的指定地址读N字节 数据
{
uchar i;
//uchar temp;
start();
write(0xa0);
while(detectack());
write(add);
while(detectack());
start();
write(0xa1);
while(detectack());
for(i=0;i
*str=read();
ack();
str++;
}
*str=read();
noack();
stop();
delay(20);
return str;
}
void main() //主函数
{
//write_str(uchar add,uchar *str,uchar num) 向IC器件指定地址写N节数据
// read_str(uchar add,uchar *str,uchar num) 从指定IC器件的指定地址读N字节 数据
uchar i,j; //uchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar a,b;
init(); //初始化总线
while(1)
{
write_str(2,table,x); //向IC器件写入 table[]
delay(20);
read_str(2,temp,x); //从IC器件读取 table[]
delay(20);
for(i=0;i<13;i++)
for(j=0;j<150;j++) //停留
{
a=(temp/10);
b=(temp%10);
P0=num;
shi=1; //十位显示
delay(300);
shi=0;
P0=num;
ge=1; //个位显示
delay(300);
ge=0; shi=0;
}
}
}
100.png (142.07 KB, 下载次数: 0)
网友评论
loveqloveq 2013年12月27日
bagdmu 发表于 2013-12-27 17:30 static/image/common/back.gif
eeprom 写完要等其写成功才能对其再写。有的24C02每次写只能写8个byte,有的可是16个byte。一般要等待5ms才 ...
嗯嗯,好像是”上卷“现象。但还是不知道从哪里下手,能指点一下吗?谢谢
bagdmu 发表于 2013-12-27 17:30 static/image/common/back.gif
eeprom 写完要等其写成功才能对其再写。有的24C02每次写只能写8个byte,有的可是16个byte。一般要等待5ms才 ...
嗯嗯,好像是”上卷“现象。但还是不知道从哪里下手,能指点一下吗?谢谢
sherwin 2013年12月31日
建议楼主重新仔细看看24CXX系列EEPROM的数据手册。
EEPROM的写,通常分为随机写入(单字节)和页写入(多字节,通常为8的倍数)两种模式,其中页写入的时候,一次写一页(比如8或者16字节),这时其实是写在了芯片的缓冲区的,需要等候5mS,等待芯片把缓冲区中的数据转入到eeprom的真正存储区域去。
如果不遵守这个规则,则会有某些信息被冲掉了。
建议楼主重新仔细看看24CXX系列EEPROM的数据手册。
EEPROM的写,通常分为随机写入(单字节)和页写入(多字节,通常为8的倍数)两种模式,其中页写入的时候,一次写一页(比如8或者16字节),这时其实是写在了芯片的缓冲区的,需要等候5mS,等待芯片把缓冲区中的数据转入到eeprom的真正存储区域去。
如果不遵守这个规则,则会有某些信息被冲掉了。
joywyc 2014年01月01日
在程序里加一个类似握手机制的约束条件,来进行控制即可。:)
在程序里加一个类似握手机制的约束条件,来进行控制即可。:)
hbzhangtuo 2014年01月02日
学习了!
学习了!
pcbkey 2015年02月22日
支持一下
支持一下
eeprom 写完要等其写成功才能对其再写。有的24C02每次写只能写8个byte,有的可是16个byte。一般要等待5ms才能再写。