接口技术计算器设计课程设计.docx

上传人:b****7 文档编号:8649378 上传时间:2023-02-01 格式:DOCX 页数:27 大小:128.29KB
下载 相关 举报
接口技术计算器设计课程设计.docx_第1页
第1页 / 共27页
接口技术计算器设计课程设计.docx_第2页
第2页 / 共27页
接口技术计算器设计课程设计.docx_第3页
第3页 / 共27页
接口技术计算器设计课程设计.docx_第4页
第4页 / 共27页
接口技术计算器设计课程设计.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

接口技术计算器设计课程设计.docx

《接口技术计算器设计课程设计.docx》由会员分享,可在线阅读,更多相关《接口技术计算器设计课程设计.docx(27页珍藏版)》请在冰豆网上搜索。

接口技术计算器设计课程设计.docx

接口技术计算器设计课程设计

 

一、引言……………………………………………………………………………4

二、实验题目及要求………………………………………………………………5

三、硬件电路………………………………………………………………………5

2.1、键盘输入模块…………………………………………………………………5

2.2、可编程并行通信接口芯片8255A……………………………………………6

2.3、可编程定时器/计数器………………………………………………………9

四、源程序……………………………………………………………………………10

六、课程设计体会……………………………………………………………………25

七、参考文献…………………………………………………………………………26

 

引言

本学期我们学习了微型计算机技术及应用这门应用性很强的课程,通过平时的上机实验,使我们初步了解了8086系统的硬件结构以及部分芯片结构,为了进一步巩固和检测所学知识,我选择基于8086CPU的模拟计算器设计。

要完成设计首先需要构建简单的微型计算机应用系统,其次是确定组成各部件的芯片,然后画原理图,根据相应的原理以及实现过程,编写出相应的汇编代码。

再根据原理图连接硬件电路,电路连接完成后进行调试。

设计过程中我们用到了8088CPU、可编程计时器8253、可编程并行输入/输出芯片8255A、74LS138、矩阵式键盘、六位七段LED数码管。

我们的模拟计算器能实现2位十进制数以内的及减法运算。

 

模拟计算器设计

一、概述

设计题目及要求:

1.通过小键盘做加减运算。

七段数码管显示器作输入数据和结果数据的显示。

2.数字用小键盘0~9,R,P,M,G作功能键

R开始运算(包括撤销运算),显示‘0'

p+

m-

g=

E退出返回dos

3运算顺序:

a.输入一原始数据显示器跟随显示

b.按+或-显示器内容不变

c.再输入一数据,显示器跟随显示。

d.按=显示器显示结果数据,当超出能显示的最大值,显示F(溢出)

e.按R重新开始运算

f.按E,结束退出

设计思路:

首先利用程序不断扫描键盘是不是有输入,如果没有就一直扫描,如果有就停止扫描,完成输入,利用汇编的程序核对输入键的数值,通过调用子程序实现2位十进制数以内的及减法运算。

运算完成后将运算的结果储存并显示到LED显示器上。

二、硬件电路设计

硬件电路键盘输入及LED数码管通过8255A接口与系统总线连接,键盘的16个按键组成8*2矩阵,其中8根矩阵线作为8255A的输出线与PB7~PB0连接,2根矩阵线作为8255A的输入线与PC7、PC6连接。

键盘采用逐次扫描原理,16个按键中0~9座位数字健,+、-、=作为加、减和等号功能键,C为清零键。

1、键盘输入模块

键盘是常用信息输入元件,其实键盘也是由一个个按钮组成,如果是独立按钮的话必须要需要一个I/O口对它进行检测,而键盘往往这需要键盘按钮数一半的I/O口数对它进行检测,也许对一个比较简单的系统I/O口数一般不是问题,但对于一个大型、复杂的系统来说I/O资源就显得非常珍贵了,尽量减少I/O使用是非常利于降低成本,另外一方面键盘比用独立按键要美观。

我们设计时使用的是8*2行列式键盘,如图2-1所示。

图中有8行2列,8根行线与PA口相连,2根列线与PC口的PC6、PC7相连。

PA、PB口要么全部输入或输出。

PC口可以进行输入和输出。

按键设置在行、类交点处(数字或字符为其键号),行、列线分别连接到按键开关的两端。

当列线通过上拉电阻接+5V时,就被钳位在高电平状态。

键盘中有无按键按下是由行线送入全扫描字、列线读入行线状态来判断。

这就是:

给航线所有I/O线均置成低电平,然后读入列线电平状态。

如国有按键盘下,总会有一根列线电平被拉至低电平,从而使列线输入不全为1。

图2-1键盘电路图2-2数码管电路

2、可编程并行通信接口芯片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的控制命令,并根据控制命令向各个功能部件发出操作指令。

图2-3.8255A芯片图

CS片选信号:

由CPU输入,有效时表示该8255A被选中。

RD,WR读、写控制信号:

由CPU输入。

RD有效表示CPU读8255A,WR有效表示CPU写8255A。

RESET复位信号:

由CPU输入。

RESET信号有效,清除8255A中所有控制字寄存器内容,并将各个端口置成输入方式。

图2-4.8255A内部结构

定义工作方式控制字:

工作方式0:

8255A中各端口的基本输入/输出方式。

 

图2-5.8255A工作方式控制

3、可编程计数器/定时器

8253具有3个独立的计数通道,采用减1计数方式。

在门控信号有效时,每输入1个计数脉冲,通道作1次计数操作。

当计数脉冲是已知周期的时钟信号时,计数就成为定时。

 

(1)、8253内部结构

  8253芯片有24条引脚,封装在双列直插式陶瓷管壳内。

  1.数据总线缓冲器

  数据总线缓冲器与系统总线连接,8位双向,与CPU交换信息的通道。

这是8253与CPU之间的数据接口,它由8位双向三态缓冲寄存器构成,是CPU与8253之间交换信息的必经之路。

  

2.读/写控制

读/写控制分别连接系统的IOR和IOW,由CPU控制着访问8253的内部通道。

接收CPU送入的读/写控制信号,并完成对芯片内部各功能部件的控制功能,因此,它实际上是8253芯片内部的控制器。

A1A0:

端口选择信号,由CPU输入。

8253内部有3个独立的通道和一个控制字寄存器,它们构成8253芯片的4个端口,CPU可对3个通道进行读/写操作3对控制字寄存器进行写操作。

这4个端口地址由最低2位地址码A1、A0来选择。

 

一、源程序

;386以上微机适用

;纯dos下才能使用

;tasm4.1或以上编译

;*********************;

;*LED*;

;*********************;

io_plx_device_idequ05406h;TPC卡设备ID

io_plx_vendor_idequ010b5h;TPC卡厂商ID

IO_PLX_SUB_IDEQU0905410B5H;TPC卡子设备及厂商ID

TIM_CTLEQU203H-200H;8253端口地址

TIMER0EQU200H-200H

TIMER1EQU201H-200H

MODE03EQU36H;8253端口数据

MODE12EQU74H

INTA00EQU20H

INTA01EQU21H

PORTSEGEQU211H-200H;数码管端口地址

PORTBITEQU210H-200H

pa55equ218h-200H;8255端口

pb55equ219h-200H

p55ctlequ21bh-200H

datasegment

csregdw?

ipregdw?

;旧中断向量保存空间

io_9054base_addressdb4DUP(0);TPC卡PCI接口芯片I/O基地址暂存空间

io_base_addressdb4DUP(0);TPC卡I/O基地址暂存空间

interrupt_linedb2DUP(0);TPC卡中断号暂存空间

pcicardnotfinddb0dh,0ah,'TPCpcicardnotfindoraddress/interrupterror!

!

!

',0dh,0ah,'$'

io9054baseaddressdb0dh,0ah,'TPCpcicard9054ChipI/OBaseAddress:

','$'

iobaseaddressdb0dh,0ah,'TPCpcicardI/OBaseAddress:

','$'

intnumberdb0dh,0ah,'TPCpcicardInterruptLine:

','$'

enter_returndb0dh,0ah,'$'

MESSDB'8253ATIMER0INMODE3!

COUNT=0200H',0AH,0DH

DB'8253ATIMER1INMODE2!

COUNT=0aH',0AH,0DH,'$'

irq_vectdb08h,09h,0ah,0bh,0ch,0dh,0eh,0fh,70h,71h,72h,73h,74h,75h,76h,77h

;新的中断向量,中断0-7的向量为:

08h-0fh,中断8-15的向量为:

70h-77h

irq_mask_0_7_tabledb011111110b,011111101b,011111011b,011110111b

db011101111b,011011111b,010111111b,001111111b

db011111011b,011111011b,011111011b,011111011b

db011111011b,011111011b,011111011b,011111011b

;新的中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零

irq_mask_8_15_tabledb0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh

db011111110b,011111101b,011111011b,011110111b

db011101111b,011011111b,010111111b,001111111b

;新的中断掩码,中断0-7时全一,中断8-15时从低至高相应位为零

INTMASKDB?

LEDDB3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH,6FH,40H

DB0AH,0DH,'$'

table1dw0101h,0102h,0104h,0108h,0110h,0120h,0140h,0180h

dw0201h,0202h,0204h,0208h,0210h,0220h,0240h,0280h

dw0401h,0402h,0404h,0408h,0410h,0420h,0440h,0480h

chardb'CDEFBA9845673210RPMG'

mesdb'PLAYANYKEYINTHESMALLKEYBOARD!

',0ah,0dh

db'ITWILLBEONTHESCREEN!

ENDWITHRorANYKEY',0ah,0dh,'$'

;extradata

num1db6dup(?

num2db6dup(?

resultdb6dup(?

countdb0

operatordb0

LedNumdb6dup(?

dataends

stackssegment

db100dup(?

STADW512DUP(?

TOPEQULENGTHSTA

stacksends

codesegment

assumecs:

code,ds:

data,ss:

stacks,es:

data

start:

;EnableLocalInterruptInput

.386

cli

movax,data

movds,ax

moves,ax

movax,stacks

movss,ax

callfindtpc;查找TPC卡资源并显示

MOVDX,wordptrio_base_address;初始化8253

adddx,TIM_CTL

MOVAL,MODE03

OUTDX,AL

MOVDX,wordptrio_base_address

adddx,TIMER0

MOVAL,00h

OUTDX,AL

MOVAL,02H

OUTDX,AL

MOVDX,wordptrio_base_address

adddx,TIM_CTL

MOVAL,MODE12

OUTDX,AL

MOVDX,wordptrio_base_address

adddx,TIMER1

MOVAL,0aH

OUTDX,AL

MOVAL,00

OUTDX,AL

MOVDX,OFFSETMESS

MOVAH,09

INT21H

MOVDX,OFFSETMES;显示提示

MOVAH,09

INT21H

movdx,wordptrio_9054base_address

adddx,68h;设置tpc卡中9054芯片io口,使能中断

inax,dx

orax,0900h

outdx,ax

movbx,wordptrinterrupt_line;保存原中断向量

moval,byteptr[irq_vect+bx]

movah,35h

int21h

movax,es

movcsreg,ax

movipreg,bx

movbx,wordptrinterrupt_line;设置新中断向量

moval,byteptr[irq_vect+bx]

movcx,cs

movds,cx

movdx,offsetint_proc

movah,25h

int21h

movax,data

movds,ax

moves,ax

inal,21h;设置中断掩码

movbx,wordptrinterrupt_line

movah,byteptr[irq_mask_0_7_table+bx]

andal,ah

out21h,al

inal,0a1h

movbx,wordptrinterrupt_line

movah,byteptr[irq_mask_8_15_table+bx]

andal,ah

out0a1h,al

sti;开中断

Reset:

;initialization

LEABX,num1

CALLClearNum

LEABX,num2

CALLClearNum

MOVbyteptrcount,0

LEABX,num1

CALLLedShow

FirstRead:

LEABX,num1

CALLReadNum

CMPbyteptroperator,4

JZReset

CMPbyteptroperator,5

JZFunExit

LoopRead:

MOVDL,operator

LEABX,num2

CALLReadNum

CMPbyteptroperator,4

JZReset

CMPbyteptroperator,5

JZFunExit

CMPDL,1

JZFunAdd

CMPDL,2

JZFunMinus

MidJmp2:

JMPFirstRead

MidJmp3:

JMPReset

;severalchoicefortheprioroperator

FunAdd:

CALLAddNum

LEABX,num1

JMPOpe2

FunMinus:

CALLMinusNum

LEABX,num1

Ope2:

CALLLedShow

LEABX,num2

CALLClearNum

LEABX,num1

CALLClearNum

JMPFirstRead

FunEqual:

JMPReset

FunClear:

JMPReset

FunExit:

JMPExit

ErrorOut:

;outputtheerrormessage

MOVwordptrnum1,0A0AH

MOVwordptrnum1+2,0A0AH

MOVwordptrnum1+4,0A0AH

LEABX,num1

callLedShow

ErrorGet:

;resettheerrorstatus

;onlyRandEcanpass

CALLkey

CMPDL,'E'

JZFunExit

CMPDL,'R'

JZMidJmp3

JMPErrorGet

 

Judge:

CMPbyteptroperator,3

JZMidJmp2

Exit:

cli

movbx,wordptrinterrupt_line;恢复中断掩码

movah,byteptr[irq_mask_0_7_table+bx]

notah

inal,21h

oral,ah

out21h,al

movbx,wordptrinterrupt_line

movah,byteptr[irq_mask_8_15_table+bx]

notah

inal,0a1h

oral,ah

out0a1h,al

movbx,wordptrinterrupt_line;恢复原中断向量

moval,byteptr[irq_vect+bx]

movdx,ipreg

movcx,csreg

movds,cx

movah,25h

int21h

movax,data;设置tpc卡中9054芯片io口,关闭中断

movds,ax

movdx,wordptrio_9054base_address

adddx,68h

inax,dx

andax,0f7ffh

outdx,ax

movax,4c00h

int21h;退出

ReadNumproc

;ifyouwanttousethisprocedure

;youmustprovidethenumberaddresstoBX

PUSHAX

PUSHCX

PUSHDX

Readin:

;enterthefirstnumber

PUSHBX

callkey;getacharin(dl)anddisplayit

POPBX

MOVAL,DL

;operatorsymbol

;plus

MOVbyteptroperator,1

CMPAL,'P'

JZExitRead

;minus

MOVbyteptroperator,2

CMPAL,'M'

JZExitRead

;equal

MOVbyteptroperator,3

CMPAL,'G'

JZExitRead

;clear

MOVbyteptroperator,4

CMPAL,'R'

JZExitRead

;exit

MOVbyteptroperator,5

CMPAL,'E'

JZExitRead

;illegalsymbol

CMPAL,'0'

JBReadin

CMPAL,'9'

JAReadin

;number

CMPbyteptrcount,6

JZReadin

LeftMove:

;movthenumber

MOVCX,5

MOVSI,0

MoveData:

MOVDL,[BX+SI+1]

MOV[BX+SI],DL

INCSI

LOOPMoveData

;insertthenumber

ANDAL,0FH

MOV[BX+5],AL

callLedShow

INCcount

JMPReadin

ExitRead:

MOVcount,0

POPDX

POPCX

POPAX

ret

ReadNumendp

MidJmp:

JMPErrorOut

AddNumproc

;addnum1andnum2

MOVCX,6

LEABX,num1

DECBX

ANDCX,CX

AddLoop:

MOVSI,CX

MOVAL,[BX+SI]

ADCAL,[BX+SI+6]

AAA

MOV[BX][SI],AL

LOOPAddLoop

JCMidJmp

ret

AddNumendp

MinusNumproc

;minusnum1andnum2

MOVCX,6

LEABX,num1

DECBX

ANDCX,CX

MinusLoop:

MOVSI,CX

MOVAL,[BX+SI]

SBBAL,[BX+SI+6]

AAS

MOV[BX][SI],AL

LOOPMinusLoop

JCMidJmp

ret

MinusNumendp

LedShowproc

;simulateLEDshow

;providethenumberaddresstoBX

;clearLEDsegment

PUSHBX

LEABX,LedNum

ADDBX,2

CALLClearNum

POPBX

;MovethedatatoLEDsegment

LEADI,LedNum

MOVCX,6

MOVSI,0

ShowLoo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1