;作者:爱因斯尼@SCUT
;时间:2010.08.29
;*****************************************************
;矩阵键盘的识别,检测是否有按键按下并将其
;键号通过LED数码管显示出来
;*****************************************************
DUAN BIT P1^5;
WEI BIT P1^6;
LIE BIT P1^7;
;==================
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN :
;==================
SETB WEI
MOV P0,#0
CLR WEI
;==================
;CLR P3.2;
;CLR P3.7;
;SETB P3.2
MAIN1:
MOV SP,#07h
MOV 31H,#00H
MOV 30H,#00H
LCALL KEY ;调用键盘扫描子程序
LCALL SHOW0;调用判断按键键号即数码管显示子程序
AJMP MAIN1
;************************************************************
;按键扫描子程序KEY
;************************************************************
KEY:
MOV P2,#0FH; P2口低四位作输入端,置1,高四位清0
MOV A,P2 ; 读P2口到累加器A
ANL A,#0FH ; 屏蔽高四位
XRL A,#0FH ; (A)与0FH相异或
JZ KEY ; 判断是否有按键按下,有,转到按键去抖子程序
; 没有,返回继续扫描
HKEY:
LCALL DELAY10ms;调用延时10ms子程序
MOV P2,#0FH
MOV A,P2 ; 再读P2口
ANL A,#0FH ; 屏蔽高四位
MOV 30H,A ; 将行线状态放30H单元低四位寄存
XRL A,#0FH ; (A)与0FH相异或
JNZ WKEY ; 判断是否真的有键按下,若是,转到判断哪个按键按下子程序
AJMP KEY ; 若不是,则返回继续扫描
WKEY: ; 判断列线状态
MOV P2,#0F0H ; P2口高四位作输入端,置1,低四位清0
MOV A,P2 ; 读P2口到累加器A
ANL A,#0F0H ; 屏蔽低四位
MOV 31H,A ; 将列线状态放入31H暂存
XRL A,#0F0H ;
JZ KEY ; 再次判断按键状态
HWKEY:
MOV A,31H ; 将列线状态送回A
ORL A,30H ; 将行列状态合并
MOV 30H,A ; 放入30H
ACALL DELAY10ms; 调用延时10ms子程序
RE:
MOV A,P2 ; 再读入P2口状态
CJNE A,#0F0H,RE; 判断按键是否释放了,没有,则等待释放
RET ; 若释放了,则返回
;***************************************************************
;判断按键的键号及数码管显示子程序SHOW0
;**************************************************************
SHOW0:
L1:
MOV A,30H ;将检测到得按键行列状态送到A
XRL A,#77H ;(A)与77H(01110111)相异或
JNZ L2 ;判断是否是第16个键按下,若不是,转到L2判断是否是第15个键按下
MOV A,#0FH ;若是,则将键号送入A
ACALL SHOW0_1;调用数码管显示子程序
L2:
MOV A,30H ;...............................
XRL A,#0B7H ;..............................
JNZ L3
MOV A,#0EH
ACALL SHOW0_1
L3:
MOV A,30H
XRL A,#0D7H
JNZ L4
MOV A,#0DH
ACALL SHOW0_1
L4:
MOV A,30H
XRL A,#0E7H
JNZ L5
MOV A,#0CH
ACALL SHOW0_1
L5:
MOV A,30H
XRL A,#7BH
JNZ L6
MOV A,#0BH
ACALL SHOW0_1
L6:
MOV A,30H
XRL A,#0BBH
JNZ L7
MOV A,#0AH
ACALL SHOW0_1
L7:
MOV A,30H
XRL A,#0DBH
JNZ L8
MOV A,#09H
ACALL SHOW0_1
L8:
MOV A,30H
XRL A,#0EBH
JNZ L9
MOV A,#08H
ACALL SHOW0_1
L9:
MOV A,30H
XRL A,#7DH
JNZ L10
MOV A,#07H
ACALL SHOW0_1
L10:
MOV A,30H
XRL A,#0BDH
JNZ L11
MOV A,#06H
ACALL SHOW0_1
L11:
MOV A,30H
XRL A,#0DDH
JNZ L12
MOV A,#05H
ACALL SHOW0_1
L12:
MOV A,30H
XRL A,#0EDH
JNZ L13
MOV A,#04H
ACALL SHOW0_1
L13:
MOV A,30H
XRL A,#7EH
JNZ L14
MOV A,#03H
ACALL SHOW0_1
L14:
MOV A,30H
XRL A,#0BEH
JNZ L15
MOV A,#02H
ACALL SHOW0_1
L15:
MOV A,30H
XRL A,#0DEH
JNZ L16
MOV A,#01H
ACALL SHOW0_1
L16:
MOV A,30H
XRL A,#0EEH
JNZ L17 ;若检测到均不是以上键号对应的按键按下,则转到L17返回主程序重新检测
MOV A,#00H
ACALL SHOW0_1;.....................
L17:
RET
;********************************************************************************
;键号送数码管显示
;********************************************************************************
SHOW0_1:
CLR P3.0
MOV DPTR,#TAB
MOVC A,@A+DPTR
SETB DUAN
MOV P0,A
CLR DUAN
AJMP MAIN1
DELAY10ms:
MOV R6,#20 ;延时10ms子程序
LX0:
MOV R7,#248
DJNZ R7,$
DJNZ R6,LX0
RET
;===========================
TAB:
DB 0FCH,60H,0DAH,0F2H ;0,1,2,3,
DB 66H,0B6H,0BEH,0E0H ;4,5,6,7,
DB 0FEH,0F6H,0EEH,3EH ;8,9,A,b,
DB 9CH,7AH,9EH,8EH,01H ;C,d,E,F
;===========================
END
欢迎光临我们的淘宝网店:http://item.taobao.com/auction/item_detail.htm?item_num_id=9447334857
文章评论(0条评论)
登录后参与讨论