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

📄 led_time.lst

📁 单片机开发资料 基于51单片机的单片机开发板 包括《实验例程
💻 LST
字号:
C51 COMPILER V7.50   LED_TIME                                                              10/20/2007 15:12:15 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE LED_TIME
OBJECT MODULE PLACED IN led_time.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE led_time.C ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************************
   2          *                                                                              *
   3          *    File       : led_time.c                                                   *
   4          *    Date       : 2007-09-10                                                   *
   5          *    Version    : 1.0                                                          *
   6          *    Powerd by  : shenyae86  QQ:184676957                                      *
   7          ********************************************************************************
   8          *    Descriptoon:                                                              *
   9          *                 LED数码管显示时钟程序                                        *
  10          *                 操作顺序:                                                   *
  11          *                      1.延时 启动等待 约400MS 待显示器进入工作状态            *
  12          *                      2.LCDInit(); 显示器初始化 清屏...                       *
  13          *                      3.延时片刻 约5MS 可不要                                 *
  14          *                      4.写入字符 检测是否忙 继续写入                          *
  15          *                                                                              *
  16          * --- 管脚名 ---------- 管脚端口 ---- 变量名 ---------                         *
  17          *     RW                   P26        LCD_RW          pin4                     *
  18          *     RS                   P27        LCD_RS          pin5                     *
  19          *     使能端               P25        LCD_E           pin6                     *
  20          *     背光正               P21        LCD_light       pin15                    *
  21          *     数据                 P0        LCD_Data        pin7-14                   *
  22          *                                                                              *
  23          *******************************************************************************/
  24          
  25          //                 AN1---时调整                                                
  26          //                 AN2---分调整                                                
  27          //                上电时初始化显示:  12-00-00                                 
  28          #include <reg51.h>
  29          #include <intrins.h>
  30          
  31          unsigned char data dis_digit;
  32          unsigned char key_s, key_v;
  33          unsigned int i;
  34          unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,   // 0, 1, 2, 3
  35                                          0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
  36          unsigned char data dis_buf[8];
  37          unsigned char data dis_index;
  38          unsigned char hour,min,sec;
  39          unsigned char sec100,bell_flag; 
  40          sbit    AN1 = P3^4;
  41          sbit    AN2 = P3^5;
  42          sbit    AN3 = P3^2;
  43          sbit    AN4 = P3^3;
  44          sbit    led = P3^6;
  45          sbit    bell= P3^7;
  46          bit scan_key();
  47          void proc_key();
  48          void inc_sec();
  49          void inc_min();
  50          void inc_hour();
  51          void display();
  52          void delayms(unsigned char ms);
  53          
  54          void main(void)
  55          {
C51 COMPILER V7.50   LED_TIME                                                              10/20/2007 15:12:15 PAGE 2   

  56   1              P1 = 0xff;
  57   1              P2 = 0xff;
  58   1              TMOD = 0x11;            // 定时器0, 1工作模式1, 16位定时方式
  59   1              TH0 = 0xD8;
  60   1              TL0 = 0XEF;
  61   1          bell_flag=0;
  62   1              TH1 = 0xFC;
  63   1              TL1 = 0x17;
  64   1              hour = 12;
  65   1              min = 00;
  66   1              sec = 00;
  67   1          bell=1;
  68   1              sec100 = 0;
  69   1              dis_buf[0] = 0xbf;                                              // 显示"-"
  70   1              dis_buf[1] = 0xbf;                                              // 显示"-"
  71   1              dis_buf[2] = 0xff;                              // 秒十位
  72   1              dis_buf[3] = dis_code[sec % 10];                // 秒个位
  73   1              dis_buf[4] = dis_code[hour / 10];               // 时十位
  74   1              dis_buf[5] = dis_code[hour % 10]& 0x7f; // 时个位
  75   1              dis_buf[6] = dis_code[min / 10];                // 分十位
  76   1              dis_buf[7] = dis_code[min % 10];                // 分个位                       
  77   1              dis_digit = 0xfe;
  78   1              dis_index = 0;
  79   1              IE = 0x8a;                              // 使能timer0,1 中断    
  80   1              TR0 = 1;
  81   1              TR1 = 1;
  82   1      
  83   1              key_v = 0x03;//11b
  84   1              dis_digit = _crol_(dis_digit,4);        // 位选通值左移, 下次按键时左移一位
  85   1              while(1)
  86   1              {
  87   2                      if(scan_key())
  88   2                      {
  89   3                              delayms(10);
  90   3                              if(scan_key())
  91   3                              {
  92   4                                      key_v = key_s;
  93   4                                      proc_key();
  94   4                              }
  95   3                      }
  96   2                      if(AN3==0)
  97   2                      {       
  98   3                      delayms(200);
  99   3              if(AN3==0)
 100   3                      dis_digit = _crol_(dis_digit,4);        // 位选通值左移, 下次按键时左移一位
 101   3                      }
 102   2              }
 103   1      }
 104          
 105          bit scan_key()
 106          {
 107   1              key_s = 0x00;
 108   1              key_s |= AN2;
 109   1              key_s <<= 1;
 110   1              key_s |= AN1;
 111   1              return(key_s ^ key_v);  
 112   1      }
 113          
 114          void proc_key()
 115          {
 116   1              EA = 0;
 117   1              if((key_v & 0x01) == 0)         // AN1
C51 COMPILER V7.50   LED_TIME                                                              10/20/2007 15:12:15 PAGE 3   

 118   1              {
 119   2                      inc_hour();
 120   2              }
 121   1              else if((key_v & 0x02) == 0)    // AN2
 122   1              {
 123   2                      min++;
 124   2                      if(min > 59)
 125   2                      {
 126   3                              min = 0;
 127   3                      }
 128   2                      dis_buf[6] = dis_code[min / 10];                // 分十位
 129   2                      dis_buf[7] = dis_code[min % 10];                // 分个位
 130   2              }
 131   1      
 132   1              EA = 1;
 133   1      }
 134          
 135          void timer1() interrupt 3
 136          // 定时器0中断服务程序, 用于数码管的动态扫描
 137          // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
 138          // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
 139          //                              选通P2.0口数码管
 140          // dis_buf   --- 显于缓冲区基地址       
 141          {
 142   1              TH1 = 0xFC;
 143   1              TL1 = 0x17;
 144   1              
 145   1              P2 = 0xff;                                                      // 先关闭所有数码管
 146   1              P1 = dis_buf[dis_index];                        // 显示代码传送到P0口
 147   1              P2 = dis_digit;                                         // 
 148   1      
 149   1              dis_digit = _crol_(dis_digit,1);        // 位选通值左移, 下次中断时选通下一位数码管
 150   1              dis_index++;                                            // 
 151   1                                              
 152   1              dis_index &= 0x07;                      // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
 153   1      } 
 154          
 155          void timer0() interrupt 1
 156          {
 157   1              TH0 = 0xd8;
 158   1              TL0 = 0xEF;     
 159   1              sec100++;
 160   1              if(hour==7)
 161   1          {
 162   2          if(min==15)
 163   2              bell_flag=1;
 164   2              }
 165   1              else
 166   1              bell=1;
 167   1              if(sec100%50==0)
 168   1              {
 169   2                 led=~led;
 170   2                 if(bell_flag==1) 
 171   2                 {
 172   3                 bell=~bell;
 173   3             i++;
 174   3                 if(i>6000) {bell_flag=0;i=0;}//报警时间次数到,关闭状态,次数清零
 175   3              }
 176   2              if(dis_buf[5]>127) 
 177   2              dis_buf[5]&=0x7f;
 178   2                  else  
 179   2              dis_buf[5]|=0x80;
C51 COMPILER V7.50   LED_TIME                                                              10/20/2007 15:12:15 PAGE 4   

 180   2              }
 181   1              if(sec100 >= 100)
 182   1              {
 183   2                      sec100 = 0;
 184   2                      inc_sec();
 185   2              }
 186   1      }
 187          
 188          void inc_sec()
 189          {
 190   1              sec++;
 191   1              if(sec > 59)
 192   1              {
 193   2                      sec = 0;
 194   2                      inc_min();
 195   2              }
 196   1              dis_buf[0] = dis_code[sec / 10];                // 秒十位
 197   1              dis_buf[1] = dis_code[sec % 10];                // 秒个位       
 198   1      }
 199          
 200          void inc_min()
 201          {
 202   1              min++;
 203   1              if(min > 59)
 204   1              {
 205   2                      min = 0;
 206   2                      inc_hour();
 207   2              }
 208   1              dis_buf[6] = dis_code[min / 10];                // 分十位
 209   1              dis_buf[7] = dis_code[min % 10];                // 分个位
 210   1      }
 211          
 212          void inc_hour()
 213          {
 214   1              hour++;
 215   1              if(hour > 23)
 216   1              {
 217   2                      hour = 0;
 218   2              }
 219   1              if(hour > 9)
 220   1                      dis_buf[4] = dis_code[hour / 10];               // 时十位
 221   1              else
 222   1                      dis_buf[4] = 0xc0;                                      // 当小时的十位为0时不显示
 223   1              dis_buf[5] = dis_code[hour % 10]& 0x7f;         // 时个位
 224   1      
 225   1      }
 226          
 227          void delayms(unsigned char ms)  
 228          // 延时子程序
 229          {                                               
 230   1              unsigned char i;
 231   1              while(ms--)
 232   1              {
 233   2                      for(i = 0; i < 120; i++);
 234   2              }
 235   1      }
 236          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    610    ----
   CONSTANT SIZE    =     11    ----
C51 COMPILER V7.50   LED_TIME                                                              10/20/2007 15:12:15 PAGE 5   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     19    ----
   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 + -