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

📄 monitor.lst

📁 汽车行驶状态记录仪,使用单片机和CPLD开发
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02b   MONITOR                                                              01/18/2005 13:48:05 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE MONITOR
OBJECT MODULE PLACED IN monitor.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE monitor.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <at898252.h>
   2          #include <absacc.h>
   3          #include "vehicle.h"
   4          
   5          #define LIMIT 60
   6          #define uint unsigned int
   7          #define uchar unsigned char
   8          
   9          #define CSA P1_1
  10          #define CSB P1_2
  11          #define DI P1_3
  12          #define RW P1_0
  13          
  14          sbit uip_bit=ACC^7;//ds12c887 register a bit 7
  15          sbit busy_bit=ACC^7;//lcd state byte bit 7
  16          sbit run_bit=P3^3; 
  17          
  18          uchar timer0_flag=0;
  19          uchar int0_flag=0;
  20          uchar active_buffer=1;
  21          
  22          uint page_counter=0;
  23          uint buffer_counter=0;
  24          //uchar active_buffer=1;
  25          uchar circle=0;
  26          uchar time_counter=0;
  27          uchar year,month,day,hour,min,sec;
  28          unsigned long ttcy=0;
  29          
  30          //delay 100ms,should be adjusted for frequency and compile
  31          void dl_100ms(void)
  32          {
  33   1              unsigned char i,j;
  34   1              for (i=10;i>0;i--) for (j=0;j<250;j++) ; 
  35   1      }
  36          
  37          /*下面是对液晶屏gxm12864d操作的函数,其内置的控制器是hd61202,
  38            128x64点阵,汉字显示,CSA,CSB用来进行左右显示区的选择。
  39            R/W,D/I两个信号我没有接在地址线上,而是用单独的端口控制,
  40            数据访问通过对外部数据区的0xffff访问实现。E信号由地址译码产生
  41          */
  42          
  43          /*  发命令i到主窗口*/
  44          void lcd_mwc(uchar i)
  45          {
  46   1           CSA=1;
  47   1           CSB=0;
  48   1           RW=1;
  49   1           DI=0;
  50   1           do {ACC=LCD;} 
  51   1               while (busy_bit) ;//wait for lcd not busy
  52   1           RW=0;
  53   1           LCD=i;
  54   1      }
  55          
C51 COMPILER V7.02b   MONITOR                                                              01/18/2005 13:48:05 PAGE 2   

  56          /*  写数据i到主窗口*/
  57          void lcd_mwd(uchar i)
  58          {
  59   1           CSA=1;
  60   1           CSB=0;
  61   1           RW=1;
  62   1           DI=0;
  63   1           do {ACC=LCD;} while (busy_bit);//wait for lcd not busy
  64   1           RW=0;
  65   1           DI=1;
  66   1           LCD=i;
  67   1      }
  68          
  69          /*   清屏                                */
  70          void lcd_clear(void)
  71          {
  72   1           uchar i;
  73   1           uchar page;
  74   1           for (page=0xb8;page<0xc0;page++)
  75   1               {
  76   2                   lcd_mwc(page);       /*设置显示页面*/
  77   2      
  78   2                   lcd_mwc(0x40);          /*设置列地址*/
  79   2       
  80   2                   for (i=0;i<64;i++)
  81   2                   {
  82   3         
  83   3                       lcd_mwd(0);
  84   3                   }
  85   2               }
  86   1      }
  87          
  88          //初始化lcd
  89          void lcd_init(void)
  90          {
  91   1              lcd_mwc(0xc0);
  92   1      
  93   1              lcd_mwc(0x3f);
  94   1      
  95   1      }
  96          
  97          //dispm_hz_up() display up half of a hanzi in left area
  98          void dispm_hz_up(uchar code * hz)
  99          {
 100   1              uchar i;
 101   1              for (i=0;i<16;i++) lcd_mwd(*(hz+i));
 102   1      }
 103          
 104          //dispm_hz_down() display down half of a hanzi in left area
 105          void dispm_hz_down(uchar code * hz)
 106          {
 107   1              uchar i;
 108   1              for (i=16;i<32;i++) lcd_mwd(*(hz+i));
 109   1      }
 110          
 111          void disp_num(uchar i)
 112          {
 113   1              uchar j;
 114   1              for (j=0;j<8;j++) lcd_mwd(ARAB[j+i*8]);
 115   1      }
 116          
 117          
C51 COMPILER V7.02b   MONITOR                                                              01/18/2005 13:48:05 PAGE 3   

 118          /*set mcu counter0 as 5s timer,clk is 500ms*/
 119          
 120          void set_5s_counter(void)
 121          {
 122   1              TMOD=0x16;//counter0 mode 2 
 123   1              TH0=-10;
 124   1              TL0=-10;
 125   1              IP=0x01;//int0 high,counter0 low
 126   1              IT0=1;
 127   1              EA=1;//enable interrupt
 128   1              ET0=1;
 129   1              EX0=1;
 130   1              TR0=1;
 131   1      }
 132          
 133          /*下面是对flash存储卡at45d041的操作,数据接口为spi接口,
 134            卡共2048页,每页264字节
 135          */
 136          
 137          void write_spi(uchar dat)
 138          {
 139   1             SPDR = dat;
 140   1             while (!(SPSR & 0x80)) ;             // wait for data transfer to be completed
 141   1      }
 142          
 143          uchar df_busy(void)
 144          {
 145   1          P1 &= ~DF_CHIP_SELECT;               // enable DataFlash
 146   1          
 147   1         write_spi(STAT_REG_READ);
 148   1         write_spi(0x00);                       // don't cares
 149   1         
 150   1         P1 |= DF_CHIP_SELECT;                // disable DataFlash 
 151   1         return SPDR;
 152   1      }
 153          
 154          //write_to_flash write data to buffer,if buffer is full write buffer to memory page
 155          void write_to_flash(uchar flash_data)
 156          { 
 157   1          //  checking if flash is busy
 158   1          while (!(df_busy()&0x80)) ;
 159   1          P1 &= ~DF_CHIP_SELECT;               // enable DataFlash
 160   1           
 161   1          if (active_buffer==1) write_spi(BUFFER_1_WRITE);
 162   1          else write_spi(BUFFER_2_WRITE);
 163   1          write_spi(0x00);                       // don't cares
 164   1          write_spi((uchar)(buffer_counter>>8)); // don't cares plus first bit of buffer address
 165   1          write_spi((uchar)buffer_counter);      // buffer address 
 166   1          write_spi(flash_data);                   // write data into SPI Data Register
 167   1              
 168   1          P1 |= DF_CHIP_SELECT;                // disable DataFlash 
 169   1          
 170   1          buffer_counter++; 
 171   1              
 172   1          if (buffer_counter > 263)               // if buffer full write buffer into memory page
 173   1          {
 174   2              buffer_counter = 0;
 175   2              if (page_counter < 2047)            // if memory is not full   
 176   2              { 
 177   3                  P1 &= ~DF_CHIP_SELECT;       // enable DataFlash
 178   3      
 179   3                  if (active_buffer==1) write_spi(B1_TO_MM_PAGE_PROG_WITHOUT_ERASE);// write data from buffer1 t
C51 COMPILER V7.02b   MONITOR                                                              01/18/2005 13:48:05 PAGE 4   

             -o page 
 180   3                  else write_spi(B2_TO_MM_PAGE_PROG_WITHOUT_ERASE);//write data from buffer2 to page
 181   3                  write_spi((uchar)(page_counter>>7));
 182   3                  write_spi((uchar)(page_counter<<1));
 183   3                  write_spi(0x00);                    // don't cares
 184   3              
 185   3                  P1 |= DF_CHIP_SELECT;        // disable DataFlash
 186   3                  page_counter++;              //page_counter 指向下一可用页
 187   3              }
 188   2              if (active_buffer==1) active_buffer=0;
 189   2              else active_buffer=1;
 190   2          }  
 191   1      }
 192          
 193          uchar cardin(void)
 194          {
 195   1              SPCR=0x5d;//interrupt disabled,spi enabled,master,msb first,spi mode 3,Fosc/16
 196   1              
 197   1              P1 &= ~DF_CHIP_SELECT;               // enable DataFlash
 198   1              
 199   1              write_spi(MAIN_MEMORY_PAGE_READ) ;
 200   1              write_spi(0x00) ;
 201   1              write_spi(0x00) ;
 202   1              write_spi(0x00) ;
 203   1              write_spi(0x00) ;
 204   1              write_spi(0x00) ;
 205   1              write_spi(0x00) ;
 206   1              write_spi(0x00) ;
 207   1              write_spi(0xff) ;//write dummy value to start register shift
 208   1              
 209   1              P1 |= DF_CHIP_SELECT ;//disable flash card
 210   1              return SPDR;
 211   1      }
 212          
 213          /*下面是对日历时钟芯片ds12c887的部分操作,芯片初始化的操作在settime.c中实现*/
 214          
 215          //getlstpage()从DS12C887中读取最近可用页地址
 216          uint getcurpage(void)
 217          {
 218   1              uchar i=0;
 219   1              uint j=0;
 220   1              i=TIME_LSTPGH;
 221   1              j=i+j;//maybe wrong
 222   1              i=TIME_LSTPGL;
 223   1              j=j<<8;
 224   1              j=j+i;
 225   1              return j;
 226   1      }
 227          
 228          //getfrnpg()从DS12C887中读取最近可用的存放终止页地址的页地址
 229          uint getfrnpg(void)
 230          {
 231   1              uchar i=0;
 232   1              uint j=0;
 233   1              i=TIME_FRNPGH;
 234   1              j+=i;
 235   1              i=TIME_FRNPGL;
 236   1              j=j<<8;
 237   1              j+=i;
 238   1              return j;
 239   1      }
 240          
C51 COMPILER V7.02b   MONITOR                                                              01/18/2005 13:48:05 PAGE 5   

 241          //storetime() read time from ds12887 then store in flash card
 242          void storetime(void)
 243          {
 244   1      //      uchar year,month,day,hour,min,sec;
 245   1              do {ACC=TIME_A;} while (uip_bit) ;//wait for UIP bit turn 0
 246   1              sec=TIME_SEC;
 247   1              min=TIME_MIN;
 248   1              hour=TIME_HOUR;
 249   1              day=TIME_DAY;
 250   1              month=TIME_MONTH;
 251   1              year=TIME_YEAR;
 252   1              write_to_flash(year);
 253   1              write_to_flash(month);
 254   1              write_to_flash(day);
 255   1              write_to_flash(hour);
 256   1              write_to_flash(min);
 257   1              write_to_flash(sec);
 258   1      }
 259          
 260          /*下面是键盘扫描和给键赋值的操作*/
 261          
 262          //keyscan() scan keyboard and return key code
 263          uchar keyscan(void)     
 264          {
 265   1              uchar sccode,recode;
 266   1              P2=0x78;
 267   1              if ((P2&0x78)!=0x78)
 268   1              {
 269   2                      dl_100ms();
 270   2                      if ((P2&0x78)!=0x78)
 271   2                      {
 272   3                              sccode=0xfe;
 273   3                              while ((sccode&0x08)!=0)
 274   3                              {
 275   4                                      P2=sccode;
 276   4                                      if((P2&0x78)!=0x78)
 277   4                                      {
 278   5                                              recode=(P2&0x78)|0x87;
 279   5                                              return ((~sccode)+(~recode));
 280   5                                      }
 281   4                                      else sccode=(sccode<<1)|0x01;
 282   4                              }
 283   3                      }
 284   2              }
 285   1              return (0);
 286   1      }
 287          
 288          
 289          //getkey() translate key code to number ,return keyboard input number
 290          uint getkey(void)
 291          {
 292   1              uchar num1=0;
 293   1              uint num2=0;
 294   1              while (num1!=0x44)
 295   1              {
 296   2                      num1=keyscan();
 297   2                      switch(num1)
 298   2                      {
 299   3                              case 0x09:
 300   3                                      num1=0;
 301   3                                      num2=num2*10;
 302   3                                      disp_num(num1);
C51 COMPILER V7.02b   MONITOR                                                              01/18/2005 13:48:05 PAGE 6   

 303   3                                      break;
 304   3                              case 0x11:
 305   3                                      num1=1;
 306   3                                      num2=num2*10+num1;
 307   3                                      disp_num(num1);
 308   3                                      break;
 309   3                              case 0x21:

⌨️ 快捷键说明

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