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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 25448|回復: 10
收起左側

51單片機按鍵檢測源程序(實現單擊、雙擊、長按等功能)

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

利用定時器記錄系統運行時間,根據系統運行時間來確定按鍵時間間隔,根據不同的時間間隔來判斷當前按鍵事件處于哪一過程以及是否結束該事件。
主函數中應循環調用按鍵檢測函數,調用間隔不超過100ms,此函數不會阻塞程序運行。


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



核心代碼如下:


/*
按鍵檢測
返回值:0  無結果
                1  短按
                2  長按
                3  雙擊
*/
u8 key_scan()
{
        //stata 函數運行狀態
        //0: 初始狀態
        //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: 初始狀態
        {         
                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        //系統時間定時器  10ms+1
{
         TL0 = 0x00;                //設置定時初值
        TH0 = 0xDC;                //設置定時初值
        system_time++;
}



說明:該工程使用了STC頭文件,請在STC-ISP軟件中將頭文件添加到Keil

截圖.jpg

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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

ID:256970 發表于 2019-7-16 15:09 | 顯示全部樓層
還沒有試用此程序,單就按鍵程序來說挺好的!思路很清晰!
回復

使用道具 舉報

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


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

使用道具 舉報

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

使用道具 舉報

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

寫入1602屏幕的時候,不用delay怎么辦  延時幾us也要定時器嗎
回復

使用道具 舉報

ID:492091 發表于 2020-10-9 14:21 | 顯示全部樓層
登錄只為點贊,謝謝
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

很好的學習環境啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本在线免费观看 | 精品国产伦一区二区三区观看说明 | 久久不卡 | 久久精品国内 | 欧美日本韩国一区二区三区 | 日日干干| 欧美激情国产精品 | 日日操夜夜干 | 岛国二区| 国产精品久久久久久久久久 | 国产精品亚洲综合 | 99国产精品99久久久久久 | 男女羞羞网站 | 在线免费黄色小视频 | 国产乱码精品一区二区三区忘忧草 | 蜜桃视频一区二区三区 | 国产精品国产精品国产专区不片 | 久久精品国产99国产 | 男女视频在线观看网站 | 在线免费看黄 | 国产原创视频 | 日本精品一区二区三区在线观看视频 | 午夜精品一区 | 成人在线视频网址 | 精品在线一区 | 欧美色综合一区二区三区 | 在线国产视频 | 超碰人人91 | 中文字幕中文字幕 | 亚洲欧美激情国产综合久久久 | 成人在线视频网站 | 在线观看www高清视频 | 久久香焦 | av中文字幕在线 | 国产精品永久免费 | 成人欧美| 亚洲欧美在线观看 | 中文字幕在线观看一区 | 国产精品久久久久9999鸭 | 日韩久久久久久久久久久 | 国产精品免费一区二区三区 |