下面是我之前寫的一個按鍵檢測的框架,適合比較多的按鍵操作,從信號接收、濾波、最好處理按鍵任務,大體上沒什么問題,不過沒具體測試過到時可能會有bug。
1 /******************************************************************************
2 * @file button.c
3 * @author wule
4 * @version
5 * @date
6 * @brief
7 ******************************************************************************
8 *
9 *****************************************************************************/
10
11 typedef unsigned char ButtonSizeType;
12
13 typedef enum{
14 RESET = 0,
15 SET = !RESET,
16 }FLAG;
17
18 typedef struct button_bit{
19 ButtonSizeType button1:1;
20 ButtonSizeType button2:1;
21 ButtonSizeType button3:1;
22 ButtonSizeType button4:1;
23 ButtonSizeType button5:1;
24 ButtonSizeType button6:1;
25 ButtonSizeType button7:1;
26 ButtonSizeType button8:1;
27 }ButtonBitType;
28
29 typedef union
30 {
31 ButtonBitType button_bit;
32 ButtonSizeType button;
33 }ButtonType;
34
35 ButtonType InputFlag;
36
37 //初始化按鍵標志狀態
38 void Init_Button_Variable(void)
39 {
40 InputFlag.button = 0;
41 }
42
43 //判斷函數,讀取每個按鍵的狀態
44 ButtonSizeType ReadButtonBit(void)
45 {
46 ButtonType button_bit;
47
48 button_bit.button = 0;
49
50 button_bit.button_bit.button1 = 1;
51 button_bit.button_bit.button3 = 1;
52 button_bit.button_bit.button5 = 1;
53
54 return button_bit.button;
55 }
56 //濾波,返回值代表當前按鍵的值
57 ButtonSizeType Button_Filter(void)
58 {
59 ButtonSizeType bf_buf;
60 static ButtonSizeType bf_pre_buf = 0,bf_backval = 0;
61 static unsigned char bf_filtercnt = 0;
62
63 bf_buf = ReadButtonBit();
64
65 if(bf_buf != bf_backval && bf_buf == bf_pre_buf)//判斷兩次是否相同
66 {
67 bf_filtercnt ++;
68 if(bf_filtercnt > 50)//作一個簡單的濾波
69 {
70 bf_backval = bf_pre_buf;
71 }
72 }
73 else
74 {
75 bf_pre_buf = bf_buf;
76 bf_filtercnt = 0;
77 }
78
79 return bf_backval;
80 }
81 //處在一個時間可控的位置,這里可以實現各種按鍵的操作
82 void ButtonTask(void)
83 {
84 ButtonType bt_state = Button_Filter();//得到按鍵狀態
85
86 if(InputFlag.button_bit.button1 == 0 && bt_state.button_bit.button1 == 1)
87 {
88 //單次觸發
89 }
90 else if(InputFlag.button_bit.button1 == 1 && bt_state.button_bit.button1 == 0)
91 {
92 //單次釋放
93 }
94
95
96 if(bt_state.button_bit.button1 == 1)
97 {
98 //計時觸發
99 }
100 else
101 {
102 //結束判斷按的時間
103 }
104 }
上一篇:STM32項目中遇到的一些問題以及解決辦法
下一篇:STM32學習1:GPIO輸出實驗——點亮三色LED
推薦閱讀
史海拾趣
長工微電子在產品研發上不斷取得突破。其中,IS6608芯片實現了多相電源并聯輸出最高到200A,這是國產電源芯片第一家可以用于服務器CPU多相并聯電源解決方案,打破了歐美電源芯片廠商在多相電源的壟斷。同時,IS6607 20A集成mos電源芯片,以3x4mm的體積實現了100w的功率輸出,代表了當時芯片產業模擬電源的最高水平。這些產品廣泛應用于服務器、臺式機、筆電、基站、AI、LED顯示屏等市場領域,為公司帶來了豐厚的回報。
Defense Logistics Agency(DLA)于1961年成立,是美國國防部(DOD)的一個獨立作戰支援機構。在成立初期,DLA就明確了其戰略定位:為全球范圍內的美軍及國防部其他部門提供統一、高效的后勤保障服務。這一戰略定位的確立,為DLA的后續發展指明了方向。
隨著國內市場的飽和,BENCENT公司開始將目光投向海外市場。公司制定了詳細的國際化戰略,包括在海外市場設立分支機構、拓展銷售渠道、加強與當地企業的合作等。通過一系列的努力,公司成功打入多個海外市場,實現了業務的多元化和國際化。
隨著市場的不斷變化和競爭的加劇,BENCENT公司意識到只有不斷創新才能在行業中立足。公司加大了研發投入,引進了一批高素質的技術人才,并與其他科研機構展開合作。通過一系列的技術創新,公司成功推出了一系列具有自主知識產權的電子產品,進一步提升了市場競爭力。
中關村之痛中關村是如何痛失“技術中心”地位的? 2004年,中國高科技產業發展出現拐點:中國高科技產業由于資本市場退出形式的好轉,以及網絡熱潮的重新回暖,而被注入全新活力,開始步入新一輪黃金時期。2003年1 ...… 查看全部問答∨ |
我在PB中新建的工程,里面添加了MFC,USB鼠標鍵盤,SD卡,FTP等,導出的SDK,在EVC里面編寫程序,不能用winsock2庫,winsock2.h和ws2.lib文件都沒的,但EVC自帶的SDK的目錄下卻有!哪位朋友知道怎么在PB里添加winsock2支持嗎?… 查看全部問答∨ |
CE60 R3支持手勢功能,它是怎么支持的?提供有API?CE60 R3以前的系統要做手勢功能怎么做?WM_LBUTTONDOWN+WM_MOUSEMOVE? CE60 R3支持手勢功能,它是怎么支持的?提供有API?CE60 R3以前的系統要做手勢功能怎么做?WM_LBUTTONDOWN+WM_MOUSEMOVE?… 查看全部問答∨ |
|
【網絡攝像機】如何利用網絡服務器或網絡攝像機控制 PTZ ? 答: 按照普遍理解: 網絡攝影機(或視頻服務器)、解碼器、云臺、鏡頭,在遠程監控、數字化監控,應該理解為前端設備,而我們操作員控制的電腦、軟件,屬于後端控制中心設備; 我們的控制指令,是通過我們操控的電腦、軟件(或網絡攝影機 ...… 查看全部問答∨ |
我家的組裝電腦用了2年多,最近偶然間發現,當指尖與機箱金屬外殼接觸時,有較強烈觸電的感覺,后來用萬用表測試了前后的usb端口電壓竟高達30V,我家用的是華碩P5G4IT-MLX系列主板,以上還請各位大蝦多多指教!!… 查看全部問答∨ |