本帖最后由 不亦心 于 2009-10-4 11:08 编辑
试试这样:
矩阵键盘程序的结构:检测是否有键按下→去抖动(检测按键闭合情况是否发生变化)→扫描行列→判断按键是否松开→获得键值
;//////变量地址申明./////////////////////////////////////////////
HANG DATA 50H ;键盘编码行数.
LIE DATA 51H ;键盘编码列数.
;//////以下是7*7矩阵键盘扫描程序.///////////////////////////////
AGAIN: MOV P0,#0FFH
MOV P2,#0FFH
MOV A,P0 ;读P0口,看有无按键按下.
MOV B,A ;B暂存P0口状态.
JZ AGAIN ;p0口为低电平,则无键按下,跳回重扫描键盘.
LCALL DELAY10M ;有键按下,则延时10MS去除抖动.
MOV A,P0 ;延时后重读键盘.
XRL A,B ;看是否与10MS前按键一致.
JNZ AGAIN ;不一致说明为无效按键,跳回重新扫描.
MOV R1,#80H ;行扫描用.
MOV R4,#07H ;列扫描次数.
MOV LIE,#00H ;逐列扫描.
LOOP: MOV A,R1
RR A
MOV R1,A
MOV P2,A
MOV A,P0
JNB ACC.0,NEXT1 ;逐行检测.
MOV HANG,#00H
LJMP SONGKAI
NEXT1: JNB ACC.1,NEXT2
MOV HANG,#01H
LJMP SONGKAI
NEXT2: JNB ACC.2,NEXT3
MOV HANG,#02H
LJMP SONGKAI
NEXT3: JNB ACC.3,NEXT4
MOV HANG,#03H
LJMP SONGKAI
NEXT4: JNB ACC.4,NEXT5
MOV HANG,#04H
LJMP SONGKAI
NEXT5: JNB ACC.5,NEXT6
MOV HANG,#05H
LJMP SONGKAI
NEXT6: JNB ACC.6,BACK
MOV HANG,#06H
LJMP SONGKAI
BACK: INC LIE ;扫描下一列.
DJNZ R4,LOOP ;检测列是否扫描完毕.
LJMP AGAIN ;不断检测扫描键盘.
;//////判断按键是否松开,及得到键值.///////////
SONGKAI: MOV A,P0
JNZ SONGKAI
MOV A,HANG
MOV B,#07H ;行数*7+列数=键值.
MUL AB
ADD A,LIE
…… |