1 、此款电子时钟,时间可以设置,有4个按键,一个功能按键,一个加,一个减,一个确定按键。 2、按下功能按键一下,时钟走时停止,时两位数码管闪烁,代表此时再调时状态,这个时候加减按键就可以调整时钟,再次按下功能按键,就可以调整分钟,再按一下功能按键就可以设置秒。设置好时间后我们按确定按键,时钟开始走时。 3、这个程序将很好的教会我们怎么让数码管闪烁显示。 #include <REG51.H> typedef unsigned int UINT; typedef unsigned char UCHAR ; sbit key1=P3^3; sbit key2=P3^4; sbit key3=P3^5; sbit key6=P3^6; sbit LE1 = P3^1; //定义位控口 sbit LE2 = P3^2; //定义段控口 UCHAR MODE ; UCHAR page ; signed char HH = 0; //小时初始值 signed char MM = 0; //分钟初始值 signed char SS = 0; //秒初始值 UINT u1_10ms = 0; //10ms计数 UINT u2_10ms = 0; bit T_CYCLE = 0; extern void T0_Init(void); //初始化定时器,函数定义在timer.c UCHAR code NUM[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; void delay(UINT t) //延时t时钟周期 { while (t--) ; } void H_Increase(void) //小时增1 { IF(HH<23) HH++; else { HH = 0; } } void M_Increase(void) //分钟增1 { if(MM<59) MM++; else { MM = 0; } } void S_Increase(void) //秒增1 { if(SS<59) SS++; else { SS = 0; } } void H(void) //小时增1 { if(HH>0) HH--; else { HH =23; } } void M(void) //分钟增1 { if(MM>0) MM--; else { MM = 59; } } void S(void) //秒增1 { if(SS>0) SS--; else { SS = 59; } } void display(UCHAR SEG,UCHAR Digi) //显示一位数码管,SEG = 0-9数字,Digi = 第0-6位 { LE2 = 1; P0 = (0x01<<Digi) ; LE2 = 0; P0 = 0x00; LE1 = 1; P0 = NUM[SEG]; if (Digi==1||Digi==4) P1&= 0x7f ; //显示分隔符 delay(50); P0 = 0xff; LE1 = 0; } void key() { if(key1==0) { delay(2); if(key1==0) { while(!key1); TR0=0; if(MODE == 3) MODE = 1; else MODE ++; } } if(key2==0) { delay(2); if(key2==0) { while(!key2); if(MODE == 1) H_Increase() ; if(MODE == 2) M_Increase() ; if(MODE == 3) S_Increase() ; } } if(key3==0) { delay(2); if(key3==0) { while(!key3); if(MODE == 1) H() ; if(MODE == 2) M() ; if(MODE == 3) S() ; } } if(key6==0) { delay(2); if(key6==0) { while(!key6); TR0=1; MODE=0; } } } void main(void) { P1 = 0xff; LE1 = 0; LE2 = 0; T0_Init(); while(1) { key(); if(MODE != 1 || T_CYCLE) { display(HH/10,0); //显示小时十位数 display(HH%10,1); //显示小时个位数 display(10,2); } if(MODE != 2 || T_CYCLE) { display(MM/10,3); //显示分钟十位数 display(MM%10,4); //显示分钟个位数 display(10,5); //显示小时个位数 } if(MODE != 3 || T_CYCLE) { display(SS/10,6); //显示秒十位数 display(SS%10,7); //显示秒个位数 } } } extern void key_Process(void); extern void S_Increase(void); void T0_Init(void) { TMOD = 0x11; //定时器赋初始值,定时时间为10ms。 TH0 = 0xd8; TL0 = 0xf0; TH1 = 0xd8; TL1= 0xf0; ET0=1; ET1=1; TR0=1; TR1=1; EA=1; } void T0_INTSrv(void) interrupt 1 { //定时器重新开始计时。 TH0 = 0xd8; TL0 = 0xf0; u1_10ms ++; if (u1_10ms>99) // 1000 ms = 1 second { u1_10ms = 0; SS++; if(SS==60) { SS=0; MM++; if(MM==60) { MM=0; HH++; if(HH==24) HH=0; } } } } void T1_INTSrv(void) interrupt 3 { //定时器重新开始计时。 TH0 = 0xd8; TL0 = 0xf0; u2_10ms ++; if (u2_10ms%10==0) // 100 ms { T_CYCLE = ! T_CYCLE; //闪烁循环 } } |
k9702 发表于 2020-8-3 11:00 菜鸟刚起步。。。。 多谢指点哈。下次写上注释; |
wulin 发表于 2020-8-2 15:25 谢谢大佬。。。。。 |
楼主你写代码要习惯写注释啊,这样不论是发出来分享还是自己查错的时候都容易让人读懂 |
xianfajushi 发表于 2020-8-2 06:48 自己都看不下去了。。。 所以换成设置6个按键的了;那样就行了; 这个还不太会写;;还是要参考别人的代码仿写一下 |
wulin 发表于 2020-8-2 15:25 ![]() |
判断乱嵌套逻辑也就乱了,从代码看不是单独按键了,而是2个按键同时按下才起作用,闪烁可调节延时少点。 |