C51 COMPILER V9.59.0.0   MAIN                                                              08/27/2022 22:38:02 PAGE 1   


C51 COMPILER V9.59.0.0, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\Objects\main.obj
COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE main.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listings\main
                    -.lst) OBJECT(.\Objects\main.obj)

line level    source

   1          /*-------------------------------------------ͷ�ļ�-------------------------------------------*/
   2          #include <STC8.H>
   3          #include "intrins.h"        //��Ƭ��C����ʹ�û��ָ���ͷ�ļ���
   4          /*-------------------------------------------�궨��-------------------------------------------*/
   5          typedef unsigned char u8;   //�޷��ŵ� 8λ������
   6          typedef unsigned int  u16;  //�޷��ŵ�16λ������
   7          typedef unsigned long u32;  //�޷��ŵ�32λ������
   8          /*-----------------------------------------BOOT�Ŷ���-----------------------------------------*/
   9          #define BOOT_PIN        P00 //BOOT������ΪP0.0�š�
  10          #define BOOT_RUN_APP    0   //BOOT��Ϊ�͵�ƽ��ʱ������APP��
  11          /*------------------------------------------���ܶ���------------------------------------------*/
  12          sfr IAP_TPS =0xf5;    //EEPROM�����ȴ�ʱ����ƼĴ���
  13          u8  code    INIT_MASK[6]    ={0xff,0xff,0xff,0xff,0xff,0xff};//��ʼ�����룬����FLASH���Ծ���0xFF��
  14          void    (* jmp_app)(void);          //��ת������
  15          #define    BOOT_STATUS      0x4200  //4200      ��BootLoader��״̬
  16          #define    BOOT_JMP_ADDR    0x4201  //4201~4202 ��BootLoader����ת��ַ
  17          
  18          #define    APP_START        0x4203  //4203      ��APP����ʼ��ַ
  19          #define    APP_MAX          5       //APP��ռ�ÿռ�Ϊ5�ֽ�
  20          #define    APP_STATUS       0x4203  //4203      ��APP��״̬
  21          #define    APP_SIZE         0x4204  //4204~4205 ��APP����С
  22          #define    APP_JMP_ADDR     0x4206  //4206~4207 ��APP��ַ
  23          
  24          #define    DATA_MAX         30              //APP�������ֵ����λΪ��������һ����Ϊ512�ֽڡ�
  25          #define    FLASH_SIZE       (DATA_MAX*512)  //APP�������ֵ����λΪ�ֽڡ�
  26          
  27          #define    read_jmp__addr       (*(unsigned int  code *)(0x0001))        //��ȡ�����������ת��ַ��
  28          #define    read_jmp__addr_h     (*(unsigned char code *)(0x0001))
  29          #define    read_jmp__addr_l     (*(unsigned char code *)(0x0002))
  30          
  31          #define    read_boot_addr       (*(unsigned int  code *)(BOOT_JMP_ADDR))//��ȡBootloader����ת��ַ��
  32          #define    read_boot_addr_h     (*(unsigned char code *)(BOOT_JMP_ADDR))
  33          #define    read_boot_addr_l     (*(unsigned char code *)(BOOT_JMP_ADDR+1))
  34          
  35          #define    read_app__addr       (*(unsigned int  code *)(APP_JMP_ADDR))    //��ȡAPP����ת��ַ��
  36          #define    read_app__addr_h     (*(unsigned char code *)(APP_JMP_ADDR))    
  37          #define    read_app__addr_l     (*(unsigned char code *)(APP_JMP_ADDR+1))
  38          
  39          #define    read_app__size       (*(unsigned int  code *)(APP_SIZE))        //��ȡAPP�Ĵ�С��
  40          #define    read_app__size_h     (*(unsigned char code *)(APP_SIZE))
  41          #define    read_app__size_l     (*(unsigned char code *)(APP_SIZE+1))
  42          
  43          #define    read_app__flag       (*(unsigned char code *)(APP_STATUS))    //��ȡAPP��״̬��
  44          #define    read_boot_flag       (*(unsigned char code *)(BOOT_STATUS))    //��ȡBootLoader��״̬��
  45          //��� [        D7       ][            D6            ][  D5  ][  D4  ][  D3  ][  D2  ][  D1  ][  D0  ]
  46          //APP   [    ʹ�ܱ�־λ    ][    ��װ  ��ɱ�־λ        ][                        Ԥ��                  ]
  47          //BOOT  [    ʹ�ܱ�־λ    ][    ��ʼ����ɱ�־λ        ][                        Ԥ��                  ]
  48          #define    BIT_ENABLE   0x80                //ʹ��λ��
  49          #define    SET_ENABLE   (~(u8)(BIT_ENABLE)) //ʹ�ܸ�����
  50          #define    GET_ENABLE   ( (u8)(BIT_ENABLE)) //��ѯʹ��λ��
  51          
  52          #define    BIT_DONE     0x40                //����
  53          #define    SET_DONE     (~(u8)(BIT_DONE))   //������������趨���ܡ�
  54          #define    GET_DONE     ( (u8)(BIT_DONE))   //��ѯ���λ��
C51 COMPILER V9.59.0.0   MAIN                                                              08/27/2022 22:38:02 PAGE 2   

  55          
  56          #define    PD_APP__OK   (GET_ENABLE|GET_DONE)   //�ж�APP���Ƿ��кϷ��ij���
  57          #define    APP__OK      (0)                     //APP���ǺϷ��ij���
  58          /*------------------------------------------��������------------------------------------------*/
  59          #if 1//���ڲ���
  60          /*-------------------------------------------------------
  61          ��������hard_init
  62          ��  ����Ӳ�������ʼ��������
  63          �����ߣ�����
  64          �������̣���
  65          �������ڣ�2020-11-30
  66          �޸ļ�¼��
  67          2020-12-08���ϲ��˴��ںͶ�ʱ���ij�ʼ��������Ϊhard_init��
  68          -------------------------------------------------------*/
  69          void hard_init(void){    
  70   1          SCON = 0x50;    //8λ����,�ɱ䲨����
  71   1          AUXR = 0x40;    //��ʱ��1ʱ��ΪFosc,��1T
  72   1          TMOD = 0x00;    //�趨��ʱ��1Ϊ16λ�Զ���װ��ʽ
  73   1          TL0 = 0xC0;     //���ö�ʱ��ֵ
  74   1          TH0 = 0x63;     //20ms
  75   1          TL1 = 0xCC;     //�趨��ֵ
  76   1          TH1 = 0xFF;     //�趨��ֵ
  77   1          TF0 = 0;        //���TF0��־
  78   1          TF1 = 0;        //���TF1��־
  79   1          TR0 = 0;
  80   1          TR1 = 1;        //������ʱ��1
  81   1          ET1 = 0;        //��ֹ��ʱ��1�ж�
  82   1      }
  83          /*-------------------------------------------------------
  84          ��������send_data
  85          ��  �������ڷ��͵��ֽں�����
  86          ��  �룺
  87              dat     Ҫ���͵��ֽڡ�
  88          �����ߣ�����
  89          �������̣���
  90          �������ڣ�2020-11-30
  91          �޸ļ�¼��
  92          -------------------------------------------------------*/
  93          void send_data(u8 dat){
  94   1          SBUF=dat;   //����һ�����ݡ�
  95   1          while(!TI); //�ȴ����ݷ��ꡣ
  96   1          TI=0;       //������ͱ�־λ��
  97   1      }
  98          /*-------------------------------------------------------
  99          ��������send_string
 100          ��  �������ڷ����ַ���������
 101          ��  �룺
 102              str     Ҫ���͵��ַ�����
 103          �����ߣ�����
 104          �������̣���
 105          �������ڣ�2020-11-30
 106          �޸ļ�¼��
 107          2020-12-08���Ż��˺�����ռ�ÿռ䡣
 108          -------------------------------------------------------*/
 109          void send_string(u8 code * str){
 110   1          while(*str){    //�ж��ַ����Ƿ�ͷ��
 111   2              SBUF=*str++;//����һ�����ݡ�
 112   2              while(!TI); //�ȴ����ݷ��ꡣ
 113   2              TI=0;       //������ͱ�־λ��
 114   2          }    
 115   1      }
 116          /*-------------------------------------------------------
C51 COMPILER V9.59.0.0   MAIN                                                              08/27/2022 22:38:02 PAGE 3   

 117          ��������send_num
 118          ��  �������ڷ���16λ���ݺ��������͸�ʽΪ%u��
 119          ��  �룺
 120              dat     Ҫ���͵����ݡ�
 121          �����ߣ�����
 122          �������̣���
 123          �������ڣ�2020-12-03
 124          �޸ļ�¼��
 125          -------------------------------------------------------*/
 126          void send_num(u16 dat){
 127   1          u8 n[5],i;
 128   1          for(i=0;i<5;i++){
 129   2              n[i]=dat%10;
 130   2              dat/=10;
 131   2          }
 132   1          if(n[4]){
 133   2              send_data('0'+n[4]);
 134   2          }
 135   1          if(n[4]|n[3]){
 136   2              send_data('0'+n[3]);
 137   2          }
 138   1          if(n[4]|n[3]|n[2]){
 139   2              send_data('0'+n[2]);
 140   2          }
 141   1          if(n[4]|n[3]|n[2]|n[1]){
 142   2              send_data('0'+n[1]);
 143   2          }
 144   1          send_data('0'+n[0]);
 145   1      }
 146          #endif
 147          #if 1//FLASH��������
 148          /*-------------------------------------------------------
 149          ��������eeprom_off
 150          ��  ����eeprom�رպ�����
 151          �����ߣ�����
 152          �������̣���
 153          �������ڣ�2020-11-30
 154          �޸ļ�¼��
 155          -------------------------------------------------------*/
 156          void eeprom_off(void){
 157   1          IAP_CONTR = 0;   //�ر�IAP����
 158   1          IAP_CMD   = 0;   //�������Ĵ���
 159   1          IAP_TRIG  = 0;   //��������Ĵ���
 160   1          IAP_ADDRH = 0xff;//����ַ���õ���IAP����
 161   1          IAP_ADDRL = 0xff;//����ַ���õ���IAP����
 162   1      }
 163          /*-------------------------------------------------------
 164          ��������eeprom_erase
 165          ��  ����eeprom�������������ڲ���һ��������
 166          ��  �룺
 167              addr    Ҫ�����ĵ�ַ��
 168          �����ߣ�����
 169          �������̣���
 170          �������ڣ�2020-11-30
 171          �޸ļ�¼��
 172          -------------------------------------------------------*/
 173          void eeprom_erase(u16 addr){
 174   1          IAP_CONTR = 0x81;       //ʹ��IAP
 175   1          IAP_CMD   = 3;          //����IAP��������
 176   1          IAP_ADDRL = addr;       //����IAP�͵�ַ
 177   1          IAP_ADDRH = addr >> 8;  //����IAP�ߵ�ַ
 178   1          IAP_TRIG  = 0x5a;       //�������(0x5a)
C51 COMPILER V9.59.0.0   MAIN                                                              08/27/2022 22:38:02 PAGE 4   

 179   1          IAP_TRIG  = 0xa5;       //�������(0xa5)
 180   1          _nop_();                //���Եȴ�һ��
 181   1          eeprom_off();           //�ر�IAP����
 182   1      }
 183          /*-------------------------------------------------------
 184          ��������eeprom_write
 185          ��  ����eeprom���ֽ�д������������ָ����ַдһ�����ݡ�
 186          ��  �룺
 187              addr    Ҫд��ĵ�ַ��
 188              dat     Ҫд������ݡ�
 189          �����ߣ�����
 190          �������̣���
 191          �������ڣ�2020-11-30
 192          �޸ļ�¼��
 193          -------------------------------------------------------*/
 194          void eeprom_write(u16 addr,u8 dat){
 195   1          IAP_CONTR = 0x81;       //ʹ��IAP
 196   1          IAP_CMD   = 2;          //����IAP���
 197   1          IAP_ADDRL = addr;       //����IAP�͵�ַ
 198   1          IAP_ADDRH = addr >> 8;  //����IAP�ߵ�ַ
 199   1          IAP_DATA  = dat;        //дIAP����
 200   1          IAP_TRIG  = 0x5a;       //�������(0x5a)
 201   1          IAP_TRIG  = 0xa5;       //�������(0xa5)
 202   1          _nop_();                //���Եȴ�һ��
 203   1          eeprom_off();           //�ر�IAP����
 204   1      }
 205          /*-------------------------------------------------------
 206          ��������eeprom_write_boot_area
 207          ��  ����eeprom���ֽ�дϵͳ��������������ָ������д������ݡ�
 208          ��  �룺
 209              addr    Ҫд��ĵ�ַ������Ҫϵͳ�����ڣ�
 210              buf     Ҫд������ݻ��棻
 211              len     Ҫд�������������
 212          �����ߣ�����
 213          �������̣���
 214          �������ڣ�2020-11-30
 215          �޸ļ�¼��
 216          2020-12-03���Ż��˹��ܣ�����ֻΪ�̶���������Ѽ�Сռ�ÿռ䣬
 217                      ����Ϊeeprom_write_boot_area��
 218          -------------------------------------------------------*/
 219          volatile u8 xdata eeprom_buf[512];//�����������ݵĻ���
 220          void eeprom_write_boot_area(u16 addr,u8 * buf,u16 len){
 221   1          u16 i,ad;
 222   1          for(i=0;i<512;i++){                //��ϵͳ��ԭ�������ݶ��������ŵ����浱�С�
 223   2              eeprom_buf[i]=(*(unsigned char code *)(BOOT_STATUS+i));
 224   2          }
 225   1          eeprom_erase(BOOT_STATUS);          //���ϵͳ����
 226   1          ad=addr-BOOT_STATUS;                //��ȡ��ַ��ƫ������
 227   1          for(i=0;i<len;i++){                 //������д�뵽���档
 228   2              eeprom_buf[i+ad]=buf[i];
 229   2          }
 230   1          for(i=0;i<512;i++){                 //������д�ص���Ƭ����
 231   2              eeprom_write(BOOT_STATUS+i,eeprom_buf[i]);
 232   2          }
 233   1      }
 234          #endif
 235          
 236          volatile u16 data_count=0,proj_count=0;//�������ݼ������������ݼ���������
 237          /*-------------------------------------------------------
 238          ��������data_save
 239          ��  �������ݱ��溯�������ڱ���Ӵ��ڽ��յ������ݡ�
 240          �����ߣ�����
C51 COMPILER V9.59.0.0   MAIN                                                              08/27/2022 22:38:02 PAGE 5   

 241          �������̣���
 242          �������ڣ�2020-12-24
 243          �޸ļ�¼��
 244          -------------------------------------------------------*/
 245          void data_save(void){
 246   1          u16 i;
 247   1          if(proj_count<=256){                            //����ܼ���С��256��˵���ǵ�һ�����ݡ�
 248   2              eeprom_write(APP_JMP_ADDR  ,eeprom_buf[1]); //��һ������ͨ������������ת��ַ��
 249   2              eeprom_write(APP_JMP_ADDR+1,eeprom_buf[2]); //����ת��ַ����������
 250   2              for(i=3;i<proj_count;i++){                  //Ȼ��д��ʣ�µ����ݡ�
 251   3                  eeprom_write(i,eeprom_buf[i]);
 252   3              }
 253   2          }else{                                          //������ǵ�һ�����ݣ�
 254   2              for(i=0;i<data_count;i++){                  //�Ǿ�ֱ�ӱ��浽flash�����ˡ�
 255   3                  eeprom_write(i+(proj_count-data_count),eeprom_buf[i]);
 256   3              }
 257   2          }
 258   1      }
 259          
 260          void main(void){
 261   1          u16 i;      //16λ��ʱ������
 262   1          u8 timeout; //ʱ�䳬ʱ��������
 263   1          IAP_TPS=24; //STC8G��STC8H�����ã�Ĭ��24MHz��
 264   1      /*------------------------------------------BootLoader��ʼ��-------------------------------*/
 265   1          if(read_boot_flag&GET_ENABLE){                                          //�ж��Dz��ǵ�һ������bootload
             -er��                    
 266   2              eeprom_write(BOOT_STATUS,       SET_ENABLE);                        //�ǵĻ�����λʹ�ܱ�־��
 267   2              eeprom_write( APP_JMP_ADDR,     (*(unsigned char code *)(0x0001))); //��ʼ��APP����ת��ַ��
 268   2              eeprom_write( APP_JMP_ADDR+1,   (*(unsigned char code *)(0x0002))); //
 269   2              eeprom_write(BOOT_JMP_ADDR,     (*(unsigned char code *)(0x0001))); //��ʼ��BOOT����ת��ַ��
 270   2              eeprom_write(BOOT_JMP_ADDR+1,   (*(unsigned char code *)(0x0002))); //
 271   2              eeprom_write(BOOT_STATUS,       SET_DONE);                          //��λ��ʼ����ϱ�־��
 272   2          }                                                                       //����BootLoader��ʼ����ɡ�
 273   1      /*------------------------------------------APP���---------------------------------------*/    
 274   1          jmp_app=(u32)read_boot_addr;                //Ĭ�ϰ�BootLoader�ĵ�ַ��APP��ַ����ֹ����ת��
 275   1          if((read_app__flag&PD_APP__OK)==APP__OK){   //�жϳ����Ƿ�Ϸ���
 276   2              jmp_app=(u32)read_app__addr;            //����Ϸ�����APP��ת��ַ����ת������
 277   2              if(BOOT_PIN==BOOT_RUN_APP){jmp_app();}  //BOOT��������ת��APP�ĵ�ƽ����ת��APP��
 278   2          }
 279   1      /*-----------------------------------BootLoader����--------------------------------------*/
 280   1          hard_init();                    //��ʼ�����ںͶ�ʱ����
 281   1          send_string("[Boot](0)\r\n");   //��ʾ������BOOT״̬��
 282   1          while(!RI);                     //�ȴ����ս����롣
 283   1          RI=0;                           //������ձ�־λ��
 284   1          if(SBUF!='!'){                  //������ǽ����룬˵�����ڴ�ʱ���Ҵ����ݵġ�
 285   2              send_string("[Lock](1)\r\n");//��ʾҪ������Ƭ����
 286   2              while(1);                    //��ѭ����������Ƭ�����ܼ������ء�
 287   2          }
 288   1      /*--------------------------------------���ؽ���------------------------------------------*/
 289   1          send_string("[Erase](2)\r\n");                                  //��ʾ��ʼ������
 290   1          eeprom_erase(0x0000);                                           //�Ȳ���һ������
 291   1          eeprom_write(0x0000,0x02);                                      //����д����תָ�
 292   1          eeprom_write(0x0001,(*(unsigned char code *)(BOOT_JMP_ADDR)));  //ȡ��BOOT����ת��ַ��8λ��д�뵽ָ���
             -�ַ�С�
 293   1          eeprom_write(0x0002,(*(unsigned char code *)(BOOT_JMP_ADDR+1)));//ȡ��ַ��8λ���ֳ��������ֽ�д�������
             -��Լӿ������ٶȡ�
 294   1          eeprom_write_boot_area(APP_START,INIT_MASK,APP_MAX);            //��ʼ��APP״̬����
 295   1          eeprom_write(APP_STATUS,SET_ENABLE);                            //д��APPʹ�ܱ�־λ��
 296   1          for(i=512;i<FLASH_SIZE;i+=512){                                 //���������������
 297   2              eeprom_erase(i);
 298   2          }
 299   1          data_count=0;               //���㵥�����ݼ�������
C51 COMPILER V9.59.0.0   MAIN                                                              08/27/2022 22:38:02 PAGE 6   

 300   1          proj_count=0;               //�����������ݼ�������
 301   1          send_string("[Start](3)");  //��ʾ��ʼ���ء�
 302   1          TR0=1;                      //�򿪶�ʱ���������ó�ʱ�жϡ�
 303   1          timeout=250;                //��һ�γ�ʱʱ��Ϊ250*20ms=5000ms=5s����λ�����������Ҫʱ�䣬��һ�γ�ʱ��
             -��Ҫ��һЩ��
 304   1          while(1){                                                           //��ѭ����������ݡ�
 305   2              while(!RI){                                                     //�ȴ����������ݡ�
 306   3                  if(TF0){                                                    //ÿ����ʱ�����ʱ��
 307   4                      TF0=0;                                                  //�����־λ��
 308   4                      timeout--;                                              //��ʱʱ��-1��
 309   4                      if(timeout==0){                                         //��ʱ�����0��ʱ��˵����ʱ�ˡ�
 310   5                          TR0=0;                                              //�رն�ʱ����
 311   5                          if(proj_count){                                     //����ڼ���������ݣ�
 312   6                              send_string("\r\n[Get ");                       //��ʾ�����˶������ݡ�
 313   6                              send_num(proj_count);
 314   6                              send_string(" Byte](4)\r\n");                   //��λ���ֽڡ�
 315   6                              data_save();                                    //������Щ���ݣ������ﱣ���ͨ����
             -���һ�������ݡ�
 316   6                              eeprom_write(APP_SIZE,    (u8)(proj_count>>8)); //��ȡAPP�Ĵ�С��8λ��д�뵽ָ����
             -ַ�С�
 317   6                              eeprom_write(APP_SIZE+1,(u8)(proj_count));      //��ȡAPP�Ĵ�С��8λ���ֳ���������
             -��д���������Լӿ������ٶȡ�
 318   6                              eeprom_write(APP_STATUS,SET_DONE);              //��װ��ɣ�д��ɱ�־λ��
 319   6                              jmp_app=(u32)read_app__addr;                    //��APP��ת��ַ����ת������
 320   6                          }else{                                              //����ڼ�û�н��յ����ݣ�
 321   6                              send_string("\r\n[Time Out](5)\r\n");           //��ʾ��ʱ��
 322   6                              jmp_app=(u32)read_boot_addr;                    //��BOOT����ת��ַ����ת������
 323   6                          }
 324   5                          jmp_app();                                          //���ؽ�����ϣ���ת��
 325   5                      }
 326   4                  }
 327   3              }
 328   2              TF0=0;                                        //������յ��������ݣ�ҲҪ���㶨ʱ����־λ��
 329   2              RI=0;                                        //ͬʱ������ձ�־λ��
 330   2              eeprom_buf[data_count++]=SBUF;                //�����յ����ݱ���������
 331   2              proj_count++;                                //ͳ��Ŀǰ�ѽ��յ����ݴ�С��
 332   2              if(data_count==256){                        //sscom5��λ����256�ֽڷ�һ��������ÿ�յ�256�ֽڵ�ʱ��
             -��
 333   3                  data_save();                            //��Ҫ�����ݱ���������
 334   3                  data_count=0;                            //ͬʱ��������ͳ�Ʊ�־λ��
 335   3              }
 336   2              if(proj_count>FLASH_SIZE){                    //������յ��Ĵ�С�����ܵĿռ䣬
 337   3                  send_string("\r\n[Overflow](6)\r\n");    //��ʾ���������
 338   3                  while(1);                                //��ѭ����������Ƭ����
 339   3              }
 340   2              timeout=50;                                    //��ʱʱ��Ϊ50*20ms=1000ms=1s
 341   2          }     
 342   1      } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    977    ----
   CONSTANT SIZE    =    110    ----
   XDATA SIZE       =    512    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7      19
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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