单片机89C52行列式键盘扫描程序(汇编)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八键盘扫描显示实验
所需软硬件:
Keil
STC-ISP
MCS-51 89C52实验箱
程序清单:
基于汇编语言
//连线P0接8列(同时也是数码管的位选线)高电平选中某位。P3低两位接行P1接数码管(段选线)低电平选中某段亮。
ORG 0000H
LJMP MAIN
MAIN:
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
MOV 34H,#00H
MOV 35H,#00H
BEGIN:
ACALL SCAN
ACALL CHECK
ACALL DISP
SJMP BEGIN
//子程序SCAN 全扫描2次扫描去抖
SCAN: ;全扫描
MOV R0,#00H ;去抖,扫描2次计数标志
MOV A,#00H
MOV P0,A ;送列扫描码
LOOP:
MOV A,P3 ;回读行信号
ANL A,#03H ;只取低两位
INC R0
CJNE A,#03H,K1
CLR F0 ;无键,置标志位为0
K1:
NOP
NOP
CJNE R0,#02H,LOOP;去抖,扫描2次
SETB F0 ;有键,置标志位为1
RET
//子程序CHECK 逐列扫描确定键码
CHECK:
MOV R1,#0FEH ;开始逐列扫描,从第0列开始
MOV R4,#00H ;记录列号
MOV R5,#00H ;记录行号
MOV A,R1
PUSH ACC ;压栈保留第0列扫描码
LOOP1:
MOV P0,A ;送列扫描码
MOV A,P3
ANL A,#03H
CJNE A,#03H,K2 ;有键转K2确定为哪一行
POP ACC ;无键扫描下一列
RL A
INC R4
CJNE R4,#08H,LOOP1 ; 是否扫描进行到最后一列
RET
K2:
DEC SP ;为保证堆栈平衡
CJNE A,#02H,K3 ;分支判断,看是否为第一行
SJMP OVER
K3:
INC R5 ;不是第一行,就是第二行,行码加1 OVER:
MOV A,R4
ADD A,R5 ;行码+列码=键码
PUSH ACC ;键码入栈保护
NOP
NOP
LCALL SCAN ;扫描看手是否松开
CJNE A,#03H,OVER ;A=03H,表示手未松开,继续扫描
POP ACC ;手松开,键码出栈
RET
//子程序DISP 键码分离送数码管显示
DISP:
JNB F0,LOOP3 ;无键不分离键码
MOV B,#10 ;有键,要进行十位和个位的分离
DIV AB
MOV 34H,A ;A为十位
MOV 35H,B ;B为个位
MOV R0,#30H ;送显示缓冲首地址
MOV R2,#01H ;送位选信号,从最低位开始亮
LOOP3:
MOV A,#0FFH
MOV P1,A ;段选:送灭码
MOV A,R2
MOV P0,A ;送位选信号
MOV A,@R0 ;送显示缓冲数据
MOV DPTR,#TAB ;查表求字形码
MOVC A,@A+DPTR
MOV P0,A ;送段选
ACALL DELAY1MS ;延时以保持稳定
INC R0 ;取下一个数
MOV A,R2
JB ACC.5,EXIT ;判断位选是否送到最高位
RL A ;左移选下一个位。
MOV R2,A ;
AJMP LOOP3
EXIT:
RET
//子程序DELAY1MS
DELAY1MS:
MOV R7,#0FFH
DJNZ R7,$
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0AH,86H,8EH END