📄 lcd1602时钟显示.lst
字号:
C51 COMPILER V7.50 LCD1602时钟显蔩 06/02/2008 16:40:27 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LCD1602时钟显蔩
OBJECT MODULE PLACED IN lcd1602时钟显示.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE lcd1602时钟显示.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /* 用1602LCD液晶做的一个时钟,包括星期,日期
2
3 ***************************
4
5 s1作为位选,每按一次,就选一位,按第九次屏幕恢复正常
6
7 s2作为加法键 在s1按下的时候才能进行加法
8
9 s3作为减法键 在s1按下的时候才能进行减法 */
10
11 #include "reg51.h"
12 #define uchar unsigned char
13 #define uint unsigned int
14 uchar code table[]=" 0000-00-00 000" ;
15 uchar code table1[]=" 00:00:00";
16 uchar code table2[][3]={"MOD","TUE","WED","THU","FRI","SAT","SUN"};
17 uint code table3[]={31,31,28,31,30,31,30,31,31,30,31,30,31};
18 sbit lcden=P1^3;
19 sbit lcdwrite=P1^1;
20 sbit lcdrs=P1^2;
21 sbit s1=P1^4;
22 sbit s2=P1^5;
23 sbit s3=P1^6;
24 sbit s=P1^7;
25 uchar time;
26 char hour,min,sec,day,mon,year1,year2,xingqi,num;
27 //延时程序
28 void delay(uint z)
29 {
30 1 uint x,y;
31 1 for(x=z;x>0;x--)
32 1 for(y=110;y>0;y--);
33 1 }
34 //lcd的写指令
35 void write_com(uchar com)
36 {
37 1 lcdrs=0;
38 1 lcden=0;
39 1 P2=com;
40 1 delay(5);
41 1 lcden=1;
42 1 delay(5);
43 1 lcden=0;
44 1 }
45 //lcd的写数据
46 void write_data(uchar da)
47 {
48 1 lcdrs=1;
49 1 lcden=0;
50 1 P2=da;
51 1 delay(5);
52 1 lcden=1;
53 1 delay(5);
54 1 lcden=0;
55 1 }
C51 COMPILER V7.50 LCD1602时钟显蔩 06/02/2008 16:40:27 PAGE 2
56 //初始化
57 void init()
58 {
59 1 uchar num;
60 1 lcdwrite=0;
61 1 lcden=0;
62 1 write_com(0x38);
63 1 write_com(0x0c);
64 1 write_com(0x06);
65 1 write_com(0x01);
66 1 for (num=0;num<15;num++)
67 1 {
68 2 write_data(table[num]);
69 2 delay(5);
70 2 }
71 1 write_com(0x80+0x40);
72 1 for (num=0;num<12;num++)
73 1 {
74 2 write_data(table1[num]);
75 2 delay(5);
76 2 }
77 1 TMOD=0x01;
78 1 TL0=(65536-46080)%256;
79 1 TH0=(65536-46080)/256;
80 1 EA=1;
81 1 ET0=1;
82 1 TR0=1;
83 1
84 1 }
85 //时间走动的显示
86 write_hms(uchar add,uchar da)
87 {
88 1 uchar shi,ge;
89 1 shi=da/10;
90 1 ge=da%10;
91 1 write_com(0x80+0x40+add);
92 1 write_data(0x30+shi);
93 1 write_data(0x30+ge);
94 1 }
95 //日期走动的显示
96 write_ymd(uchar add,uchar da)
97 {
98 1 uchar shi,ge;
99 1 shi=da/10;
100 1 ge=da%10;
101 1 write_com(0x80+add);
102 1 write_data(0x30+shi);
103 1 write_data(0x30+ge);
104 1 }
105 //星期走动的显示
106 void write_xingqi(char xingqi)
107 {
108 1 char num;
109 1 write_com(0x80+12);
110 1 for(num=0;num<3;num++)
111 1 write_data(table2[xingqi][num]);
112 1
113 1 }
114
115 //键盘扫描
116 void keyscan()
117 {
C51 COMPILER V7.50 LCD1602时钟显蔩 06/02/2008 16:40:27 PAGE 3
118 1 s=0;
119 1 if(s1==0)
120 1 {
121 2 delay(5);
122 2 if(s1==0)
123 2 {
124 3 num++;
125 3 while(!s1);
126 3 if(num==1)
127 3 {
128 4 TR0=0;
129 4 write_com(0x80+0x40+11);
130 4 write_com(0x0f);
131 4 }
132 3 }
133 2 if(num==2)
134 2 {
135 3 write_com(0x80+0x40+8);
136 3 }
137 2 if(num==3)
138 2 {
139 3 write_com(0x80+0x40+5);
140 3 }
141 2 if(num==4)
142 2 {
143 3 write_com(0x80+12);
144 3 write_com(0x0f);
145 3 }
146 2 if(num==5)
147 2 {
148 3 write_com(0x80+10);
149 3 }
150 2 if(num==6)
151 2 {
152 3 write_com(0x80+7);
153 3 }
154 2 if(num==7)
155 2 {
156 3 write_com(0x80+4);
157 3 }
158 2 if(num==8)
159 2 {
160 3 write_com(0x80+2);
161 3 }
162 2 if(num==9)
163 2 {
164 3 num=0;
165 3 write_com(0x0c);
166 3 TR0=1;
167 3 }
168 2 }
169 1 if(num!=0)
170 1 {
171 2 if(s2==0)
172 2 {
173 3 delay(5);
174 3 if(s2==0)
175 3 {
176 4 while(!s2);
177 4 if(num==1)
178 4 {
179 5 sec++;
C51 COMPILER V7.50 LCD1602时钟显蔩 06/02/2008 16:40:27 PAGE 4
180 5 if(sec==60)
181 5 sec=0;
182 5 write_hms(10,sec);
183 5 write_com(0x80+0x40+11);
184 5 }
185 4 if(num==2)
186 4 {
187 5 min++;
188 5 if(min==60)
189 5 min=0;
190 5 write_hms(7,min);
191 5 write_com(0x80+0x40+8);
192 5 }
193 4 if(num==3)
194 4 {
195 5 hour++;
196 5 if(hour==24)
197 5 hour=0;
198 5 write_hms(4,hour);
199 5 write_com(0x80+0x40+5);
200 5 }
201 4 if(num==4)
202 4 {
203 5 xingqi++;
204 5 if(xingqi==7)
205 5 xingqi=0;
206 5 write_xingqi(xingqi);
207 5 write_com(0x80+14);
208 5 }
209 4 if(num==5)
210 4 {
211 5 day++;
212 5 if(day==table3[mon]+1)
213 5 day=1;
214 5 write_ymd(9,day);
215 5 write_com(0x80+10);
216 5 }
217 4 if(num==6)
218 4 {
219 5 mon++;
220 5 if(mon==13)
221 5 mon=1;
222 5 write_ymd(6,mon);
223 5 write_com(0x80+7);
224 5 }
225 4 if(num==7)
226 4 {
227 5 year1++;
228 5 if(year1==100)
229 5 year1=0;
230 5 write_ymd(3,year1);
231 5 write_com(0x80+4);
232 5 }
233 4 if(num==8)
234 4 {
235 5 year2++;
236 5 if(year2==100)
237 5 year2=0;
238 5 write_ymd(1,year2);
239 5 write_com(0x80+2);
240 5 }
241 4 }
C51 COMPILER V7.50 LCD1602时钟显蔩 06/02/2008 16:40:27 PAGE 5
242 3 }
243 2 if(s3==0)
244 2 {
245 3 delay(5);
246 3 if(s3==0)
247 3 {
248 4 while(!s3);
249 4 if(num==1)
250 4 {
251 5 sec--;
252 5 if(sec==-1)
253 5 sec=59;
254 5 write_hms(10,sec);
255 5 write_com(0x80+0x40+11);
256 5 }
257 4 if(num==2)
258 4 {
259 5 min--;
260 5 if(min==-1)
261 5 min=59;
262 5 write_hms(7,min);
263 5 write_com(0x80+0x40+8);
264 5 }
265 4 if(num==3)
266 4 {
267 5 hour--;
268 5 if(hour==-1)
269 5 hour=23;
270 5 write_hms(4,hour);
271 5 write_com(0x80+0x40+5);
272 5 }
273 4 if(num==4)
274 4 {
275 5 xingqi--;
276 5 if(xingqi==-1)
277 5 xingqi=6;
278 5 write_xingqi(xingqi);
279 5 write_com(0x80+14);
280 5 }
281 4 if(num==5)
282 4 {
283 5 day--;
284 5 if(day==0)
285 5 day=table3[mon];
286 5 write_ymd(9,day);
287 5 write_com(0x80+10);
288 5 }
289 4 if(num==6)
290 4 {
291 5 mon--;
292 5 if(mon==0)
293 5 mon=12;
294 5 write_ymd(6,mon);
295 5 write_com(0x80+7);
296 5 }
297 4 if(num==7)
298 4 {
299 5 year1--;
300 5 if(year1==-1)
301 5 year1=0;
302 5 write_ymd(3,year1);
303 5 write_com(0x80+4);
C51 COMPILER V7.50 LCD1602时钟显蔩 06/02/2008 16:40:27 PAGE 6
304 5 }
305 4 if(num==8)
306 4 {
307 5 year2--;
308 5 if(year2==-1)
309 5 year2=0;
310 5 write_ymd(1,year2);
311 5 write_com(0x80+2);
312 5 }
313 4 }
314 3 }
315 2 }
316 1 }
317
318 //主函数
319 void main ()
320 {
321 1 init();
322 1 while(1)
323 1 {
324 2 keyscan();
325 2 }
326 1 }
327 //中断定时
328 void timer0() interrupt 1
329 {
330 1 TL0=(65536-46080)%256;
331 1 TH0=(65536-46080)/256;
332 1 time++;
333 1 if(time==20)
334 1 {
335 2 time=0;
336 2 sec++;
337 2 if(sec==60)
338 2 {
339 3 sec=0;
340 3 min++;
341 3 if(min==60)
342 3 {
343 4 min=0;
344 4 hour++;
345 4 if(hour==24)
346 4 {
347 5 hour=0;
348 5 day++;
349 5 xingqi++;
350 5 if(day==table3[mon]+1)
351 5 {
352 6 day=1;
353 6 mon++;
354 6 if(mon==13)
355 6 {
356 7 mon=1;
357 7 year1++;
358 7 if(year1==100)
359 7 {
360 8 year1=0;
361 8 year2++;
362 8 if(year2==100)
363 8 {
364 9 year2=0;
365 9 }
C51 COMPILER V7.50 LCD1602时钟显蔩 06/02/2008 16:40:27 PAGE 7
366 8 write_ymd(1,year2);
367 8 }
368 7 write_ymd(3,year1);
369 7 }
370 6 write_ymd(6,mon);
371 6 }
372 5 write_ymd(9,day);
373 5 if(xingqi==7)
374 5 xingqi=0;
375 5 write_xingqi(xingqi);
376 5 }
377 4 write_hms(4,hour);
378 4 }
379 3 write_hms(7,min);
380 3 }
381 2 write_hms(10,sec);
382 2 }
383 1 }
384
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1164 ----
CONSTANT SIZE = 76 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 ----
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 + -