標(biāo)題: 關(guān)于單片機(jī)按鍵控制多位數(shù)碼管增減問題求教 [打印本頁]

作者: 棒棒糖帶刺    時(shí)間: 2017-12-26 19:38
標(biāo)題: 關(guān)于單片機(jī)按鍵控制多位數(shù)碼管增減問題求教
想做一個(gè)電子時(shí)鐘:采用6位數(shù)碼管顯示當(dāng)前日期,并可以利用按鍵修改年、月、日等信息,F(xiàn)在還沒有考慮顯示實(shí)時(shí)的日期,但是在按鍵控制數(shù)碼管數(shù)字加減的時(shí)候,碰到一個(gè)問題,當(dāng)按鍵按下的時(shí)候可以加一,但按鍵彈起就又返回原來的值了,想向大神們請(qǐng)教一下原因是什么,具體程序該怎么改。附件有編的源碼和原理圖

單片機(jī)源程序:
  1. #include<reg51.h>


  2.                                //0  1      2    3    4    5   6     7    8    9          -
  3. char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //CC共陰極數(shù)碼管段碼


  4. sbit key_jia=P2^0;//加鍵
  5. sbit key_jian=P2^1;//減鍵
  6. sbit key_xuan=P2^2; //校準(zhǔn)時(shí)間鍵


  7. int change_time_flag=0;


  8. // bit runflag=0;//界面選擇




  9. unsigned int nian,yue,ri;//實(shí)時(shí) 年月日


  10. void delay(int i)
  11. {
  12.         while(i--);//us延遲函數(shù)
  13. }


  14. void display_date()//實(shí)時(shí)時(shí)間界面顯示
  15. {
  16.         int i;
  17.         for(i=0;i<6;i++)
  18.         {
  19.                 switch(i)
  20.                 {
  21.                         case 0:P0=0XFE;P1=table[nian/10];
  22.                         break;
  23.                         case 1:P0=0XFD;P1=table[nian%10]|0x80;        //顯示小數(shù)點(diǎn)
  24.                         break;
  25.                         case 2:P0=0XFB;P1=table[yue/10];
  26.                         break;
  27.                         case 3:P0=0XF7;P1=table[yue%10]|0x80;
  28.                         break;
  29.                         case 4:P0=0XEF;P1=table[ri/10];
  30.                         break;
  31.                         case 5:P0=0XDF;P1=table[ri%10];
  32.                         break;
  33.                 }
  34.                 delay(10);
  35.                 P1=0x00;        //消影
  36.         }
  37. }

  38. void key() //按鍵判斷{                                                        ///////////////////實(shí)時(shí)時(shí)間設(shè)置        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);//等待按鍵彈起        }
  39.         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) //實(shí)時(shí)設(shè)置按鍵按下        {        //        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);        }
  40. }
  41. void main(){
  42.         while(1)        {                        ri=17;yue=12;nian=25;//初始時(shí)間                 //display_date();                key();//按鍵判斷                        //界面選擇//                if(runflag==0)   // key1();        display_date();                        }}
復(fù)制代碼


QQ圖片20171226184336.png (32.21 KB, 下載次數(shù): 61)

QQ圖片20171226184336.png

自制.rar

77.15 KB, 下載次數(shù): 10


作者: HC6800-ES-V2.0    時(shí)間: 2017-12-27 08:17
把你程序中,主函數(shù),主循環(huán)第一句賦初值,放到主循環(huán)外面,成為主函數(shù)第一句。
你按鍵調(diào)整日期時(shí)間后,主循環(huán)最后還要循環(huán)到第一句,又重新賦初值,所以會(huì)有你說的現(xiàn)象。
作者: sirf3    時(shí)間: 2017-12-27 15:50
可能是去按按鍵抖動(dòng)沒有做好,導(dǎo)致按一次,單片機(jī)卻認(rèn)為按了多次。
建議先把思路整理一下,不要著急寫程序,先用文字描述下按鍵掃描的過程。

比如是希望按下的瞬間,數(shù)字加減,還是釋放瞬間。還是釋放后若干mS內(nèi)再動(dòng)作?

作者: qq1105424012    時(shí)間: 2017-12-28 00:40
  沒有把你改變的值 真正改變  只是滿足你按下去的if條件執(zhí)行 但跳出if 你的改變量沒有在while中的實(shí)際控制時(shí)間的變量
作者: 棒棒糖帶刺    時(shí)間: 2017-12-28 22:58
HC6800-ES-V2.0 發(fā)表于 2017-12-27 08:17
把你程序中,主函數(shù),主循環(huán)第一句賦初值,放到主循環(huán)外面,成為主函數(shù)第一句。
你按鍵調(diào)整日期時(shí)間后,主 ...

對(duì)的對(duì)的,謝謝大神
作者: 棒棒糖帶刺    時(shí)間: 2017-12-28 22:59
sirf3 發(fā)表于 2017-12-27 15:50
可能是去按按鍵抖動(dòng)沒有做好,導(dǎo)致按一次,單片機(jī)卻認(rèn)為按了多次。
建議先把思路整理一下,不要著急寫程序 ...

恩恩,好的,延時(shí)那邊我需要再考慮一下




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1