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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機定時器的電子時鐘程序問題,關于按鍵控制問題?

[復制鏈接]
跳轉到指定樓層
樓主
void keyscan()
{
   unsigned char flag;
   if(KEY1==0)
   {
         DelayMS(10);
         if(KEY1==0)
         {                   
              di();
                  TR0=~TR0;
                  flag=~flag;
                     while(!KEY1);
         }       
   }
   if(flag)
   {
         if(KEY2==0)
     {
         DelayMS(5);
         if(KEY2==0)
            {
                  di();
                 s=s+1;
                 if(s==60)
                 s=0;
                  while(!KEY1);


            }
     }


         if(KEY3==0)
     {
         DelayMS(5);
         if(KEY3==0)
            {
                  di();
                 m=m+1;
                 if(m==60)
                 m=0;
                  while(!KEY3);
            }
     }
         if(KEY4==0)
     {
         DelayMS(5);
         if(KEY4==0)
            {
                  di();
                 h=h+1;
                 if(h==24)
                 s=0;
                  while(!KEY4);


            }
     }






   }


}


我用的的T0定時器,想要按鍵KEY1第一次按數碼暫停,KEY2控制秒加減,KEY3控制分加減,KEY4控制時加減,第二次按KEY1數碼管繼續計時,按鍵這部分程序寫到這里不知道為什么數碼管不受按鍵控制?求大神指導一下。



按鍵.png (41.79 KB, 下載次數: 88)

按鍵.png

CPU.png (120.88 KB, 下載次數: 88)

CPU.png

數碼管.png (146.82 KB, 下載次數: 77)

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

使用道具 舉報

沙發
ID:123289 發表于 2016-11-1 23:42 | 只看該作者
你的防按鍵彈動方案太初級了。
回復

使用道具 舉報

板凳
ID:123289 發表于 2016-11-1 23:47 | 只看該作者
按鍵按下有個彈動的過程,即會產生0、1若干次,持續的時間是多少呢?就是你要解決的問題。
你用DelayMS(5),DelayMS(10)來解決彈動問題的依據是什么呢?
回復

使用道具 舉報

地板
ID:102056 發表于 2016-11-2 18:01 | 只看該作者
yzwzfyz 發表于 2016-11-1 23:42
你的防按鍵彈動方案太初級了。

真心不會按鍵防抖更難的。
回復

使用道具 舉報

5#
ID:102056 發表于 2016-11-2 18:03 | 只看該作者
yzwzfyz 發表于 2016-11-1 23:47
按鍵按下有個彈動的過程,即會產生0、1若干次,持續的時間是多少呢?就是你要解決的問題。
你用DelayMS(5) ...

按照一般來說,按鍵防抖延時5-20MS
回復

使用道具 舉報

6#
ID:145763 發表于 2016-11-2 18:59 | 只看該作者
當按鍵按下后,是等待按鍵恢復后在執行功能的嗎?如while(key!=0);
回復

使用道具 舉報

7#
ID:102056 發表于 2016-11-2 19:16 | 只看該作者
feikong 發表于 2016-11-2 18:59
當按鍵按下后,是等待按鍵恢復后在執行功能的嗎?如while(key!=0);

不是,首先判斷按鍵有沒有按下if(KEY==0),執行程序,在判斷按鍵有沒有彈起while(!KEY),如果彈起就跳出這個循環。
回復

使用道具 舉報

8#
ID:145922 發表于 2016-11-3 15:41 | 只看該作者
你可以用軟件編譯一下
回復

使用道具 舉報

9#
ID:123289 發表于 2016-11-5 01:10 | 只看該作者
給你一個用了多年的程序,匯編的。領會實質后自己用C寫。
回復

使用道具 舉報

10#
ID:123289 發表于 2016-11-5 01:10 | 只看該作者
;SCANKEY.ASM掃鍵,有效時,置鍵有效B_INPUT,置鍵已按下未松開B_KEYPUSHED。
;下列狀況無效
;1,與上次鍵值R_LASTKEY不同
;2,與上次鍵值相同時間不足R_TIMEKEY<>0(<32ms)
;3,無按鍵
;4,按下未松開B_KEYPUSHED=1
;影響:PSW,A,RB_KEY,R_LASTKEY ,R_TIMEKEY

SCANKEY:        MOV        A, P1                        ;取鍵值1-8鍵都可以
                MOV        RB_KEY,A                ;存入本次鍵值,如果成功RB_KEY里的各位就是按鍵結果,成功與否取決于B_INPUT(后面述)
                XCH        A, R_LASTKEY                ;取并存上次鍵值
                XRL     A, R_LASTKEY                ;與上次比較,相同?
                ANL        A, #C_KEY                ;如果有不用的鍵,就用#C_KEY常數屏蔽掉
                JZ        K001                        ;與上次比較,相同...
;與上次不同處理:復計次退出
                MOV        R_TIMEKEY, #C_TIME        ;不同,復鍵計次,#C_TIME計掃鍵的計次器,這里設8,8次
                SJMP    K00E
;與上次相同處理:不足8次(32ms),也不處理
K001:                MOV        A, R_TIMEKEY                ;上次與本次鍵值相同計次器
                JZ        K002                        ;=0,就表示到時間了,可以決定了。
                DEC        R_TIMEKEY                ;相同不足8次(32ms),也不處理
;與上次相同不足時間不處理
                SJMP    K00E
;8次相同-------------------------
;檢查是否未按下
K002:                MOV        A, R_LASTKEY            ;取本次鍵標記位
                XRL        A, #C_KEY               ;未按的鍵值=0
                ANL        A, #C_KEY               ;只取鍵標記位,排除不用的鍵位(1-8個鍵)
                JNZ        K003                    ;非0,一定有鍵按下
;未按下不處理:清長按標記(按下未松)后退出
                CLR        B_KEYPUSHED                ;是0,則鍵已長時未按,即鍵已松開,清松開標記
                SJMP    K00E
;鍵按下且達32ms以上,鍵否松開?
K003:                JNB        B_KEYPUSHED, K004       ;按下未松不處理
                SJMP    K00E                    ;鍵已按下不處理
;鍵按下且達32ms以上,鍵也松開了
K004:                SETB        B_INPUT                        ;否則置鍵有效,B_INPUT
                SETB        B_KEYPUSHED                ;置鍵已按下
K00E:                RET

主程序使用
1、B_INPUT=1,則RB_KEY中的鍵值有效,可以使用(1-8個鍵,通常=0的是按下了),鍵處理程序完成后,記得清B_INPUT=0,就可以了。
2、B_INPUT=0,無鍵有效。

程序中各參數:
B_INPUT:    鍵有效標記
RB_KEY:     鍵值,通常是20H-2FH中的一個單元,可以位尋址,用起來方便。
R_LASTKEY:  上次采樣鍵值
R_TIMEKEY:  上次本次鍵值相同計次器,如計8次,對于4ms的掃鍵,=32ms
B_KEYPUSHED:鍵按下未松標記
C_KEY:      鍵屏蔽值,如:00001111B,表示高4位無鍵,低4位有鍵(P10,P11,P12,P13)
C_TIME:      常數8,當上次本次鍵值不相同時,用它復位R_TIMEKEY。
回復

使用道具 舉報

11#
ID:186936 發表于 2017-9-27 21:42 | 只看該作者
yzwzfyz 發表于 2016-11-1 23:47
按鍵按下有個彈動的過程,即會產生0、1若干次,持續的時間是多少呢?就是你要解決的問題。
你用DelayMS(5) ...

延時去除抖動
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲伊人久久综合 | 日韩精品一区二区三区在线播放 | 91精品入口蜜桃 | 中文字幕一区二区三区四区五区 | 欧美久久久久久久久 | 国内精品久久久久 | 国产成人精品av | 97超碰在线播放 | 亚洲一区二区三区四区五区中文 | 九九九视频 | 欧美成年黄网站色视频 | 国产三区av | 九九伦理片 | 日日干日日操 | 亚洲天堂中文字幕 | 精品美女久久久 | 国产精品视频区 | 一级做a爰片久久毛片免费看 | 国产精品18久久久久久白浆动漫 | 久久天天躁狠狠躁夜夜躁2014 | 国产黄色大片网站 | 日韩免费一二三区 | 欧美一级二级在线观看 | 免费黄色a视频 | 成人精品在线观看 | 看片wwwwwwwwwww| 香蕉国产在线视频 | 午夜欧美日韩 | 国产精品二区三区在线观看 | 91国在线观看 | 精品一区二区三区91 | 精品av| 97av视频在线观看 | 最新日韩精品 | 国产亚洲一区二区在线观看 | 日本一区二区不卡视频 | 狠狠插天天干 | 国产高清视频在线 | 欧美成人精品在线观看 | 国产九九精品视频 | 欧美日韩亚洲一区 |