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

📄 watch.lst

📁 一款电子钟程序,可通过数码管显示时
💻 LST
字号:
C51 COMPILER V7.06   WATCH                                                                 11/18/2006 00:43:17 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE WATCH
OBJECT MODULE PLACED IN watch.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE watch.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          /*****************************************************************/ 
   3          /*                                                               */                                       
             -                         
   4          /*名称:                      电子钟程序                         */                                       
             -                                                                                                                        
             -            
   5          /*功能:           可通过数码管显示时,分,秒用一个点闪烁        */ 
   6          /*                 时,分均可调,24小时制                        */                                       
             -            
   7          /*难度等级:                   中                                */                                       
             -                              
   8          /* 作者:                  zengrenliang                          */
   9          /* 版权:           http://www.51kaifa.com                       */
  10          /*编写日期:        2006.05.19                                   */                                       
             -                                                                                                                        
             -                                              
  11          /*****************************************************************/
  12          
  13          #include <reg52.h>
  14          
  15          #define uchar  unsigned char
  16          
  17          sbit addr0 = P1^4;//系统片选地址线0
  18          sbit addr1 = P1^5;//系统片选地址线1
  19          sbit addr2 = P1^6;//系统片选地址线2
  20          sbit addr3 = P1^7;//系统片选地址线3
  21          
  22          //行扫描数组
  23          uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
  24          //数码管显示的段码表
  25          uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
  26                                 0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
  27                                 0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格
  28          
  29          uchar dispbuf[8]; //显示缓冲区                         
  30          unsigned char second,minute,hour,count,flag,keybit;//秒,分,时,50ms计数器,数码管刷新标志
  31          
  32          /******************************延时函数****************************/
  33          void  delay(unsigned int loop)
  34          {  unsigned int i ;          //loop 为执行空指令的次数,改变它可一改变延时时长
  35   1        for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
  36   1       }
  37          
  38          /***********************************初始化函数*************************/
  39          void initial()
  40          { uchar j;
  41   1        second=0x00;//秒清零
  42   1        minute=0x00;//分清零
  43   1        hour = 12;  //时12
  44   1        count = 20;//50毫秒置初值
  45   1        keybit = 0;//读键延时标志
  46   1        flag = 0x01;//清除刷新标志
  47   1        for(j=0;j<8;j++)
  48   1          dispbuf[j] = 1;//清数码管显示缓冲区
C51 COMPILER V7.06   WATCH                                                                 11/18/2006 00:43:17 PAGE 2   

  49   1        TMOD = 0x11;//T0 T1工作于方式1
  50   1        TL1 = 0x00;
  51   1        TH1 = 0x4C;//50ms定时初值
  52   1        ET1 = 1;//允许T1中断
  53   1        PT1 = 1;//T1中断优先级高
  54   1      
  55   1        EA = 1;//开中断
  56   1        TR1 = 1;//T1开始计时
  57   1       }
  58          
  59          
  60          /******************************显示+读键*************************/
  61          
  62          void ledscan()
  63          {  unsigned char i,key,value,keyvalue,dispvalue;  
  64   1      
  65   1          for(i=0;i<8;i++){
  66   2            
  67   2             addr3 = 0;
  68   2             addr0 = 0;
  69   2             addr1 = 1;
  70   2             addr2 = 0;//开发板上U4(74HC574)的片选地址
  71   2             P0 = 0xff; //关显示
  72   2             addr3 = 1; 
  73   2             addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
  74   2             P2 = scan[i];//取row0--row7行扫描数据
  75   2             addr0 = 0;
  76   2             addr1 = 0;
  77   2             addr2 = 1;//开发板上U6(74HC244)的片选地址
  78   2             addr3 = 1;
  79   2             P0 = 0xff;//准备读取按键
  80   2             if((P0 !=0xff) && keybit==0)//是否有按键和按键标志是否被清除
  81   2              {value = 0;
  82   3               key = ~P0;
  83   3               keybit = 1;//置已按键标志
  84   3               while(key){
  85   4                  value++;
  86   4                  key = key /2;
  87   4               }
  88   3               keyvalue = 8*i + value;//计算十六进制键值
  89   3               switch(keyvalue)//转按键功能处理
  90   3               {
  91   4                  case 4:   if(hour==23)
  92   4                              hour = 0;
  93   4                            else
  94   4                              hour++;//时加1
  95   4                            break;
  96   4                  case 8:   if(hour==0)
  97   4                              hour = 23;
  98   4                            else
  99   4                              hour--;//时减1
 100   4                            break;
 101   4                  case 12:   if(minute==59)
 102   4                              minute = 0;
 103   4                            else
 104   4                              minute++;//分加1
 105   4                            break;
 106   4                  case 16:   if(minute==0)
 107   4                              minute = 59;
 108   4                            else
 109   4                              minute--;//分减1
 110   4                            break;
C51 COMPILER V7.06   WATCH                                                                 11/18/2006 00:43:17 PAGE 3   

 111   4                  case 15:   second = 0;//秒清零
 112   4                            break;
 113   4                  default:  break;  
 114   4                  
 115   4               }
 116   3              }
 117   2             addr3 = 0;//键值读取完成,使U6无效
 118   2             
 119   2             addr3 = 0;
 120   2             addr0 = 0;
 121   2             addr1 = 1;
 122   2             addr2 = 0;//开发板上U4(74HC574)的片选地址
 123   2             dispvalue =table[dispbuf[i]]; //取一行显示数据 
 124   2             if(i==5 && flag)
 125   2              dispvalue &= 0x7f;//秒指示闪烁
 126   2             P0 = dispvalue; 
 127   2             addr3 = 1; 
 128   2             addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
 129   2             delay(50); //延时50us
 130   2             }
 131   1       }
 132          
 133          
 134          /*********************************50ms中断响应****************************/
 135          void  int50ms() interrupt 3
 136          {
 137   1        TR1=0;//关定时器T0
 138   1        TL1= 0x00;
 139   1        TH1= 0x4C;//赋定时初值
 140   1        TR1=1;//开定时器T0
 141   1        count--;//50ms计数减1
 142   1        if(count == 10)
 143   1          flag = 0;
 144   1        if(count == 0)//1秒定时到
 145   1         {count = 20;//重赋50ms计数值
 146   2          flag = 1;
 147   2          keybit = 0;
 148   2          if(second != 59)
 149   2            second++;//秒加1
 150   2          else{
 151   3            second=0x00;
 152   3            if(minute !=59)
 153   3             minute++;//分加1
 154   3            else{
 155   4             minute=0x00;
 156   4             if(hour != 23)
 157   4              hour++;//时加1
 158   4             else
 159   4              hour =0x00;
 160   4              }
 161   3             }
 162   2            }
 163   1        }
 164          
 165          
 166          /*************************************填充显示缓冲区****************************/
 167          
 168          void  feedbuffer()
 169          {
 170   1      uchar temp;
 171   1       temp = second;
 172   1       dispbuf[7] = temp % 10;//秒个位               数码管位选顺序
C51 COMPILER V7.06   WATCH                                                                 11/18/2006 00:43:17 PAGE 4   

 173   1       temp = temp / 10;        //         1   0   3   2   5   4   7   6
 174   1       dispbuf[6] = temp % 10;//秒十位        8   8   8   8   8   8   8   8
 175   1      
 176   1       dispbuf[0] = 17; //不显示
 177   1      
 178   1       temp = minute;
 179   1       dispbuf[5] = temp % 10;//分个位
 180   1       temp = temp / 10;
 181   1       dispbuf[4] = temp % 10;//分十位
 182   1      
 183   1       dispbuf[3] = 16;//显示"-" 
 184   1      
 185   1       temp = hour;
 186   1       dispbuf[2] =temp % 10;//时个位
 187   1       temp = temp / 10;
 188   1       dispbuf[1] =temp % 10;//时十位
 189   1      }
 190          
 191          
 192          /*************************************主函数*********************************/
 193          
 194          main()
 195          {
 196   1       
 197   1       initial();//初始化
 198   1       while(1){
 199   2        
 200   2         feedbuffer();//填充显示缓冲区
 201   2         ledscan();//送显示   
 202   2        } 
 203   1      }
 204          
 205          /************************************结束**************************************/


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