標題: 求助大佬,STC8G單片機的EEPROM的疑惑 [打印本頁]

作者: suqianfu    時間: 2021-6-12 22:14
標題: 求助大佬,STC8G單片機的EEPROM的疑惑
參考STC8G單片機的技術文檔里面的例程,在帶電狀態(tài)下EEPROM是可以寫,也可以讀的。但就是斷電后,在主程序里讀同一個地址。數(shù)據(jù)就是空白。什么都沒有。怎么辦呀?

貼上例程

#include<STC8.h>                 //STC15W系列單片機。晶振12MHZ
#include <INTRINS.H>
#define uint unsigned int   //宏命令,聲明uint替代unsignde int
#define uchar unsigned char

sfr        DATA1=0xC2;  //數(shù)據(jù)寄存器
sfr        ADDRH=0xC3; //地址寄存器高八位
sfr        ADDRL=0xC4; //地址寄存器低八位
sfr        CMD=0xC5;    //命令模式寄存器
sfr        TRIG=0xC6;    //命令觸發(fā)寄存器
sfr        CONTR=0xC7;  //控制寄存器
sfr        TPS=0xF5;       //等待時間控制繼存器


void iapoff()
{
    IAP_CONTR = 0;                              //關閉IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除觸發(fā)寄存器
    IAP_ADDRH = 0x80;                           //將地址設置到非IAP區(qū)域
    IAP_ADDRL = 0;
}


uchar read(uint add)//讀EEPROM子函數(shù),add為EEPROM讀數(shù)地址
{
                uchar dat;
        CONTR=0x80;       //定義控制寄存器工作時間,打開控制寄存器,晶體為12M
        TPS=12;           //晶振為12MHZ
        CMD=1;            //選擇讀的方式
        ADDRH=add>>8;     //得到地址高八位
        ADDRL=add;        //得到地址低八位
        TRIG=0x5a;        //控制碼
        TRIG=0xa5;        //控制碼
         _nop_();         //延時
                 _nop_();
                 _nop_();
        dat=DATA1;
        return dat;//將值返回
        iapoff();
}


void iniap(uint add,uchar vale)//寫EEPROM子函數(shù),add為EEPROM要寫數(shù)的地址, vale為要存的數(shù)變量
{

        CONTR=0x80;//定義控制寄存器工作時間,打開控制寄存器,晶體為12M
        TPS=12;//晶振為12MHZ
        CMD=0X02;//選擇寫的方式
        ADDRH=add>>8;//得到地址高八位
        ADDRL=add;//得到地址低八位
        DATA1=vale;//將要存的數(shù)放進存數(shù)寄存器DATA
        TRIG=0x5a;//控制碼
        TRIG=0xa5;//控制碼
         _nop_();//延時
         _nop_();
         _nop_();
        iapoff();
}


void del(uint add)//刪除子函數(shù)
{
        CONTR=0x80;

        TPS=12;//晶振為12MHZ
        CMD=3;//選擇寄存器方式
        ADDRH=add>>8;
        ADDRL=add;
        TRIG=0x5a;
        TRIG=0xa5;
         _nop_();
                 _nop_();
                 _nop_();
                 iapoff();
}


void key()
{   
     if(k1!=jat&num<=2){jat=k1,num++;}      
    if(jta==1)                                                //判斷JTA是否為1
  {               
     if(num==2)                                          //如果NUM是2
     {        
       bled=1;rled=0;                                   //藍燈滅,紅燈亮
       del(0x0f00);bled=0;                             //清除0X0F00這個EEPROM地址。
       iniap(0x0f00,1);bled=1;rled=1;             //寫入0X0F00這個地址。注數(shù)1;所有燈滅。
       if(jta==read(0x0f00)){num=3;rled=0;}    //讀取一次0X0F00這個地址,判斷讀數(shù)是否JTA相等,直至相等就退出儲存狀態(tài)。
     }


  }
}

void main()
{  
   P0M0=0Xff;
   P0M1=0X00;
   P1M0=0X00;
   P1M1=0X00;
   P2M0=0X00;
   P2M1=0X00;
   P3M0=0X00;
   P3M1=0X00;
   P4M0=0X00;
   P4M1=0X00;
   P5M0=0X00;
   P5M1=0X00;
   P6M0=0X00;
   P6M1=0X00;
   P7M0=0X00;
   P7M1=0X00;

    shuxian=read(0x0f00);                    //如果是1,讀取EEPROM發(fā)送到數(shù)顯。
    while(1)   {
    key();
    }

}





作者: suqianfu    時間: 2021-6-13 03:24
看了官方技術手冊好像這個8G2K64S4這個是特殊型號,可以自定義EEPROM尺寸的.....所以可能儲存地址有問題。不過現(xiàn)在回家了,只能明天早上再驗證了。定義1K容量EEPROM的話,地址范圍應該是0x0000~0x03ff.超出范圍值無效。
作者: wulin    時間: 2021-6-13 10:51
suqianfu 發(fā)表于 2021-6-13 03:24
看了官方技術手冊好像這個8G2K64S4這個是特殊型號,可以自定義EEPROM尺寸的.....所以可能儲存地址有問題。 ...

8G2K64S4的EEPROM沒有固定地址,自定義地址放在用戶程序占用空間剩余下的任意扇區(qū)。重要事說三遍:扇區(qū),扇區(qū),扇區(qū)。每個扇區(qū)512字節(jié),各扇區(qū)首地址以200H遞增,0x0000,0x0200,0x0400,......。
如同作業(yè)本,你寫字用了3頁半,EEPROM只能從第5頁開始。

樓主這句可能錯了if(k1!=jat & num<=2)
按題意應該是if(k1!=jat && num<=2)
作者: suqianfu    時間: 2021-6-14 16:48
wulin 發(fā)表于 2021-6-13 10:51
8G2K64S4的EEPROM沒有固定地址,自定義地址放在用戶程序占用空間剩余下的任意扇區(qū)。重要事說三遍:扇區(qū), ...

嗯嗯,確實是地址問題,F(xiàn)在可以正常讀寫了。大佬,還有一個問題,串口中斷導致了點陣的動態(tài)掃描索引時序不一致而引起爆點,就是有一行因為中斷而亮燈時間長一點,視覺上會特別亮。這個怎么處理呢?而且位置隨串口中斷次數(shù)不停變換。看著像鬼影。但跟鬼影又不同。難道點陣要用定時器中斷來掃描嗎?我是直接用P0口接的點陣。
作者: npn    時間: 2021-6-15 00:03
EEPROM 只能把1寫成0,無法把0寫成1。
只有擦除后才可以恢復成1并寫入新的數(shù)據(jù),至少擦1個扇區(qū)(512字節(jié))。
作者: npn    時間: 2021-6-15 05:41
suqianfu 發(fā)表于 2021-6-14 16:48
嗯嗯,確實是地址問題,F(xiàn)在可以正常讀寫了。大佬,還有一個問題,串口中斷導致了點陣的動態(tài)掃描索引時序 ...

使用高優(yōu)先級定時器中斷控制點陣掃描
作者: suqianfu    時間: 2021-6-15 13:27
npn 發(fā)表于 2021-6-15 05:41
使用高優(yōu)先級定時器中斷控制點陣掃描

試過了,只要動態(tài)掃描索引被打斷,就會造成那一行亮燈時間不一致視覺殘留久一丁點而顯得特別亮。我現(xiàn)在只能在串口中斷里面關顯示了。這樣整體看起來亮度均勻一點,而沒有爆點。后續(xù)可能要用GN1640這種自帶定頻動態(tài)掃描專門驅動點陣的IC了。然后單片機只負責送數(shù)據(jù)。就是這樣成本會高一點。。。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1