熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2021-2-26 15:17
正文摘要:我現(xiàn)在會(huì)中斷掃描處理按鍵,短按一下LED亮,短按一下再滅,我現(xiàn)在想長按一下LED亮,長按一下再滅,不知道如何下手,請(qǐng)問高手指點(diǎn)一下 |
旁觀者 發(fā)表于 2021-3-6 16:40 必須加計(jì)數(shù)器 而且要設(shè)定計(jì)數(shù)器的時(shí)長或者間隔 不然以單片機(jī)的速度 瞬間你這個(gè)變量就溢出了 然后重新計(jì)數(shù) 最后得到值未知 即 不一定是你需要的值 假設(shè)你定義個(gè)int變量 那么最大范圍是65535 如果不加計(jì)數(shù)器 int變量從0到65535也就是毫秒級(jí)別 等你松手的時(shí)候int的值可能是0~65535之間任意一個(gè)數(shù)值 簡單的流程應(yīng)該是這樣 用計(jì)數(shù)器設(shè)定一個(gè)20~50ms計(jì)數(shù)器 即每一次中斷是20~50ms 然后設(shè)置一個(gè)變量 變量=計(jì)時(shí)器中斷次數(shù) 即 每20~50ms這個(gè)變量被+一次 按下按鍵后防抖 確認(rèn)按下時(shí) 清零變量 松開按鍵后防抖 確認(rèn)松開時(shí) 檢察變量的值 如果變量>閥值=長按 否則是短按 |
| 我的思路是這樣的,判斷按鍵按下在while循環(huán)自加一個(gè)變量,松開后用if判斷自加變量是否大于你定的時(shí)間變量,大于LED取反,自加變量置0. |
|
wulin 發(fā)表于 2021-2-26 16:50 終于看到高手了,這才是真確的按鍵處理思路。不像有些菜鳥,按鍵處理程序里面有delay(); |
|
這是基本功,你不是會(huì)中斷掃描處理按鍵了嗎,定時(shí)器的中斷時(shí)間是很準(zhǔn)確的,比如你的定時(shí)器中斷時(shí)間是10ms,在中斷中加一句:time++;這個(gè)time就是10ms計(jì)時(shí),第一次按鍵變1后,將time=0;等按鍵再一次變0后,time*10ms就是按鍵按下的準(zhǔn)確時(shí)間。 |
|
用定時(shí)器計(jì)數(shù)唄, 或者每過一小段時(shí)間讀一次進(jìn)行采樣,按照采樣次數(shù)來確定是否長按 |
|
P3.0讀到0后f計(jì)數(shù), P3.0變成1后看f的值, 若f大于某一樹,則認(rèn)為是長按,否則判定位短按或未按。 |
| 非STC得芯片? |
wulin 發(fā)表于 2021-2-26 16:50 謝謝,我就是苦惱在了計(jì)數(shù)怎么計(jì)的問題 |
| 壇子里有詳細(xì)講解的代碼,上面找找看看,很容易 |
|
定時(shí)中斷采樣鍵盤,鍵盤按下就計(jì)數(shù)+1,若判斷鍵盤松開,讀取鍵盤按下的計(jì)數(shù),根據(jù)大小判斷長短按。 |
|
//適用于STC8 #include <reg52.h> sbit key=P3^0; sbit LED=P3^3; long count;//計(jì)數(shù)變量 bit key_sign;//按鍵狀態(tài)標(biāo)志 void main() { while(1) { if(!key)//長按大約0.6秒響應(yīng),增加count值就可增加延時(shí) { if(++count>=100000 && key_sign==0) { key_sign=1;//記憶按鍵狀態(tài) LED=~LED;//LED取反 } } else//松手 { count=0;//計(jì)數(shù)變量清0 key_sign=0;//按鍵狀態(tài)復(fù)位 } } } |
| 參與人數(shù) 1 | 黑幣 +15 | 收起 理由 |
|---|---|---|
|
| + 15 | 絕世好帖! |
| 統(tǒng)計(jì)按下的時(shí)間應(yīng)該可以,就是時(shí)間超過2S認(rèn)為長按,才開燈! |
Powered by 單片機(jī)教程網(wǎng)