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

📄 closetest.lst

📁 单片机程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.05   CLOSETEST                                                             11/25/2003 23:29:19 PAGE 1   


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

stmt level    source

   1          #include    <absacc.h>      //包含头文件
   2          #include    <reg51.h>       //包含头文件
   3          
   4          typedef unsigned char  byte;   //定义字节
   5          typedef unsigned int   word;   //定义字
   6          
   7          #define XTALL 11.0592      //定义晶振频率
   8          #define DLY_1MS (word)(1500*XTALL/12)   //1ms延时计数次数设定
   9          
  10          #define SECOND  (*(byte xdata*)0x4000)   //秒
  11          #define MINUTE  (*(byte xdata*)0x4002)   //分
  12          #define HOUR    (*(byte xdata*)0x4004)   //小时
  13          #define DAY     (*(byte xdata*)0x4006)   //天
  14          #define WEEK    (*(byte xdata*)0x4007)   //星期
  15          #define MONTH   (*(byte xdata*)0x4008)   //月
  16          #define YEAR    (*(byte xdata*)0x4009)   //年
  17          #define MCA     (*(byte xdata*)0x400a)   //寄存器A
  18          #define MCB     (*(byte xdata*)0x400b)   //寄存器B
  19          #define MCC     (*(byte xdata*)0x400c)   //寄存器C
  20          #define MCD     (*(byte xdata*)0x400d)   //寄存器D
  21          
  22          #define TIMES      ((byte xdata*)0x400e) //开关时间及次第保存地址
  23          
  24          #define DAY_SUM    ((byte xdata*)0x407c) //继电器闭合总天数
  25          #define PRESS_SUM  ((byte xdata*)0x407d) //继电器闭合总次数        
  26          #define CUR_DAY    ((byte xdata*)0x407e) //上次中断日期
  27          
  28          /*byte code ASC2[19][5]={       //各字符对应的ASC2码
  29                                               {  49,130,131,132,133 }, //1 R L U D_ARROW 
  30                                               {  50,65,66,67,35 }, //2 A B C #
  31                                               {  51,68,69,70,63 }, //3 D E F ?
  32                                               {  52,71,72,73,33 }, //4 G H I !
  33                                               {  53,74,75,76,60 }, //5 J K L <
  34                                               {  54,77,78,79,62 }, //6 M N O > 
  35                                               {  55,80,81,82,83 }, //7 P Q R S
  36                                               {  56,84,85,86,44 }, //8 T U V ,
  37                                               {  57,87,88,89,90 }, //9 W X Y Z 
  38                                       {  50,97,98,99,35 }, //2 a b c #
  39                                               {  51,100,101,102,63 }, //3 d e f ?
  40                                               {  52,103,104,105,33 }, //4 g h i !
  41                                               {  53,106,107,108,60 }, //5 j k l <
  42                                               {  54,109,110,111,62 }, //6 m n o >
  43                                               {  55,112,113,114,115}, //7 p q r s 
  44                                               {  56,116,117,118,44 }, //8 t u v ,
  45                                               {  57,119,120,121,122 }, //9 w x y z
  46                                               {  41,38,36,32,37}, // $ ¥ 空格  % 
  47                                               {  48,43,45,47,92 }};//0 + - / \*  */
  48          
  49          byte lcddata,datadr,last_day,last_hour,last_minute,key_num,move_num,press_num,days_sum;
  50          byte last_num,timeout,tiancha,check_num,num1,num2,num3;
  51          sbit RS=P3^4;
  52          sbit RW=P3^5;
  53          sbit E=P3^3;
  54          //sbit sqwe_flag=P2^5;
  55          sbit int0_flag=P2^6;
C51 COMPILER V7.05   CLOSETEST                                                             11/25/2003 23:29:19 PAGE 2   

  56          sbit uip_bit=ACC^7;
  57          bit busy_flag,changetime_flag,checktime_flag,key_flag,close_flag,flash_flag,del_flag,daycheck_flag;//sqw_f
             -lag;
  58          //////////////////////////////////////////////////////////////////////////
  59          void delay(){//延时子程序
  60   1           byte d=8;
  61   1               while(d)d--;
  62   1      }
  63          void  timer0_isr()  interrupt  1  using 1{      //定时器中断程序入口*/
  64   1            TR0=0;                                      //定时1毫秒进入中断*/
  65   1            TH0=-(DLY_1MS/256);
  66   1            TL0=-(DLY_1MS%256);
  67   1             TR0=1;                                       //1毫秒中断次数加1*/   
  68   1             num1++;                                         
  69   1             if (num1==100)                             //100毫秒定时到*/
  70   1               {          
  71   2                 num1=0;num2++;num3++;
  72   2                 }
  73   1                 if(num2==5)                                   //500ms延时*/
  74   1                    {
  75   2                        flash_flag=~flash_flag;num2=0;
  76   2                 }
  77   1                 if(num3==20){       //2s检测一次日期变化                       
  78   2                    daycheck_flag=1;num3=0;
  79   2                 }
  80   1         }   
  81          void check(){//忙状态检测子程序
  82   1           byte d;
  83   1           RS=0;
  84   1               RW=1;
  85   1               E=0;
  86   1               E=1;
  87   1           d=P1&0x80;
  88   1           E=0; 
  89   1           if(d!=0) busy_flag=1;
  90   1           else busy_flag=0;
  91   1      }
  92          void check_busy(){//等待直到可以写入
  93   1           do{
  94   2                  check();
  95   2               }while(busy_flag);
  96   1      }
  97          void write_data(){//数据写入子程序
  98   1           check_busy();
  99   1           E=0;
 100   1               RS=1;
 101   1               RW=0;
 102   1               E=1;
 103   1           P1=lcddata;
 104   1               E=0;
 105   1           delay();
 106   1      }
 107          void write_dr(){//数据写入地址指定,从0x00---0x13,0x40---0x53
 108   1           check_busy();
 109   1           E=0;
 110   1           RS=0;
 111   1           RW=0;
 112   1           E=1;
 113   1           P1=0x80+datadr;
 114   1           E=0;
 115   1           delay();
 116   1      }
C51 COMPILER V7.05   CLOSETEST                                                             11/25/2003 23:29:19 PAGE 3   

 117          void clr_lcd(){//清屏子程序
 118   1           check_busy();
 119   1           E=0;
 120   1               RS=0;
 121   1               RW=0;
 122   1               E=1;
 123   1               P1=0x01;
 124   1               E=0;
 125   1           delay();
 126   1      }
 127          void set_lcd(){//lcd屏设置为8位,2行,5*7点矩阵
 128   1           check_busy();
 129   1           RS=0;
 130   1               RW=0;
 131   1               E=1;
 132   1               P1=0x38;
 133   1               E=0;
 134   1           delay();
 135   1      }
 136          void lcd_on(){//lcd屏点亮,显示
 137   1           check_busy();
 138   1           RS=0;
 139   1               RW=0;
 140   1               E=1;
 141   1               P1=0x0c;
 142   1               E=0;
 143   1           delay();
 144   1      }
 145          void lcd_off(){//lcd屏熄灭,不显示
 146   1           check_busy();
 147   1           RS=0;
 148   1           RW=0;
 149   1               E=1;
 150   1               P1=0x08;
 151   1               E=0;
 152   1           delay();
 153   1      }
 154          void cursor_move(){//光标移动模式设定
 155   1           check_busy();
 156   1           RS=0;
 157   1           RW=0;
 158   1               E=1;
 159   1               P1=0x06;
 160   1               E=0;
 161   1      } 
 162          void start_lcd(){//lcd初始化
 163   1           set_lcd();
 164   1           lcd_off();
 165   1           cursor_move();
 166   1      }
 167          void read_initstat(){//时钟芯片忙检测
 168   1          do{
 169   2                  ACC=MCA;
 170   2                      }while(uip_bit);
 171   1      } 
 172          void int0_place(){//继电器按下一次总次数和上次按下时间改变
 173   1        byte i,j,a,y,z;
 174   1        if(!close_flag){//第一次按下继电器
 175   2           last_hour=HOUR;
 176   2           last_minute=MINUTE;
 177   2               //MCB=0x80;
 178   2           if((*DAY_SUM==0)||(*DAY_SUM==1)){//总天数尚为0,第一次
C51 COMPILER V7.05   CLOSETEST                                                             11/25/2003 23:29:19 PAGE 4   

 179   3                  j=*(TIMES+1);//当天的按键次数加1
 180   3                  if(j<54){
 181   4                          j++;
 182   4                  *(TIMES+1)=j;
 183   4                      }       
 184   3                  *DAY_SUM=1;
 185   3              *TIMES=0;
 186   3                      i=*PRESS_SUM;
 187   3                      if(i<54){
 188   4                          i++;
 189   4                          *PRESS_SUM=i;
 190   4                      }
 191   3                      for(z=0;z<2*(*PRESS_SUM);z++){
 192   4                          *(TIMES+2*(*PRESS_SUM)+3-z)=*(TIMES+2*(*PRESS_SUM)+1-z);
 193   4                      }
 194   3                      *TIMES=0;
 195   3                      *(TIMES+2)=last_hour;
 196   3              *(TIMES+3)=last_minute; 
 197   3              //MCB=0x20;
 198   3           }
 199   2           else if(*DAY_SUM>1){//非第一天
 200   3                      if((2*(*PRESS_SUM)+2*(*DAY_SUM))<109){
 201   4                              for(y=0;y<2*(*PRESS_SUM);y++){
 202   5                                   *(TIMES+2*(*DAY_SUM)+2*(*PRESS_SUM)+1-y)=*(TIMES+2*(*DAY_SUM)+2*(*PRESS_SUM)-1-y);
 203   5                              }
 204   4                  *TIMES=0;
 205   4                  a=*(TIMES+1);
 206   4                              a++;
 207   4                              *(TIMES+1)=a;
 208   4                              y=*PRESS_SUM;
 209   4                              y++;
 210   4                              *PRESS_SUM=y;
 211   4                  }
 212   3              else if((2*(*PRESS_SUM)+2*(*DAY_SUM))>=110){
 213   4                              for(y=0;y<2*(*PRESS_SUM)-2;y++){
 214   5                                  *(TIMES+109-y)=*(TIMES+109-2-y);
 215   5                              }
 216   4                              z=*(TIMES+2*(*DAY_SUM)-1);
 217   4                              if(z>1){
 218   5                                   z--;
 219   5                       *(TIMES+2*(*DAY_SUM)-1)=z;
 220   5                          }
 221   4                              else if(z==1){
 222   5                                   for(y=0;y<2*(*PRESS_SUM-1);y++){
 223   6                                           *(TIMES+2*(*DAY_SUM-1)+y)=*(TIMES+2*(*DAY_SUM-1)+2+y);
 224   6                                       }
 225   5                                       i=*DAY_SUM;
 226   5                                       i--;
 227   5                                       *DAY_SUM=i;
 228   5                       i=*PRESS_SUM;
 229   5                                       i--;
 230   5                                       *PRESS_SUM=i;
 231   5                              }
 232   4                              else if(z==0){
 233   5                                   for(y=0;y<2*(*PRESS_SUM-1);y++){
 234   6                                           *(TIMES+2*(*DAY_SUM-1)+y)=*(TIMES+2*(*DAY_SUM-1)+2+y);
 235   6                                       }
 236   5                                       i=*DAY_SUM;
 237   5                                       i--;
 238   5                                       *DAY_SUM=i;
 239   5                              }
 240   4                  *TIMES=0;
C51 COMPILER V7.05   CLOSETEST                                                             11/25/2003 23:29:19 PAGE 5   

 241   4                  a=*(TIMES+1);
 242   4                  a++;
 243   4                  *(TIMES+1)=a;
 244   4                  }
 245   3              *(TIMES+2*(*DAY_SUM))=last_hour;
 246   3              *(TIMES+2*(*DAY_SUM)+1)=last_minute;
 247   3              }
 248   2              
 249   2          datadr=0x46;//清除以前的次数10位
 250   2          write_dr();
 251   2          lcddata=0x20;
 252   2          write_data();
 253   2          datadr=0x46;//写入新的次数10位
 254   2          write_dr();
 255   2          lcddata=0x30+*(TIMES+1)/10;
 256   2          write_data();
 257   2           
 258   2          datadr=0x47;//清除以前的次数个位
 259   2          write_dr();

⌨️ 快捷键说明

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