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

📄 51

📁 51单片机大量源码
💻
字号:
C51 COMPILER V8.02   LCD_CLOCK                                                             07/24/2009 14:54:59 PAGE 1   


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

line level    source

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

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

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

⌨️ 快捷键说明

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