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

📄 text1.lst

📁 用汇编语言写的时钟的程序
💻 LST
字号:
C51 COMPILER V6.23a  TEXT1                                                                 06/18/2007 17:49:32 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: E:\学习资料\专业软件\单片机\KEIL非安装版\Keil\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEN
                    -D

stmt level    source

   1          #include<reg52.h>
   2          code unsigned char ledcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0
             -x71};
   3          struct Time
   4          {
   5           unsigned char flag;
   6           unsigned char second;
   7           unsigned char minute;
   8           unsigned char hour;
   9           unsigned int ms;
  10          
  11          }gTime;
  12          unsigned char tag=0;
  13          unsigned char adjust_tag=0;
  14          void TimeOut(void);
  15          void keyIn(unsigned char keydata);
  16          unsigned char keyOut(void);
  17          unsigned char getkey(void);
  18          void msCall(void);
  19          void SLEDScan(void);
  20          void keyscan(void);
  21          void ledchange(void);
  22          unsigned char keybufWp=0;
  23          unsigned char keybufRp=0;
  24          unsigned char keybuf[8];
  25          unsigned char Disbuf[4]={0x00, 000, 0x00, 0x00};
  26          void Initial (void)
  27          { 
  28   1        CP_RL2=0;
  29   1        C_T2=0;
  30   1        RCAP2H=-(1843>>8);
  31   1        RCAP2L=-1843;
  32   1        TR2=1;
  33   1        ET2=1;
  34   1        EA=1;
  35   1      }
  36          
  37          void Timer1(void) interrupt 5
  38          {
  39   1              TF2=0;
  40   1        msCall();
  41   1       
  42   1      }
  43          
  44          void msCall(void)
  45          {
  46   1       SLEDScan(); 
  47   1       keyscan();
  48   1       if(adjust_tag==0)
  49   1          TimeOut();
  50   1      }
  51          
  52          void SLEDScan(void)
  53          {
C51 COMPILER V6.23a  TEXT1                                                                 06/18/2007 17:49:32 PAGE 2   

  54   1        static unsigned char sts=0;
  55   1         P2|=0x0f;
  56   1         switch(sts)
  57   1          {
  58   2           case 0 ://;break;
  59   2           case 1 :P0=ledcode[Disbuf[3]];P2&=0xf7;break;
  60   2           case 2 :P0=ledcode[Disbuf[2]];P2&=0xfb;break;  
  61   2           case 3 :P0=ledcode[Disbuf[1]];P2&=0xfd;break;
  62   2               case 4 :
  63   2                  if( gTime.flag )
  64   2                                 {
  65   3                                               P0=0x80;
  66   3                                   P2&=0xfd;
  67   3                                                       break;
  68   3                          }
  69   2               else
  70   2                             {
  71   3                                 P0=0x00;
  72   3                             P2&=0xfd;
  73   3                                  break;
  74   3                      } 
  75   2           case 5 :P0=ledcode[Disbuf[0]];P2&=0xfe;break; 
  76   2          }
  77   1        if(++sts>=6) sts=1;
  78   1      
  79   1      }
  80          
  81           void keyIn(unsigned char keydata)
  82            {
  83   1         keybuf[keybufWp]=keydata;
  84   1          if (++keybufWp>=8) 
  85   1                   keybufWp=0;
  86   1        }
  87          
  88           unsigned char keyOut(void)
  89           { unsigned char retvalue;
  90   1         while (keybufRp==keybufWp);
  91   1         retvalue=keybuf[keybufRp];
  92   1         if (++keybufRp>=8) keybufRp=0;
  93   1         return(retvalue);
  94   1       }
  95           
  96          void keyscan(void)
  97          {
  98   1              static unsigned char sts=0;
  99   1              static unsigned char cut=10;
 100   1              unsigned char keyvalue;
 101   1      
 102   1              if( --cut != 0 ) return;
 103   1              cut = 10;
 104   1              switch( sts )
 105   1              {
 106   2                      case 0:// ; 
 107   2      
 108   2                      case 1:
 109   2                              if( getkey() != 0xff )
 110   2                          {
 111   3                                      keyvalue = getkey();
 112   3                                      sts = 2;
 113   3                              }
 114   2                              break;
 115   2      
C51 COMPILER V6.23a  TEXT1                                                                 06/18/2007 17:49:32 PAGE 3   

 116   2               case 2:
 117   2                   if(keyvalue!=getkey())
 118   2                      {
 119   3                               sts=1; 
 120   3                               break;
 121   3                              }
 122   2                              
 123   2                 else
 124   2                         {
 125   3                         keyIn(keyvalue);
 126   3                         sts=3;
 127   3                         }
 128   2                         break;
 129   2               case 3:
 130   2                   if(getkey()==0xff)
 131   2                          sts=4;
 132   2                          break;
 133   2               case 4:if(getkey()!=0xff) 
 134   2                        {
 135   3                                sts=3;
 136   3                                break;
 137   3                                }
 138   2                       else 
 139   2                               sts=1;
 140   2                               break;
 141   2              }
 142   1       }
 143          
 144          
 145          unsigned char getkey(void)
 146           { unsigned char p,x,y;
 147   1         P1=0x0f;
 148   1         x=P1;
 149   1         P1=0xf0;
 150   1         y=P1;
 151   1         p=x|y;
 152   1         switch(p)
 153   1           {  
 154   2             case 0xee : return(0x0c);break;               
 155   2             case 0xde : return(0x0d);break;
 156   2                 case 0xbe : return(0x0e);break;
 157   2                 case 0x7e : return(0x0f);break;
 158   2                 case 0xed : return(0x08);break;
 159   2                 case 0xdd : return(0x09);break;
 160   2                 case 0xbd : return(0x0a);break;
 161   2                 case 0x7d : return(0x0b);break;
 162   2                 case 0xeb : return(0x04);break;
 163   2                 case 0xdb : return(0x05);break;
 164   2                 case 0xbb : return(0x06);break;
 165   2                 case 0x7b : return(0x07);break;
 166   2                 case 0xe7 : return(0x00);break;
 167   2                 case 0xd7 : return(0x01);break;
 168   2                 case 0xb7 : return(0x02);break;
 169   2                 case 0x77 : return(0x03);break;
 170   2                 case 0xff : return(0xff);break;
 171   2           }
 172   1       }
 173          void TimeOut(void)
 174          {
 175   1      
 176   1       if (++gTime.ms<1000) return;
 177   1          {
C51 COMPILER V6.23a  TEXT1                                                                 06/18/2007 17:49:32 PAGE 4   

 178   2           gTime.ms=0;
 179   2               tag=1;
 180   2               }
 181   1       if ( ++gTime.second<60) return;
 182   1           gTime.second=0;
 183   1       if ( ++gTime.minute<60) return;
 184   1           gTime.minute=0;
 185   1       if ( ++gTime.hour<24)  return;
 186   1           gTime.hour=0;
 187   1      
 188   1      }
 189          void mode1( void )/* 模式1  显示分秒 且让第2个小数点常亮*/
 190          {
 191   1        Disbuf[3]=gTime.second%10;
 192   1        Disbuf[2]=gTime.second/10;
 193   1        Disbuf[1]=gTime.minute%10;
 194   1        Disbuf[0]=gTime.minute/10;
 195   1        gTime.flag=1;
 196   1      }
 197          
 198          void mode2( void )/*模式2   显示时分 让第2个小数点闪烁 */
 199            {  
 200   1         
 201   1             Disbuf[3]=gTime.minute%10;
 202   1             Disbuf[2]=gTime.minute/10;
 203   1             Disbuf[1]=gTime.hour%10;
 204   1             Disbuf[0]=gTime.hour/10;
 205   1             gTime.flag=(gTime.flag+1)%2;;
 206   1                 
 207   1        }
 208          unsigned char khit(void)/*判断是否有键按下 有键盘返回值 无返回0*/
 209          {
 210   1        return (keybufWp-keybufRp);
 211   1      }
 212          void changemode(void)/*  分状态显示,每按一次C键,模式切换一次*/
 213          {
 214   1       static unsigned char sts=0;//状态标志
 215   1       unsigned char Data=0;
 216   1               if(khit())
 217   1                Data=keyOut();
 218   1                if(Data==0xc)
 219   1           sts=(sts+1)%2;                     
 220   1         switch(sts)
 221   1         { 
 222   2          case 0 : mode1();break;
 223   2              case 1 : mode2();break;
 224   2         } 
 225   1      }
 226          void adjust1(void)
 227          {
 228   1          unsigned char time;
 229   1                 gTime.second=0;
 230   1             Disbuf[3]=0x00;
 231   1             Disbuf[2]=0x00;
 232   1                 Disbuf[1]=0x00;
 233   1             Disbuf[0]=0x01;
 234   1         while (khit()==0);
 235   1           {
 236   2              time=keyOut();
 237   2              Disbuf[2]=time;
 238   2              gTime.second=10*time;  
 239   2           }
C51 COMPILER V6.23a  TEXT1                                                                 06/18/2007 17:49:32 PAGE 5   

 240   1         while (khit()==0);
 241   1           {
 242   2             time=keyOut();
 243   2             Disbuf[3]=time;
 244   2             gTime.second=gTime.second+time; 
 245   2           }
 246   1        
 247   1          
 248   1      }
 249          void adjust2(void)
 250          {
 251   1          unsigned char time;
 252   1               gTime.minute=0;
 253   1             Disbuf[3]=0x00;
 254   1             Disbuf[2]=0x00;
 255   1                 Disbuf[1]=0x00;
 256   1             Disbuf[0]=0x02;
 257   1         while (khit()==0);
 258   1           {
 259   2              time=keyOut();
 260   2              Disbuf[2]=time;
 261   2              gTime.minute=10*time;  
 262   2           }
 263   1         while (khit()==0);
 264   1           {
 265   2             time=keyOut();
 266   2             Disbuf[3]=time;
 267   2             gTime.minute=gTime.minute+time; 
 268   2           }
 269   1      
 270   1      }
 271          
 272          void adjust3(void)
 273          {
 274   1          unsigned char time;
 275   1               gTime.hour=0;
 276   1             Disbuf[3]=0x00;
 277   1             Disbuf[2]=0x00;
 278   1                 Disbuf[1]=0x00;
 279   1             Disbuf[0]=0x03;
 280   1         while (khit()==0);
 281   1           {
 282   2              time=keyOut();
 283   2              Disbuf[2]=time;
 284   2              gTime.hour=10*time;  
 285   2           }
 286   1         while (khit()==0);
 287   1           {
 288   2             time=keyOut();
 289   2             Disbuf[3]=time;
 290   2             gTime.hour=gTime.hour+time; 
 291   2           }
 292   1       
 293   1      }
 294          void adjust(void)
 295          {   
 296   1                                
 297   1              adjust3();
 298   1          adjust2();            
 299   1              adjust1();
 300   1                
 301   1      }
C51 COMPILER V6.23a  TEXT1                                                                 06/18/2007 17:49:32 PAGE 6   

 302           void main(void)
 303          {  
 304   1         Initial();
 305   1         while(1)
 306   1         {   
 307   2          unsigned char Data=0;
 308   2               if(khit())
 309   2                {
 310   3              Data=keyOut();  
 311   3              if(Data==0xa)
 312   3                 {
 313   4                      adjust_tag=1;
 314   4                      adjust();
 315   4                          adjust_tag=0;
 316   4                     }
 317   3                  else
 318   3                        keybufRp--;   
 319   3            }
 320   2         if( tag==1)//一秒到来的标志 把新的时间读入显示缓存区
 321   2           {    
 322   3             changemode();
 323   3                tag=0;
 324   3           }
 325   2         }
 326   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    841    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     26       2
   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 + -