二、实验电路
CLK0 GATE0 OUT0 8253 CLK1 GATE1 OUT1 CS GND WR RD IOW IOR 图1 8253与8259 实验电路图
接1MHZ输出端 +5V 接IRQ7 280H~287H
五、实验项目
1.该实验用PC机内部的中断控制器8259A,中断源用TPC-H实验箱上的8253来产生,电路如图1
所示,将8253计数器0,计数器1分别设置为方式3和方式2,计数初值设为2000,使8253每隔4秒产生一次中断请求。 2.编写程序,要求每次主机响应外中断IRQ7时,显示\"THIS IS A 8259A INTERRUPT !\",在键盘上敲任意一个键,程序退出。
3.修改电路和程序,直接用手动产生单个脉冲作为中断请求信号,要求每按一次开关产生一次中断,
在屏幕上显示一次\" THIS IS A 8259A INTERRUPT !\",中断10次后程序退出。
六、编程提示
1.在TPC-H实验系统的接口卡上有一个跳线开关(JP),可以选择IRQ2、IRQ3、IRQ4、IRQ7引到试
验箱上的IRQ插孔,出厂设置的是IRQ7。
2.由于9054的驱动程序影响直写9054芯片的控制寄存器,中断实验需要在纯DOS的环境中才能正
常运行。
3.由于TPC卡使用PCI总线,所以分配的中断号每台微机可能都不同,编程时需要了解当前的微机使用那个中断号并进行设置,获取方法如下:在纯DOS环境下 C:\\ASM\\>提示符下键入PORTR1后敲回车键,会得到:
TPC PCI Card 9054 Chip I/O Base Adress:2000 TPC PCI Card I/O Base Adress:2400
TPC PCI Card Memory Base Adress:d2000000 TPC PCI Card Interrupt Line:0A
其中,2000为PCI卡上9054芯片的基地址;2400为试验箱的基地址,2400/2407对应的是280/287H插孔;0A表示系统分配中断为IRQ10。
4.由于TPC卡使用9054芯片连接微机,所以在编程使用微机中断前需要使能9054的中断功能,代码
如下:
mov dx,ioport_cent+68h ;设置tpc 卡中9054芯片io口,使能中断
in ax,dx
实验七 定时器8253与中断控制器8259A实验
or ax,0900h out dx,ax
其中IOPORT_CENT是9054芯片寄存器组的I/O起始地址(TPC PCI Card 9054 Chip I/O Base Adress:2000),+68H的偏移是关于9054芯片中断使能的寄存器地址,设置含义如下: 设置INTCSR(68H)寄存器,中断模式设置:
BITS 8 功能 1:能够产生PCI中断 0:禁止产生PCI中断 11 1:能够LOCAL端输入的中断送到PCI端 0:禁止LOCAL端输入的中断送到PCI端 其它位为零即可,更多内容参看9054芯片数据手册 程序退出前还要关闭9054的中断,代码如下:
mov dx,ioport_cent+68h ;设置tpc 卡中9054芯片io口,关闭中断 in ax,dx
and ax,0f7ffh out dx,ax
5. PC机中断控制器8259 的主片地址为20H、21H, 从片地址为A0H、A1H,编程时要根据中断类型号设置中断矢量,8259中断屏蔽寄存器IMR对应位要清零(允许中断),中断服务结束返回前要使用中断结束命令:
MOV AL,20H OUT 20H,AL OUT 0A0H,AL
中断结束返回DOS时应将IMR对应位置1,以关闭中断。
;手动产生单个脉冲作为中断请求信号对应程序 data segment
int_offset dw ?
int_seg dw ? ;旧中断向量保存空间 irq_times db 10 ; 中断计数 flag db 0 ; 中断标志
msg1 db 0dh,0ah,' THIS IS A 8259A INTERRUPT !',0dh,0ah,'$' data ends code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax
cli
; TPC PCI Card 9054 Chip I/O Base Adress:2000时
mov dx,2068h ;设置 tpc 卡中9054芯片io口,使能中断 in ax,dx
or ax,900h out dx,ax push ds
; TPC PCI Card Interrupt Line:0A,分配中断为IRQ10时,中断类型号为72H mov ax,3572h
int 21h ;保存原中断向量 mov int_seg,es mov int_offset,bx
mov ax,seg int_proc ;设置新中断向量 mov ds,ax
mov dx,offset int_proc mov ax,2572h int 21h
in al, 0a1h
and al, 11111011b
out 0a1h, al ;开放从片相应的中断 pop ds sti
loop1: cmp flag,0 je loop1
mov dx,offset msg1 mov ah,9 int 21h mov flag,0 dec irq_times jnz loop1
cli
in al, 0a1h
or al, 00000100b
out 0a1h, al ;屏蔽从片相应的中断
mov dx, int_offset ;恢复原中断向量
mov ds,int_seg mov ax,2572h int 21h
mov dx,2068h ;设置 tpc 卡中9054芯片io口,关闭中断
in ax,dx and ax,0f7ffh out dx,ax sti
mov ax,4c00h int 21h int_proc proc far push ax mov flag,1
mov al,20h out 0a0h,al
out 20h,al ;Send EOI pop ax iret int_proc endp code ends end start
实验七 定时器8253与中断控制器8259A实验
;8253每隔4秒产生一次中断请求对应程序 data segment
int_offset dw ?
int_seg dw ? ;旧中断向量保存空间 flag db 0
msg1 db 0dh,0ah,' THIS IS A 8259A INTERRUPT !',0dh,0ah,'$' msg2 db 0dh,0ah,'Press any key to exit!',0dh,0ah,'$' data ends code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax
cli
; TPC PCI Card 9054 Chip I/O Base Adress:2000时
mov dx,2068h ;设置 tpc 卡中9054芯片io口,使能中断 in ax,dx or ax,900h out dx,ax push ds
; TPC PCI Card Interrupt Line:0A,分配中断为IRQ10时,中断类型号为72H mov ax,3572h
int 21h ;保存原中断向量 mov int_seg,es mov int_offset,bx
mov ax,seg int_proc ;设置新中断向量 mov ds,ax
mov dx,offset int_proc mov ax,2572h int 21h
in al, 0a1h
and al, 11111011b
out 0a1h, al ;开放从片相应的中断 pop ds
mov dx,offset msg2
mov ah,9 int 21h
mov dx,2403H ;向8253写控制字, TPC PCI Card I/O Base Adress:2400
mov al,27h ;使0通道为工作方式3 out dx,al
mov al,65h ;设8253通道1工作方式2
out dx,al
mov al,20H ;写入计数初值 mov dx,2400H
out dx,al mov dx,2401H out dx,al sti
loop1: cmp flag,0 je loop1
mov dx,offset msg1 mov ah,9 int 21h mov flag,0
mov ah,0bh int 21h cmp al,0
jnz exit ;按任意键退出 jmp loop1 exit: cli
in al, 0a1h
or al, 00000100b
out 0a1h, al ;屏蔽从片相应的中断
mov dx, int_offset ;恢复原中断向量
mov ds,int_seg mov ax,2572h int 21h
mov dx,2068h ; in ax,dx and ax,0f7ffh out dx,ax sti
mov ax,4c00h int 21h int_proc proc far push ax mov flag,1
mov al,20h ;Send EOI out 0a0h,al out 20h,al pop ax iret int_proc endp code ends end start
设置 tpc 卡中9054芯片io口,关闭中断
实验八 8255和LED数码管显示实验
二、实验电路
实验电路如图2及图3所示。
图2 静态显示电路 图3 动态显示电路
五、实验项目
1.静态显示:按图2连接好电路,将8255A的A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1接+5V(选中),S0、dp接地(关闭)。编程从键盘输入一位十进制数字(0~9),在七段数码管上显示出来。
程序框图、源代码(含注释)及实验结果如下: 2.动态显示(选做):按图3连接好电路,七段数码管段码连接不变,位码驱动输入端S1S0接8255C口的PC1、PC0。编程在两个数码管上显示56。
六、编程提示
1.实验台上的七段数码管为共阴极,码段采用同相驱动,输入端加高电平,选中的数码管亮,位码
加反相驱动器,位码输入端高电平选中。 2.七段数码管的字形代码如下表:
;0-9程序:
data segment ioport io8255a
equ 2400h-280h equ ioport+288h
io8255ctr equ ioport+28bh
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1 db 0dh,0ah,'Input a num (0--9),other key is exit:',0dh,0ah,'$' data ends code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax
mov dx,io8255ctr mov ax,80h out dx,al sss: mov dx,offset mesg1 mov ah,9 int 21h
mov ah,1 int 21h
cmp al,'0' jb exit cmp al,'9' ja exit sub al,30h mov bx,offset led xlat mov dx,io8255a out dx,al
jmp sss exit: mov ax,4c00h int 21h code ends
end start
;使8255的A口为输出方式 ;显示提示信息
;从键盘接收字符 ;是否小于0 ;若是则退出 ;是否大于9 ;若是则退出
;将所得字符的ASCII码减30H ;bx为数码表的起始地址 ;求出相应的段码 ;从8255的A口输出 ;转SSS ;返回
;动态56程序:
data segment ioport io8255a io8255c
equ 2400h-280h equ ioport+288h equ ioport+28Ah
io8255ctr equ ioport+28bh
mesg1 db 0dh,0ah,' Press any key to exit!',0dh,0ah,'$' data ends code segment
assume cs:code,ds:data start: mov ax,data
mov ds,ax mov ah,9 int 21h
mov dx, io8255ctr ;将8255设为A口输出 mov al,80h out dx,al
mov dx,offset mesg1 ;显示提示信息
loop1: mov dx, io8255a mov al,6Dh out dx,al mov dx, io8255c mov al,2
out dx,al
mov cx,3000h
delay: loop delay ;延时 mov dx, io8255a mov al, 7Dh out dx,al mov dx, io8255c mov al,1
out dx,al mov cx,3000h
delay1:loop delay1 ;延时
mov ah,0bh
int 21h cmp al,0 jnz exit
jmp loop1
;按任意键退出
exit: mov dx, io8255c
mov al,0 ;关掉数码管显示 out dx,al
mov ax,4c00h ;返回DOS int 21h
code ends
end start
因篇幅问题不能全部显示,请点此查看更多更全内容