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

📄 monitor.lst

📁 基于单片机控制的汽车行驶状态纪录仪系统设计
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02b   MONITOR                                                              09/27/2005 23:33:35 PAGE 1   


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

stmt level    source

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

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

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

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

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

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

⌨️ 快捷键说明

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