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

📄 lab24.lst

📁 这是一个时钟程序
💻 LST
字号:
C51 COMPILER V6.23a  LAB24                                                                 08/11/2007 22:38:38 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE LAB24
OBJECT MODULE PLACED IN lab24.OBJ
COMPILER INVOKED BY: e:\mcs51\Keil\C51\BIN\C51.EXE lab24.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*可调时钟(无小时)和设定闹钟功能*/
   2          #include<at89x52.h>
   3          char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
   4          char code tv[]={0xfe,0xfd,0xfb,0xf7};
   5          char led[4];
   6          unsigned int counter;
   7          unsigned char s_data=50,m_data=59,n,w=4,flag,flag2,flag3,set_mdata,set_sdata,mdata,sdata;
   8          void display(void);
   9          
  10          void delay(unsigned int j)    
  11          {
  12   1      unsigned int i;
  13   1      for(i=0;i<j;i++);
  14   1      }
  15          
  16          void delay2(void)    
  17          {
  18   1      unsigned int j;
  19   1      //for(i=0;i<1000;i++)
  20   1      for(j=0;j<500;j++) display();
  21   1      }
  22          
  23          void display(void)                      
  24          {
  25   1      unsigned char k,i;
  26   1      if(flag2==1)                    //设定闹钟时不显示实际时间
  27   1      {
  28   2      led[0]=mdata/10;
  29   2      led[1]=mdata%10;
  30   2      led[2]=sdata/10;
  31   2      led[3]=sdata%10;
  32   2      }
  33   1      else
  34   1      {
  35   2      led[0]=m_data/10;
  36   2      led[1]=m_data%10;
  37   2      led[2]=s_data/10;
  38   2      led[3]=s_data%10;
  39   2      }
  40   1      n++;
  41   1      if(n>180)
  42   1              n=0; 
  43   1      for(k=0;k<4;k++)
  44   1      {
  45   2              if(k==w)                                        //闪烁显示
  46   2              {
  47   3                      if(n<90)                                                
  48   3                      {i=led[k];
  49   4              P0=num[i];
  50   4                      if(k==1)
  51   4                              P0=num[i] | 0x80;       //显示小数点
  52   4                      P2=tv[k];
  53   4                      delay(100);
  54   4                      }
  55   3                      else
C51 COMPILER V6.23a  LAB24                                                                 08/11/2007 22:38:38 PAGE 2   

  56   3                      {
  57   4                      P0=num[10];
  58   4                      if(k==1)
  59   4                              P0=num[10] | 0x80;
  60   4                      P2=tv[k];
  61   4                      delay(100);
  62   4                      }
  63   3              }
  64   2              else                                    //正常显示
  65   2              {
  66   3                      i=led[k];
  67   3              P0=num[i];
  68   3                      if(k==1)
  69   3                              P0=num[i] | 0x80;
  70   3                      P2=tv[k];
  71   3                      delay(100);     
  72   3               }
  73   2      }
  74   1      }
  75          
  76          
  77          void adjust(void)                               //调整函数
  78          {
  79   1              if(P3_5==0)           
  80   1              {
  81   2                      while(P3_5==0)          
  82   2                              display();
  83   2                      if(flag2==0)            //T1,开始调整时间  ;记时停止
  84   2                      {
  85   3                      TR0=0;
  86   3                      w=0;
  87   3                      flag++;
  88   3                      if(flag==2)                     //第一次按下是开始调整时间,第二次按下时确定
  89   3                              {flag=0;TR0=1;w=4;}
  90   3                      }
  91   2                      else                    //开始设定闹钟,记时不停止
  92   2                      {
  93   3                      w=0;
  94   3                      flag++;
  95   3                      if(flag==2)                     //第一次按下是开始调整时间,第二次按下时确定
  96   3                              {flag=0;flag2=0;flag3=1;w=4;}
  97   3                      }
  98   2              }
  99   1      
 100   1      
 101   1      
 102   1      
 103   1              if(P3_2==0)                  //INT0,加操作 
 104   1              {       
 105   2                      while(P3_2==0)
 106   2                              display();
 107   2                      if(flag2==0)
 108   2                      {       //显示当前时间,由于采用逐个数码管闪烁,逐个调整,所以分钟数和秒数的个位,十位分别赋值,比较麻烦
 109   3                      if(w==0)
 110   3                              {m_data=(m_data/10+1)*10+m_data%10;if(m_data>=60){m_data=m_data%10;}} 
 111   3                      if(w==1)
 112   3                              {if(m_data%10==9) m_data=m_data/10*10;else m_data=m_data%10+1+m_data/10*10; }
 113   3                      if(w==2)
 114   3                              {s_data=(s_data/10+1)*10+s_data%10;if(s_data>=60){s_data=s_data%10;}}
 115   3                      if(w==3)
 116   3                              {if(s_data%10==9) s_data=s_data/10*10;else s_data=s_data%10+1+s_data/10*10; }
 117   3                      }
C51 COMPILER V6.23a  LAB24                                                                 08/11/2007 22:38:38 PAGE 3   

 118   2                      else
 119   2                      {                                       //显示闹钟时间,逐个调整,
 120   3                      if(w==0)
 121   3                              {mdata=(mdata/10+1)*10+mdata%10;if(mdata>=60){mdata=mdata%10;}} 
 122   3                      if(w==1)
 123   3                              {if(mdata%10==9) mdata=mdata/10*10;else mdata=mdata%10+1+mdata/10*10; }
 124   3                      if(w==2)
 125   3                              {sdata=(sdata/10+1)*10+sdata%10;if(sdata>=60){sdata=sdata%10;}}
 126   3                      if(w==3)
 127   3                              {if(sdata%10==9) sdata=sdata/10*10;else sdata=sdata%10+1+sdata/10*10; }
 128   3                      }
 129   2              
 130   2              }
 131   1              
 132   1      
 133   1      
 134   1      
 135   1      
 136   1              if(P3_3==0)            //INT1,减操作
 137   1              {       
 138   2                      while(P3_3==0)
 139   2                              display();
 140   2                      if(flag2==0)
 141   2                      {                                       //显示当前时间
 142   3                      if(w==0)
 143   3                              {if(m_data/10==0) m_data=50+m_data%10; else m_data=(m_data/10-1)*10+m_data%10;} 
 144   3                      if(w==1)
 145   3                              {if(m_data%10==0) m_data=m_data/10*10+9;else m_data=m_data%10-1+m_data/10*10;}
 146   3                      if(w==2)
 147   3                              {if(s_data/10==0) s_data=50+s_data%10; else s_data=(s_data/10-1)*10+s_data%10;} 
 148   3                      if(w==3)
 149   3                              {if(s_data%10==0) s_data=s_data/10*10+9;else s_data=s_data%10-1+s_data/10*10;}
 150   3                      }
 151   2                      else
 152   2                      {                                       ////显示闹钟时间
 153   3                      if(w==0)
 154   3                              {if(mdata/10==0) mdata=50+mdata%10; else mdata=(mdata/10-1)*10+mdata%10;} 
 155   3                      if(w==1)
 156   3                              {if(mdata%10==0) mdata=mdata/10*10+9;else mdata=mdata%10-1+mdata/10*10;}
 157   3                      if(w==2)
 158   3                              {if(sdata/10==0) sdata=50+sdata%10; else sdata=(sdata/10-1)*10+sdata%10;} 
 159   3                      if(w==3)
 160   3                              {if(sdata%10==0) sdata=sdata/10*10+9;else sdata=sdata%10-1+sdata/10*10;}
 161   3                      }
 162   2              }
 163   1              //}
 164   1      
 165   1      
 166   1      
 167   1      
 168   1              if(P3_4==0)            //T0,下一个数码管闪烁/设定闹钟开始
 169   1              {
 170   2                      while(P3_4==0)
 171   2                              display();
 172   2                      if(flag==1)                     //当flag==1时,说明P3_5按下过,开始调整时间,此时P3_4只起循环闪烁数码管的功能
 173   2                      {
 174   3                      w++;
 175   3                      if(w==4) w=0;
 176   3                      }
 177   2                      else                            //设定闹钟
 178   2                      {
 179   3                      flag2=1;
C51 COMPILER V6.23a  LAB24                                                                 08/11/2007 22:38:38 PAGE 4   

 180   3                      mdata=m_data;           //读取当前时间值
 181   3                      sdata=s_data;
 182   3                      }
 183   2              }
 184   1      
 185   1      }
 186                                          
 187          
 188          
 189          
 190          
 191          void timer0() interrupt 1                       
 192          {
 193   1              counter++;
 194   1              if(counter==5000)
 195   1                      {
 196   2                      s_data++;
 197   2                      counter=0;
 198   2                      }
 199   1      }
 200          
 201          
 202          
 203          main(void)
 204          {
 205   1              IE=0x8a;
 206   1              TMOD=0x02;
 207   1              TH0=-200;
 208   1              TL0=-200;
 209   1              TR0=1;
 210   1              
 211   1              while(1)
 212   1              {
 213   2                      if(s_data==60)
 214   2                      {       
 215   3                              s_data=0;
 216   3                              m_data++;       
 217   3                      }
 218   2                      if(m_data==60)
 219   2                      {
 220   3                              m_data=0;
 221   3                      }
 222   2                      
 223   2                      adjust();
 224   2                      if(m_data==mdata && s_data==sdata)              //判断是否等于设定的时间值,即闹钟功能,mdata,sdata为设定的闹钟时间
             -;
 225   2                              {if(flag3==1)                                           //m_data,s_data为当前时间值
 226   3                                      {P1_0=0;delay2();P1_0=1;flag3=0;}}                              //  P1_0口接的数码管亮一下表示闹钟时间到
 227   2                      //delay(100);                                          
 228   2                      display();
 229   2              }
 230   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1188    ----
   CONSTANT SIZE    =     15    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     17       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
C51 COMPILER V6.23a  LAB24                                                                 08/11/2007 22:38:38 PAGE 5   

END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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