×
单片机 > 单片机程序设计 > 详情

51单片机4×4矩阵按键程序

发布时间:2020-05-27 发布时间:
|
ORG 0000H
LJMP MAIN ;跳转至主程序
ORG 0100H
MAIN: LCALL KEY_IN
MOV P0,A
LCALL DEL
AJMP MAIN
;======================
;判断有无按键,无按键直接返回
;KEY_IN: MOV P1,#0F0H ;置行线为低电平,读列线状态(在高4位,无按键则全为1)
; MOV A,P1
; ANL A,#0F0H ;屏蔽低四位
; MOV B,A
; MOV P1,#0FH ;置列线为低电平,读行线状态(在低4位,无按键则全为1)
; MOV A,P1
; ANL A,#0FH
; ORL A,B ;高四位与低四位重新组合
; CJNE A,#0FFH,KEYSCAN ;0FFH为末按键
; RET
;==========================================
;//=============键盘扫描程序==============================================
;KEYSCAN:
KEY_IN: MOV R1,#0 ;初始化列地址
MOV R3,#11110111B ;初始化扫描码
LOOP:
MOV A,R3
RL A
MOV R3,A ;保留扫描码
MOV P1,A ;送扫描码
MOV A,P1 ;读键盘
ORL A,#0F0H ;屏蔽高四位
CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键动作
INC R1 ;列地址加1,准备扫描下一列
CJNE R1,#4,LOOP ;列地址不等于4,扫描下一列
SJMP EXIT ;没有按键,退出
;//=============按键判断对应位等于零,说明该行有按键按下==================
NEXT31:
JB ACC.0,NEXT32
MOV R2,#0 ;第0行有按键
SJMP NEXT5
NEXT32:
JB ACC.1,NEXT33
MOV R2,#1 ;第1行有按键
SJMP NEXT5
NEXT33:
JB ACC.2,NEXT34
MOV R2,#2 ;第2行有按键
SJMP NEXT5
NEXT34:
MOV R2,#3 ;第3行有按键
NEXT5: ;计算按键地址
MOV A,R1
RL A
RL A ;列地址乘4(每列对应4行)
ADD A,R2 ;加行地址
MOV DPTR,#KEYTAB
MOVC A,@A+DPTR
EXIT:
; MOV P1,#0FFH ;置键盘接口高电平
RET
;延时子程序,1s延时
DEL: MOV R7,#10
DEL1: MOV R6,#200
DEL2: MOV R5,#248
HERE: DJNZ R5,HERE
DJNZ R6,DEL2
DJNZ R7,DEL1
RET

;//=============按键名称表================================================
KEYTAB:
DB 3fH ;扫描码0 *****************************************
DB 06H ;扫描码1 **
DB 5bH ;扫描码2 I/O口 P1.0 P1.1 P1.2 P1.3 **
DB 4fH ;扫描码3 **
DB 66H ;扫描码4 P1.4 0 1 2 3 **
DB 6dH ;扫描码5 **
DB 7dH ;扫描码6 P1.5 4 5 6 7 **
DB 07H ;扫描码7 **
DB 7fH ;扫描码8 P1.6 8 9 A B **
DB 6fH ;扫描码9 **
DB 77H ;扫描码A P1.7 C D E F **
DB 7cH ;扫描码B **
DB 39H ;扫描码C *****************************************
DB 5eH ;扫描码D
DB 79H ;扫描码E
DB 71H ;扫描码F
DB 00H
DB 00H
END 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式