<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 11927|回復: 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 (149.63 KB)

    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 | 只看該作者
    在程序里加一個類似握手機制的約束條件,來進行控制即可。
    6
    發表于 2014-1-2 22:21:36 | 只看該作者
    學習了!
    7
    發表于 2015-2-22 14:35:32 | 只看該作者
    支持一下
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷