您好,欢迎来到好走旅游网。
搜索
您的当前位置:首页键盘扫描及显示设计实验

键盘扫描及显示设计实验

来源:好走旅游网


一、 实验名称:

键盘扫描及显示设计实验

二、 实验目的

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务