📄 main.lst
字号:
348 3 { sound=1; cur_alarm_active=tmp; break; } //闹钟项的时间
349 3 }
350 2 return;
351 2 }
352 1
353 1 if(count_down==0) //过了一秒钟
354 1 { count_down=8000;
355 2 sec++;
356 2 if(sec==60)
357 2 { sec=0;
358 3 min++;
359 3 if(min==60)
360 3 { min=0;
361 4 hour++;
362 4 if(hour==24)
363 4 { hour=0; day++;
364 5 switch(day)
365 5 { case 29: if(month==2 && year%4) { day=1; month=3; }
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 7
366 6 break;
367 6 case 30: if(month==2 && year%4==0) { day=1; month=3; }
368 6 break;
369 6 case 31: if(month==4 || month==6 || month==9 || month==11)
370 6 { day=1; month++; }
371 6 break;
372 6 case 32: day=1; month++;
373 6 if(month==13) { month=1; year++; }
374 6 }
375 5 }
376 4 }
377 3 }
378 2 }
379 1 }
380 ///////////////////////////////////////////////////////
381 //定时器2中断,用于按键扫描
382 //////////////////////////////////////////////////////
383 void Timer1ISR(void) interrupt 3 using 2
384 {
385 1 unsigned char keytmp;
386 1 TH1=0x15;
387 1 TL1=0xa0; // 每30ms中断一次
388 1 if(show_status==0) //当前正在设置闹钟项
389 1 {
390 2 display[0]=dis_code[ cur_alarm_set ];
391 2 display[1]=0xff;
392 2 display[2]=dis_code[ alarm[cur_alarm_set].h/10 ];
393 2 display[3]=dis_code[ alarm[cur_alarm_set].h%10 ];
394 2 display[4]=dis_code[ alarm[cur_alarm_set].m/10 ];
395 2 display[5]=dis_code[ alarm[cur_alarm_set].m%10 ];
396 2 display[6]=dis_code[ (alarm_wk>>cur_alarm_set)&1 ];
397 2 display[7]=dis_code[ (alarm_en>>cur_alarm_set)&1 ];
398 2 }
399 1 if(show_status==1 || show_status==3) //当前显示或设置日期
400 1 {
401 2 display[0]=dis_code[ year/10 ];
402 2 display[1]=dis_code[ year%10 ];
403 2 display[2]=dis_code[ month/10 ];
404 2 display[3]=dis_code[ month%10 ];
405 2 display[4]=dis_code[ day/10 ];
406 2 display[5]=dis_code[ day%10 ];
407 2 display[6]=0xff;
408 2 display[7]=dis_code[ weekday ];
409 2 }
410 1 if(show_status==2 || show_status==4) //当前显示或设置时间
411 1 {
412 2 display[0]=dis_code[ hour/10 ];
413 2 display[1]=dis_code[ hour%10 ];
414 2 display[2]=dis_code[ min/10 ];
415 2 display[3]=dis_code[ min%10 ];
416 2 display[4]=dis_code[ sec/10 ];
417 2 display[5]=dis_code[ sec%10 ];
418 2 display[6]=0xff;
419 2 display[7]=0xff;
420 2 }
421 1 /*** 按键扫描及处理 ***/
422 1 keytmp=P3;
423 1 keytmp=keytmp>>2;
424 1 keytmp=~(keytmp) & 0x0f;
425 1 if(keytmp==0) {km=0;kp=0;}
426 1 else
427 1 { if(km==0) km=1;
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 8
428 2 else
429 2 { if(kp==0)
430 3 { kp=1;
431 4 if(keytmp==1) SetAlarm(); //第一个按钮闹钟设置
432 4 if(keytmp==2 && led_on) SetInc(); //第二个按钮,仅当数码管打开时有效
433 4 if(keytmp==4) SetReduce(); //第三个按钮
434 4 if(keytmp==8 & led_on) SetNext(); //第四个按钮,仅当数码管打开时有效
435 4 } // end of if(kp==0)
436 3 } // end of if(km==0)
437 2 } // end of if(keytmp!=0)
438 1 }
439
440 //////////////////////////////////////////////////////////
441 //主函数入口
442 /////////////////////////////////////////////////////////
443 void main(void)
444 {
445 1 unsigned char i;
446 1 hour=12; min=00; sec=00;
447 1 year=8; month=8; day=8;
448 1 count_down=8000;
449 1 flash=0; attr=0xff;
450 1 led_on=1; //点亮数码管标志
451 1 km=0;kp=0;
452 1 show_status=2; //加电后显示当前时间
453 1 new_alarm_info=0;
454 1 sound=0;
455 1 alarm_stop=0;
456 1
457 1 for(i=0;i<8;i++) //从EEPROM中读入8个闹钟设置
458 1 {
459 2 alarm[i].h=myread(i*2);
460 2 alarm[i].m=myread(i*2+1);
461 2 }
462 1 alarm_en=myread(i*2);
463 1 alarm_wk=myread(i*2+1);
464 1 IE=0;
465 1 IP=0; //disable all interrupt and lower priority
466 1 TMOD=0x12; //timer 0 is set to mode 2,auto_reloading,timer1,mode 1
467 1 TH0=0x8d;
468 1 TL0=0x8d; //timer0 parameters for 0.125ms
469 1 TH1=0x94;
470 1 TL1=0x00; //timer1 parameters for 30ms
471 1 TR0=1;
472 1 TR1=1; //timer0 interrupt most important
473 1 ET0=1;
474 1 ET1=1;
475 1 EA=1; //enable interrupt function
476 1 while(1)
477 1 {
478 2 ///////////////////////////////////
479 2 if(led_on)
480 2 for(i=0;i<8;i++)
481 2 {
482 3 P2=0xff;
483 3 if( flash || attr&(0x80>>i) )
484 3 {
485 4 P0=display[i];
486 4 P2=0xff-(0x80>>i);
487 4 DelayX1ms(1);
488 4 }
489 3 }
C51 COMPILER V7.06 MAIN 08/22/2008 21:21:40 PAGE 9
490 2 else P2=0xff;
491 2 ///////////////////////////////////
492 2 if(new_alarm_info)
493 2 {
494 3 P2=0xff; //暂时关闭数码管
495 3 new_alarm_info=0; //写入EEPROM
496 3 for(i=0;i<8;i++)
497 3 {
498 4 mywrite(i*2,alarm[i].h);
499 4 mywrite(i*2+1,alarm[i].m);
500 4 }
501 3 mywrite(i*2,alarm_en);
502 3 mywrite(i*2+1,alarm_wk);
503 3 }
504 2
505 2 }
506 1 }
507 ///////////////////////////////////////////////
508 //程序结束
509 ///////////////////////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2120 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 39 1
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 + -