VtorKey-輕量級(jí)短長(zhǎng)按單多擊組合動(dòng)作按鍵模塊
VtorKey-輕量級(jí)短長(zhǎng)按單多擊組合動(dòng)作按鍵模塊
?
?
VtorKey
VtorKey-輕量級(jí)短長(zhǎng)按單多擊組合動(dòng)作按鍵模塊
作者郵箱:vtor3478@qq.com
開發(fā)時(shí)間:2023年07月03日(周一)
相關(guān)網(wǎng)址:
https://www.bilibili.com/video/BV1sm4y1Y78Q
https://gitee.com/vtor3478/ElecModule
https://gitee.com/vtor3478/ElecModule/tree/main/VtorKey
?
00-前言
本設(shè)計(jì)(包括但不限于圖片,文字,視頻,代碼風(fēng)格,以下省去括號(hào))
將發(fā)布于博客園,b站,吾愛論壇,開源中國(guó),偽鈔雜貨鋪微信公眾號(hào),影子論壇等
本設(shè)計(jì)為 偽鈔 本人創(chuàng)作,轉(zhuǎn)載請(qǐng)注明出處
?
本設(shè)計(jì)能提供單擊,長(zhǎng)按,以及長(zhǎng)短按組合的按鍵反饋
本設(shè)計(jì)適用于gpio資源少,且需要較多用戶操作的情況
本設(shè)計(jì)截止至目前(20230703)僅支持輪詢,以后有機(jī)會(huì)再開發(fā)中斷模式
?
理解(并使用)本設(shè)計(jì),需要你有一點(diǎn)數(shù)據(jù)結(jié)構(gòu)基礎(chǔ),
?????????????????????????????????????????????有一定的c語(yǔ)言與單片機(jī)基礎(chǔ)
???????????????????????????有較為扎實(shí)的狀態(tài)機(jī)基礎(chǔ),
?
本設(shè)計(jì)是我基于原有的基礎(chǔ)工程《diaan》進(jìn)行設(shè)計(jì),
其中包含許多其他知識(shí),如果我沒有提及,那說明與VtorKey無(wú)關(guān)
?
軟件環(huán)境:stm32cubeide 1.12.0
硬件環(huán)境:stm32f103rct6
?
名詞解釋:
curState:當(dāng)前狀態(tài),記錄長(zhǎng)按,短按,彈起,消抖等狀態(tài)
lastState:用于彈起時(shí),區(qū)分剛剛是長(zhǎng)按還是短按
holdTime:持續(xù)時(shí)間,用于區(qū)分短按還是長(zhǎng)按,區(qū)分短彈起還是長(zhǎng)彈起
?
?
?
01-分析按鍵狀態(tài)
一個(gè)按鍵,從按下到彈起,會(huì)經(jīng)歷哪些情況
?
電平情況: ??彈起時(shí)的電平 ??????????????????????????按下后的電平
狀態(tài)可分: ??彈起 ????????????按消 ??????????????按下 ?????????彈消
按下時(shí)長(zhǎng): ??短按 ???????????長(zhǎng)按 ???????????????短彈 ??????????長(zhǎng)彈
?
?
02-單擊長(zhǎng)短按
如果curState為《按下》,如果holdTime小于《長(zhǎng)按值》認(rèn)定為《短按》并記錄
??????????????????????????????????????如果holdTime大于《長(zhǎng)按值》認(rèn)定為《長(zhǎng)按》并記錄
當(dāng)lastState與curState將要不同時(shí),使用lastState記錄curState,然后更c(diǎn)urState
?
03-消抖環(huán)節(jié)
消抖的判斷代碼在長(zhǎng)短按判斷之前,只是文章介紹訪問長(zhǎng)短按之后
為了防止在觸發(fā)長(zhǎng)按的過程中觸發(fā)短按,所以需要用用彈起狀態(tài)作為一個(gè)單擊動(dòng)作的結(jié)束
當(dāng)curState為《彈起》,由于,根據(jù)lastState是短按,還是長(zhǎng)按,就可以使用對(duì)應(yīng)的返回值
?
?
04-組合動(dòng)作
上一次彈起與下一次按下的時(shí)間足夠小,認(rèn)為是組合動(dòng)作
?
如果要記錄組合動(dòng)作,需要一個(gè)組合內(nèi) 動(dòng)作與動(dòng)作之間《分隔符》
按習(xí)慣來(lái)說,用《短彈》作為《分隔符》比較合適
如果要記錄組合動(dòng)作,需要一個(gè)結(jié)束組合動(dòng)作結(jié)束的《結(jié)束符》
按習(xí)慣來(lái)說,用《長(zhǎng)彈》作為《結(jié)束符》比較合適
?
因?yàn)橐却督Y(jié)束符》所以響應(yīng)速度比較慢
?
當(dāng)用戶快速短按2下,并等待一段時(shí)間
其中兩次短擊之間間隔一般小于500ms,所以我使用500作為《長(zhǎng)彈》的比較值
~~~~~無(wú)限長(zhǎng)時(shí)間~~~~~~~按下~500ms~彈起~~~200ms~~~按下~~50ms~~彈起~~~~~~無(wú)限長(zhǎng)時(shí)間~~~~~
此動(dòng)作可認(rèn)為《短短按》,值為《11》
?
?
05-PeekCombine
為防止重復(fù)操作,為防止用戶直接修改,為防止其他意外情況
所以使用KEY_PeekCombine獲取組合動(dòng)作,
只有在組合動(dòng)作結(jié)束后才會(huì)返回有效值,
且函數(shù)內(nèi)會(huì)清空組合動(dòng)作,防止反復(fù)獲取
?
06-PeekAction
只提供按下動(dòng)作 ??和 ???彈起動(dòng)作
為簡(jiǎn)單環(huán)境提供按操作
不是重點(diǎn),略過,有興趣請(qǐng)自行學(xué)習(xí)
?
?
07-移植與使用流程
0701-反綁定
因?yàn)楸驹O(shè)計(jì)反綁定了project.h
所以用戶需要先創(chuàng)建project.h文件,以確保成功編譯
?
0702-時(shí)間設(shè)置
搜索VTOR_KEY_TIME_CONFIG_BY_USERSELF
在project.h中定義,并定義好時(shí)間和電平宏
?
?
0703-KEY_GetLevel函數(shù)
用戶只需要提供讀取key的io電平(vtor_key_user_project.c文件)
本設(shè)計(jì)使用了HAL_GPIO_ReadPin直接讀取io
?
0704-KEY_Init函數(shù)
初始化好vtorKeyHeader即可
?
0705-KEY_Scan函數(shù)
定時(shí)循環(huán)調(diào)用即可
?
0706-KEY_PeekCombine函數(shù)
根據(jù)返回值進(jìn)行判斷即可
?
?
?
?
?
?
?