微机原理键盘扫描及显示设计实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、 实验名称:
键盘扫描及显示设计实验 二、 实验目的
1. 学习按键扫描的原理及电路接法; 2 .掌握利用8255完成按键扫描及显示。
三、 实验内容及步骤
1.实验内容
编写程序完成按键扫描功能,并将读到的按键值依次显示在数码管上。实验机的按 键及显示模块电路如图 1所示。按图2连线。
Γ≡≡
If *
—I
〔01S
冥
P
π图1键盘及显示电路
2. 实验步骤 (1) 按图1接线;
(2) 键入:CheCk 命令,记录分配的I/O 空间; (3) 利用查出的地址编写程序,然后编译链接; (4) 运行程序,观察数码管显示是否正确。
四、流程图
22LZj
XD2汽
XDrX
XDir d √
I I
WirI ⅝IOR A .■
[QYO Λ :
07 PBfl D⅛ PBl
般
唯
* C4
PB3
PBl •皿 PBi 71 PB6 DO E55
PB7
FA.Q Al
PAJ
AO 吨
!
PA5 I WR PCo 7 RD PCI ∙÷ CS PΩ I PCI
图2实验连线
>Cχ
⅛ 7
H *J J XXXX
t- ⅛r√ *JJ <⅛i YYYY
开始
五、源程序
是
KeySCa n. asm
;键盘扫描及数码管显示实验 根据CHECKE 置信息修改下列符号值 *******************
的A 口地址
的B 口地址 的C 口地址 的控制寄存器地址
STACKI SEGMENT STACK
DW 256 DUP(?) STACKI ENDS DATA SEGMENT DTABLE
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
初始化8255工作方式
方式0, A 口、B 口输出,C 口低4位输入・ *************** IoYo EQU 9800H 片选IOYO 对应的端口始地址 MY8255_ _A EQU IOY0+00H*4 ;8255 MY8255
_
_B EQU IOY0+01H*4 ;8255
MY8255_
_C EQU IOY0+02H*4 ;8255 DB
MOV DX,MY8255_MODE MOV AL,81H
;
・***************************************************************** MY8255_MODE EQU IOY0+03H*4 ;8255
OUT DX,AL BEGIN:
CALL DIS ; CALL CLEAR ; CALL CCSCAN ; 显示刷新清屏扫描按键
JNZ GETKEY1 ; 有键按下则跳置GETKEY1
MOV AH,1 ; INT 16H
JZ BEGIN ; QUIT: 判断PC键盘是否有按键按下
无按键则跳回继续循环,有则退出
MOV AX,4C00H ;
INT 21H
返回到DOS
GETKEY1:
CALL DIS ;
CALL DALLY
CALL DALLY
CALL CCSCAN ;
JNZ GETKEY2 ; JMP
BEGIN ; 显示刷新
再次扫描按键有键按下则跳置GETKEY2 否则跳回开始继续循环
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 选取一列,将X1〜X4中一个置O
读Y1〜Y4,用于判断是哪一行按键闭合
L1:TEST AL,O1H ; JNZ L2 ; MOV AL,OOH ;
JMP KCODE 是否为第1 行
不是则继续判断
设置第1 行第1 列的对应的键值
L2:TEST AL,O2H ; JNZ L3 ; 是否为第2 行不是则继续判断
MOV AL,04H
JMP KCODE
L3:TEST AL,04H JNZ L4
MOV AL,08H
JMP KCODE
L4:TEST AL,08H JNZ NEXT
MOV AL,0CH
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 设置第2 行第1 列的对应的键值
是否为第3 行
不是则继续判断
设置第3 行第1 列的对应的键值
是否为第4 行
不是则继续判断
设置第4 行第1 列的对应的键值
将第1 列的值加上当前列数,确定按键值保存按键值
显示刷新
清屏扫描按键,判断按键是否弹
起未弹起则继续循环等待弹起
当前检测的列数递增
检测是否扫描到第4 列
是则跳回到开始处
没检测到第4 列则准备检测下一列
CCSCAN PROC NEAR MOV AL,00H
MOV DX,MY8255_A
OUT DX,AL 扫描是否有按键闭合子程序将4列全选通,X1〜X4置O