找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 25524|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)按鍵檢測(cè)源程序(實(shí)現(xiàn)單擊、雙擊、長(zhǎng)按等功能)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
原理:將按鍵這一事件的過(guò)程劃分成如下幾個(gè)狀態(tài):
        //stata 函數(shù)運(yùn)行狀態(tài)
        //0: 初始狀態(tài)
        //1: 第一洗按鍵按下
        //2: 第一次長(zhǎng)按抬起
        //3: 第一次短按抬起
        //4: 第二次按鍵按下
        //5: 第二次按鍵抬起

利用定時(shí)器記錄系統(tǒng)運(yùn)行時(shí)間,根據(jù)系統(tǒng)運(yùn)行時(shí)間來(lái)確定按鍵時(shí)間間隔,根據(jù)不同的時(shí)間間隔來(lái)判斷當(dāng)前按鍵事件處于哪一過(guò)程以及是否結(jié)束該事件。
主函數(shù)中應(yīng)循環(huán)調(diào)用按鍵檢測(cè)函數(shù),調(diào)用間隔不超過(guò)100ms,此函數(shù)不會(huì)阻塞程序運(yùn)行。


版本說(shuō)明:
............................................................
版本號(hào)Beta0.0
本驅(qū)動(dòng)工具包主要包含以下驅(qū)動(dòng)(xxx.c文件和xxx.h文件共同使用,下面不再寫(xiě)后綴)
1“define.h”----包含了類(lèi)型定義與開(kāi)發(fā)板屬性的設(shè)置(如晶振頻率等)
2“delay”----定義了兩個(gè)延時(shí)函數(shù),支持STC大多數(shù)芯片(除15H系列..)
【提示】本函數(shù)庫(kù)中驅(qū)動(dòng)多數(shù)依賴(lài)于"delay.c""delay.h"和"define.h"文件
3“digital_display”----數(shù)碼管顯示驅(qū)動(dòng)(硬件是基于兩個(gè)373鎖存器分別用作段數(shù)據(jù)和位數(shù)據(jù))
4“digital_to_string”----包含了浮點(diǎn)數(shù)轉(zhuǎn)換成字符串的函數(shù)
5“DS18B20”----溫度傳感器驅(qū)動(dòng)
6“DS1302”----時(shí)鐘芯片驅(qū)動(dòng)
7“I2C”----軟件模擬I2C總線驅(qū)動(dòng)
8“Keyboard”----矩陣鍵盤(pán)驅(qū)動(dòng)
9“LCD_1602_display”----1602液晶屏驅(qū)動(dòng)(并口)
10“LCD_12864_display”----12864液晶屏驅(qū)動(dòng)(并口帶中文字庫(kù))(只是顯示文字,不包含畫(huà)圖)
11“NEC_IR_coding”----用一個(gè)紅外LED實(shí)現(xiàn)紅外編碼發(fā)射的驅(qū)動(dòng)
12“NEC_IR_decoding”----紅外解碼驅(qū)動(dòng)
13“NRF24L01”----2.4G無(wú)線通訊模塊驅(qū)動(dòng)
14“Uart”----串口驅(qū)動(dòng)相關(guān)函數(shù)   
未完待續(xù)...
............................................................
............................................................
版本號(hào)Beta0.1
修復(fù)了數(shù)碼管有關(guān)殘影的bug
取消了矩陣鍵盤(pán)的松手檢測(cè),檢測(cè)不到鍵按下時(shí)返回0代替
未完待續(xù)...
............................................................
............................................................
版本號(hào)Beta0.2
加入了獨(dú)立按鍵的檢測(cè),兼容矩陣按鍵,修復(fù)了矩陣鍵盤(pán)關(guān)于不同開(kāi)發(fā)板兼容性的bug
增加了串口不同波特率的初始化程序
未完待續(xù)...
............................................................
............................................................
版本號(hào)Beta0.3
調(diào)整了數(shù)碼管顯示驅(qū)動(dòng)的結(jié)構(gòu)代碼,方便不同開(kāi)發(fā)板移植
調(diào)整了紅外解碼閾值,提高解碼效率
未完待續(xù)...
............................................................
............................................................
版本號(hào)Beta0.4
1602液晶驅(qū)動(dòng)的代碼更改為區(qū)域刷新,字符串長(zhǎng)度不夠顯示空格,避免出現(xiàn)顯示殘留
調(diào)整了若干驅(qū)動(dòng)文件名字
修復(fù)了數(shù)字轉(zhuǎn)字符串函數(shù)在顯示0時(shí)有負(fù)號(hào)的bug
添加了QMC5883地磁場(chǎng)傳感器驅(qū)動(dòng)
未完待續(xù)...
............................................................



核心代碼如下:


/*
按鍵檢測(cè)
返回值:0  無(wú)結(jié)果
                1  短按
                2  長(zhǎng)按
                3  雙擊
*/
u8 key_scan()
{
        //stata 函數(shù)運(yùn)行狀態(tài)
        //0: 初始狀態(tài)
        //1: 第一洗按鍵按下
        //2: 第一次長(zhǎng)按抬起
        //3: 第一次短按抬起
        //4: 第二次按鍵按下
        //5: 第二次按鍵抬起
        u8 res=0;
        static u8 key_sta,stata=0;  
        static u32 time=0,time1=0,time2=0;
        if(key==0)        //按下消抖
        {
delay_10ms(1);
                if(key==0)        
                        key_sta=0;               
                else
                        return 0;
        }
        else //松開(kāi)消抖
        {
                delay_10ms(1);
                if(key==1)         
                        key_sta=1;               
                else
                        return 0;               
        }

        if(stata==0)                                 //0: 初始狀態(tài)
        {         
                if(key_sta==0)                  
                {
                        stata=1;
                        time=system_time;
                }
                return 0;
        }
        else if(stata==1)                        //1: 第一洗按鍵按下
        {
                time1=system_time;
                time2=time1-time;         
                if(time2>60)
                {
                        stata=2;        
                }
                else if(key_sta==1)
                {
                        time=system_time;
                        stata=3;
                }
                return 0;
        }
        else if(stata==2)                        //2: 第一次長(zhǎng)按抬起
        {
                if(key_sta==1)
                {        
                        stata=0;
                        return 2;        
                }
                return 0;
        }
        else if(stata==3)                        //3: 第一次短按抬起
        {
                   time1=system_time;
                time2=time1-time;
                if(time2>30)
                {
                        stata=0;        
                        return 1;
                }
                else if(key_sta==0)
                {        
                        stata=4;        
                }
                return 0;
        }
        else if(stata==4)                        //4: 第二次按鍵按下
        {
                if(key_sta==1)                        //5: 第二次按鍵抬起
                {
                        stata=0;
                        return 3;
                }
                return 0;
        }
        else
                return 0;
}
void time0_irq() interrupt 1 using 1        //系統(tǒng)時(shí)間定時(shí)器  10ms+1
{
         TL0 = 0x00;                //設(shè)置定時(shí)初值
        TH0 = 0xDC;                //設(shè)置定時(shí)初值
        system_time++;
}



說(shuō)明:該工程使用了STC頭文件,請(qǐng)?jiān)赟TC-ISP軟件中將頭文件添加到Keil



全部資料51hei下載地址:
按鍵.rar (63.3 KB, 下載次數(shù): 313)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:438987 發(fā)表于 2018-12-7 11:01 | 只看該作者
可以是可以,但是,跟組合按鍵有沖突嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:256970 發(fā)表于 2019-7-16 15:09 | 只看該作者
還沒(méi)有試用此程序,單就按鍵程序來(lái)說(shuō)挺好的!思路很清晰!
回復(fù)

使用道具 舉報(bào)

地板
ID:207882 發(fā)表于 2019-7-16 21:52 | 只看該作者
        while(time2<t)
        {
                time2=system_time-time1;
        }


你這里還是死等10ms中斷一次呀,,,還是逃不出delay或者while的魔爪,,哈哈,,
回復(fù)

使用道具 舉報(bào)

5#
ID:387856 發(fā)表于 2020-6-29 09:05 | 只看該作者
一個(gè)程序里只要用到了delay(),這個(gè)程序就是適合玩玩,做不了產(chǎn)品的。真正的程序里一般不會(huì)用到delay()的。
回復(fù)

使用道具 舉報(bào)

6#
ID:502376 發(fā)表于 2020-9-28 11:30 | 只看該作者
liuhailan5757 發(fā)表于 2020-6-29 09:05
一個(gè)程序里只要用到了delay(),這個(gè)程序就是適合玩玩,做不了產(chǎn)品的。真正的程序里一般不會(huì)用到delay()的。

寫(xiě)入1602屏幕的時(shí)候,不用delay怎么辦  延時(shí)幾u(yù)s也要定時(shí)器嗎
回復(fù)

使用道具 舉報(bào)

7#
ID:492091 發(fā)表于 2020-10-9 14:21 | 只看該作者
登錄只為點(diǎn)贊,謝謝
回復(fù)

使用道具 舉報(bào)

8#
ID:118488 發(fā)表于 2021-6-8 09:19 | 只看該作者
kankan,xiexie~
回復(fù)

使用道具 舉報(bào)

9#
ID:401564 發(fā)表于 2021-7-8 00:38 | 只看該作者
liuhailan5757 發(fā)表于 2020-6-29 09:05
一個(gè)程序里只要用到了delay(),這個(gè)程序就是適合玩玩,做不了產(chǎn)品的。真正的程序里一般不會(huì)用到delay()的。

雖然過(guò)了一年多了,但我不是忍不住要說(shuō)說(shuō)
"一個(gè)程序里只要用到了delay(),這個(gè)程序就是適合玩玩,做不了產(chǎn)品的。真正的程序里一般不會(huì)用到delay()的。
"
真正的有經(jīng)驗(yàn)的單片機(jī)工程師是不會(huì)說(shuō)這種話的,
我雖然才學(xué)C語(yǔ)言幾天,但我手頭上有公司以前留下的檔案,產(chǎn)品是出口德國(guó)的,已經(jīng)穩(wěn)定量產(chǎn)的程序,看了你這話我特意的去看一下,delay()是有很多的
回復(fù)

使用道具 舉報(bào)

10#
ID:65956 發(fā)表于 2021-7-9 09:07 | 只看該作者
你這個(gè)system_time是全局變量嗎?在上面的代碼找不到定義處
回復(fù)

使用道具 舉報(bào)

11#
ID:974137 發(fā)表于 2021-11-15 14:51 | 只看該作者
Y_G_G 發(fā)表于 2021-7-8 00:38
雖然過(guò)了一年多了,但我不是忍不住要說(shuō)說(shuō)
"一個(gè)程序里只要用到了delay(),這個(gè)程序就是適合玩玩,做不了產(chǎn) ...

很好的學(xué)習(xí)環(huán)境啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表