亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 基于51單片機(jī)定時(shí)器的電子時(shí)鐘程序問題,關(guān)于按鍵控制問題? [打印本頁]

作者: king@    時(shí)間: 2016-11-1 23:35
標(biāo)題: 基于51單片機(jī)定時(shí)器的電子時(shí)鐘程序問題,關(guān)于按鍵控制問題?
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定時(shí)器,想要按鍵KEY1第一次按數(shù)碼暫停,KEY2控制秒加減,KEY3控制分加減,KEY4控制時(shí)加減,第二次按KEY1數(shù)碼管繼續(xù)計(jì)時(shí),按鍵這部分程序?qū)懙竭@里不知道為什么數(shù)碼管不受按鍵控制?求大神指導(dǎo)一下。



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

按鍵.png

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

CPU.png

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

數(shù)碼管.png

作者: yzwzfyz    時(shí)間: 2016-11-1 23:42
你的防按鍵彈動(dòng)方案太初級(jí)了。
作者: yzwzfyz    時(shí)間: 2016-11-1 23:47
按鍵按下有個(gè)彈動(dòng)的過程,即會(huì)產(chǎn)生0、1若干次,持續(xù)的時(shí)間是多少呢?就是你要解決的問題。
你用DelayMS(5),DelayMS(10)來解決彈動(dòng)問題的依據(jù)是什么呢?
作者: king@    時(shí)間: 2016-11-2 18:01
yzwzfyz 發(fā)表于 2016-11-1 23:42
你的防按鍵彈動(dòng)方案太初級(jí)了。

真心不會(huì)按鍵防抖更難的。
作者: king@    時(shí)間: 2016-11-2 18:03
yzwzfyz 發(fā)表于 2016-11-1 23:47
按鍵按下有個(gè)彈動(dòng)的過程,即會(huì)產(chǎn)生0、1若干次,持續(xù)的時(shí)間是多少呢?就是你要解決的問題。
你用DelayMS(5) ...

按照一般來說,按鍵防抖延時(shí)5-20MS
作者: feikong    時(shí)間: 2016-11-2 18:59
當(dāng)按鍵按下后,是等待按鍵恢復(fù)后在執(zhí)行功能的嗎?如while(key!=0);
作者: king@    時(shí)間: 2016-11-2 19:16
feikong 發(fā)表于 2016-11-2 18:59
當(dāng)按鍵按下后,是等待按鍵恢復(fù)后在執(zhí)行功能的嗎?如while(key!=0);

不是,首先判斷按鍵有沒有按下if(KEY==0),執(zhí)行程序,在判斷按鍵有沒有彈起while(!KEY),如果彈起就跳出這個(gè)循環(huán)。
作者: 愛你把    時(shí)間: 2016-11-3 15:41
你可以用軟件編譯一下
作者: yzwzfyz    時(shí)間: 2016-11-5 01:10
給你一個(gè)用了多年的程序,匯編的。領(lǐng)會(huì)實(shí)質(zhì)后自己用C寫。
作者: yzwzfyz    時(shí)間: 2016-11-5 01:10
;SCANKEY.ASM掃鍵,有效時(shí),置鍵有效B_INPUT,置鍵已按下未松開B_KEYPUSHED。
;下列狀況無效
;1,與上次鍵值R_LASTKEY不同
;2,與上次鍵值相同時(shí)間不足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里的各位就是按鍵結(jié)果,成功與否取決于B_INPUT(后面述)
                XCH        A, R_LASTKEY                ;取并存上次鍵值
                XRL     A, R_LASTKEY                ;與上次比較,相同?
                ANL        A, #C_KEY                ;如果有不用的鍵,就用#C_KEY常數(shù)屏蔽掉
                JZ        K001                        ;與上次比較,相同...
;與上次不同處理:復(fù)計(jì)次退出
                MOV        R_TIMEKEY, #C_TIME        ;不同,復(fù)鍵計(jì)次,#C_TIME計(jì)掃鍵的計(jì)次器,這里設(shè)8,8次
                SJMP    K00E
;與上次相同處理:不足8次(32ms),也不處理
K001:                MOV        A, R_TIMEKEY                ;上次與本次鍵值相同計(jì)次器
                JZ        K002                        ;=0,就表示到時(shí)間了,可以決定了。
                DEC        R_TIMEKEY                ;相同不足8次(32ms),也不處理
;與上次相同不足時(shí)間不處理
                SJMP    K00E
;8次相同-------------------------
;檢查是否未按下
K002:                MOV        A, R_LASTKEY            ;取本次鍵標(biāo)記位
                XRL        A, #C_KEY               ;未按的鍵值=0
                ANL        A, #C_KEY               ;只取鍵標(biāo)記位,排除不用的鍵位(1-8個(gè)鍵)
                JNZ        K003                    ;非0,一定有鍵按下
;未按下不處理:清長(zhǎng)按標(biāo)記(按下未松)后退出
                CLR        B_KEYPUSHED                ;是0,則鍵已長(zhǎng)時(shí)未按,即鍵已松開,清松開標(biāo)記
                SJMP    K00E
;鍵按下且達(dá)32ms以上,鍵否松開?
K003:                JNB        B_KEYPUSHED, K004       ;按下未松不處理
                SJMP    K00E                    ;鍵已按下不處理
;鍵按下且達(dá)32ms以上,鍵也松開了
K004:                SETB        B_INPUT                        ;否則置鍵有效,B_INPUT
                SETB        B_KEYPUSHED                ;置鍵已按下
K00E:                RET

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

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

作者: wxc19960311    時(shí)間: 2017-9-27 21:42
yzwzfyz 發(fā)表于 2016-11-1 23:47
按鍵按下有個(gè)彈動(dòng)的過程,即會(huì)產(chǎn)生0、1若干次,持續(xù)的時(shí)間是多少呢?就是你要解決的問題。
你用DelayMS(5) ...

延時(shí)去除抖動(dòng)




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