当前位置:文档之家› 8086矩阵键盘显示

8086矩阵键盘显示

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元件清单4.3电路分析̅̅̅̅组成,其中CS̅̅̅̅由A7、A3、A4、A6、A5、A0通过74LS138电路中8255A端口由A1、A0、CS̅̅̅̅有效,A1、A0分别连接A2、A1,A2 A1=00选择得到,当A7 A3 A4 A6 A5 A0=100100时CS时为A端口,A2 A1=01时为B端口,A2 A1=10时为C端口,A2 A1=11时为控制口,则8255A 端口地址为:A口C0H,B口C2H,C口C4H,控制口C6H。

键盘为4×4的矩阵键盘构成,按键两端分别按行连接和列连接连接到8255A,使用扫描法逐行输出1读取列值获取地址用来查表。

数码显示为8位数码管,其中PA口输出码为段选,确定所亮的字形,输出后由段选锁存器锁存数据,PB口输出码为位选,确定哪一位灯亮输出由74LS138译码后给位选锁存器锁存数据。

两锁存器配合使灯亮起,每次只亮一个灯并逐次扫描下一个输出给下一个灯亮,在高频情况下可看到所有输入数字同时亮起。

数码管LED为共阴极连接方式。

清零功能中,在当前电路中8255A三个输出端均已被占用,另接一个清零输入复用端̅̅̅̅接在74LS138的Y0输出端,即A7 A3 口易造成仿真混乱,因此另设了一个8255A,其地址CSA4 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流程图绘制A口=FFHB口=00HBL=0C口=00H按键?BH=0CL=FEH扫描法计算地址到BH延时CX=AXBH=1CX=0?BL+1BL=8?A口输入清零?BL=7 BL=0?字形码入栈DH=CL出栈显示延时是否是否否是是否否是5.3程序代码DATA SEGMENTTAB1 DB0FEH,0B0H,0EDH,0F9H,0B3H,0DBH,0DFH,0F0H,0FFH,0F3H,0F7H,9FH,0CEH,0BDH,0CFH,0C7 HDATA ENDSSTACK SEGMENT STACK 'STACK'DW 1000H DUP(?)TOP LABEL WORDSTACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART:NOPTOP1: MOV BL,00H ;输入字符位数计数,从0计至7MOV AL,88H ;端口设置为10001000BMOV DX,0C6H ;端口地址A口0C0H,B口0C2H,C口0C4H,控制口0C6H OUT DX,ALMOV AL,0FFH ;A端口初始化为11111111B,A口为字段码输出MOV DX,0C0HOUT DX,AXMOV AX,100H ;B端口初始化为00000000B,B口为字位码输出MOV DX,0C2HOUT DX,AXR3: NOPLOOP3:MOV AL,00H ;C端口低位输出0000BMOV DX,0C4HOUT DX,ALNONE: MOV DX,0C4HIN AL,DX ;C端口高位读入数据AND AL,0F0HCMP AL,0F0H ;判断是否按键JZ NO ;未按下按键JNZ YES ;有按下按键NO: CMP BL,00HJZ NONE ;之前未有按键按下,循环此阶段步骤JNZ UNONE ;之前有按键按下,跳转至显示恢复现场YES: XOR BH,BHMOV AL,88HMOV DX,0C6HOUT DX,ALMOV CL,0FEH ;记录初值1110BLOOP2:MOV AL,CL ;赋值给C端口低位输出MOV DX,0C4HOUT DX,ALIN AL,DX ;读取高位输入值MOV DH,ALOR DH,0FHSHR DH,4 ;右移至低位MOV AX,CXMOV CX,4LOOP1:SHR DH,1 ;判断输入数据0左边1的个数作为地址 INC BH ;记录循环次数JNC DONE ;有0则输出,无0循环四次到下一步执行 LOOP LOOP1XOR CX,CXMOV CX,AXROL CL,1 ;初值循环左移移位换位输出0JMP LOOP2 ;未检测到输入0重新扫描至下一行循环读取DONE: NOPMOV DX,CXMOV CX,0A000H ;按键延时LOOP6:NOPLOOP LOOP6MOV DX,CXDEC BH ;记录循环次数减一形成地址XOR CH,CHMOV CL,BLMOV AL,BH ;地址保存至AL中XOR BX,BXXOR AH,AHMOV BX,OFFSET TAB1;读取TAB1的偏移地址存在BX中XLAT ;以DS:[BX+AL]寻址,找到显示数字放在AL中 MOV BX,STACKMOV SS,BX ;确定堆栈基址CMP CL,00HJNZ GO ;非第一次输入数字跳过移动SP到栈顶MOV SP,OFFSET TOP ;SP移动到栈顶GO: PUSH AX ;从表格中取出字形码入栈XOR BX,BXMOV BL,CLINC CL ;设置显示数字循环次数LIGHT:MOV DH,CLLOOP4:XOR CH,CH ;循环开始,逐位对所要显示的数字进行显示MOV AH,DHMOV AL,BHADD AL,10H ;输出位码到B端口并在PB4口输出使能在位码锁存器所锁,共阴极控制位码MOV DX,0C2HOUT DX,ALMOV DH,AHPOP AX ;字形码出栈MOV AH,DHMOV DX,0C0HOUT DX,AL ;输出字形码到A端口输出至段码锁存器锁存,使能已在字形码中设置,与位码共同显示一个数字MOV DH,AHXOR AH,AHPUSH AX ;再次将出栈字形码入栈MOV AX,SPADD AX,1ADD AX,1MOV SP,AX ;SP地址挪至栈中下一个字形码MOV AX,CXMOV CX,120H ;两数字之间延时以防同位置双数显示LOOP7:NOPLOOP LOOP7MOV CX,AXINC BHLOOP LOOP4 ;循环扫描显数MOV BH,DHMOV DL,DHXOR DH,DHMOV AX,SPSUB AX,DXSUB AX,DXMOV SP,AX ;SP移动至已保存数据栈底用来记录下一个数INC BL ;输入数字位数加一计数CMP BL,08H ;若已经超过8个数,跳转至CHANGE将计数值强制更新位7,表示只显示8个数JZ CHANGEBACK: NOPMOV AL,9BH ;设置第二片8255A,为A口输入MOV DX,46HOUT DX,ALMOV DX,40HIN AL,DX ;读入A口输入AND AL,01HCMP AL,01H ;判断PA0是否为1,判断清零键是否按下JZ TOP1 ;按下,跳转至程序初始化重新开始NEXT: MOV AL,88H ;没有按下从新设置MOV DX,0C6HOUT DX,ALMOV CX,02HLOOP LOOP3 ;循环至按键判断CHANGE:MOV BL,07HJMP BACKUNONE:DEC BL ;有保存数据没有新输入数据,从保存循环次数中取出次数MOV CL,BHXOR BH,BHJMP LIGHT ;返回到显数位置再次显数JMP R3 ;循环读取CODE ENDSEND START6.程序调试及结果分析图2 初始化电路,此时清零键不为高电平图3 输入一个数图4 输入两个数图5 输入8个数图6 输入9个数,与图5相比实现了左移功能。

相关主题