⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.lst

📁 STC89C54RD单片机内部EEPROM读写源代码。
💻 LST
字号:
C51 COMPILER V7.01  EEPROM                                                                 01/14/2009 00:09:42 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN eeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE eeprom.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //-------实验名称:宏晶单片机EEPROM读写存储功能实验
   2          //-------单片机型号:STC89C58RD+
   3          //-------版本: V3
   4          
   5          #include <reg52.h>
   6          #include <intrins.h>
   7          //-----------------------
   8          //--定义与IAP有关的特殊功能寄存器
   9          sfr ISP_DATA = 0xe2;                //ISP数据寄存器地址
  10          sfr ISP_ADDRH= 0xe3;                //EEPROM,Flash存储器高位地址
  11          sfr ISP_ADDRL= 0xe4;                //EEPROM,Flash存储器低位地址
  12          sfr ISP_CMD = 0xe5;                         //ISP指令寄存器地址
  13          sfr ISP_TRIG = 0xe6;                //ISP命令触发器寄存器地址
  14          sfr ISP_CONTR= 0xe7;                //ISP/IAP控制寄存器
  15          
  16          //------------------------
  17          //--按键定义
  18          sbit key1 = P1^0;
  19          sbit key2 =     P1^1;
  20          sbit key3 = P1^2;
  21          sbit Beep = P1^5;
  22          sbit P0_0=P0^0;
  23          sbit P0_1=P0^1;
  24          sbit P0_2=P0^2;
  25          sbit P0_3=P0^3;
  26          sbit P0_4=P0^4;
  27          sbit P0_5=P0^5;
  28          sbit P0_6=P0^6;
  29          sbit P0_7=P0^7;
  30          sbit P2_0=P2^0;
  31          sbit P2_1=P2^1;
  32          sbit P2_2=P2^2;
  33          sbit P2_3=P2^3;
  34          sbit P1_7=P1^7;
  35          #define Scan P3
  36          #define Beep_on Beep=0;
  37          #define Beep_off Beep=1;
  38          //------------------------
  39          //--定义变量
  40          //------------------------
  41          //--Flash 操作等待时间
  42          //#define ENABLE_ISP 0x83               //<5MHz
  43          //#define ENABLE_ISP 0x82               //<10MHz
  44          #define ENABLE_ISP 0x81                 //<20MHz                 打开ISP操作功能及等待时间
  45          //#define ENABLE_ISP 0x80               //>20MHz
  46          #define DEBUG_DATA 0x01                 //往EEPROM写入的数据
  47          #define uchar unsigned char
  48          unsigned int ADD;
  49          //------------------------
  50          //--IAP操作模式
  51          //------------------------
  52          #define Read 0x01                               //读Flash命令字
  53          #define Write 0x02                              //写Flash命令字
  54          #define Erase 0x03                              //擦除Flash命令字
  55          uchar telnm[11];
C51 COMPILER V7.01  EEPROM                                                                 01/14/2009 00:09:42 PAGE 2   

  56          //---------------------------
  57          //--选择型号STC54\58起始地址都为0x8000,51起始地址为0x2000
  58          unsigned int DATA_FLASH_START_ADDRESS = 0x8000;
  59          unsigned char DATA_memory;
  60          
  61          /*---------------延时子程序----------------*/
  62          void Delay_US (uchar us)
  63          {
  64   1        while(--us);
  65   1      }
  66          void Delay_MS (uchar ms)
  67          {
  68   1        do {Delay_US(246);Delay_US(247);}
  69   1        while(--ms);
  70   1      }
  71          void Delay_S (uchar s)
  72          {
  73   1        do {Delay_MS(200);Delay_MS(200);Delay_MS(200);Delay_MS(200);Delay_MS(200);}
  74   1        while(--s);
  75   1      }
  76          
  77          //---------------------------
  78          //--触发TRIG寄存器
  79          void Trigger_ISP ()
  80          {
  81   1          EA = 0;
  82   1              ISP_TRIG = 0x46;
  83   1              ISP_TRIG = 0xb9;
  84   1              _nop_();
  85   1              EA = 1;
  86   1      }
  87          
  88          //---------------------------
  89          //--禁止IAP操作
  90          void IAP_Disable ()
  91          {
  92   1          ISP_CONTR = 0;
  93   1              ISP_CMD = 0;
  94   1              ISP_TRIG = 0;
  95   1      }
  96          
  97          //---------------------------
  98          //--读Flash操作
  99          void Byte_Read ()
 100          {
 101   1          uchar i;
 102   1              
 103   1              for(i=0;i<11;i++)
 104   1              {
 105   2                      ADD=DATA_FLASH_START_ADDRESS+i;
 106   2                      ISP_ADDRH = ( ADD >> 8 );//地址的高8位
 107   2                      ISP_ADDRL = ( ADD & 0x00ff );//地址的低8位
 108   2                      EA=0;//关中断
 109   2                      ISP_CONTR = ENABLE_ISP;         //打开IAP功能,及设置Flash操作等待时间
 110   2                      ISP_CMD = Read;                     //选择读 AP模式
 111   2                      ISP_TRIG = 0x46;
 112   2                      ISP_TRIG = 0xb9;
 113   2                      _nop_();
 114   2                      telnm[i] = ISP_DATA;//存储读到的数据
 115   2                      EA = 1;
 116   2                      IAP_Disable();
 117   2              }
C51 COMPILER V7.01  EEPROM                                                                 01/14/2009 00:09:42 PAGE 3   

 118   1              
 119   1              
 120   1      }
 121          
 122          //---------------------------
 123          //--字节编程
 124          void Byte_Program ()
 125          {       uchar i;
 126   1              unsigned int ADD;
 127   1          for(i=0;i<11;i++)
 128   1              {       
 129   2                      ISP_DATA = DEBUG_DATA+i;
 130   2                      ADD=DATA_FLASH_START_ADDRESS+i;
 131   2                      ISP_ADDRH = ( ADD >> 8 );//地址的高8位
 132   2                      ISP_ADDRL = ( ADD & 0x00ff );//地址的低8位
 133   2                      EA = 0;
 134   2                      ISP_CONTR = ENABLE_ISP;     //打开IAP功能,及设置Flash操作等待时间
 135   2                      ISP_CMD = Write;
 136   2                      //Trigger_ISP ();
 137   2                      ISP_TRIG = 0x46;
 138   2                      ISP_TRIG = 0xb9;
 139   2                      _nop_();
 140   2                      EA = 1;
 141   2                      IAP_Disable ();
 142   2              }
 143   1      
 144   1              
 145   1      }
 146          
 147          //---------------------------
 148          //--擦除扇区
 149          void Sector_Erase ()
 150          {
 151   1              uchar i;
 152   1          
 153   1              for(i=0;i<11;i++)
 154   1              {
 155   2                      ISP_CONTR = ENABLE_ISP;    //打开IAP功能,及设置Flash操作等待时间 
 156   2                      ISP_CMD = Erase;
 157   2                      ADD=DATA_FLASH_START_ADDRESS+i;
 158   2                      ISP_ADDRH = ( ADD >> 8 );//地址的高8位
 159   2                      ISP_ADDRL = ( ADD & 0x00ff );//地址的低8位
 160   2                      Trigger_ISP (); 
 161   2                      IAP_Disable ();
 162   2              }
 163   1              P0=0XFF;
 164   1              P2=0XFF;
 165   1              
 166   1      }
 167          //---------------------------
 168          //--LED显示
 169          void LED()
 170          {
 171   1              if(telnm[0]==1)
 172   1              {       
 173   2                      P0_1=0;
 174   2              }
 175   1              if(telnm[1]==2)
 176   1              {       
 177   2                      P0_2=0;
 178   2              }
 179   1               if(telnm[2]==3)
C51 COMPILER V7.01  EEPROM                                                                 01/14/2009 00:09:42 PAGE 4   

 180   1              {       
 181   2                      P0_3=0;
 182   2              }
 183   1              if(telnm[3]==4)
 184   1              {       
 185   2                      P0_4=0;
 186   2              }
 187   1              if(telnm[4]==5)
 188   1              {       
 189   2                      P0_5=0;
 190   2              }
 191   1              if(telnm[5]==6)
 192   1              {       
 193   2                      P0_6=0;
 194   2              }
 195   1              if(telnm[6]==7)
 196   1              {       
 197   2                      P0_7=0;
 198   2              }
 199   1              if(telnm[7]==8)
 200   1              {       
 201   2                      P2_0=0;
 202   2              }
 203   1              if(telnm[8]==9)
 204   1              {       
 205   2                      P2_1=0;
 206   2              }
 207   1              if(telnm[9]==10)
 208   1              {       
 209   2                      P2_2=0;
 210   2              }
 211   1              if(telnm[10]==11)
 212   1              {       
 213   2                      P2_3=0;
 214   2              }
 215   1              
 216   1      //      else
 217   1      //      P0=0x5f;
 218   1              
 219   1              
 220   1      }
 221          
 222          
 223          void Key_board ()
 224          {
 225   1          if(key1==0)
 226   1              {
 227   2                  Delay_MS(5);
 228   2                      if(key1==0)
 229   2                      {
 230   3                          Byte_Read ();//KEY1按下,
 231   3                              LED();//显示数据
 232   3                      }
 233   2                      while(key1==0);
 234   2              }
 235   1              if(key2==0)//KEY2按下
 236   1              {
 237   2                  Delay_MS(5);
 238   2                      if(key2==0)
 239   2                      {
 240   3                          P0=0xff;
 241   3                              Byte_Program ();//写数据到EEPROM
C51 COMPILER V7.01  EEPROM                                                                 01/14/2009 00:09:42 PAGE 5   

 242   3                              DATA_memory=0;
 243   3                              Beep_on;
 244   3                              P1_7=0;
 245   3                          Delay_MS(200);
 246   3                          Beep_off;
 247   3                              P1_7=1;
 248   3                          Delay_MS(200);
 249   3                          Beep_on;
 250   3                              P1_7=0;
 251   3                          Delay_MS(200);
 252   3                          Beep_off;
 253   3                              P1_7=1;
 254   3                              Delay_MS(200);
 255   3                          Beep_on;
 256   3                              P1_7=0;
 257   3                          Delay_MS(200);
 258   3                          Beep_off;
 259   3                              P1_7=1;
 260   3                      }
 261   2                      while(key2==0);
 262   2              }
 263   1              if(key3==0)
 264   1              {
 265   2                  Delay_MS(5);
 266   2                      if(key3==0)
 267   2                      {
 268   3                          Sector_Erase ();//擦除EEPROM
 269   3                              Byte_Read ();
 270   3                              LED();
 271   3                      }
 272   2              }
 273   1      }
 274          
 275          void initial ()
 276          {
 277   1          TMOD=0x20;   //定时器1选择方式2,8位自动重装
 278   1          ES=1;        //允许串口中断
 279   1          PCON=0x00;   //SMOD=0
 280   1          SCON=0x50;   //串口选择方式1
 281   1          TH1=0xfd;    //波特率设置为9600
 282   1          TL1=0xfd;
 283   1          EA=1;
 284   1              TR1=1;       //开定时器T1运行控制位
 285   1      }
 286          
 287          void COM_int() interrupt 4 using 0
 288          {
 289   1          uchar com_buff;
 290   1          RI=0;
 291   1              com_buff=SBUF;
 292   1              if(com_buff==0xab)         //自定义指令为0xab
 293   1              {   
 294   2                  Delay_S(1); 
 295   2                  ISP_CONTR=0x60;        //软件复位到ISP编程区
 296   2              }
 297   1      }
 298          
 299          void main()
 300          {
 301   1          initial ();                    //初始化
 302   1              P0 = 0xf0;
 303   1              Delay_S(1);
C51 COMPILER V7.01  EEPROM                                                                 01/14/2009 00:09:42 PAGE 6   

 304   1              P0 = 0x0f;
 305   1              Delay_S(1);
 306   1              while(1)
 307   1              {
 308   2              Key_board ();
 309   2              }
 310   1      }
 311           


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    449    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -