查看: 11894|回復: 6
打印 上一主題 下一主題

[提問(wèn)] eprom芯片,一次存儲40個(gè)數字問(wèn)題

[復制鏈接]
跳轉到指定樓層
樓主
發(fā)表于 2013-12-27 12:58:48 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
現在做的就是,使用eprom芯片,讓數碼管從0~99顯示,工作原理就是,從單片機里寫(xiě)一個(gè)數字給eprom芯片,然后再從eprom芯片里讀剛才單片機給的數字,把這數字在數碼管顯示出來(lái)。如此循環(huán)下去,就能看到數碼管從0~99顯示了。     
  現在我就想一次傳輸10個(gè)數字給eprom,然后再從eprom里讀出數據來(lái)顯示在數碼管里,這樣是沒(méi)問(wèn)題的。但現在我要傳輸多一點(diǎn)數字,比如40個(gè),按照這樣就會(huì )出現亂碼了,讀不了40個(gè)那么多數字,讀到第13個(gè)就開(kāi)始亂了。請問(wèn),這怎么解決,謝謝啦
#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;                //一次讀取多少個(gè)數字
                                
uchar  temp[40];


void delay(uchar w)        //delay
{
   uchar j;
   for(;w>0;w--)
     for(j=0;j<125;j--);
}
void delay_nop(void)        //機器周期延時(shí)函數
{
   _nop_();_nop_();_nop_();_nop_();
   _nop_();_nop_();_nop_();_nop_();
}
void init()//總線(xiàn)初始化
{
   SDA=1;
   delay_nop();
   SCL=1;
   delay_nop();
}
void start()        //總線(xiàn)起始信號
{
   SDA=1;
   SCL=1;
   delay_nop();
   SDA=0;
   delay_nop();
   SCL=0;
}
void  stop()   //總線(xiàn)停止信號
{
    SDA=0;
        SCL=1;
        delay_nop();
        SDA=1;
        delay_nop();
        SCL=0;
}
void ack()     //總線(xiàn)應答信號
{
  SDA=0;
  SCL=1;
  delay_nop();
  SCL=0;
  SDA=1;

}
void noack()  //總線(xiàn)非應答信號
{
   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總線(xiàn)發(fā)送一個(gè)字節數據
{
     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總線(xiàn)接收一個(gè)字節數據
{
           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器件指定地址寫(xiě)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器件指定地址寫(xiě)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();  //初始化總線(xiàn)
           
         while(1)
         {
                    write_str(2,table,x);           //向IC器件寫(xiě)入 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;                                 //個(gè)位顯示
                         delay(300);
                         ge=0; shi=0;
                        
                }
         
          }

}

100.png (142.07 KB, 下載次數: 0)


100.png (149.63 KB)

100.png
沙發(fā)
發(fā)表于 2013-12-27 17:30:20 | 只看該作者
eeprom 寫(xiě)完要等其寫(xiě)成功才能對其再寫(xiě)。有的24C02每次寫(xiě)只能寫(xiě)8個(gè)byte,有的可是16個(gè)byte。一般要等待5ms才能再寫(xiě)。
板凳
 樓主| 發(fā)表于 2013-12-27 21:39:32 | 只看該作者
bagdmu 發(fā)表于 2013-12-27 17:30
eeprom 寫(xiě)完要等其寫(xiě)成功才能對其再寫(xiě)。有的24C02每次寫(xiě)只能寫(xiě)8個(gè)byte,有的可是16個(gè)byte。一般要等待5ms才 ...

嗯嗯,好像是”上卷“現象。但還是不知道從哪里下手,能指點(diǎn)一下嗎?謝謝
地板
發(fā)表于 2013-12-31 20:45:02 | 只看該作者
建議樓主重新仔細看看24CXX系列EEPROM的數據手冊。

EEPROM的寫(xiě),通常分為隨機寫(xiě)入(單字節)和頁(yè)寫(xiě)入(多字節,通常為8的倍數)兩種模式,其中頁(yè)寫(xiě)入的時(shí)候,一次寫(xiě)一頁(yè)(比如8或者16字節),這時(shí)其實(shí)是寫(xiě)在了芯片的緩沖區的,需要等候5mS,等待芯片把緩沖區中的數據轉入到eeprom的真正存儲區域去。

如果不遵守這個(gè)規則,則會(huì )有某些信息被沖掉了。
地下室
發(fā)表于 2014-1-1 22:07:31 | 只看該作者
在程序里加一個(gè)類(lèi)似握手機制的約束條件,來(lái)進(jìn)行控制即可。
6
發(fā)表于 2014-1-2 22:21:36 | 只看該作者
學(xué)習了!
7
發(fā)表于 2015-2-22 14:35:32 | 只看該作者
支持一下
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页