📄 clock.lst
字号:
203 6 { day=1; month++; } break;
204 6 case 32: day=1; month++;
205 6 if(month==13) { month=1; year++; }
206 6 }
207 5 }
208 4 }
209 3 }
210 2 }
211 1 }
212 //以下是定时器2中断,用于按键扫描
213 void Timer1ISR(void) interrupt 3 using 2
214 {
215 1 unsigned char keytmp;
216 1 char tmp;
217 1 TH1=0x15; TL1=0xa0; // 每30ms中断一次
218 1 /*** 当前显示的内容 ***/
219 1 if(show_status==0) //当前正在设置闹钟项
220 1 {display[0]=cur_alarm_set;
221 2 display[1]=0xf;
222 2 display[2]=alarm[cur_alarm_set].h/10;
223 2 display[3]=alarm[cur_alarm_set].h%10;
224 2 display[4]=alarm[cur_alarm_set].m/10;
225 2 display[5]=alarm[cur_alarm_set].m%10;
226 2 display[6]=(alarm_wk>>cur_alarm_set)&1;
227 2 display[7]=(alarm_en>>cur_alarm_set)&1;}
228 1 if(show_status==1 || show_status==3) //当前显示或设置日期
229 1 {display[0]=year/10;
230 2 display[1]=year%10;
231 2 display[2]=month/10;
232 2 display[3]=month%10;
233 2 display[4]=day/10;
234 2 display[5]=day%10;
235 2 display[6]=0xf;
236 2 display[7]=weekday;}
237 1 if(show_status==2 || show_status==4) //当前显示或设置时间
238 1 {display[0]=hour/10;
239 2 display[1]=hour%10;
240 2 display[2]=min/10;
241 2 display[3]=min%10;
C51 COMPILER V7.04 CLOCK 09/17/2005 11:01:02 PAGE 5
242 2 display[4]=sec/10;
243 2 display[5]=sec%10;
244 2 display[6]=0xf;
245 2 display[7]=0xf;} //最后两后无显示
246 1 /*** 按键扫描及处理 ***/
247 1 keytmp=~(P1) & 0x0f;
248 1 if(keytmp==0) { km=0; kp=0; }
249 1 else { if(km==0) km=1;
250 2 else{ if(kp==0)
251 3 {kp=1;if(keytmp==1) //第一个按钮
252 4 { if(sound) { alarm_stop=1; sound=0; } //如果闹钟正响,按此键停止
253 5 else if((show_status==1 || show_status==2) && led_on) //正显示日期或时间
254 5 { show_status=0; cur_alarm_set=0; attr=0x3f; } //进入闹钟设置
255 5 else if(show_status==0) //如正在设置闹钟时间项
256 5 { show_status=2; new_alarm_info=1; attr=0xff; } //返回当前时间显示
257 5 return;
258 5 }
259 4 if(keytmp==2 && led_on) //第二个按钮,仅当数码管打开时有效
260 4 {switch(attr)
261 5 { case 0xff: if(show_status==1) show_status=2; //在显示时间与日期间切换
262 6 else if(show_status==2) show_status=1; break;
263 6 case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;
264 6 else if(show_status==3)
265 6 year=(year+1)%50; //当前日期的"年"加1
266 6 else if(show_status==4)
267 6 hour=(hour+1)%24; //当前时间的"时"加1
268 6 break;
269 6 case 0xcf: if(show_status==0) //闹钟设置的"时"加1
270 6 alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;
271 6 else if(show_status==3)
272 6 { month++; //当前日期的"月"加1
273 7 if(month==13) month=1; }
274 6 else if(show_status==4)
275 6 min=(min+1)%60; //当前时间的"分"加1
276 6 break;
277 6 case 0xf3: if(show_status==0)
278 6 alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;
279 6 else if(show_status==3)
280 6 {day++; //当前日期的"日"加1
281 7 if(day==32) day=1; }
282 6 else if(show_status==4)
283 6 {count_down=8000;
284 7 sec=(sec+1)%60; } //当前时间的"秒"加1
285 6 break;
286 6 case 0xfd: if(show_status==0)
287 6 alarm_wk^=0x1<<cur_alarm_set; //周末标志位切换
288 6 break;
289 6 case 0xfe: if(show_status==0)
290 6 alarm_en^=0x1<<cur_alarm_set; //启用标志位切换
291 6 }
292 5 return;
293 5 }
294 4 if(keytmp==4) //第三个按钮
295 4 {switch(attr)
296 5 { case 0xff: if(show_status==1 || show_status==2)
297 6 led_on=~led_on; //打开或关闭数码管显示
298 6 break;
299 6 case 0x3f: if(show_status==0) //如果正在设置闹钟
300 6 { if(cur_alarm_set==0) cur_alarm_set=7;
301 7 else cur_alarm_set--;}
302 6 else if(show_status==3) //当前日期的"年"减1
303 6 { if(year==0) year=49; else year--; }
C51 COMPILER V7.04 CLOCK 09/17/2005 11:01:02 PAGE 6
304 6 else if(show_status==4) //当前时间的"时"减1
305 6 { tmp=hour-1; if(tmp<0) hour=23; else hour=tmp; }
306 6 break;
307 6 case 0xcf: if(show_status==0) //闹钟设置的"时"减1
308 6 { tmp=alarm[cur_alarm_set].h-1;
309 7 if(tmp<0) alarm[cur_alarm_set].h=23;
310 7 else alarm[cur_alarm_set].h=tmp;
311 7 }
312 6 else if(show_status==3)
313 6 { month--; //当前日期的"月"减1
314 7 if(month==0) month=12; }
315 6 else if(show_status==4)
316 6 { tmp=min-1; //当前时间的"分"减1
317 7 if(tmp<0) min=59; else min=tmp; }
318 6 break;
319 6 case 0xf3: if(show_status==0) //闹钟设置的"分钟"减1
320 6 { tmp=alarm[cur_alarm_set].m-1;
321 7 if(tmp<0) alarm[cur_alarm_set].m=59;
322 7 else alarm[cur_alarm_set].m=tmp;
323 7 }
324 6 else if(show_status==3)
325 6 { day--; //当前日期的"日"减1
326 7 if(day==0) day=31; }
327 6 else if(show_status==4)
328 6 { tmp=sec-1; //当前时间的"秒"减1
329 7 count_down=8000;
330 7 if(tmp<0) sec=59; else sec=tmp; }
331 6 break;
332 6 case 0xfd: if(show_status==0) //切换周末标志
333 6 alarm_wk^=0x1<<cur_alarm_set;
334 6 break;
335 6 case 0xfe: if(show_status==0) //切换启用标志
336 6 alarm_en^=0x1<<cur_alarm_set;
337 6 }
338 5 return;
339 5 }
340 4 if(keytmp==8 & led_on) //第四个按钮,仅当数码管打开时有效
341 4 {switch(attr)
342 5 {case 0xff: if(show_status==1) //如果当前显示日期
343 6 show_status=3; //切换到调准日期状态
344 6 else if(show_status==2) //如果当前显示时间
345 6 show_status=4; //切换到调准时间状态
346 6 attr=0x3f; break; //第一?二个数码管闪烁
347 6 case 0x3f: attr=0xcf; break; //第三?四个数码管闪烁
348 6 case 0xcf: attr=0xf3; break; //第五?六个数码管闪烁case 0xf3: if(show_status==0)
349 6 case 0xf3: if(show_status==0) attr=0xfd; //第七个数码管闪烁
350 6 else if(show_status==3)
351 6 { show_status=1; attr=0xff; } //恢复正常显示日期
352 6 else if(show_status==4)
353 6 { show_status=2; attr=0xff; } //恢复正常显示时间
354 6 break;
355 6 case 0xfd: if(show_status==0) attr=0xfe; //第八个数码管闪烁
356 6 break;
357 6 case 0xfe: if(show_status==0) attr=0x3f; //第一?二个数码管闪烁
358 6 }
359 5 } // end of if(keytmp==4)
360 4 } // end of if(kp==0)
361 3 } // end of if(km==0)
362 2 } // end of if(keytmp!=0)
363 1 }
364 //以下是主函数
365 main()
C51 COMPILER V7.04 CLOCK 09/17/2005 11:01:02 PAGE 7
366 {
367 1 unsigned char i;
368 1 hour=23; min=58; sec=30; year=2; month=4; day=25;
369 1 count_down=8000;
370 1 flash=0; attr=0xff; led_on=1;
371 1 km=0; kp=0; show_status=2; //加电后显示当前时间
372 1 new_alarm_info=0; sound=0; alarm_stop=0;
373 1 for(i=0;i<8;i++) //从EEPROM中读入8个闹钟设置
374 1 { alarm[i].h=myread(i*2); alarm[i].m=myread(i*2+1); }
375 1 alarm_en=myread(i*2);
376 1 alarm_wk=myread(i*2+1);
377 1 IE=0; IP=0; //禁止所有中断
378 1 TMOD=0x12; //定时器0为模式2,定时器1为模式1
379 1 TH0=6; TL0=6; //定时器0为0.125ms
380 1 TH1=0x15; TL1=0xa0; //定时器1为30ms
381 1 TR0=1; TR1=1; //启动定时器0和定时器1
382 1 ET0=1; ET1=1; EA=1; //开定时器0中断?定时器1中断和总中断
383 1 while(1)
384 1 {
385 2 if(led_on)
386 2 for(i=0;i<8;i++)
387 2 { P2=0; if(flash || attr&(0x80>>i))
388 3 { P0=display; P2=0x80>>i; DelayX1ms(1); } }
389 2 else P2=0;
390 2 if(new_alarm_info)
391 2 { P2=0; //暂时关闭数码管
392 3 new_alarm_info=0; //写入EEPROM
393 3 for(i=0;i<8;i++)
394 3 { mywrite(i*2,alarm[i].h); mywrite(i*2+1,alarm[i].m); }
395 3 mywrite(i*2,alarm_en); mywrite(i*2+1,alarm_wk);}
396 2 }
397 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2224 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 39 4
IDATA SIZE = ---- ----
BIT SIZE = 7 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -