数字时钟的显示及修改
实验目的
掌握定时器的使用、按键检测及数码管的动态显示。
实验内容
1、绘制如下proteus仿真图
功能,用6位数码管实现时、分、秒的显示及更新;
3、三个按键实现时间的修改。
代码
#include<reg52.h> #define u8 unsigned char #define u16 unsigned int sbit SW1 =P3^0; sbit SW2 =P3^1; sbit SW3 =P3^2; sbit LED = P3^7; u8 Data[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d, 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00 } ; enum fun { confirm=0,set_sec,set_min,set_hour }; enum fun SetTime; //u8 SetTime; bit SMG_SS_FLAG=0; u8 key_hour=8; u8 key_min =56; u8 key_sec =0; void delay_ms(u16 ms); void Display(u8 Hour,u8 Min,u8 Sec); void Key(void);
main() { LED=1; TMOD=0x01; //定时器0 方式1 TH0=0xfc; // 设置初始值1ms TL0=0x18; TR0=1; //启动定时器 ET0=1; //允许中断 EA=1; while(1) { Key(); // display(); } } void Key(void) { if(SW1==0) { delay_ms(10); if(SW1==0) // { SetTime++; if(SetTime>set_hour) { SetTime=confirm; } // SetTime=fun_f; } while(!SW1){;}; // } else if(SW2==0) { delay_ms(10); if(SW2==0) // { switch(SetTime) { case confirm: break; case set_sec: key_sec++; break; case set_min: key_min++; break; case set_hour: key_hour++; break; } } while(!SW2){;}; // } else if(SW3==0) { delay_ms(10); if(SW3==0) // { switch(SetTime) { case confirm: break; case set_sec: if(key_sec!=0)key_sec--; break; case set_min: if(key_min!=0)key_min--; break; case set_hour: if(key_hour!=0)key_hour--; break; } } while(!SW3){;}; // } } void delay_ms(u16 ms) { u8 k; u16 i; for(i=ms*2;i>0;i--) { for(k=250;k>0;k--) {} } } void Display(u8 Hour,u8 Min,u8 Sec) { static u8 DpyScan=0; P2=0xff; switch(DpyScan) { case 0:if(SMG_SS_FLAG==1||SetTime!=set_hour) { P1=Data[Hour/10]; } else { P1=0x00; } break; case 1:if(SMG_SS_FLAG==1||SetTime!=set_hour) { P1=Data[Hour%10]; } else { P1=0x00; } break; case 2:if(SMG_SS_FLAG||SetTime!=set_min) { P1=Data[Min/10]; } else { P1=0x00; } break; case 3:if(SMG_SS_FLAG||SetTime!=set_min) { P1=Data[Min%10]; } else { P1=0x00; } break; case 4:if(SMG_SS_FLAG||SetTime!=set_sec) { P1=Data[Sec/10]; } else { P1=0x00; } break; case 5:if(SMG_SS_FLAG||SetTime!=set_sec) { P1=Data[Sec%10]; } else { P1=0x00; } break; } P2=~(0x01<<DpyScan); if(DpyScan<6) { DpyScan++ ; } else { DpyScan=0; } } void timer0(void) interrupt 1 //定时器0中断函数 { static u16 SMG_twinkle; static u16 TIME=0; SMG_twinkle++; if(SMG_twinkle>20) { SMG_twinkle=0; SMG_SS_FLAG=~SMG_SS_FLAG; } TIME++ ; if(TIME>=200) { TIME=0; key_sec++; } if(key_sec>59) { key_sec=0;key_min++; } if(key_min>59) { key_min=0; key_hour++; } if(key_hour>23) { key_hour=0; key_min=0; key_sec=0; } Display(key_hour,key_min,key_sec); TH0=0xec; //1ms TL0=0x77; }
效果