一、 实验名称:
键盘扫描及显示设计实验
二、 实验目的
1.学习按键扫描的原理及电路接法;
2.掌握利用8255完成按键扫描及显示。
三、实验内容及步骤
1. 实验内容
编写程序完成按键扫描功能,并将读到的按键值依次显示在数码管上。实验机的按键及显示模块电路如图1所示。按图2连线。
图1 键盘及显示电路
图2 实验连线
2. 实验步骤
(1)按图1接线;
(2)键入:check命令,记录分配的I/O空间; (3)利用查出的地址编写程序,然后编译链接; (4)运行程序,观察数码管显示是否正确。
四、流程图
开 始
无按键 初始化缓冲用于存放键值 初始化8255工作方式 显示刷新及清屏
扫描小键盘按键 有按键 显示刷新及清屏 无按键 扫描小键盘按键 有按键 依次检测1-4列,确定是第几行按键按下 将按键保存到缓冲区 显示刷新及清屏
否 否 按键是否弹起 是 是否检测完 是 五、源程序
;Keyscan.asm
;键盘扫描及数码管显示实验
;***************根据CHECK配置信息修改下列符号值******************* IOY0 EQU 9800H ;片选IOY0对应的端口始地址
;***************************************************************** MY8255_A EQU IOY0+00H*4 ;8255的A口地址 MY8255_B EQU IOY0+01H*4 ;8255的B口地址 MY8255_C EQU IOY0+02H*4 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址
STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS
DATA SEGMENT DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA ENDS ;键值表,0~F对应的7段数码管的段位值
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA MOV DS,AX
MOV SI,3000H ;建立缓冲区,存放要显示的键值 MOV AL,00H ;先初始化键值为0 MOV [SI],AL MOV [SI+1],AL MOV [SI+2],AL MOV [SI+3],AL MOV DI,3003H
MOV DX,MY8255_MODE ;初始化8255工作方式
MOV AL,81H ;方式0,A口、B口输出,C口低4位输入 OUT DX,AL
BEGIN:
CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;扫描按键 JNZ GETKEY1 ;有键按下则跳置GETKEY1
MOV AH,1 ;判断PC键盘是否有按键按下 INT 16H
JZ BEGIN ;无按键则跳回继续循环,有则退出 QUIT:
MOV AX,4C00H ; INT 21H
GETKEY1:
CALL DIS ; CALL DALLY CALL DALLY
CALL CCSCAN ; JNZ GETKEY2 ; JMP BEGIN ;
GETKEY2:
MOV CH,0FEH MOV CL,00H ;COLUM:
MOV AL,CH ; MOV DX,MY8255_A OUT DX,AL
MOV DX,MY8255_C ; IN AL,DX
L1:TEST AL,01H ; JNZ L2 ; MOV AL,00H ;JMP KCODE
L2:TEST AL,02H ; JNZ L3 ; MOV AL,04H ; JMP KCODE
返回到DOS 显示刷新 再次扫描按键 有键按下则跳置GETKEY2 否则跳回开始继续循环 设置当前检测的是第几列 选取一列,将X1~X4中一个置0 读Y1~Y4,用于判断是哪一行按键闭合 是否为第1行 不是则继续判断
设置第1行第1列的对应的键值 是否为第2行 不是则继续判断
设置第2行第1列的对应的键值
L3:TEST AL,04H ;是否为第3行 JNZ L4 ;不是则继续判断
MOV AL,08H ;设置第3行第1列的对应的键值 JMP KCODE
L4:TEST AL,08H ;是否为第4行 JNZ NEXT ;不是则继续判断
MOV AL,0CH ;设置第4行第1列的对应的键值
KCODE:
ADD AL,CL ; CALL PUTBUF ; PUSH AX
KON:CALL DIS ; CALL CLEAR ; CALL CCSCAN ; JNZ KON ; POP AX
NEXT:
INC CL ; MOV AL,CH TEST AL,08H ; JZ KERR ;
ROL AL,1 ; MOV CH,AL JMP COLUM KERR:
JMP BEGIN
CCSCAN PROC NEAR ; MOV AL,00H
MOV DX,MY8255_A ; OUT DX,AL
MOV DX,MY8255_C
IN AL,DX ;将第1列的值加上当前列数,确定按键值保存按键值 显示刷新 清屏 扫描按键,判断按键是否弹起 未弹起则继续循环等待弹起 当前检测的列数递增 检测是否扫描到第4列 是则跳回到开始处 没检测到第4列则准备检测下一列 扫描是否有按键闭合子程序 将4列全选通,X1~X4置0 读Y1~Y4
NOT AL
AND AL,0FH ;取出Y1~Y4的反值 RET CCSCAN ENDP
CLEAR PROC NEAR ;清除数码管显示子程序
MOV DX,MY8255_B ;段位置0即可清除数码管显示 MOV AL,00H OUT DX,AL RET CLEAR ENDP
DIS PROC NEAR ; PUSH AX ; MOV SI,3000H MOV DL,0F7H MOV AL,DL AGAIN:
PUSH DX
MOV DX,MY8255_A
OUT DX,AL ; MOV AL,[SI] ; MOV BX,OFFSET DTABLE AND AX,00FFH ADD BX,AX MOV AL,[BX] ; MOV DX,MY8255_B OUT DX,AL ; CALL DALLY INC SI ; POP DX MOV AL,DL TEST AL,01H ; JZ OUT1 ; ROR AL,1 MOV DL,AL JMP AGAIN ;OUT1:
POP AX RET
显示键值子程序
以缓冲区存放的键值为键值表偏移找到键值并显示设置X1~X4,选通一个数码管
取出缓冲区中存放键值 将键值作为偏移和键值基地址相加得到相应的键值写入数码管A~Dp 取下一个键值 判断是否显示完? 显示完,返回 未显示完,跳回继续 DIS ENDP
PUTBUF PROC NEAR ;保存键值子程序 MOV SI,DI MOV [SI],AL DEC DI CMP DI,2FFFH JNZ GOBACK MOV DI,3003H GOBACK: RET PUTBUF ENDP
DALLY PROC NEAR ; PUSH CX
MOV CX,00FFH D1: MOV AX,00FFH D2: DEC AX JNZ D2 LOOP D1 POP CX RET DALLY ENDP
CODE ENDS
END START
软件延时子程序
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务