南邮|微机系统串行口的测试

实验目的:

学习串行接口8250的工作原理及编程和中断程序的设计,运用微机系统串行通信知识,进行微机系统串行口的测试。

实验要求:

编写程序对微机系统的串行口进行自发自收内环测试,从键盘键入发送数据,屏幕显示接收数据。发送要求采用查询方式,接收采用中断方式。

DATA SEGMENT USE16
OLD0C DD ?
FLAG DB 0
MSG DB 'You can play a key on the keybord!',0AH,0DH,'$' 
DATA  ENDS

CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
    MOV AX,DATA
    MOV DS,AX
    
    CLI
    CALL I8250
    CALL I8259
    CALL READ0C
    CALL WRITE0C
    STI
    
;--------发送数据--------
SCAN1:
    MOV FLAG,0
    MOV DX,3FDH
    IN AL,DX
    TEST AL,00100000B    ;发送保持寄存器是否为空
    JZ SCAN1
;--------提示信息--------
    LEA DX, MSG
    MOV AH,09H
    INT 21H    
SCAN2:
    MOV AH,01H
    INT 16H  
    JZ SCAN2            ;查询键盘缓冲区 
    CMP AL,27            ;判断是否为Esc
    JZ EXIT 
    MOV DX,3F8H
    AND AL,7FH            ;屏蔽最高位,使用AND指令满足ASCII7位的要求
    OUT DX,AL            ;发送数据
NEXT1: 
    MOV DX,3FDH
    IN AL,DX            ;读取通信线状态寄存器
    TEST AL,01000000B    ;发送移位寄存器是否为空
    JZ NEXT1
;-------接收数据-------
SCAN3:  
    CMP FLAG,1
    JNZ SCAN3
    MOV AH,0CH
    INT 21H                ;清空缓存区
    JMP SCAN1

;-------中断服务子程序--------
RECEIVE PROC
    PUSH AX
    PUSH DX
    PUSH DS 
    MOV AX,DATA
    MOV DS,AX
    MOV DX,3F8H
    IN AL,DX            ;读取接收缓冲区的内容
    AND AL,01111111B
    MOV DL,AL
    MOV AH,02H
    INT 21H                ;显示接收到的字符
    MOV DL,0AH
    MOV AH,02H
    INT 21H                ;换行
    MOV FLAG,1
    MOV AL,20H
    OUT 20H,AL
    POP DS
    POP DX
    POP AX
    IRET
RECEIVE ENDP    
    
    
;-------初始化8250--------
I8250 PROC
    MOV AL,10000000B
    MOV DX,3FDH
    OUT DX,AL        ;设置访问除数寄存器
    MOV AL,0
    MOV DX,3F9
    OUT DX,AL        ;写除数寄存器高八位
    MOV AL,60H
    MOV DX,3F8H
    OUT DX,AL        ;写除数寄存器低八位
    MOV AL,00000011B
    MOV DX,3FBH
    OUT DX,AL        ;设置数据帧格式
    MOV AL,00000001B
    MOV DX,3F9H
    OUT DX,AL        ;设置中断允许寄存器,允许8250内部提出接收中断
    MOV AL,00011111B
    MOV DX,3FCH
    OUT DX,AL        ;设置MODEM控制寄存器,允许8250发送中断请求
    RET
I8250 ENDP


;-------初始化8259-------
I8259 PROC
    IN AL,21H
    AND AL,11101111B
    OUT 21H,AL
    RET
I8259 ENDP    


;-------读中断向量------
READ0C PROC
    MOV AX,350CH
    INT 21H
    MOV WORD PTR OLD0C,BX
    MOV WORD PTR OLD0C+2,ES
    RET
READ0C ENDP


;-------写中断向量------
WRITE0C PROC
    PUSH DS
    MOV AX,CODE
    MOV DS,AX
    MOV DX,OFFSET RECEIVE
    MOV AX,250CH
    INT 21H
    POP DS
    RET
WRITE0C ENDP


;-----恢复中断向量------
RESET PROC
    IN AL,21H
    OR AL,000001000B
    OUT 21H,AL
    MOV AX,250BH
    MOV DX,WORD PTR OLD0C
    MOV DS,WORD PTR OLD0C+2
    INT 21H
    RET
RESET ENDP


;-------结束退出--------
EXIT PROC
    CALL RESET
    MOV AH,4CH
    INT 21H
    RET
EXIT ENDP    

CODE ENDS
END BEG

  • 14
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任性不认命~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值