中断服务程序流程见图6-13
图6-13 中断服务程序流程
(3)实验程序清单
CODE
SEGMENT ; ASSUME CS:CODE
INTPORT1 EQU 0FF80H INTPORT2 EQU 0FF81H INTQ3 EQU INTREEUP3 TCONTR0 EQU 0043H TCON1 EQU 0041H IOCONPT EQU 0FF2BH IOBPT EQU 0FF29H IOAPT EQU 0FF28H
;8259A偶地址入口 ;8259A奇地址入口 ;中断源IR3地址 ;8253端口地址 ;8253端口地址
PA EQU 0FF20H ;字位口 PB EQU 0FF21H ;字形口 PC EQU 0FF22H ;键入口
ADPORT EQU 0FE00H ;ADC0809端口地址 ORG 12D0H ;源地址
START: JMP START0 ;跳转到START0
BUF DB ?,?,?,?,?,? ;定义6字节的缓冲区 intcnt db ? RES DB ?
data1 db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h db 0a1h,86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH; 定义七段码
START0: CLD;置方向位
CALL BUF1;调用BUF1
CALL WRINTVER ;调用 WRINTVER
MOV AL,13H;初始化ICW1,单片,边沿触发,设置ICW4 MOV DX,INTPORT1 OUT DX,AL
MOV AL,08H ;写ICW2,允许IR3中断 MOV DX,INTPORT2 OUT DX,AL
MOV AL,09H;写ICW4,8259A在缓冲方式下工作,8086/8088系统 OUT DX,AL
MOV AL,0F7H;写OCW1,允许中断源IR3,其余均被屏蔽 OUT DX,AL
MOV intcnt,25 MOV DX,TCONTR0
MOV AL,74H;8253工作通道1,先读(写)低字节,再读(写)高字节,方式4,二进制计数
OUT DX,AL
MOV DX,TCON1
MOV AX,40000 ;8253初始值40000 OUT DX,AL
MOV AL,AH ;写初值的高字节 OUT DX,AL
MOV DX,0FF2BH ;8255初始化,PA口方式0,输出
MOV AL,82H OUT DX,AL
STI ;开中断
WATING: CALL DISP ;调用显示程序 JMP WATING ;循环,延时
WRINTVER: MOV AX,0H
MOV ES,AX ;ES指向AX
MOV DI,002CH ;置DI初值为002CH LEA AX,INTQ3 ;取INTQ3的初值 STOSW
MOV AX,0000h STOSW
RET;中断返回
INTREEUP3: DEC INTCNT ;INTCNT自减1
JNZ INTRE2 ;不相等跳转到INTRE2 MOV INTCNT, 25
ADCON: MOV AX,00 ;设定输入电压值 MOV DX,ADPORT OUT DX,AL
MOV CX,0500H ;循环值,延时 DELAY: LOOP DELAY
MOV DX,ADPORT ;读电压值 IN AL,DX
MOV RES,AL ;将Al中值存入到RES中 CALL CONVERS ;调用CONVERS
MOV AL,RES
CMP AL, 66H ;Al与66H比较
JA NEXT1 ;若大于,跳转到NEXT1 MOV AL, 0F0H
MOV DX, IOAPT ;输出
OUT DX,AL
JMP INTRE2 ;跳转到INTRE2 NEXT1: CMP AL, 99H ;AL与99H比较
JA NEXT2 ;跳转到NEXT2(灯L7-L10亮) MOV AL, 0C3H MOV DX, IOAPT OUT DX,AL
JMP INTRE2 ;跳转到INTRE2 NEXT2: MOV AL, 0FH MOV DX, IOAPT OUT DX,AL
INTRE2: IRET
CONVERS: MOV AND MOV SHR MOV DISP: RET; MOV DIS1: MOV ADD DIS2: MOV LX1: MOV BUF1: MOV CODE
MOV AL,20H ;中断 MOV OUT DX,INTPORT1 DX,AL
;中断返回 MOV AND AH, AL AL, 0FH
;取Al中得低四位 MOV MOV BX, OFFSET BUF [BX+5], AL AL,AH ;取 ;;将取AlBUFAl中得值给的偏移地址给中的高四位[BX+5] BX AL, 0F0H CL, 04H
AL, CL ;Al中的内容右移4位 中断返回[BX+4], AL ;将Al中的内容给AL, 0FFH
[BX+4] ;PA端口清零 MOV OUT DX, PA MOV DX, AL
CL, 0DFH ;显示 MOV BX, OFFSET BUF ;取BUF的偏移地址
OUT DX, PC DX, AL ;将Al中的 内容输出到PC端口MOV MOV AL, [BX] PUSH AH, 00H BX;BX入栈
MOV BX, OFFSET DATA1 ;取DATAMOV BX, AX
1得偏移地址 AL, [BX] ;将对应的七段码给Al POP MOV BX;BX出栈
OUT DX, PB DX, AL
;输出到PB口 MOV MOV AL, CL显示OUT DX, PA DX, AL
PUSH CX ;CX出栈LOOP CX, 00A0H $ ;空循环,延时
POP CMP CX
JZ CL,0FEH LX1 INC ROR BX
JMP CL, 1 DIS1
MOV AL, 0FFH ;PB口清零 OUT DX, PB DX, AL
RET ;中断返回 MOV BUF, 00H BUF+1, 08H MOV MOV BUF+2, 00H MOV BUF+3 ,09H BUF+4, 00H MOV RET BUF+5, 00H ENDS
END START
实验总结:
实验八 8250 串口实验
一、实验目的
(1)系统扩展以8250 为核心的可编程串行异步通讯接口芯片。 (2)对扩展的串行通讯接口实现自发自收。 二、实验内容
将寄存器AH 的内容从10H 开始通过8250 发送、接收,每次收发后AH 的内 容自动增1 直到FFH 为止,同时将每次接收到的数据,依次写到内存4000H~ 40EFH 单元中,实现自发自收。 三、编程指南 1、通讯协议
1 个起始位,8 位数据位,1 个停止位,波特率:4800。 2、8250 的内部寄存器的端口地址
* 通讯线控制寄存器第7 位(DLAB)=0 ,** DLAB=1 3、8250 的内部寄存器格式(见课本)
4、波特率除数锁存器的值与波特率的对应关系(16 进制数) 5、8250 的初始化编程 (1)设置波特率
(2)设置通讯数据格式 (3)设置操作方式
(4)设置中断允许寄存器 四、实验接线图
五、实验步骤
1.连FF80H 孔到CS7,连TXD 到RXD(8250 实验区)。 2.编辑、调试、运行程序。
3.当系统显示“8250——good”表示自发自收结束,按RST 键,系统返回
P 态,用内存读写命令检查4000H~40EFH 内容是否为10H~FFH,验证其正确性。 六、参考程序
CODE SEGMENT ;H8250.ASM ASSUME CS: CODE ;H8250.ASM
START: BUF DB ?,?,?,?,?,?;data1:
START0: MAIN: DATA EQU 0ff80H ;BTS-LSB
MSB EQU 0ff81H LINE EQU 0ff83H LSTAT EQU 0ff85H
PA EQU 0FF20H ;字位口 PB EQU 0FF21H ;字形口
PC EQU 0FF22H ;键入口 ORG 29A0H;源地址
JMP START0;跳转到START0 定义6字节缓冲区 db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h, 0c6h,0a1h;定义七段码
db 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH
MOV AL,80H ;DLAB=1
MOV DX,LINE OUT DX,AL
MOV AL,18H ;BTS=4800;置波特率因子低8位 MOV DX,DATA ;ff80H OUT DX,AL
MOV DX,MSB;置波特率因子高8位 MOV AL,00 OUT DX,AL
MOV AL,03H ;8- BIT ,1-STOP MOV DX,LINE OUT DX,AL
MOV AL,00 ;NO-INT MOV DX,MSB ;8001H OUT DX,AL
MOV AH,10H;AH中的内容 MOV BX,4000H
CALL TXD;调用TXD
CALL RCV;调用RCV MOV [BX],AL INC BX;BX自加