• 微机接口复习


    微机接口复习

    一、复习方向

    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 
    
    代码成就万世基积沙镇海 梦想永在凌云意意气风发
  • 相关阅读:
    CreateProcess的使用方法
    数据库课程设计
    OC可变參数的函数实现va_start、va_end、va_list的使用
    Tiny语言执行环境TM机源码
    LeetCode:Triangle
    [LeetCode] Word Search [37]
    关闭对话框,OnClose和OnCancel
    【Hibernate步步为营】--继承映射具体解释
    hdu 4499 Cannon(暴力)
    String.Format使用方法
  • 原文地址:https://www.cnblogs.com/ma1998/p/13693141.html
Copyright © 2020-2023  润新知