㈠ 51單片機,矩陣按鍵,長按短按判斷
/*網友反映長鍵結束後會送出短鍵值,特作更改2019.03.29*/
//1,再寫一個長短鍵判斷函數,調用那個按鍵掃描函數
unsignedcharKEY_process(void)
{
staticunsignedcharOld_key=0;//上次按鍵值
staticunsignedcharKey_buf=0;//按鍵有效保存
staticunsignedcharPress_CNT=0;//按鍵按下時間,根據調用時間間隔確定
=0;//長鍵有效標記變數
unsignedcharNew_key=0;//當前按鍵值
unsignedcharKEY=0;//待返回的按鍵值
New_key=keyscan();
if(New_key==Old_key)
{
if(New_key!=0)//建議keyscan返回0的那個值改為其他值,方便這里判斷
{
Key_buf=New_key;
if(Press_CNT<0xff)
{
Press_CNT++;
}
if(Press_CNT>=100)//調用時間間隔確定*100為長按時間,
{
KEY=Key_buf+100;//將短鍵+100作長鍵區分
Press_CNT=0;//按鍵時間清0
Key_buf=0;//按鍵緩沖清0
bPreKeyIsLong=1;//長鍵有效標記
}
}
else//按鍵彈起
{
if(Key_buf&&(bPreKeyIsLong==0))//僅在長鍵無效時
{
KEY=Key_buf;//將緩沖值送將返回的值
Key_buf=0;//清按鍵緩沖
}
Press_CNT=0;//按鍵彈起或按其他按鍵,將長按時間清0
bPreKeyIsLong=0;//長鍵有效標記清0
}
}
Old_key=New_key;//將新按鍵賦給下一次的舊按鍵值
returnKEY;//0代表無按鍵
}
//2,彈起不返回已確定的值,則在keyscan最後加一句判斷
if((P3&0X0F)==0X0F)//按鍵已經彈起
{
keyvalue=MY_key;//使按鍵等於一個自定義的值
}
㈡ 如何用單片機判斷按鍵是單擊還是雙擊
假設有鍵按下時 key = 0 。
if(key == 0) { //發現按下按鍵
Delay(10) //延時約10ms
if(key == 0) { //確認第一次按下
while(!key); //等待釋放
//-------------------以上是常規的按鍵判別步驟
Delay(100) //多延時一會,約100ms
if(key == 0) {//確認第二次按下
//執行雙擊程序
}
else {
//執行單擊程序
}
}
}
㈢ 單片機如何檢測多個按鍵按下情況
用查詢的辦法
或
中斷+查詢的辦法
如果有鍵按下(中斷)
則依次查詢所有按鍵
或直接每幾十或幾百ms判斷所有按鍵的狀態
這樣就一個都不漏掉了
㈣ 51單片機雙鍵同時識別(長按)判斷程序怎麼編
假設「1」表示鍵按下,那麼雙鍵同時按,肯定埠有兩個「1」,只有一個鍵按則只有一個「1」,當然「0」表示按下的話,取反就是了。
這樣就好辦了,將這個有效鍵位值賦值給累加器A,根據奇偶標志「P"的值就可以判斷是單鍵還是雙鍵了。
㈤ 單片機中判斷按鍵是否按下為防止誤判斷需要做什麼
一般需要增加消抖,也就是採集到「按下」時還需要過幾十毫秒再採集一次,如果仍然為「按下」狀態才視為有效的按下。
上面只是最粗糙的一種判斷方法,一般僅用於可靠性要求不高的場合。對於商業級的產品則至少需要添加軟體濾波的方式來准確判斷按鍵的真實狀態。
㈥ 單片機矩陣鍵盤鍵號的判別
PA口接列線,PC口接行線
掃面列線,讀取行線狀態....行線默認都為高電平,當行線和列線相交時,某一列線為低電平,那麼如果這一列沒有鍵按下,行線的狀態依然為高電平,如果有鍵按下,那麼行線被短路,變為低電平,哪條行線輸出低電平,那麼就是這一行的鍵被按下,又知道是在哪一列,也就完全確定按下的是哪一鍵了...也就是行首號加列號就是鍵號(行號和列號都是從0開始的)
應該是第一行的首鍵號為8,列號為1,所以閉合鍵號為9吧(你自己前面說的也是:閉合鍵的鍵號等於為低電平的列好加上行線為低電平的行的首鍵號)
掃描的意思就是沒開始掃描時,列線全部為高電平,開始掃描時,先第0列變為低電平,其他列仍然是高電平,然後第1列變為低電平,其他列仍然為高電平(包括前面變低電平的0列,現在也恢復高電平了),然後是第2列變為低電平,其他列為高電平,直到第7列為低電平,其他列為高電平,完成一次掃描...
還有「PA口輸出為11111101時,就是第1列輸出為低電平,其他列為高電平,列為輸入口,不讀取它的狀態,行口為輸出口,讀取行狀態,若pc0~pc3輸出1101,如果pc0~pc3依次對應行0~3的話,那麼第2行為低電平(你說:則1行1列相交鍵處於閉合,是pc0~pc3依次對應行3~0的情況),則1列2行相交的鍵閉合,每行有8列,第2行的行首號(因為行號從0開始,所以行號為2的行,按照習慣是第3行)為16,列號為1,那麼鍵號就為16+1=17
下面有掃描2*4鍵盤的匯編程序(你的是4*8,即4行8列的鍵盤),僅供參考
看不懂不強求,希望對你有所幫助
DATA SEGMENT
TABLE DB 『A』 ,『B』 ,『C』 ,『D』 ,『E』 ,『F』 ,『G』 ,『H』
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,81H;使8255的A口和C口,並初始化
OUT 63H,AL
START1:
CALL EXAM;判斷是否有鍵按下的子程序
JZ START1
CALL DELAY;延時程序,判斷鍵是否誤按
CALL EXAM
JZ START1;如果是誤按,返回開始處,如果為否,順序執行
MOV CL,00H ;開始鍵號判斷
MOV CH,0FEH
CHECK:
MOV AL,CH
OUT 60H,AL
IN AL,62H ;從c口讀數據,也就是讀取行的狀態...
TEST AL,01H;判斷是否為第0行
JNZ OTHER ;不是,則轉OTHER處
MOV AL,00H ;是的話,行首號置0
JMP KCODE;確定鍵號
OTHER: ;判斷是否第1行
TEST AL,02H
JNZ NEXT ;不是則跳到NEXT處,進行下一列的判斷
MOV AL,04H ;第1行行首號置4
KCODE: ;確定鍵號
ADD AL,CL
MOV BX,OFFSET TABLE
AND AX,0FFH
ADD BX,AX
MOV AL,[BX]
MOV [DI],AL
MOV AH,01H
MOV AL,[DI]
INT 10H
NEXT: ;進行下一列的判斷
INC CL
MOV AL,CH
TEST AL,08H
JZ START1
ROL AL,1
MOV CH,AL
JMP CHECK
EXAM PROC
MOV AL,00H
OUT 60H,AL
IN AL,62H
NOT AL
TEST AL,03H
RET
EXAM ENDP
DELAY PROC
PUSH CX
MOV CX,0010H
T1:
MOV AX,1000H
T2:DEC AX
JNZ T2
LOOP T1
POP CX
RET
DELAY ENDP
CODE ENDS
END START
㈦ 如何用單片機判斷按鍵單擊雙擊
這個一般是經驗值,可這樣判斷:連續兩次擊鍵間隔時間超過500ms,則視為單擊,否則視為雙擊按鍵。去抖動時間一般使用30ms。如果按鍵質量不太好,時間可以加倍。可以選擇幾組參數
然後實踐一下看看手感。
㈧ 單片機按鍵按下的先後順序判斷
看看如下圖片:
㈨ 單片機如何判斷4個按鍵正反依次按下後狀態
計數啊。如果是先按1或是4 就進入去。中間注意循環等待時間。
if(key1 == 0x00)
{
if(key2 == 0x00)
{
順向。
}
else
{
不是順向,單獨動作。
}
}
㈩ 單片機怎樣識別按鍵是單機,雙擊還是長按,演算法應該是怎樣
按鍵的處理進行時間判斷.在一定的時間內如果按下按鍵,當時間小於這個時間,那麼為單次按鍵,當時間超過一定時間為為長按,當兩次按的中間有高電平時,為雙擊.你可以參考參考.