微机接口复习

微机接口复习

一、复习方向

image-20200917085321966

二、程序查询方式输入输出

image-20200917091132350

例题:以查询方式编程,从内存中首地址为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的单片初始化和多片初始化

image-20200917093156767

初始化需要看初始化命令字ICW

ICW1

image-20200917094019313

ICW2

image-20200917094107250

ICW3:注意主片的ICW3和从片的ICW3不一样,单片8259A初始化的时候一般不用ICW3

image-20200917094206201

ICW4

image-20200917094359761

单片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的初始化

例题:

image-20200917104942397

image-20200917105029892

    ;初始化主片
    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方式控制字

image-20200919105547681

PC口置位复位控制字

image-20200919105616690

8255A方式0初始化:

image-20200917171559736

    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与接口之间都采用查询方式交换数据。

image-20200917180929392

image-20200917181004681

甲机发送程序

    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计数器的应用

image-20200919080059499

image-20200918150757651

原理图和流程图

image-20200918150930459

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 
posted @ 2020-09-18 19:45  侠客小飞  阅读(1173)  评论(0编辑  收藏  举报