资源描述
接口技术计算器设计课程设计
———————————————————————————————— 作者:
———————————————————————————————— 日期:
2
个人收集整理 勿做商业用途
目 录
一、 引言 ……………………………………………………………………………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。读/写控制
8253
11
10
9
8
7
6
5
4
3
2
D7
1
D6
D5
D4
D3
D2
D1
D0
CLK0
OUT0
GET0
GND
12
14
15
16
17
18
19
20
21
22
23
24
0UT1
CLK1
GATE1
OUT2
GATE2
A1
WR
A0
CS
CKL2
RD
+5v
13
读/写控制分别连接系统的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_id equ 05406h ;TPC卡设备ID
io_plx_vendor_id equ 010b5h ;TPC卡厂商ID
IO_PLX_SUB_ID EQU 0905410B5H ;TPC卡子设备及厂商ID
TIM_CTL EQU 203H-200H ;8253端口地址
TIMER0 EQU 200H—200H
TIMER1 EQU 201H-200H
MODE03 EQU 36H ;8253端口数据
MODE12 EQU 74H
INTA00 EQU 20H
INTA01 EQU 21H
PORTSEG EQU 211H-200H ;数码管端口地址
PORTBIT EQU 210H—200H
pa55 equ 218h-200H ;8255端口
pb55 equ 219h—200H
p55ctl equ 21bh—200H
data segment
csreg dw ?
ipreg dw ? ;旧中断向量保存空间
io_9054base_address db 4 DUP(0) ;TPC卡PCI接口芯片I/O基地址暂存空间
io_base_address db 4 DUP(0) ;TPC卡I/O基地址暂存空间
interrupt_line db 2 DUP(0) ;TPC卡中断号暂存空间
pcicardnotfind db 0dh,0ah,’TPC pci card not find or address/interrupt error !!!’,0dh,0ah,’$'
io9054baseaddress db 0dh,0ah,'TPC pci card 9054 Chip I/O Base Address : ’,’$'
iobaseaddress db 0dh,0ah,'TPC pci card I/O Base Address : ',’$'
intnumber db 0dh,0ah,’TPC pci card Interrupt Line : ',’$'
enter_return db 0dh,0ah,’$’
MESS DB ’8253A TIMER0 IN MODE3! COUNT=0200H’,0AH,0DH
DB ’8253A TIMER1 IN MODE2! COUNT=0aH’,0AH,0DH,'$'
irq_vect db 08h,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_table db 011111110b,011111101b,011111011b,011110111b
db 011101111b,011011111b,010111111b,001111111b
db 011111011b,011111011b,011111011b,011111011b
db 011111011b,011111011b,011111011b,011111011b
;新的中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零
irq_mask_8_15_table db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh
db 011111110b,011111101b,011111011b,011110111b
db 011101111b,011011111b,010111111b,001111111b
;新的中断掩码,中断0—7时全一,中断8—15时从低至高相应位为零
INTMASK DB ?
LED DB 3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH,6FH,40H
DB 0AH,0DH,'$'
table1 dw 0101h,0102h,0104h,0108h,0110h,0120h,0140h,0180h
dw 0201h,0202h,0204h,0208h,0210h,0220h,0240h,0280h
dw 0401h,0402h,0404h,0408h,0410h,0420h,0440h,0480h
char db 'CDEFBA9845673210 RPMG'
mes db 'PLAY ANY KEY IN THE SMALL KEYBOARD! ’,0ah,0dh
db 'IT WILL BE ON THE SCREEN! END WITH R or ANY KEY',0ah,0dh,’$’
;extra data
num1 db 6 dup (?)
num2 db 6 dup (?)
result db 6 dup (?)
count db 0
operator db 0
LedNum db 6 dup (?)
data ends
stacks segment
db 100 dup (?)
STA DW 512 DUP (?)
TOP EQU LENGTH STA
stacks ends
code segment
assume cs:code,ds:data,ss:stacks,es:data
start:
;Enable Local Interrupt Input
。386
cli
mov ax,data
mov ds,ax
mov es,ax
mov ax,stacks
mov ss,ax
call findtpc ;查找TPC卡资源并显示
MOV DX,word ptr io_base_address ;初始化8253
add dx,TIM_CTL
MOV AL,MODE03
OUT DX,AL
MOV DX,word ptr io_base_address
add dx,TIMER0
MOV AL,00h
OUT DX,AL
MOV AL,02H
OUT DX,AL
MOV DX,word ptr io_base_address
add dx,TIM_CTL
MOV AL,MODE12
OUT DX,AL
MOV DX,word ptr io_base_address
add dx,TIMER1
MOV AL,0aH
OUT DX,AL
MOV AL,00
OUT DX,AL
MOV DX,OFFSET MESS
MOV AH,09
INT 21H
MOV DX,OFFSET MES ;显示提示
MOV AH,09
INT 21H
mov dx,word ptr io_9054base_address
add dx,68h ;设置 tpc 卡中9054芯片io口,使能中断
in ax,dx
or ax,0900h
out dx,ax
mov bx,word ptr interrupt_line ;保存原中断向量
mov al,byte ptr [irq_vect+bx]
mov ah,35h
int 21h
mov ax,es
mov csreg,ax
mov ipreg,bx
mov bx,word ptr interrupt_line ;设置新中断向量
mov al,byte ptr [irq_vect+bx]
mov cx,cs
mov ds,cx
mov dx,offset int_proc
mov ah,25h
int 21h
mov ax,data
mov ds,ax
mov es,ax
in al, 21h ;设置中断掩码
mov bx,word ptr interrupt_line
mov ah,byte ptr [irq_mask_0_7_table+bx]
and al,ah
out 21h, al
in al, 0a1h
mov bx,word ptr interrupt_line
mov ah,byte ptr [irq_mask_8_15_table+bx]
and al,ah
out 0a1h, al
sti ;开中断
Reset:
;initialization
LEA BX,num1
CALL ClearNum
LEA BX,num2
CALL ClearNum
MOV byte ptr count,0
LEA BX,num1
CALL LedShow
FirstRead:
LEA BX,num1
CALL ReadNum
CMP byte ptr operator,4
JZ Reset
CMP byte ptr operator,5
JZ FunExit
LoopRead:
MOV DL,operator
LEA BX,num2
CALL ReadNum
CMP byte ptr operator,4
JZ Reset
CMP byte ptr operator,5
JZ FunExit
CMP DL,1
JZ FunAdd
CMP DL,2
JZ FunMinus
MidJmp2:
JMP FirstRead
MidJmp3:
JMP Reset
;several choice for the prior operator
FunAdd:
CALL AddNum
LEA BX,num1
JMP Ope2
FunMinus:
CALL MinusNum
LEA BX,num1
Ope2:
CALL LedShow
LEA BX,num2
CALL ClearNum
LEA BX,num1
CALL ClearNum
JMP FirstRead
FunEqual:
JMP Reset
FunClear:
JMP Reset
FunExit:
JMP Exit
ErrorOut:
;output the error message
MOV word ptr num1,0A0AH
MOV word ptr num1+2,0A0AH
MOV word ptr num1+4,0A0AH
LEA BX,num1
call LedShow
ErrorGet:
;reset the error status
;only R and E can pass
CALL key
CMP DL,'E'
JZ FunExit
CMP DL,’R'
JZ MidJmp3
JMP ErrorGet
Judge:
CMP byte ptr operator,3
JZ MidJmp2
Exit: cli
mov bx,word ptr interrupt_line ;恢复中断掩码
mov ah,byte ptr [irq_mask_0_7_table+bx]
not ah
in al, 21h
or al, ah
out 21h, al
mov bx,word ptr interrupt_line
mov ah,byte ptr [irq_mask_8_15_table+bx]
not ah
in al, 0a1h
or al, ah
out 0a1h, al
mov bx,word ptr interrupt_line ;恢复原中断向量
mov al,byte ptr [irq_vect+bx]
mov dx,ipreg
mov cx,csreg
mov ds,cx
mov ah,25h
int 21h
mov ax,data ;设置 tpc 卡中9054芯片io口,关闭中断
mov ds,ax
mov dx,word ptr io_9054base_address
add dx,68h
in ax,dx
and ax,0f7ffh
out dx,ax
mov ax,4c00h
int 21h ;退出
ReadNum proc
;if you want to use this procedure
;you must provide the number address to BX
PUSH AX
PUSH CX
PUSH DX
Readin:
;enter the first number
PUSH BX
call key ;get a char in (dl) and display it
POP BX
MOV AL,DL
;operator symbol
;plus
MOV byte ptr operator,1
CMP AL,’P'
JZ ExitRead
;minus
MOV byte ptr operator,2
CMP AL,’M'
JZ ExitRead
;equal
MOV byte ptr operator,3
CMP AL,’G’
JZ ExitRead
;clear
MOV byte ptr operator,4
CMP AL,’R'
JZ ExitRead
;exit
MOV byte ptr operator,5
CMP AL,'E’
JZ ExitRead
;illegal symbol
CMP AL,'0’
JB Readin
CMP AL,'9’
JA Readin
;number
CMP byte ptr count,6
JZ Readin
LeftMove:
;mov the number
MOV CX,5
MOV SI,0
MoveData:
MOV DL,[BX+SI+1]
MOV [BX+SI],DL
INC SI
LOOP MoveData
;insert the number
AND AL,0FH
MOV [BX+5],AL
call LedShow
INC count
JMP Readin
ExitRead:
MOV count,0
POP DX
POP CX
POP AX
ret
ReadNum endp
MidJmp:
JMP ErrorOut
AddNum proc
;add num1 and num2
MOV CX,6
LEA BX,num1
DEC BX
AND CX,CX
AddLoop:
MOV SI,CX
MOV AL,[BX+SI]
ADC AL,[BX+SI+6]
AAA
MOV [BX][SI],AL
LOOP AddLoop
JC MidJmp
ret
AddNum endp
MinusNum proc
;minus num1 and num2
MOV CX,6
LEA BX,num1
DEC BX
AND CX,CX
MinusLoop:
MOV SI,CX
MOV AL,[BX+SI]
SBB AL,[BX+SI+6]
AAS
MOV [BX][SI],AL
LOOP MinusLoop
JC MidJmp
ret
MinusNum endp
LedShow proc
;simulate LED show
;provide the number address to BX
;clear LED segment
PUSH BX
LEA BX,LedNum
ADD BX,2
CALL ClearNum
POP BX
;Move the data to LED segment
LEA DI,LedNum
MOV CX,6
MOV SI,0
ShowLoop:
MOV AL,[BX+SI]
PUSH DI
ADD DI,SI
MOV [DI],AL
POP DI
INC SI
LOOP ShowLoop
ret
LedShow endp
ClearNum proc
;clear the number
;provide number address to BX
MOV CX,6
DEC BX
ClearZero:
MOV SI,CX
MOV byte ptr [BX+SI],0
LOOP ClearZero
ret
ClearNum endp
key proc near
kst:
mov al,82h
MOV DX,word ptr io_base_address
add dx,p55ctl
out dx,al ;set command word of 8255a
;porta for output,portb for input
wait1:
next:
mov al,00
MOV DX,word ptr io_base_address
add dx,pa55
out dx,al ;porta output 00
MOV DX,word ptr io_base_address
add dx,pb55
in al,dx ;get col data
cmp al,0ffh
jz wait1 ;no key is closed ,wait
push ax ;save the col data
push ax
call delay
MOV DX,word ptr io_base_address
add dx,p55ctl
mov al,90h ;set command word of 8255a
out dx,al ;porta for input,portb for output
MOV DX,word ptr io_base_address
add dx,pb55
pop ax
out dx,al ;output col data from portb
MOV DX,word ptr io_base_address
add dx,pa55
in al,dx ;(al) is row data
pop bx
mov ah,bl ;(ah) is col data
not ax
mov si,offset table1
mov di,offset char
mov cx,24
tt:
cmp ax,[si] ;cmp (col,row) with every word
jz nn ;in the table
dec cx
jz kst
add si,2
inc di
jmp tt
nn:
mov dl,[di]
mov ah,02
int 21h
push dx
mov al,82h
MOV DX,word ptr io_base_address
add dx,p55ctl
out dx,al ;set command word of 8255a
;porta for output,portb for input
wait2:
mov al,00
MOV DX,word ptr io_base_address
add dx,pa55
out dx,al ;porta output 00
MOV DX,word ptr io_base_address
add dx,pb55
in al,dx ;get col data
cmp al,0ffh
jnz wait2 ;wait until the key is up
pop dx
ret
key endp
delay proc near
push ax ;delay 50ms--100ms
push bx
push cx
push dx
mov ah,0
int 1ah
mov bx,dx
delay1:
mov ah,0
int 1ah
cmp bx,dx
jz delay1
mov bx,dx
delay2:
mov ah,0
int 1ah
cmp bx,dx
jz delay2
pop dx
pop cx
pop bx
pop ax
ret
delay endp
int_proc proc far
cli
push ax
PUSH CX
push dx
PUSH DI
push ds
MOV AX,DATA
MOV DS,AX
MOV DI,OFFSET LedNum
MOV CL,01
DIS1: MOV AL,[DI]
MOV BX,OFFSET LED
XLAT
MOV DX,word ptr io_base_address
add dx,PORTSEG
OUT DX,AL
MOV AL,CL
MOV DX,word ptr io_base_address
add dx,PORTBIT
OUT DX,AL
PUSH CX
MOV CX,8000H ;显示时间延迟
TimeDELAY: LOOP TimeDELAY
POP CX
CMP CL,20H
JZ QUIT
INC DI
SHL CL,1
MOV AL,00
OUT DX,AL
JMP DIS1
QUIT:
MOV DX,word ptr io_base_address
add dx,PORTBIT
MOV AL,00
OUT DX,AL
mov al,20h ;Send EOI
out 0a0h,al
out 20h,al
mov cx,0ffffh
loopx:
nop
loop loopx ;延时
pop ds
POP DI
pop dx
POP CX
pop ax
sti
iret
int_proc endp
fin
展开阅读全文