键盘按键与数码管显示
实验目的:
熟悉星研集成开发环境,掌握微机接口程序编写调试的基本方法。
掌握矩阵式键盘的工作原理及识别键盘按键的方法。
掌握8段数码管显示数字或字符的工作原理和它的使用方法。
掌握用8255扫描键盘及用8255刷新数码管显示的方法。
实验:
在(2行*8列)小键盘上任意按下某个按键,该键的键值将同时显示在8个数码管上。按键松开时显示上一次的按键值。
(2 行*8 列)小键盘:
实验箱上2行*8列小键盘上当某个按键被按下时,该键所在行的行线值为0、所在列的列线值也为0。根据这个特点结合上述原理图采用"列扫描法"可以识别出当前被按下的按键。
8 个数码管:
实验箱上8个8段数码管。每个数码管有8个笔段,按逆时针方向依次称为a段、b段、c段、d段、e段、f段、g段、dp段,8个段接收来自外部的一个8位二进制数(D7---D0),并且笔段a 对应数据位D0........笔段dp 对应数据位D7 ,由于数码管是共阳的,当段码端接收低电平时相应的笔段就会点亮,段码端接收的数据决定了数码管显示的具体内容。(例:要显示数字0,则笔段a、b、c、d、e、f 都必须点亮,笔段g、h不应该点亮,8个段接收的值应该是11000000,数据D0--D7就应该是11000000(0C0H),让段码端接收11000000它就会显示0)。
数码管的位码控制GND端,当它接收低电平时该数码管会被选中有效工作:即这时只要段码端有有效的数据数码管就会显示数据,当它接收高电平时数码管不工作,这时即使段码端有有效数据数码管也不会显示任何数据。
8255 各端口的分工:
8255的A口工作在方式0输出状态控制数码管的段码;B端口工作在方式0输出状态控制数码管的位码,并且同时控制键盘列线的扫描;C端口工作在方式0输入状态,其中的PC0、PC1控制键盘的第一、第二行行值的读入。
实验代码:
.MODEL TINY
PA_8255 EQU 0270H
PB_8255 EQU 0271H
PC_8255 EQU 0272H
CTRL_8255 EQU 0273H
.STACK 100
.DATA
buffer DB ?
SEG_TAB DB 0C0H, 0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H
DB 080H, 90H, 88H, 83H, 0C6H,0A1H,86H,8EH,0FFH
.CODE
START: MOV AX,@DATA
MOV DS,AX
MOV ES,AX
NOP
MOV DX,CTRL_8255 ;8255初始化
MOV AL,89H
OUT DX,AL
LEA SI,buffer
MOV AL,10H ;默认数码管不显示
MOV [SI],AL
CALL DIR ;调用显示子程序
MAIN2: LEA DI,buffer
CALL Getkey ;得到按键在SEG_TAB中的值放入AL
STOSB ;将AL赋值给DI指向的地址
CALL DIR
JMP MAIN2
DIR PROC NEAR
PUSH AX
PUSH BX
PUSH DX
LEA SI,buffer ;置显示缓冲器初值
MOV AL,[SI]
LEA BX,SEG_TAB
XLAT ;查表取显示数据->AL
MOV DX,PA_8255
OUT DX,AL ;AL段数据->8255 PA口
MOV DX,PB_8255
MOV AL,0 ;位码控制GND端低电平有效, 显示8位数据管
OUT DX,AL
CALL DL1ms
POP DX
POP BX
POP AX
RET
DIR ENDP
DL1ms PROC NEAR
PUSH CX
MOV CX,500
LOOP $
POP CX
RET
DL1ms ENDP
GETKEY PROC NEAR
PUSH BX
PUSH DX
LK: CALL AllKey ;调用判有无闭合键子程序
JNE LK1
CALL DIR ;调用显示子程序
JMP LK
;补充程序完成列扫描,得到按键在SEG_TAB中的值放入AL
LK1: MOV BL, 0FEH ;0FEH-->BL 第0列开始扫描,用BL保存列线扫描口数值,从PB0开始
MOV BH, 0 ;0-->BH 用BH保存列线值,从第0列开始
LK2: MOV DX, PB_8255 ;写B口位码控制端
MOV AL, BL ;
OUT DX, AL ;将BL写入B口列线控制端
MOV DX, PC_8255 ;读C口
IN AL, DX ;
TEST AL, 1 ;PC0不等于0转向LONE继续判断PC1
JNZ LONE ;
MOV AL, 0 ;0行有键闭合,0-〉AL PC0等于0表示0行有键闭合,用BH存放按键值
JMP LKP
LONE: TEST AL, 2
JNZ NEXT ;PC1不等于0则转向NEXT列计算器+1
MOV AL, 08 ;1行有键闭合,08H-->AL
LKP: ADD BH, AL ;用BH保存键值
LK3: CALL AllKey
JNE LK3 ;判断释放否
MOV AL, BH ;BH键号->AL
JMP EXIT
NEXT: INC BH ;列计数器加1
TEST BL, 80H ;
JZ EXIT ;判是否已扫到最后一列则转向KEND
ROL BL, 1 ;将BL循环左移一位
JMP LK2
EXIT: POP DX
POP BX
RET
GETKEY ENDP
AllKey PROC NEAR ;判断键盘是否有按键闭合
MOV DX,PB_8255
XOR AL,AL
OUT DX,AL ;全"0"->扫描口,列线控制端低电平有效
MOV DX,PC_8255 ;读C口数据
IN AL,DX ;读键状态
AND AL,03H ;取低二位
CMP AL,3 ;取C口低二位和00000011b比较
RET
AllKey ENDP
END START