8086矩阵键盘显示Word格式.docx
《8086矩阵键盘显示Word格式.docx》由会员分享,可在线阅读,更多相关《8086矩阵键盘显示Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
若无按键,列线输入全为1。
在本实验中,我们将8255A的C口单元作为负责扫描式键盘的端口。
在代码的编程上,我们让C口的低四位输出全为0,
高四位输入检查是否有0从而判断是否有按键按下,该段语句通过loop语句完成循环进行重复检查按键的按下情况。
假如有按键按下,则通过逐行扫描的形式获取按下按键的行数以及列数,再通过该行数与该列数形成的坐标信息得出是哪个按键按下。
左移数码管的实现需要两个子功能:
第一个功能是要输出键盘对应的数字,第二个功能是要实现数字的左移功能。
本实验中,我们将8255A的A口负责键盘对应字形码的输出,B口负责对应位码的输出。
首先,在获取键盘按下的坐标后,我们在对应的表格中得到要输出的字形码。
接着字形码入栈和出栈的操作以及指针sp的操作实现对应码数和字型码的输出,也就成功实现了左移功能。
程序中必须设定延时以防止两个数同时显示。
清零键的设定实现的是按下清零键消除数码管中所有显示数字的功能。
本实验中,我们另加入一片8255A,通过将其A口设定为输入来检查清零键是否按下,如果是则实现清零功能。
4.电路设计
4.1电路原理图
图1电路图总览
4.2
元件清单
表1元件清单
8086
1片
非门
1个
按键
17个
8255A
2片
电阻
若干
4.3电路分析
电路中8255A端口由A1、A0、组成,其中由A7、A3、A4、A6、A5、A0通过74LS138选择得到,当A7A3A4A6A5A0=100100时有效,A1、A0分别连接A2、A1,A2A1=00时为A端口,A2A1=01时为B端口,A2A1=10时为C端口,A2A1=11时为控制口,则8255A端口地址为:
A口C0H,B口C2H,C口C4H,控制口C6H。
键盘为的矩阵键盘构成,按键两端分别按行连接和列连接连接到8255A,使用扫描法逐行输出1读取列值获取地址用来查表。
数码显示为8位数码管,其中PA口输出码为段选,确定所亮的字形,输出后由段选锁存器锁存数据,PB口输出码为位选,确定哪一位灯亮输出由74LS138译码后给位选锁存器锁存数据。
两锁存器配合使灯亮起,每次只亮一个灯并逐次扫描下一个输出给下一个灯亮,在高频情况下可看到所有输入数字同时亮起。
数码管LED为共阴极连接方式。
清零功能中,在当前电路中8255A三个输出端均已被占用,另接一个清零输入复用端口易造成仿真混乱,因此另设了一个8255A,其地址接在74LS138的Y0输出端,即A7A3A4A6A5A0=000100时有效,清零8255A端口地址为:
A口40H,B口42H,C口44H,D口46H。
5.程序代码部分
5.1代码原理分析程序分为三部分:
总初始化、输入数据处理、输出显示处理。
首先在数据区列表提前存放带使能的字形码。
初始化部分,段选均输出1,位选均输出1,以此确保数码管没有显示。
输入数据部分,以0123为例,其读取到的数据如表2所示。
表2读取数字与输入关系
数字
输入值
输入值0右侧
1的个数
1110
1
1101
2
1011
3
0111
0123、4567、89AB、CDEF分别在不同行读取到这些数据,可由此确定在输入不同位置的按键时处理其值得到所需要的查表地址值,并将得到的地址在逐次的总循环中压入堆栈。
在显示部分写小循环,从堆栈中循环取出数据逐个扫描显示,段选按照先输入后出栈后输入先出栈的顺序依次从堆栈中取出数据,控制位选按照顺序从000B开始输出,直至输入8个数后输出111B,经过74LS138译码到相应位灯输出0,形成左移效果,作为共阴极控制数码管显示,每次扫描只亮一个灯,在高频情况下可达成多个输入的显示。
在输入开始加入按键是否按下判断操作,在第一次即之前没有输入时循环在此判断,非第一次的重复显示,有输入执行输入地址计算操作。
清零中直接读取另一片8255A的A端口输入PA0口的信号,当其为高电平时表示清零键按下,系统直接跳转至程序初始化部分,计数值更变为0重新开始计数,实现清零功能。
5.2流程图绘制
5.3程序代码
DATASEGMENT
TAB1DB
0FEH,0B0H,0EDH,0F9H,0B3H,0DBH,0DFH,0F0H,0FFH,0F3H,0F7H,9FH,0CEH,0BDH,0CFH,0C7H
DATAENDS
STACKSEGMENTSTACK'
STACK'
DW1000HDUP(?
)
TOPLABELWORD
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK
START:
NOP
TOP1:
MOVBL,00H
输入字符位数计数,从0计至7
MOVAL,88H;
端口设置为10001000B
MOVDX,0C6H;
端口地址A口0C0H,B口0C2H,C口0C4H,控制口0C6H
OUTDX,AL
MOVAL,0FFH;
A
端口初始化为11111111B,A口为字段码输出
MOVDX,0C0H
OUTDX,AX
MOVAX,100H;
B
MOVDX,0C2H
端口初始化为00000000B,B口为字位码输出
R3:
NOP
LOOP3:
MOVAL,00H
;
C端口低位输出0000B
MOVDX,0C4H
NONE:
MOVDX,0C4H
INAL,DX;
C
端口高位读入数据
ANDAL,0F0H
CMPAL,0F0H;
判断是否按键
JZNO;
未按下按键
JNZYES;
有按下按键
NO:
CMPBL,00H
JZNONE;
之前未有按键按下,循环此阶段步骤
JNZUNONE;
之前有按键按下,跳转至显示恢复现场
YES:
XORBH,BH
MOVAL,88H
MOVDX,0C6H
MOVCL,0FEH;
记录初值1110B
LOOP2:
MOVAL,CL
赋值给C端口低位输出
读取高位输入值
MOVDH,AL
ORDH,0FH
SHRDH,4;
右移至低位
MOVAX,CX
MOVCX,4
LOOP1:
SHRDH,1
判断输入数据0左边1的个数作为地址
INCBH;
记录循环次数
JNCDONE;
有0则输出,无0循环四次到下一步执行
LOOPLOOP1
XORCX,CX
MOVCX,AX
ROLCL,1;
初值循环左移移位换位输出0
JMPLOOP2;
未检测到输入0重新扫描至下一行循环读取
DONE:
MOVDX,CX
MOVCX,0A000H;
LOOP6:
按键延时
LOOPLOOP6
DECBH;
记录循环次数减一形成地址
XORCH,CH
MOVCL,BL
MOVAL,BH;
XORBX,BX
地址保存至AL中
XORAH,AH
MOVBX,OFFSETTAB1;
读取TAB1的偏移地址存在BX中
XLAT;
以DS:
[BX+AL]寻址,找到显示数字放在AL中
MOVBX,STACK
MOVSS,BX;
确定堆栈基址
CMPCL,00H
JNZGO;
非第一次输入数字跳过移动SP到栈顶
MOVSP,OFFSETTOP;
SP移动到栈顶
GO:
PUSHAX;
从表格中取出字形码入栈
MOVBL,CL
INCCL;
设置显示数字循环次数
LIGHT:
MOVDH,CL
LOOP4:
XORCH,CH;
循环开始,逐位对所要显示的数字进行显示
MOVAH,DH
MOVAL,BH
ADDAL,10H;
输出位码到B端口并在PB4口输出使能在位码锁存器所
锁,共阴极控制位码
MOVDH,AH
POPAX;
字形码出栈
OUTDX,AL;
输出字形码到A端口输出至段码锁存器锁存,使能已在
字形码中设置,与位码共同显示一个数字
PUSHAX;
MOVAX,SP
ADDAX,1
MOVSP,AX;
SP
MOVCX,120H;
LOOP7:
LOOPLOOP7
INCBH
LOOPLOOP4;
MOVBH,DH
MOVDL,DH
XORDH,DH
再次将出栈字形码入栈
地址挪至栈中下一个字形码
两数字之间延时以防同位置双数显示
循环扫描显数
SUBAX,DX
INCBL;
输入数字位数加一计数
CMPBL,08H;
7,表示只显示8个数
若已经超过8个数,跳转至CHANG将E计数值强制更新位
移动至已保存数据栈底用来记录下一个数
JZCHANGE
BACK:
MOVAL,9BH;
MOVDX,46H
设置第二片8255A,为A口输入
MOVDX,40H
读入A口输入
ANDAL,01H
CMPAL,01H;
判断PA0是否为1,判断清零键是否按下
JZTOP1;
按下,跳转至程序初始化重新开始
NEXT:
MOVAL,88H
没有按下从新设置
MOVCX,02H
LOOPLOOP3;
循环至按键判断
CHANGE:
MOVBL,07H
JMPBACK
UNONE:
DECBL;
有保存数据没有新输入数据,从保存循环次数中取出次数
MOVCL,BH
XORBH,BH
JMPLIGHT;
返回到显数位置再次显数
JMPR3
循环读取
CODEENDS
ENDSTART
6.程序调试及结果分析
图2初始化电路,此时清零键不为高电平
图3输入一个数
图4输入两个数
图5输入8个数
图6输入9个数,与图5相比实现了左移功能。
图7清零功能,此时清零键为高电平
7.问题与小结
本实验中,成功实现了按键输入正确显示数字,并能够左移显示各个数字,最后的清零功能刚开始在理论分析层面是可以实现的,但是未能成功在电路中仿真出来,原因是对一片8255A芯片端口的输出输入的复用造成的混乱,在最后加了一片芯片成
功实现了清零功能,但也造成了浪费。
在实验中,对扫描法移位数显的掌握逐渐从不
懂到熟练运用是最大的收获。
同时在实验程序的编写中对地址的灵活运用也收获颇丰
8.分工说明