|
想做一个电子时钟:采用6位数码管显示当前日期,并可以利用按键修改年、月、日等信息。现在还没有考虑显示实时的日期,但是在按键控制数码管数字加减的时候,碰到一个问题,当按键按下的时候可以加一,但按键弹起就又返回原来的值了,想向大神们请教一下原因是什么,具体程序该怎么改。附件有编的源码和原理图
单片机源程序:
- #include<reg51.h>
- //0 1 2 3 4 5 6 7 8 9 -
- char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //CC共阴极数码管段码
- sbit key_jia=P2^0;//加键
- sbit key_jian=P2^1;//减键
- sbit key_xuan=P2^2; //校准时间键
- int change_time_flag=0;
- // bit runflag=0;//界面选择
- unsigned int nian,yue,ri;//实时 年月日
- void delay(int i)
- {
- while(i--);//us延迟函数
- }
- void display_date()//实时时间界面显示
- {
- int i;
- for(i=0;i<6;i++)
- {
- switch(i)
- {
- case 0:P0=0XFE;P1=table[nian/10];
- break;
- case 1:P0=0XFD;P1=table[nian%10]|0x80; //显示小数点
- break;
- case 2:P0=0XFB;P1=table[yue/10];
- break;
- case 3:P0=0XF7;P1=table[yue%10]|0x80;
- break;
- case 4:P0=0XEF;P1=table[ri/10];
- break;
- case 5:P0=0XDF;P1=table[ri%10];
- break;
- }
- delay(10);
- P1=0x00; //消影
- }
- }
- void key() //按键判断{ ///////////////////实时时间设置 if(key_jia==0)//加键按下 { // delay(10);//消抖 if(key_jia==0) { // delay(10); // while(!key_jia); if(change_time_flag==0) { ri++; } else if(change_time_flag==1) { yue++; } else nian++; // while(!key_jia);//等待按键弹起 } //while(!key_jia);//等待按键弹起 }
- if(key_jian==0)//减键按下 { // delay(10); //消抖 if(key_jian==0) { if(change_time_flag==0) { ri--; } else if(change_time_flag==1) { yue--; } else nian--; } // while(!key_jian);//等待按键弹起 } if(key_xuan==0) //实时设置按键按下 { // delay(10); if(key_xuan==0) { // runflag=0; change_time_flag++; delay(10); if(change_time_flag==3) change_time_flag=0; } // while(!key_xuan); }
- }
- void main(){
- while(1) { ri=17;yue=12;nian=25;//初始时间 //display_date(); key();//按键判断 //界面选择// if(runflag==0) // key1(); display_date(); }}
复制代码
|
|