久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3490|回復: 5
打印 上一主題 下一主題
收起左側

關于單片機按鍵控制多位數碼管增減問題求教

[復制鏈接]
跳轉到指定樓層
樓主
想做一個電子時鐘:采用6位數碼管顯示當前日期,并可以利用按鍵修改年、月、日等信息。現在還沒有考慮顯示實時的日期,但是在按鍵控制數碼管數字加減的時候,碰到一個問題,當按鍵按下的時候可以加一,但按鍵彈起就又返回原來的值了,想向大神們請教一下原因是什么,具體程序該怎么改。附件有編的源碼和原理圖

單片機源程序:
  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共陰極數碼管段碼


  4. sbit key_jia=P2^0;//加鍵
  5. sbit key_jian=P2^1;//減鍵
  6. sbit key_xuan=P2^2; //校準時間鍵


  7. int change_time_flag=0;


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




  9. unsigned int nian,yue,ri;//實時 年月日


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


  14. void display_date()//實時時間界面顯示
  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;        //顯示小數點
  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() //按鍵判斷{                                                        ///////////////////實時時間設置        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) //實時設置按鍵按下        {        //        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;//初始時間                 //display_date();                key();//按鍵判斷                        //界面選擇//                if(runflag==0)   // key1();        display_date();                        }}
復制代碼


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

QQ圖片20171226184336.png

自制.rar

77.15 KB, 下載次數: 10

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:164602 發表于 2017-12-27 08:17 | 只看該作者
把你程序中,主函數,主循環第一句賦初值,放到主循環外面,成為主函數第一句。
你按鍵調整日期時間后,主循環最后還要循環到第一句,又重新賦初值,所以會有你說的現象。
回復

使用道具 舉報

板凳
ID:266627 發表于 2017-12-27 15:50 | 只看該作者
可能是去按按鍵抖動沒有做好,導致按一次,單片機卻認為按了多次。
建議先把思路整理一下,不要著急寫程序,先用文字描述下按鍵掃描的過程。

比如是希望按下的瞬間,數字加減,還是釋放瞬間。還是釋放后若干mS內再動作?

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:84283 發表于 2017-12-28 00:40 來自手機 | 只看該作者
  沒有把你改變的值 真正改變  只是滿足你按下去的if條件執行 但跳出if 你的改變量沒有在while中的實際控制時間的變量
回復

使用道具 舉報

5#
ID:217998 發表于 2017-12-28 22:58 | 只看該作者
HC6800-ES-V2.0 發表于 2017-12-27 08:17
把你程序中,主函數,主循環第一句賦初值,放到主循環外面,成為主函數第一句。
你按鍵調整日期時間后,主 ...

對的對的,謝謝大神
回復

使用道具 舉報

6#
ID:217998 發表于 2017-12-28 22:59 | 只看該作者
sirf3 發表于 2017-12-27 15:50
可能是去按按鍵抖動沒有做好,導致按一次,單片機卻認為按了多次。
建議先把思路整理一下,不要著急寫程序 ...

恩恩,好的,延時那邊我需要再考慮一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷精品 | 久久久久国产精品 | 一区二区中文字幕 | 久久专区| 国产中文一区二区三区 | 中文字幕在线人 | 瑟瑟激情 | 欧美成人一区二区三区片免费 | 黄色精品 | 国产中文原创 | 在线观看黄色大片 | 青青久草| 国产视频一区二区 | 一区二区三区免费 | 91免费电影 | 欧美日在线 | 中文字幕第100页 | 男人的天堂avav | 狠狠干综合视频 | 日本一区二区三区免费观看 | 精品人伦一区二区三区蜜桃网站 | 国产精品片 | 亚洲国产精久久久久久久 | 国户精品久久久久久久久久久不卡 | 一区二区三区中文字幕 | 亚洲男人网 | 午夜在线免费观看 | 日本成人中文字幕在线观看 | 日韩欧美视频免费在线观看 | 欧美久久综合 | 久久精品国产一区 | 亚洲视频在线一区 | aaa级片 | 国产欧美精品在线观看 | 国产精品久久久久久久免费观看 | 国产在线视频99 | 国产不卡一区在线观看 | 男人天堂手机在线视频 | 亚洲区在线| www.婷婷| 9999视频 |