欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 關(guān)于單片機(jī)驅(qū)動(dòng)獨(dú)立按鍵的幾個(gè)問題,求分析 [打印本頁]

作者: SHANWAZI    時(shí)間: 2021-1-19 23:53
標(biāo)題: 關(guān)于單片機(jī)驅(qū)動(dòng)獨(dú)立按鍵的幾個(gè)問題,求分析
今天做獨(dú)立按鍵  控制數(shù)碼管的一個(gè)程序過程如下:
實(shí)驗(yàn)效果為按鍵按一下數(shù)碼管顯示鍵值
問題是1   因?yàn)槲业陌存I掃描是用的延時(shí)消抖
再一個(gè)就是松手檢測(cè)用的是這種while(!KEY1);
按鍵一直按著程序就死在循環(huán)這里導(dǎo)致每次按一下數(shù)碼管都閃一下這個(gè)閃一下我估計(jì)應(yīng)該就是程序就停在這里不走了這個(gè)會(huì)不會(huì)是一個(gè)弊端?
問題2  假如按鍵不松手重新一直就不走永遠(yuǎn)死在這了?    在做實(shí)驗(yàn)的時(shí)候試過通過標(biāo)志位的辦法來判斷和檢測(cè)   可是始終調(diào)不通無奈沒辦法初學(xué)者了解的也比較少!只能相論壇的師傅們請(qǐng)教了!
求問  有沒有其他什么辦法或者給一個(gè)思路可以在按鍵在沒有松手的情況下程序也不會(huì)停止返回來繼續(xù)判斷按鍵是否松開  松開了就為下一次按下做準(zhǔn)備。沒松開就繼續(xù)掃描。



作者: wulin    時(shí)間: 2021-1-20 06:19
樓主所述的按鍵程序只是一些入門級(jí)文章介紹的方法,目的是讓初學(xué)者初步了解MCU識(shí)別按鍵操作的過程。其具有不可克服的弊端,不可用于實(shí)戰(zhàn)中。關(guān)于各種應(yīng)用場(chǎng)景的按鍵掃描程序的寫法數(shù)不勝數(shù)。給你一款可用于實(shí)戰(zhàn)的獨(dú)立按鍵示例。
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit key=P3^4;                                //按鍵端口

  5. uchar key_value;                        //鍵值變量
  6. uint  count=0;                                //消抖計(jì)數(shù)變量
  7. bit   sign=0;                                //按鍵狀態(tài)標(biāo)志


  8. void keyscan()                                //按鍵掃描程序
  9. {
  10.         if(key==0)                                //檢測(cè)按鍵按下
  11.         {
  12.                 count++;                                //消抖計(jì)數(shù)
  13.                 if(count>=100 && sign==0)//100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
  14.                 {                       
  15.                         sign=1;                        //按鍵狀態(tài)標(biāo)志置1
  16.                         key_value++;
  17.                 }
  18.         }
  19.         else                                                //鍵抬起
  20.         {
  21.                 sign=0;                                //按鍵狀態(tài)標(biāo)志清0
  22.                 count=0;                                //消抖計(jì)數(shù)清0
  23.         }
  24. }
  25. void main()                                                //主函數(shù)
  26. {
  27.         while(1)
  28.         {
  29.                 keyscan();                                //按鍵掃描程序
  30.                 P1=~key_value;                        //P1接LED,鍵值取反低電平亮顯示鍵值
  31.         }
  32. }
復(fù)制代碼

作者: SHANWAZI    時(shí)間: 2021-1-20 08:26
wulin 發(fā)表于 2021-1-20 06:19
樓主所述的按鍵程序只是一些入門級(jí)文章介紹的方法,目的是讓初學(xué)者初步了解MCU識(shí)別按鍵操作的過程。其具有 ...

是的如您所說本人目前學(xué)習(xí)編程方法也比較入門也比較傻瓜式編程,在這里非常感謝您的回復(fù)和這歷程回去后好好研究一下其運(yùn)行原理十分感謝!!!!
作者: munuc_w    時(shí)間: 2021-1-20 08:56
我發(fā)了一個(gè)簡(jiǎn)易按鍵的處理函數(shù)的帖子,可以解決你的問題,審核通過后可以去看看。
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2021-1-20 10:01
本帖最后由 人人學(xué)會(huì)單片機(jī) 于 2021-1-20 18:35 編輯

下面的這個(gè)就是按鍵長(zhǎng)短按的,主函數(shù)循環(huán)掃碼就行,沒有死等!!!!
void ROTARY_Key_Scan_Drive()
{
        static bit flag1=0;
        static bit flag2=1;
        static bit key_down=0;
        static u8 count1=0;
        static u16 count2=0;
        if(key_down==1)
        {
                count2++;
                if(count2>10000)
                {
                        count2=0;
                        flag1=1;
                        if(flag2)
                        {
                                flag2=0;
                                Rotary_Read_Data_Key=ROTARY_KEY_L;
                        }
                }
                if(ROTARY_MUTE==1)
                {
                        key_down=0;
                        flag2=1;
                        count2=0;
                        if(flag1)
                        {
                                flag1=0;
                        }
                        else
                        {
                                Rotary_Read_Data_Key=ROTARY_KEY_S;        
                        }
                }
        }
        else
        {
                if(ROTARY_MUTE==0)
                {
                        count1++;
                        if(count1>100)
                        {
                                count1=0;
                                if(ROTARY_MUTE==0)
                                {
                                        key_down=1;
                                }
                        }
                }
                else
                {
                        count1=0;
                }
        }
}
我發(fā)的貼子有圖片,你可以看看 加深理解 http://m.raoushi.com/bbs/dpj-201806-1.html

作者: SHANWAZI    時(shí)間: 2021-1-20 10:31
munuc_w 發(fā)表于 2021-1-20 08:56
我發(fā)了一個(gè)簡(jiǎn)易按鍵的處理函數(shù)的帖子,可以解決你的問題,審核通過后可以去看看。

看不見樓主能不能給個(gè)鏈接記錄!!!!
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2021-1-20 10:36
http://m.raoushi.com/bbs/dpj-201806-1.html 這個(gè)是我寫的貼子,審核通過后就能看到了
作者: munuc_w    時(shí)間: 2021-1-20 11:04
SHANWAZI 發(fā)表于 2021-1-20 10:31
看不見樓主能不能給個(gè)鏈接記錄!!!!

好像領(lǐng)到在審查。。。。
作者: SHANWAZI    時(shí)間: 2021-1-20 11:12
munuc_w 發(fā)表于 2021-1-20 11:04
好像領(lǐng)到在審查。。。。

我現(xiàn)在還在單步運(yùn)行調(diào)試樓上師傅給的思路
作者: wulin    時(shí)間: 2021-1-20 11:25
SHANWAZI 發(fā)表于 2021-1-20 08:26
是的如您所說本人目前學(xué)習(xí)編程方法也比較入門也比較傻瓜式編程,在這里非常感謝您的回復(fù)和這歷程回去后好 ...

一款簡(jiǎn)練的矩陣鍵盤數(shù)碼管顯示程序仿真.zip (109.55 KB, 下載次數(shù): 9)

作者: SHANWAZI    時(shí)間: 2021-1-20 11:34
wulin 發(fā)表于 2021-1-20 06:19
樓主所述的按鍵程序只是一些入門級(jí)文章介紹的方法,目的是讓初學(xué)者初步了解MCU識(shí)別按鍵操作的過程。其具有 ...

您的例程我去研究一下了似乎有點(diǎn)巧妙   
只要按鍵不松開count貌似一直在自加  但是這個(gè)時(shí)候按鍵標(biāo)志位已經(jīng)被置位為1
在這里 if(count>=2 && kye_up==0)
{
         kye_up==1;
}
這標(biāo)志位要檢到0 兩個(gè)條件才會(huì)成立  兩個(gè)有一個(gè)不成立則不執(zhí)行后面的語句?
只要按鍵不松開標(biāo)志位就不清零??
以上我去單步運(yùn)行得出不知道對(duì)不對(duì)。
作者: wulin    時(shí)間: 2021-1-20 11:42
SHANWAZI 發(fā)表于 2021-1-20 11:34
您的例程我去研究一下了似乎有點(diǎn)巧妙   
只要按鍵不松開count貌似一直在自加  但是這個(gè)時(shí)候按鍵標(biāo)志位 ...

你理解的很正確,兩個(gè)條件同時(shí)成立才會(huì)執(zhí)行,count也不怕溢出,松手就清0。
作者: cdiyy    時(shí)間: 2021-1-20 11:47
        while((a<50)&&(GPIO_KEY!=0xf0))         //檢測(cè)按鍵松手檢測(cè)
                        {
                                delay(1000);
                                。。。。。。。。。。
                        }
作者: SHANWAZI    時(shí)間: 2021-1-20 11:56
wulin 發(fā)表于 2021-1-20 11:42
你理解的很正確,兩個(gè)條件同時(shí)成立才會(huì)執(zhí)行,count也不怕溢出,松手就清0。

即使加到65535再加一會(huì)從0開始再來一遍  只要按鍵不松開此計(jì)數(shù)就不清0
我明白了   非常感謝您給的思路這下問題迎刃而解真的的跪謝了!   
作者: SHANWAZI    時(shí)間: 2021-1-20 11:58
cdiyy 發(fā)表于 2021-1-20 11:47
while((a

感謝回復(fù)   我還在研究理解樓上例程!
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2021-1-20 18:34
用我回復(fù)你的代碼,或者看看我的貼子 http://m.raoushi.com/bbs/dpj-201806-1.html
作者: SHANWAZI    時(shí)間: 2021-1-21 09:42
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2021-1-20 10:01
下面的這個(gè)就是按鍵長(zhǎng)短按的,主函數(shù)循環(huán)掃碼就行,沒有死等!!!!
void ROTARY_Key_Scan_Drive()
{

太復(fù)雜短按都沒弄透徹  您這更加把兩個(gè)結(jié)合到了一起我這種初級(jí)手不太適合
作者: 學(xué)生1    時(shí)間: 2021-1-28 12:00
獨(dú)立按鍵比其他的按鍵操作更簡(jiǎn)單
作者: SHANWAZI    時(shí)間: 2021-1-28 14:10
學(xué)生1 發(fā)表于 2021-1-28 12:00
獨(dú)立按鍵比其他的按鍵操作更簡(jiǎn)單

是的  !




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