查看: 10609|回复: 6

[提问] eprom芯片,一次存储40个数字问题

[复制链接]
发表于 2013-12-27 12:58:48 | 显示全部楼层 |阅读模式
现在做的就是,使用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[40];


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[a];
                         shi=1;                                 //十位显示
             delay(300);
                         shi=0;
                    
                         P0=num;
                          ge=1;                                 //个位显示
                         delay(300);
                         ge=0; shi=0;
                        
                }
         
          }

}

100.png (142.07 KB, 下载次数: 0)


100.png
发表于 2013-12-27 17:30:20 | 显示全部楼层
eeprom 写完要等其写成功才能对其再写。有的24C02每次写只能写8个byte,有的可是16个byte。一般要等待5ms才能再写。
 楼主| 发表于 2013-12-27 21:39:32 | 显示全部楼层
bagdmu 发表于 2013-12-27 17:30
eeprom 写完要等其写成功才能对其再写。有的24C02每次写只能写8个byte,有的可是16个byte。一般要等待5ms才 ...

嗯嗯,好像是”上卷“现象。但还是不知道从哪里下手,能指点一下吗?谢谢
发表于 2013-12-31 20:45:02 | 显示全部楼层
建议楼主重新仔细看看24CXX系列EEPROM的数据手册。

EEPROM的写,通常分为随机写入(单字节)和页写入(多字节,通常为8的倍数)两种模式,其中页写入的时候,一次写一页(比如8或者16字节),这时其实是写在了芯片的缓冲区的,需要等候5mS,等待芯片把缓冲区中的数据转入到eeprom的真正存储区域去。

如果不遵守这个规则,则会有某些信息被冲掉了。
发表于 2014-1-1 22:07:31 | 显示全部楼层
在程序里加一个类似握手机制的约束条件,来进行控制即可。
发表于 2014-1-2 22:21:36 | 显示全部楼层
学习了!
发表于 2015-2-22 14:35:32 | 显示全部楼层
支持一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表