標(biāo)題: 如何讓單片機(jī)按鍵檢測更靈敏? [打印本頁]

作者: whj023    時(shí)間: 2017-4-25 09:44
標(biāo)題: 如何讓單片機(jī)按鍵檢測更靈敏?
在做單片機(jī)按鍵程序的時(shí)候,靈敏度和效率難以取舍,各位大俠們,有沒有更好的方法呢?

#include <REGX51.H>
#include <intrins.h>

//獨(dú)立鍵盤.無按鍵動(dòng)作時(shí)其返回值num_key=0,否則返回按鍵號(hào)num_key
extern unsigned char keyboard_self()
{
        unsigned char num_key=0;//按鍵號(hào)
        unsigned char temp=0;//用于讀取P2線上按鍵值
        static unsigned char temp_code=0;//保存按鍵值
        static unsigned char num_check=0;//低電平有效次數(shù)
        static unsigned char key_flag=0;//按鍵有效標(biāo)識(shí)

        temp=P2&0xF0;//讀取P2線數(shù)據(jù)

        if(temp!=0xF0)//低電平判斷
        {
                num_check++;
                if(num_check==10)//連續(xù)10次(10ms)低電平有效,則認(rèn)為按鍵有效
                {
                        key_flag=1;//使能按鍵有效標(biāo)識(shí)
                        temp_code=temp;//保存按鍵值
                }
        }
        else//松手時(shí)判斷
        {
                num_check=0;

                if(key_flag==1)//按鍵有效
                {
                        key_flag=0;

                        switch(temp_code)//讀取按鍵號(hào)
                        {
                                case 0xE0: num_key=1;  P1=0xf0;
                                           break;
                                case 0xD0: num_key=2;  P1=0x0f;
                                           break;
                                case 0xB0: num_key=3;  P1=0xaa;
                                           break;
                                case 0x70: num_key=4;  P1=0xff;
                                           break;
                        }
                }
        }

        return(num_key);
}

void main()
{
        while(1)
        {
                keyboard_self();
        }
}




作者: whj023    時(shí)間: 2017-4-25 09:45
請(qǐng)各位大俠們多多指點(diǎn)
作者: zqy181818    時(shí)間: 2017-4-25 13:27
要有消抖函數(shù)
作者: wuyibin2003    時(shí)間: 2017-4-25 15:33
太靈敏容易誤動(dòng)作 一般加消抖程序
作者: wenjiulin    時(shí)間: 2017-4-25 15:48
如果你C寫的不好,可以增加一個(gè)RC電路一顆4.7K電阻一顆104電容即可
作者: sdgffg    時(shí)間: 2017-4-25 17:34
用消抖或者中斷吧
作者: 51Lovers    時(shí)間: 2017-4-25 18:32
鍵盤操作在ms級(jí),靈敏度根據(jù)自己設(shè)計(jì)需要吧,也可以增加硬件設(shè)計(jì);效率高就需要中斷方式。
作者: ahshmj    時(shí)間: 2017-4-25 18:39
按鍵消抖只是毫秒級(jí)的,不至于影響什么效率吧?如果不加消抖或消抖時(shí)間短,容易產(chǎn)生誤動(dòng)作。
即便是使用中斷,也要防止誤動(dòng)作。
只要鍵沒問題,也不存在靈敏度的問題。
作者: zl2168    時(shí)間: 2017-4-25 21:12
本帖最后由 zl2168 于 2017-4-25 21:19 編輯

按鍵抖動(dòng)一般是5~10ms,有少數(shù)超過10ms。手指按動(dòng)按鍵最快50~100ms。因此,按鍵消抖不會(huì)影響按鍵動(dòng)作靈敏度,影響按鍵動(dòng)作靈敏度的是程序編制,程序中按鍵掃描實(shí)時(shí)性才會(huì)影響按鍵動(dòng)作靈敏度。





以上摘自張志良編著《80C51單片機(jī)實(shí)用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學(xué)習(xí)51單片機(jī)原理,程序(雙解c和匯編)語句條條有注解,便于閱讀理解,便于自學(xué)。







作者: dragon19790000    時(shí)間: 2017-4-27 11:53
延時(shí)去抖最簡單,最好開關(guān)并聯(lián)104電容
作者: 你像風(fēng)兒來了    時(shí)間: 2017-4-28 13:54
硬件去抖就靈敏了,軟件優(yōu)化只是輔助作用
作者: 614600455    時(shí)間: 2017-4-28 16:47
硬件去做。軟件輔助

作者: metalbei    時(shí)間: 2017-4-28 18:27
加個(gè)延時(shí)函數(shù)進(jìn)行消抖,一般10ms
作者: 00xx    時(shí)間: 2017-4-28 22:15
使用中斷
作者: xiaoheiwushouji    時(shí)間: 2017-5-6 19:32
我也在找這資料...
作者: 惜緣2008    時(shí)間: 2017-5-6 20:13
按鍵一般要消抖,延時(shí)個(gè)5~~20ms
作者: 雄仔    時(shí)間: 2017-5-7 14:23
可以加電容
作者: jack678    時(shí)間: 2020-8-16 11:37
我覺得中斷時(shí)最靈敏的,其次就是用一個(gè)定時(shí)器,然后每個(gè)一段時(shí)間掃描一下按鍵,32中的滴答定時(shí)器就是不錯(cuò)的選擇
作者: 底層用戶    時(shí)間: 2022-3-31 21:27
可以用系統(tǒng)rtx
作者: 電工小明    時(shí)間: 2022-4-1 08:17
只追求按鍵靈敏度就用中斷,如果想提高按鍵穩(wěn)定性就用硬件去抖。
作者: qianhuan    時(shí)間: 2022-4-1 11:14
雄仔 發(fā)表于 2017-5-7 14:23
可以加電容

電容怎么選擇的
作者: 洛今夏    時(shí)間: 2022-4-1 13:30
要加消抖,可以利用延時(shí)函數(shù)消除抖動(dòng)
作者: 單片機(jī)學(xué)習(xí)習(xí)    時(shí)間: 2022-4-1 19:14
沒有消抖程序,加個(gè)20MS的按鍵延時(shí),就搞定
作者: ziyundehao    時(shí)間: 2022-4-2 01:37
寫個(gè)奇偶校驗(yàn) 沒記錯(cuò)的話《手把手教你51單片機(jī)》這本書就有講到
作者: dalaoshi    時(shí)間: 2022-4-2 16:58
看了很多抗抖動(dòng)的討論,想說幾句,這些抗抖動(dòng)的例子都只是停留在原理的解說,在實(shí)際應(yīng)用時(shí)就是另一回事,必須看應(yīng)用時(shí)按鈕的實(shí)際用途。

一個(gè)按鈕被按下,單片機(jī)一定能被檢測到,如果需要在其他程序被用來處理事件,就SETB一個(gè)位做識(shí)別,然后離開,根本無需抗抖動(dòng),因?yàn)榇蠖鄶?shù)程序完成事件處理后回來,早就過了抖動(dòng)期。如果處理事件的程序事件太短,可以用這個(gè)SETB的位跳過按鈕檢測程序,等事件處理程序完成處理事件,把被SETB的位CLR掉,自然就會(huì)運(yùn)行按鈕檢測程序,這樣就不會(huì)發(fā)生按一次鈕而多次觸發(fā)的問題。如果希望按下鈕后確保按鈕必須放開,則在檢測到按下后,進(jìn)入檢測放開的程序,不斷循環(huán),直到按鈕被放開,但這就浪費(fèi)單片機(jī)的時(shí)間了。

這說明在真實(shí)應(yīng)用的中,抗抖動(dòng)程序是很少用到的,教材只是教你原理。
作者: 3346661547    時(shí)間: 2022-4-3 16:41
使用消抖中斷方式
作者: 東方木青龍    時(shí)間: 2022-4-4 08:42
qianhuan 發(fā)表于 2022-4-1 11:14
電容怎么選擇的

估一下延時(shí)時(shí)間,RC延時(shí)




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