8086矩阵键盘显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 实验要求
利用可编程并行接口芯片 8255A 设计一个键盘与 LED 显示器接口。
1)系统设置一个 4 行×4 列的行/ 列扫描式键盘和一个 8 位的共阴极七段数码管
2)键盘提供 0~F 这 16 个十六进制数字键,采用行/列扫描式接口,数码管采用动态扫描的方式;
3)编写程序,将键盘键入的数字,采用左移的方式显示在数码管上;
4)按下 C 键清除所有显示内容。
2. 实验目的
1)熟练掌握 8086 汇编语言程序设计以及可编程接口芯片应用技术;
2)掌握 Proteus 仿真软件的基本操作与调试功能;
3)掌握基于 Proteus 的 8086 应用系统软硬件设计与调试方法与步骤,并完成仿真实验
3. 实验分析本实验可具体分解为三大部分,分别是扫描式矩阵键盘的实现,左移数码管的实现以及清零键的实现。
扫描式矩阵键盘的原理如下:设定行线输出,列线输入,行线逐行输出0,如果某列有按键,则列线输入为 0;若无按键,列线输入全为 1。在本实验中,我们将 8255A 的 C 口单元作为负责扫描式键盘的端口。在代码的编程上,我们让 C 口的低四位输出全为 0,
高四位输入检查是否有 0从而判断是否有按键按下,该段语句通过 loop 语句完成循环进行重复检查按键的按下情况。假如有按键按下,则通过逐行扫描的形式获取按下按键的行数以及列数,再通过该行数与该列数形成的坐标信息得出是哪个按键按下。左移数码管的实现需要两个子功能:第一个功能是要输出键盘对应的数字,第二个功能是要实现数字的左移功能。本实验中,我
们将 8255A的 A 口负责键盘对应字形码的输出, B 口负责对应位码的输出。首先,在获取键盘按下的坐标后,我们在对应的表格中得到要输出的字形码。接着字形码入栈和出栈的操作以及指针sp 的操作实现对应码数和字型码的输出,也就成功实现了左移功能。程序中必须设定延时以防止两个数同时显示。
清零键的设定实现的是按下清零键消除数码管中所有显示数字的功能。本实验中,我们另加入一片 8255A,通过将其 A 口设定为输入来检查清零键是否按下,如果是则实现清零功能。
4. 电路设计
4.1 电路原理图
图1 电路图总览
4.2 元件清单
表 1 元件清单
8086 1片
非门
1个
74273 3片 74LS138 2片 74HC573 2片 74LS32
1片 二极管 10A01
1个
4.3 电路分析
电路中 8255A端口由 A1、A0、组成,其中由 A7、A3、A4、A6、A5、A0 通过 74LS138 选择得到,当 A7 A3 A4 A6 A5 A0=100100 时有效,A1、A0分别连接 A2、A1,A2 A1=00 时为 A 端口,A2 A1=01时为 B端口,A2 A1=10时为 C端口,A2 A1=11时为控制口,则 8255A 端口地址为: A 口 C0H,B口 C2H,C口 C4H,控制口 C6H。
键盘为的矩阵键盘构成,按键两端分别按行连接和列连接连接到 8255A,使用扫描法逐行输出 1 读取列值获取地址用来查表。
数码显示为 8 位数码管,其中 PA口输出码为段选,确定所亮的字形,输出后由段选锁存器锁存数据, PB口输出码为位选,确定哪一位灯亮输出由 74LS138译码后给位选锁存器锁存数据。两锁存器配合使灯亮起,每次只亮一个灯并逐次扫描下一个输出给下一个灯亮,在高频情况下可看到所有输入数字同时亮起。数码管 LED为共阴极连接方式。
清零功能中,在当前电路中 8255A三个输出端均已被占用,另接一个清零输入复用端口易造成仿真混乱,因此另设了一个 8255A,其地址接在 74LS138的 Y0输出端,即 A7 A3 A4 A6 A5 A0=000100时有效,清零 8255A端口地址为: A口 40H,B口 42H,C口 44H,D 口 46H。
5. 程序代码部分
5.1 代码原理分析程序分为三部分:总初始化、输入数据处理、输出显示处理。首先
在数据区列表提前存放带使能的字形码。
初始化部分,段选均输出 1,位选均输出 1,以此确保数码管没有显示。输入数据部
分,以 0123为例,其读取到的数据如表 2 所示。
表2 读取数字与输入关系
0123、4567、89AB、CDEF分别在不同行读取到这些数据,可由此确定在输入不同位置
的按键时处理其值得到所需要的查表地址值,并将得到的地址在逐次的总循环中压入堆栈。
在显示部分写小循环,从堆栈中循环取出数据逐个扫描显示,段选按照先输入后出栈后输入先出栈的顺序依次从堆栈中取出数据,控制位选按照顺序从 000B开始输出,直至输入 8 个数后输出 111B,经过 74LS138译码到相应位灯输出 0,形成左移效果,作为共阴极控制数码管显示,每次扫描只亮一个灯,在高频情况下可达成多个输入的显示。
在输入开始加入按键是否按下判断操作,在第一次即之前没有输入时循环在此判断,非第一次的重复显示,有输入执行输入地址计算操作。
清零中直接读取另一片 8255A的 A 端口输入 PA0口的信号,当其为高电平时表示清零
键按下,系统直接跳转至程序初始化部分,计数值更变为 0 重新开始计数,实现清零功能。
5.2 流程图绘制
5.3 程序代码
DATA SEGMENT
TAB1 DB
0FEH,0B0H,0EDH,0F9H,0B3H,0DBH,0DFH,0F0H,0FFH,0F3H,0F7H,9FH,0CEH,0BDH,0CFH,0C7 H DATA ENDS
STACK SEGMENT STACK 'STACK'
DW 1000H DUP(?)
TOP LABEL WORD
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK
START:NOP
TOP1: MOV BL,00H输入字符位数计数,从 0 计至 7
MOV AL,88H ;端口设置为 10001000B
MOV DX,0C6H ;端口地址 A口 0C0H,B口 0C2H,C口 0C4H,控制口 0C6H OUT DX,AL
MOV AL,0FFH ;A端口初始化为 11111111B,A 口为字段码输出MOV DX,0C0H
OUT DX,AX
端口初始化为 00000000B,B 口为字位码输出MOV AX,100H ;B
MOV DX,0C2H
OUT DX,AX
R3: NOP
LOOP3:MOV AL,00H;C 端口低位输出 0000B
MOV DX,0C4H
OUT DX,AL