📄 aexp10r.asm
字号:
;*------------------------------------------------------*
;* Aexp10r.asm 8251串行接口应用实验-接收端程序 *
;* 串行通信接收程序source file *
;* Copyright (c) 2002 by HUST *
;*------------------------------------------------------*
data51 equ 308h ;8251A数据口
ctrl51 equ 309h ;8251A命令/状态口
ctrl55 equ 303h ;8255命令口
timer2 equ 306h ;8253的2号计数器端口
timctl equ 307h ;8253的命令口
clk00 equ 12h ;8251输入时钟频率(十六进制表示)
clk01 equ 34deh
factor equ 16 ;波特率因子16
data segment
input_message db 'Please Wait ...',0dh,0ah
db 'end with any key',0dh,0ah,'$'
bps00 dw (?)
data ends
code segment
assume cs:code,ds:data
init51 proc near ;8251A初始化子程序
mov dx,ctrl51 ;8251A命令口
xor ax,ax ;空操作
out dx,al
mov al,40h ;8251A内部复位
call charout
mov al,4ah ;8251A方式命令
call charout
mov al,04h ;8251A工作命令
call charout
ret ;返回
init51 endp
charout proc near ;送数据子程序
out dx,al
push cx
mov cx,100 ;延时
gg: loop gg
pop cx
ret
charout endp
set_bps proc near ;8253-5计数初值计算与装入子程序
mov dx,clk00 ;取8253-5输入时钟频率clk做被除数
mov ax,clk01
mov bx,bps00 ;所选波特率做第一个除数
div bx ;除法运算,商数送ax
mov dx,0 ;余数清零
mov bx,factor ;取波特率因子做第二个除数
div bx ;除法运算,的计数初值(商数)送ax
mov bx,ax ;保存计数初值至bx
mov dx,timctl ;8253-5命令口
mov al,0b6h ;8253-5初始化命令
out dx,al
mov dx,timer2 ;8253-5计数器2的端口
mov ax,bx ;取计数初值
out dx,al ;取计数初值低字节
mov al,ah ;取计数初值高字节
out dx,al
ret ;返回
set_bps endp
main proc far
begin: mov bps00,1200
call set_bps
call init51
mov dx,ctrl55 ;初始化8255A
mov al,80h
out dx,al
mov al,0dh
out dx,al
mov dx,seg input_message ;输出提示信息
mov ds,dx
mov dx,offset input_message
mov ah,09h
int 21h
m0: mov ah,0bh ;检查是否有任意按键按下
int 21h
cmp al,00h
jne over ;有,则退出
mov dx,ctrl51 ;读取状态
in al,dx
test al,02h ;测试数据是否准备好
jz m0 ;没有准备好,则继续等待
mov dx,data51 ;准备好,接收字符
in al,dx
mov dl,al ;显示字符
mov ah,02h
int 21h
jmp m0 ;继续
over:mov al,0ch ;关PC6=0,关闭8253的GATE2
mov dx,ctrl55
out dx,al
mov ax,4c00h ;程序退出
int 21h
main endp
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -