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

📄 lcd_clock.lst

📁 买板子时赠的实验例子
💻 LST
字号:
C51 COMPILER V7.07   LCD_CLOCK                                                             11/20/2005 11:49:32 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE LCD_CLOCK
OBJECT MODULE PLACED IN lcd_clock.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE lcd_clock.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //日历时钟
   2          //按AN1,进入设置状态
   3          //按AN2,停止闹钟声音
   4          //按AN3,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态
   5          //按AN4,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字
   6          //LCD第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能(可在调整状态进行设置)
   7          //正常状态,LCD上排最前面显示自定义字符,LCD下排最前面闪动"willar"
   8          //设置状态,LCD上排最前面显示"P",下排最前面在设置闹钟时间时显示"alarm:",其它状态显示"time"
   9          //年代变化2000--2099,星期自动转换
  10          //程序中有自定义字符写入
  11          #include <reg51.h>
  12          #include <intrins.h>
  13          unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};
  14          unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};  //星期月参变数
  15          unsigned char data dis_buf1[16];                //lcd上排显示缓冲区
  16          unsigned char data dis_buf2[16];                //lcd下排显示缓冲区             
  17          unsigned char data year,month,date,week;//年、月、日、星期
  18          unsigned char data armhour,armmin,armsec;//闹钟时、分、秒
  19          unsigned char data hour,min,sec,sec100; //时、分、秒、百分之一秒
  20          unsigned char data flag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值    
  21          bit     alarm;  //标识是否启用闹钟,1--启用,0--关闭
  22          sbit     rs = P2^0;                             //LCD数据/命令选择端(H/L)
  23          sbit     rw = P2^1;                             //LCD读/写选择端(H/L)
  24          sbit     ep = P2^2;                             //LCD使能控制
  25          sbit    PRE = P3^4;                             //调整键(AN3)
  26          sbit    SET = P3^5;                             //调整键(AN4)
  27          sbit    SPK = P3^7;                             
  28          void delayms(unsigned char ms); //延时程序
  29          bit  lcd_busy();                                //测试LCD忙碌状态程序
  30          void lcd_wcmd(char cmd);                //写入指令到LCD程序
  31          void lcd_wdat(char dat);                //写入数据到LCD程序
  32          void lcd_pos(char pos);                 //LCD数据指针位置程序
  33          void lcd_init();                                //LCD初始化设定程序
  34          void pro_timedate();                    //时间日期处理程序
  35          void pro_display();                             //显示处理程序
  36          void pro_key();                                 //按键处理程序
  37          void time_alarm();                              //定时报警功能(闹钟)
  38          unsigned char scan_key();               //按键扫描程序
  39          unsigned char week_proc();              //星期自动计算与显示函数
  40          bit leap_year();                                //判断是否为闰年
  41          void lcd_sef_chr();                             //LCD自定义字符程序
  42          void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned ch
             -ar dis_s);                        
  43                                                                          //更新显示缓冲区函数
  44           
  45          
  46          // 延时程序
  47          void delay(unsigned char ms)
  48          {       while(ms--)
  49   1              {       unsigned char i;
  50   2                      for(i = 0; i< 250; i++)     
  51   2                      {
  52   3                              _nop_();                           //执行一条_nop_()指令为一个机器周期
  53   3                              _nop_();
  54   3                              _nop_();
C51 COMPILER V7.07   LCD_CLOCK                                                             11/20/2005 11:49:32 PAGE 2   

  55   3                              _nop_();
  56   3                      }
  57   2              }
  58   1      }               
  59                  
  60          
  61          //测试LCD忙碌状态
  62          bit lcd_busy()
  63          {       
  64   1              bit result;
  65   1              rs = 0;
  66   1              rw = 1;
  67   1              ep = 1;
  68   1              _nop_();
  69   1              _nop_();
  70   1              _nop_();
  71   1              _nop_();
  72   1              result =(bit)(P0&0x80); //LCD的D0--D7中,D7=1为忙碌,D7=0为空闲
  73   1              ep = 0;
  74   1              return result;  
  75   1      }
  76          
  77          //写入指令到LCD
  78          void lcd_wcmd(char cmd)
  79          {                                                       
  80   1              while(lcd_busy());      //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令
  81   1              rs = 0;
  82   1              rw = 0;
  83   1              ep = 0;
  84   1              _nop_();
  85   1              _nop_();        
  86   1              P0 = cmd;
  87   1              _nop_();
  88   1              _nop_();
  89   1              _nop_();
  90   1              _nop_();
  91   1              ep = 1;
  92   1              _nop_();
  93   1              _nop_();
  94   1              _nop_();
  95   1              _nop_();
  96   1              ep = 0;         
  97   1      }
  98          
  99          //写入数据到LCD
 100          void lcd_wdat(char dat) 
 101          {                                                       
 102   1              while(lcd_busy());      //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据
 103   1              rs = 1;
 104   1              rw = 0;
 105   1              ep = 0;
 106   1              P0 = dat;
 107   1              _nop_();
 108   1              _nop_();
 109   1              _nop_();
 110   1              _nop_();
 111   1              ep = 1;
 112   1              _nop_();
 113   1              _nop_();
 114   1              _nop_();
 115   1              _nop_();
 116   1              ep = 0; 
C51 COMPILER V7.07   LCD_CLOCK                                                             11/20/2005 11:49:32 PAGE 3   

 117   1      }
 118          
 119          //LCD数据指针位置程序
 120          void lcd_pos(char pos)
 121          {                                               
 122   1              lcd_wcmd(pos|0x80);     //数据指针=80+地址码(00H~27H,40H~67H)
 123   1      }
 124          
 125          
 126          //设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)
 127          //这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)
 128          void lcd_sef_chr()
 129          {       //第一个自定义字符
 130   1              lcd_wcmd(0x40); //"01 000 000"  第1行地址 (D7D6为地址设定命令形式

⌨️ 快捷键说明

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