📄 3_1.txt
字号:
;使用74164连接8行2列键盘的行线,74165连接键盘的列线,编写扫描键盘
;按键的程序
;D4:JP36--------G5:JP92 (74165连接键盘的列线)
;D5:JP49--------G5:JP47 (74164连接键盘的行线)
;A3:JP59--------G6:JP65 (P2接发光管用来检验扫描键码值)
;A3:P1.0--------D5:A,B (作为74164的数据线)
;A3:P1.1--------D5:CLK (作为74164的时钟线)
;A3:P1.4--------D4:SH/~LD (用于74165的移位加载信号)
;A3:P1.5--------D4:QH (作为74165的数据线)
;A3:P1.2--------D4:CLK (作为74165的时钟线)
ORG 0000H
LJMP START
ORG 0100H
START: MOV SP,#60H
LOOP: ACALL KEY0
MOV A,R0 R0中存放扫描得到的键码
CPL A
MOV P2,A
SJMP LOOP
KEY0: ACALL KEYIN
JNZ KEY1
ACALL DELAY
AJMP KEYOV ;无按键,返回
KEY1: ACALL DELAY
ACALL DELAY ;去抖动
ACALL KEYIN
JNZ KEY2
ACALL DELAY
AJMP KEYOV ;无按键,返回
KEY2: MOV R4,#00 行码计数
MOV R2,#0FEH 行扫描码
MOV R1,#08H 将行扫描码按位送入
MOV A,R2
KEY3: MOV R3,A
ANL A,#80H
CJNE A,#00H,KEY4
CLR P1.0
AJMP KEY5
KEY4: SETB P1.0
KEY5: CLR P1.1
SETB P1.1
MOV A,R3
RL A
DJNZ R1,KEY3
CLR P1.4 读出列码
ACALL DELAY
SETB P1.4
MOV C,P1.5
MOV ACC.0,C
CLR P1.2
SETB P1.2
MOV C,P1.5
MOV ACC.1,C
JB ACC.0,LONE 第0列无键闭合,转LONE
MOV A,#00H 装第0列状态友起始值
AJMP KEYNUM
LONE: JB ACC.1,KEYNO 第1列无键闭合,转KEYNO
MOV A,#08H 装第0列状态友起始值
AJMP KEYNUM
KEYNO: INC R4 扫描行号加1
MOV A,R2
RL A
JNB ACC.0,KEYOV 扫锚完最后一行,转KEYOV
MOV R2,A
MOV R1,#08H
AJMP KEY3
KEYNUM: ADD A,R4 计算码值
MOV R0,A
KEYOV: RET
KEYIN: MOV R1,#08H 检查是否有键闭合
KEYIN1: CLR P1.0
CLR P1.1
SETB P1.1
DJNZ R1,KEYIN1
CLR P1.4
ACALL DELAY
SETB P1.4
MOV C,P1.5
MOV ACC.0,C
CLR P1.2
SETB P1.2
MOV C,P1.5
MOV ACC.1,C
CPL A 若无键按下,则全为0
ANL A,#03H
RET
DELAY: MOV R5,#02H 延时
DELAY1: MOV R6,#0FFH
DELAY2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DELAY2
DJNZ R5,DELAY1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -