实验平台:KEIL5 + Proteus8
1、实验目的:
利用实验系统提供的键盘扫描电路和显示电路,实现扫描键盘和数码显示,把按键输入的键码在六位数码管上显示出来。
实验程序可分成三个模块。
①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。
②显示模块:将显示单元的内容在显示器上动态显示。
③主程序:调用键输入模块和显示模块。
源程序:
ORG 0
mov 30h,#01h ;显示缓冲单元
mov 31h,#02h
mov 32h,#03h
mov 33h,#04h
mov 34h,#05h
mov 35h,#06h
LP8:ACALL KINP ;键盘扫描程序
JB PSW.5,LP7 ;无键不处理键值
MOV B, #0AH ;有键,分离键码
DIV AB
MOV 34H,A ;送显示缓冲
MOV 35H,B
LP7:ACALL DISP ;调显示程序
SJMP LP8
DISP:MOV R0,#30H ;显示缓冲首址
MOV R2,#01H ;位控初始码(先亮最低位)
LOOP:MOV A, #0FFH ;共阳 灭码
MOV P1,A
MOV A,R2 ;送位控信号
MOV P0,A
MOV A,@R0 ;从显示缓冲中取数
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查出字形代码
MOV P1,A ;送显示字符段代码
ACALL DY1MS ;稳定显示信息
INC R0 ;取下一个数
MOV A,R2
JB ACC.5,EXIT ;判断是否送到最高位?
RL A
MOV R2,A ;得到下一个位控信号
AJMP LOOP
EXIT:RET
DY1MS:MOV R7,#0FFH
DJNZ R7,$
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
KINP:LCALL KAP ;扫描键子程序
JNZ KP1
SETB PSW.5 ;置无键标志
RET
KP1:LCALL DELY ;去抖
LCALL KAP ;再次扫描键盘
JNZ KP2 ;转识键码程序
SETB PSW.5 ;置无键标志
RET
KP2:CLR PSW.5 ;置有键操作标志
MOV R2,#0FEH ;逐列扫描初始值
MOV R4,#00H ;0列加数
KP4:
MOV A,R2
MOV P0,A ;送列扫描信号
MOV A,P3 ;回读行信号
JB ACC.0,L1 ;不是第一行,转第二行
MOV A,#00H ;是第一行,行吗=0
AJMP KP5
L1:JB ACC.1,NEXT ; 不是第二行,转下一列
MOV A,#08H ;是第二行,行码=8
KP5:ADD A,R4 ;对应的行码+对应的列码=键码
PUSH ACC ;保护已经得到的键码
KP3:LCALL DELY
LCALL KAP ;继续扫描
JNZ KP3 ;A值不等于0,表示手未松开!
POP ACC ;A值等于0,手已经松开,弹回键码!
RET
NEXT:INC R4 ;下一列列码加1
MOV A,R2
JNB ACC.7,KINP ;列到最后列了吗?
RL A
MOV R2,A ;下一列
AJMP KP4 ;扫描下一列
KAP:MOV A,#00H ;全扫描字(列)
MOV P0,A ;送全扫描字
MOV A,P3 ;回读行信息
CPL A
ANL A,#0FH ;得到A值,=0,无键;≠0,有键
RET
DELY:MOV R6,#14H ;去抖!
DL:MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DL
RET
end
2、实验原理图:
部分一部分二
部分三
原理图总视图
3、实验现象:
实验操作:
按键实现数字的加减变化。