📄 ex10.lst
字号:
C51 COMPILER V8.09 EX10 02/22/2008 19:36:15 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE EX10
OBJECT MODULE PLACED IN ex10.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ex10.c BROWSE DEBUG OBJECTEXTEND TABS(5)
line level source
1 /*用定时器0,1602液晶,设计一个数字时钟,可以由三个按钮控制调节时间*/
2 #include<reg52.h>
3 #include"lcd1602.h"
4 #include"18b20.h"
5 #define TIMER0_COUNT 0xEE00
6 sbit mode=P3^0;
7 sbit plus=P3^1;
8 sbit dec=P3^2;
9 sbit rd=P3^7;
10 sbit fm=P2^3;
11 uchar count,s1num,timer0_tick,count=0;
12 typedef struct{
13 char hour;
14 char minute;
15 char second;
16 }time;
17
18 typedef struct{
19 uint year;
20 uchar month;
21 char day;
22 }date;
23 time now={0,0,0};
24 date today={2008,1,29};
25 char code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
26 char code weekday[7][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
27
28 uchar monthday(uchar year,uchar month)
29 {
30 1 if(month==2 && year%4==0) //润年的2月有29天
31 1 return(29);
32 1 else
33 1 return(dayofmonth[month-1]); //非闰年时的该月份天数
34 1 }
35
36 void display_week() //由年月日计算星期
37 {
38 1 char days;
39 1 days=(today.day+1+2*today.month+3*(today.month+1)/5+today.year+today.year/4-today.year/100+today.year
-/400)%7;
40 1 display_string(&weekday[days][0]);
41 1 }
42
43 static void timer0_initialize(void) //timer0 initialize
44 {
45 1 EA=0; //设置不接受所有中断
46 1 timer0_tick=0;
47 1 TR0=0; //关闭Timer0
48 1 TMOD=0X01; //设置Timer0为模式2,16位工作模式
49 1 TL0=(TIMER0_COUNT & 0X00FF); //设置Timer0低八位数值
50 1 TH0=(TIMER0_COUNT >> 8); //设置Timer0高八位数值
51 1 PT1=1; //设置Timer0的优先级为最高
52 1 ET0=1; //设置接受Timer0的中断
53 1 TR0=1; //启动Timer0
54 1 EA=1; //设置系统接受中断
C51 COMPILER V8.09 EX10 02/22/2008 19:36:15 PAGE 2
55 1 }
56
57 void write_time(uchar add,uchar number)
58 {
59 1 gotoxy(2,add);
60 1 display_data(number);
61 1 }
62 void write_riqi(uchar add,uchar number)
63 {
64 1 gotoxy(1,add);
65 1 display_data(number);
66 1 }
67
68 void keyscan()
69 {
70 1 uchar mode_num;
71 1 rd=0;
72 1 if(mode==0)
73 1 {
74 2 delay(5);
75 2 if(mode==0)
76 2 { mode_num++;
77 3 while(!mode);
78 3 TR0=0;
79 3 write_com(0x0f);
80 3 }
81 2 if(mode_num==1) gotoxy(1,4);
82 2 if(mode_num==2) gotoxy(1,7);
83 2 if(mode_num==3) gotoxy(1,10);
84 2 if(mode_num==4) gotoxy(2,2);
85 2 if(mode_num==5) gotoxy(2,5);
86 2 if(mode_num==6) gotoxy(2,8);
87 2 if(mode_num==7)
88 2 {
89 3 mode_num=0;
90 3 write_com(0x0c);
91 3 TR0=1;
92 3 }
93 2 }
94 1 if(mode_num!=0)
95 1 {
96 2 if(plus==0)
97 2 {
98 3 delay(5);
99 3 if(plus==0)
100 3 {
101 4 while(!plus);
102 4 if(mode_num==1)
103 4 {
104 5 today.year++;
105 5 write_riqi(1,today.year/100);
106 5 write_riqi(3,today.year%100);
107 5 gotoxy(1,12);
108 5 display_week();
109 5 gotoxy(1,4);
110 5 }
111 4 if(mode_num==2)
112 4 {
113 5 today.month++;
114 5 if(today.month==13) today.month=1;
115 5 write_riqi(6,today.month);
116 5 gotoxy(1,12);
C51 COMPILER V8.09 EX10 02/22/2008 19:36:15 PAGE 3
117 5 display_week();
118 5 gotoxy(1,7);
119 5 }
120 4 if(mode_num==3)
121 4 {
122 5 today.day++;
123 5 if(today.day>monthday(today.year,today.month))
124 5 today.day=1;
125 5 write_riqi(9,today.day);
126 5 gotoxy(1,12);
127 5 display_week();
128 5 gotoxy(1,10);
129 5 }
130 4 if(mode_num==4)
131 4 {
132 5 now.hour++;
133 5 if(now.hour==24) now.hour=0;
134 5 write_time(1,now.hour);
135 5 gotoxy(2,2);
136 5 }
137 4 if(mode_num==5)
138 4 {
139 5 now.minute++;
140 5 if(now.minute==60) now.minute=0;
141 5 write_time(4,now.minute);
142 5 gotoxy(2,5);
143 5 }
144 4 if(mode_num==6)
145 4 {
146 5 now.second++;
147 5 if(now.second==60) now.second=0;
148 5 write_time(7,now.second);
149 5 gotoxy(2,8);
150 5 }
151 4 }
152 3 }
153 2 if(dec==0)
154 2 {
155 3 delay(5);
156 3 if(dec==0)
157 3 {
158 4 while(!dec);
159 4 if(mode_num==1)
160 4 {
161 5 today.year--;
162 5 write_riqi(1,today.year/100);
163 5 write_riqi(3,today.year%100);
164 5 gotoxy(1,12);
165 5 display_week();
166 5 gotoxy(1,4);
167 5 }
168 4 if(mode_num==2)
169 4 {
170 5 today.month--;
171 5 if(today.month==0) today.month=12;
172 5 write_riqi(6,today.month);
173 5 gotoxy(1,12);
174 5 display_week();
175 5 gotoxy(1,7);
176 5 }
177 4 if(mode_num==3)
178 4 {
C51 COMPILER V8.09 EX10 02/22/2008 19:36:15 PAGE 4
179 5 today.day--;
180 5 if(today.day==0)
181 5 today.day=monthday(today.year,today.month);
182 5 write_riqi(9,today.day);
183 5 gotoxy(1,12);
184 5 display_week();
185 5 gotoxy(1,10);
186 5 }
187 4 if(mode_num==4)
188 4 {
189 5 now.hour--;
190 5 if(now.hour<0) now.hour=23;
191 5 write_time(1,now.hour);
192 5 gotoxy(2,2);
193 5 }
194 4 if(mode_num==5)
195 4 {
196 5 now.minute--;
197 5 if(now.minute<0) now.minute=59;
198 5 write_time(4,now.minute);
199 5 gotoxy(2,5);
200 5 }
201 4 if(mode_num==6)
202 4 {
203 5 now.second--;
204 5 if(now.second<0) now.second=59;
205 5 write_time(7,now.second);
206 5 gotoxy(2,8);
207 5 }
208 4 }
209 3 }
210 2 }
211 1 }
212
213 void display_temp()
214 {
215 1 uint wendu;
216 1 uchar A1,A2;
217 1 tmpchange();
218 1 wendu=tmp();
219 1 A1=wendu/10;
220 1 A2=wendu%10;
221 1 gotoxy(2,10);
222 1 display_data(A1);
223 1 display_string(".");
224 1 write_date(int_to_char[A2]);
225 1 }
226
227 void timer0(void) interrupt 1
228 {
229 1 TR0=0;
230 1 TL0=(TIMER0_COUNT & 0X00FF);//设置Timer0低八位数值
231 1 TH0=(TIMER0_COUNT >> 8);//设置Timer0高八位数值
232 1 TR0=1;
233 1 count++;
234 1 if(count==40) display_temp();
235 1 if(count==200)
236 1 {
237 2 count=0;
238 2 now.second++;
239 2 if(now.second==60)
240 2 {
C51 COMPILER V8.09 EX10 02/22/2008 19:36:15 PAGE 5
241 3 now.second=0;
242 3 now.minute++;
243 3 if(now.minute==60)
244 3 {
245 4 now.minute=0;
246 4 now.hour++;
247 4 if(now.hour==24)
248 4 {
249 5 now.hour=0;
250 5 today.day++;
251 5 if(today.day>monthday(today.year,today.month))
252 5 {
253 6 today.day=1;
254 6 today.month++;
255 6 if(today.month==13)
256 6 {
257 7 today.month=1;
258 7 today.year++;
259 7 }
260 6 write_riqi(6,today.month);
261 6 }
262 5 write_riqi(9,today.day);
263 5 gotoxy(1,12);
264 5 display_week();
265 5 }
266 4 write_time(1,now.hour);
267 4 }
268 3 write_time(4,now.minute);
269 3 }
270 2 write_time(7,now.second);
271 2 }
272 1 }
273
274 void main()
275 {
276 1 init_lcd();
277 1 rd=0;
278 1 timer0_initialize();
279 1 gotoxy(1,1);
280 1 display_string("2008/01/29 ");
281 1 display_week();
282 1 gotoxy(2,1);
283 1 display_string("00:00:00");
284 1 gotoxy(2,10);
285 1 display_string("00.0C");
286 1 while(1) keyscan();
287 1
288 1 }
289
290
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1489 ----
CONSTANT SIZE = 80 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 7
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -