基于8086与Proteus仿真的44键盘计算器的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于8086与Proteus仿真的4*4键盘计算器的设计
一、设计目的
本次课程设计的实验目的是通过该实验掌握较复杂程序的设计。能够独立完成用程序对8086、8255控制键盘和LED显示的控制,完成计算器加减法的应用。独立编写程序,明白和掌握程序的原理和实现方式。为以后的设计提供经验。学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
二、设计内容
设计计算器,要求至少能完成多位数的加减乘除运算。独立完成用程序对8086、8255控制键盘和LED显示的控制,完成计算器加减乘除的应用。
三、设计原理与硬件电路
设计的思路是:首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序完成数据的储存或者是加减的运算。运算完成后将运算的结果储存并显示到LED显示器上。
各部分硬件功能:
可编程并行通信接口芯片8255A 8255A内部结构:
1. 并行输入/输出端口A,B,C
8255A内部包括三个8位的输入输出端口,分别是端口A、端口B、端口C,相应信号线是PA7~PA0、PB7~PB0、PC7~PC0。端口都是8位,都可以作为输入或输出。通常将端口A和端口B定义为输入/输出的数据端口,而端口C则既可以作数据端口,又可以作为端口A和端口B的状态和控制信息的传送端口。
2.A组和B组控制部件
端口A和端口C的高4位(PC7~PC4)构成A组;由A组控制部件实现控制功能。端口B和端口C的低4位(PC3~PC0)构成B组;由B组控制部件实现控制功能。A组和B组利用各自的控制单元来接收读写控制部件的命令和CPU通过数据总线(D0~D7)送来的控制字,并根据他们来定义各个端口的操作方式。
3. 数据总线缓冲存储器
三态双向8位缓冲器,是8255A与8086CPU之间的数据接
口。与I/O操作有关的数据、控制字和状态信息都是通过该缓冲器进行传送。
4. 读/写控制部件
8255A完成读/写控制功能的部件。能接收CPU的控制命令,并根据控制命令向各个功能部件发出操作指令。
CS 片选信号:由CPU输入,有效时表示该8255A被选中。RD, WR 读、写控制信号:由CPU输入。RD有效表示CPU读8255A,WR有效表示CPU写8255A。RESET 复位信号:由CPU输入。RESET信号有效,清除8255A中所有控制字寄存器内容,并将各个端口置成输入方式。
定义工作方式控制字:
工作方式0:8255A中各端口的基本输入/输出方式。
5.键盘输入模块
键盘是常用信息输入元件,其实键盘也是由一个个按钮组成,如果是独立按钮的话必须要需要一个I/O口对它进行检测,而键盘往往这需要键盘按钮数一半的I/O口数对它进行检测,也许对一个比较简单的系统I/O口数一般不是问题,但对于一
个大型、复杂的系统来说I/O资源就显得非常珍贵了,尽量减
少I/O使用是非常利于降低成本,另外一方面键盘比用独立按
键要美观,这也是键盘能够长期得到人们青睐的原因,可是硬
件上的节省必然导致软件上编程的复杂,那就来看看键盘到底
使软件编程有多复杂?
下图是一个4*4键盘的结构图,它是四条I/O线作为行线,四条I/O线作为列线组成的键盘。在键盘的行线和列线的每一个交点上,设置一个按键,这样键盘中按键的个数是4*4个。
这种行列式键盘结构能够有效地提高单盘及系统中I/O口的利用率。于是将键盘接8255A的PC口,至于为什么选择PC是有原因的,进行键盘扫描一般要求有一部分的I/O口的工作方式是输入,另一部分I/O是输出,具体到4*4键盘则要求4个I/O口输入,另外4个输出,这一点PC口刚好符合,而PA、PB口要么全部输入或输出,所以只能是PC口接键盘。
4*4键盘结构图
五、设计流程图
六、实验程序
DATA SEGMENT
X DB ?,?,?,? ;存放数据的每一位
X1 DW ? ;存放第一个数据值
X2 DW ? ;存放第二个数据值
Y DW ? ;存放运算结果
S DB ? ;存放运算符号值
E DB ? ;按下等号键标记
CC DB ? ;存放运算数据位数
H DB 0 ;存放按键行号
L DB 0 ;存放按键列号
DISCODE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,3 9H,5EH,79H,71H ;段码表
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,90H ;设置为A口输入,B口输出,C口输出
OUT 46H,AL
MOV DI,OFFSET X+3 ;DI指向X的高位KKK: CALL KEY ;扫描按键
JMP KKK
;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号
KEY PROC CHECK: CALL DISP ;等待按键按下的同时进行显示
MOV AL,0F0H ;所有行输出低电平
OUT 44H,AL
IN AL,40H
CMP AL,0FFH ;读列值
JZ CHECK ;若都为高电平则无键按下,等待
MOV CX,50
LOOP $ ;延时消抖
IN AL,DX ;重读列值
CMP AL,0FFH
JZ CHECK ;无键按下一直等待
MOV H,0 ;有键按下,先把行列号变量清0
MOV L,0
MOV BL,01H
MOV BH,0FEH ;扫描法读键值:从第一行开始测试,即PC0输出低电平
NEXT: MOV AL,BH
OUT 44H,AL
NEXTH: IN AL,40H ;读列值,判断是第几列有键按下
TEST AL,BL ;从第一列开始判断
JZ WAIT0
ROL BL,1
CMP BL,10H ;当前行状态下没有任何列有键按下,则转为对下一行的测试
JZ NEXTL
INC H ;每判断一列,列号加1
JMP NEXTH ;再对下一列进行判断NEXTL: MOV H,0
MOV BL,01H
ROL BH,1 ;对下一行测试,让下一个PC 口输出低电平
CMP BH,0EFH
JZ EXIT
INC L
JMP NEXT
WAIT0: IN AL,40H ;若有键按下,则等该按键松开后再计算键值
CMP AL,0FFH
JNZ WAIT0
MOV CX,50
LOOP $ ;延时消抖
IN AL,40H
CMP AL,0FFH
JNZ WAIT0