|
想做一個電子時鐘:采用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(); }}
復制代碼
|
|