📄 lcd_clock.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 + -