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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 25706|回復(fù): 10
收起左側(cè)

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

  [復(fù)制鏈接]
ID:280994 發(fā)表于 2018-8-6 14:11 | 顯示全部樓層 |閱讀模式
原理:將按鍵這一事件的過程劃分成如下幾個狀態(tài):
        //stata 函數(shù)運(yùn)行狀態(tài)
        //0: 初始狀態(tài)
        //1: 第一洗按鍵按下
        //2: 第一次長按抬起
        //3: 第一次短按抬起
        //4: 第二次按鍵按下
        //5: 第二次按鍵抬起

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


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



核心代碼如下:


/*
按鍵檢測
返回值:0  無結(jié)果
                1  短按
                2  長按
                3  雙擊
*/
u8 key_scan()
{
        //stata 函數(shù)運(yùn)行狀態(tài)
        //0: 初始狀態(tài)
        //1: 第一洗按鍵按下
        //2: 第一次長按抬起
        //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 //松開消抖
        {
                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: 第一次長按抬起
        {
                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)時間定時器  10ms+1
{
         TL0 = 0x00;                //設(shè)置定時初值
        TH0 = 0xDC;                //設(shè)置定時初值
        system_time++;
}



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

截圖.jpg

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



評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:438987 發(fā)表于 2018-12-7 11:01 | 顯示全部樓層
可以是可以,但是,跟組合按鍵有沖突嗎
回復(fù)

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
ID:256970 發(fā)表于 2019-7-16 15:09 | 顯示全部樓層
還沒有試用此程序,單就按鍵程序來說挺好的!思路很清晰!
回復(fù)

使用道具 舉報

ID:207882 發(fā)表于 2019-7-16 21:52 | 顯示全部樓層
        while(time2<t)
        {
                time2=system_time-time1;
        }


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

使用道具 舉報

ID:387856 發(fā)表于 2020-6-29 09:05 | 顯示全部樓層
一個程序里只要用到了delay(),這個程序就是適合玩玩,做不了產(chǎn)品的。真正的程序里一般不會用到delay()的。
回復(fù)

使用道具 舉報

ID:502376 發(fā)表于 2020-9-28 11:30 | 顯示全部樓層
liuhailan5757 發(fā)表于 2020-6-29 09:05
一個程序里只要用到了delay(),這個程序就是適合玩玩,做不了產(chǎn)品的。真正的程序里一般不會用到delay()的。

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

使用道具 舉報

ID:492091 發(fā)表于 2020-10-9 14:21 | 顯示全部樓層
登錄只為點(diǎn)贊,謝謝
回復(fù)

使用道具 舉報

ID:118488 發(fā)表于 2021-6-8 09:19 | 顯示全部樓層
kankan,xiexie~
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-7-8 00:38 | 顯示全部樓層
liuhailan5757 發(fā)表于 2020-6-29 09:05
一個程序里只要用到了delay(),這個程序就是適合玩玩,做不了產(chǎn)品的。真正的程序里一般不會用到delay()的。

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

使用道具 舉報

ID:65956 發(fā)表于 2021-7-9 09:07 | 顯示全部樓層
你這個system_time是全局變量嗎?在上面的代碼找不到定義處
回復(fù)

使用道具 舉報

ID:974137 發(fā)表于 2021-11-15 14:51 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-7-8 00:38
雖然過了一年多了,但我不是忍不住要說說
"一個程序里只要用到了delay(),這個程序就是適合玩玩,做不了產(chǎn) ...

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品三级 | 久草电影网 | 久久久国产精品一区 | 91精品国产一区二区三区动漫 | 视频在线观看一区二区 | 免费黄色片在线观看 | 宅男噜噜噜66一区二区 | 91在线视频免费观看 | 久久久国产一区二区三区 | 免费久久久久久 | 先锋资源吧 | 99re视频在线观看 | 日日骚网 | 国产欧美一区二区三区日本久久久 | 久久99精品久久久久蜜桃tv | 91影片| 欧美精品 在线观看 | 久久久久国产 | 丝袜一区二区三区 | 在线一区视频 | 三区在线 | 欧美一级在线观看 | 日韩国产免费观看 | 欧美国产中文字幕 | 天天操人人干 | 成年男女免费视频网站 | 欧美一级在线视频 | 国产乱码精品一区二区三区五月婷 | 久久久夜夜夜 | 欧美精 | 欧美美女二区 | 国产精品久久久久久久久久久久 | 亚洲三区在线观看 | 亚洲午夜精品久久久久久app | 日韩视频在线播放 | 天天综合永久 | 国产视频中文字幕在线观看 | 国产亚洲精品精品国产亚洲综合 | 亚洲国产精品一区二区三区 | av中文字幕在线播放 | 欧美亚洲国产日韩 |