微机接口复习
一、复习方向
二、程序查询方式输入输出
例题:以查询方式编程,从内存中首地址为BUFFER的缓冲区向CRT终端输出128个字节,CRT终端数据口地址为0008H,状态口地址为0020H,D7为状态位,0表示输出缓存空闲。
MOV BX,OFFSET BUFFER ;首地址
MOV CX,128 ;累加器赋值128
LOP:MOV DX,0020H ;状态口地址
IN AL,DX ;输入状态
AND AL,10000000B ;按位与操作,保留最高位D7的值
JNZ LOP ;如果D7的值非0,跳转到LOP处
MOV AL,[BX] ;取出数据
MOV DX,0008H ;数据口地址
OUT DX,AL ;输出
LOOP LOP ;循环128次,和累加器CX联用
HLT ;结束
三、8259A的单片初始化和多片初始化
初始化需要看初始化命令字ICW
ICW1
ICW2
ICW3:注意主片的ICW3和从片的ICW3不一样,单片8259A初始化的时候一般不用ICW3
ICW4
单片8259A初始化
举例:IBMPC机中,只有一片8259A,可接受外部8级中断。在I/O地址中,分配8259A的端口地址为20H和21H,初始化为:边沿触发、缓冲连接、中断结束采用EOI命令、中断优先级采用完全嵌套方式,8级中断源的中断类型分别为08H~0FH初始化程序为:
MOV DX,20H ;8259A的初始化地址(偶地址)
MOV AL,00010011B ;写入ICW1,边沿触发,调用地址间隔为8,单片,需要ICW4
OUT DX,AL
MOV DX,21H ;8259A的初始化地址(奇地址)
MOV AL,08H ;写入ICW2,即00001000B,取中断类型的高5位
OUT DX,AL
MOV AL,00001101b ;写入ICW4.全嵌套方式,缓冲方式主,非自动EOI,8086模式
OUT DX,AL
XOR AL,AL ;写入OCW1
OUT DX,AL
STI
多片8259A的初始化
例题:
;初始化主片
INT A00 EQU 020H ;8259A主片端口(偶地址)
INT A01 EQU 021H ;8259A主片端口(奇地址)
MOV AL,00010001B ;写入ICW1,边沿触发、调用地址间隔为8、级联、需要ICW4
OUT INTA00,AL
JMP SHORT $+2 ;I/O端口延时要求(下同)
MOV AL,00001000B ;写入ICW2,即08H,中断号的高5位,D2~D0不起作用
OUT INTA01,AL
JMP SHORT $+2
MOV AL,00000100B ;写入ICW3,主片上的IR2接从片
OUT INTA01,AL
JMP SHORT $+2
MOV AL,00000001B ;写入ICW4,全嵌套、非缓冲、非自动EOI、8086模式
OUT INTA01,AL
;初始化从片
INT B00 EQU 0A0H ;8259A主片端口(偶地址)
INT B01 EQU 0A1H ;8259A主片端口(奇地址)
MOV AL,00010001B ;写入ICW1,边沿触发、调用地址间隔为8、级联、需要ICW4
OUT INTB00,AL
JMP SHORT $+2 ;I/O端口延时要求(下同)
MOV AL,10110000B ;70H,写入ICW2,即70H,中断号的高5位,D2~D0不起作用
OUT INTB01,AL
JMP SHORT $+2
MOV AL,00000010B ;02H,写入ICW3,主片上的IR2接从片
OUT INTB01,AL
JMP SHORT $+2
MOV AL,00000001B ;01H,写入ICW4,全嵌套、非缓冲、非自动EOI、8086模式
OUT INTB01,AL
四、8255A方式0和方式1
8255A方式控制字
PC口置位复位控制字
8255A方式0初始化:
ORG 100H ;定位,从100开始
MOV DX,303H ;8255A的控制口地址,A1A0=11
MOV AL,10000001B ;方式控制字1有效、A口控制方式0,输出、C口的高半字节输出、B口的控制方式0,输出、C口的低半字节输入。
OUT DX,AL ;
MOV AL,00001111B ;PC7置高,使STB=1
OUT DX,AL ;
MOV SI,OFFSET BUF ;打印字符的首内存地址
MOV CX,0FFH ;打印256个字符个数,11111111B
L:MOV DX,302H ;PC口地址,A1A0=10
IN AL,DX ;
AND AL,00000100B ;查BUSY=0?(PC2=0)但是复位状态
JNZ L ;如果不为0,忙,则等待;不忙,则向PA口送数
MOV AL,300H ;PA口地址,A1A0=00
MOV AL,[SI] ;从内存取数
OUT DX,AL ;送数到PA口
MOV DX,303H ;8255A的控制口
MOV AL,00001110 ;STB信号置低,PC7=0
OUT DX,AL
NOP ;负脉冲(延时)
NOP
MOV AL,00001111B ;STB信号置高,PC7=1
OUT DX,AL
INC SI ;内存地址加1
DEC CX ;字节数减1
JNZ L ;if not zero,CX不为0,跳转到L处
MOV AL,4CH ;程序结束标志
INT 21H
BUF DB ;256个ASCII字符代码
8255A方式1初始化及应用:
题目:在甲乙两台微型计算机之间并行传送1K字节的数据。甲机发送,乙机接收。甲机一侧的8255A采用方式1工作,乙机一侧的8255A采用方式0工作。两侧的CPU与接口之间都采用查询方式交换数据。
甲机发送程序
MOV DX,303H ;8255A的控制口地址,A1A0=11
MOV AL,10100000B ;方式控制字有效、A口控制方式1,输出、C口的高半字节输出、B口的控制方式0,输出、C口的低半字节输出。
OUT DX,AL ;
MOV AL,00001101B ;PC6置高,使INTRA=1
OUT DX,AL ;
MOV SI,OFFSET BUFS ;发送数据区的指针
MOV CX,3FFH ;发送1024个字节数,011111111111B
MOV DX,300H ;向PA口写第一个数,产生第一个OBF信号
MOV AL,[SI] ;送给乙方,以便获取乙方的ACK信号
OUT DX,AL
INC SI ;内存地址加1
DEC CX ;传送字节减1
L:MOV DX,302H ;PC口
IN AL,DX ;查发送中断请求
AND AL,00001000B ;INTRA=1?(PC3=1?)
JZ L ;如果为0,若无中断请求,则等待,若有中断请求,则向PA口写数
MOV DX,300H ;PA口地址
MOV AL,[SI] ;从内存中取数,通过PA口向乙机发送第二个数据
OUT DX,AL
INC SI ;内存地址加1
DEC CX ;字节数减1
JNZ L ;字节未完继续
MOV AH,4CH ;程序结束标志
INT 21H
BUF DB
乙机接收程序:
MOV DX,303H ;8255A的控制口
MOV AL,0A8H ;10101000,方式控制字有效,A口方式方式1输出,c口高半字节输入,B口方式0输出,C口低半字节输入
OUT DX,AL
MOV AL,07H ;00000111,PC3=1置ACK=1
OUT DX,AL
MOV DI,OFFSET BUFR ;设置接收数据区的指针
MOV CX,3FFH ;接收字节数
L1:MOV DX,302H ;8255A的PC口,A1A0=10
IN AL,DX ;查询
AND AL,80H ;10000000检查甲机的OBF=0?(乙机的PC7=0)
JNZ L1 ;若无数据发来,则等待,若有数据发来,则从PA口读数
MOV DX,300H ;8055A的PA口地址
IN AL,DX ;从PA口读入数据
MOV [DI],AL ;存入内存
MOV DX,303H ;8255A的控制口
MOV AL,06H ;00000110,PC3置0
OUT DX,AL ;
NOP ;延时
NOP
MOV AL,07H ;00000111,PC3=1
OUT DX,AL
INC DI ;内存地址加1
DEC CX ;字节数减1
JNZ L1 ;如果不等于0,跳转到L1,等于0的话结束
MOV AH,4CH ;程序结束标志
INT 21H
BUFR DB 1024 DUP(?)
五、8253计数器的应用
原理图和流程图
CODE SEGMENT
ASSUME CS:CODE,DS:CODE ;段关联,数据段,代码段
ORG 100H ;定位100H
START:JUMP BEGIN ;跳转到begin处
LONG1 EQU 6 ;长音和短音的定义
SHORT EQU 1
BEGIN:MOV AX,CODE
MOV DS,AX ;初始化8253
MOV AL,0B6H ;10110110B,方式命令:选择计数器2,先读写字节,后读写高字节
OUT 43H,AL ;43H是8253命令口A1A0=11
MOV AX,5D3H ;产生800Hz的方波初值,题上给出的值相除后1491转二进制是101 1101 0011B转十六进制刚好是5D3H
OUT 42H,AL ;8253的计数器2口,像计数器2装初始值,先装低字节
MOV AL,AH ;后装高字节
OUT 42H,AL ;关闭扬声器
IN AL,61H ;01100001B,读入8255A的PB口
AND AL,0FCH ;11111100B,AND运算,置PB0和PB1为0,关闭GATA2与门
OUT 61H,AL ;查任意键,启动发生器
WAIT1:MOV AH,0BH ;00001010B选择计数器0、锁存寄存器、方式5硬件触发选通、二进制计数
INT 21H ;中断
CMP AL,00H ;比较一下有无按键按下
JE WAIT1 ;无按键按下等待,有按键按下,发出长音
;发长音
LOP:MOV BL,LONG1 ;长音入口参数
CALL SSP ;调用发声子程序
MOV AH,0BH ;00001010B,同上,功能调用,检测外部硬件
INT 21H
CMP AL,00H ;比较
JE CONTINUE1 ;无按键按下发短音,有按键按下检测是否为ESC键
MOV AH,08H ;00001000B方式4,软件触发选通
INT 21H
CMP AL,1BH ;00011011B比较一下是否为ESC
JE QUIT ;是,停止发声并退出
CONTINUE1:MOV BL,SHORT1 ;短音入口参数
CALL SSP ;调用发声子程序
JMP LOP ;循环
;关闭扬声器,并退出
QUIT:IN AL,61H ;quit,停止发声,退出,61H是PB口地址
MOV AH,AL
AND AL,OFCH ;
OUT 61H,AL
MOV AL,AH ;
OUT 61H,AL
MOV AH,4CH;
INT 21H
;发声子程序
SSP PROC NEARCH
IN AL,61H ;读取PB口的原值
OR AL,03H ;后两位PB0,PB1置高,打开GATE2和与门
OUT 61H,AL ;向PB口输出,开始发声
SUB CX,CX ;设置CX的值为CX乘CX
L:LOOP L
DEC BL ;BL为子程序的入口条件
JNZ L
RET
SSP ENDP
CODE ENDS
END START