📄 aexp7.asm
字号:
;*------------------------------------------------------*/
;* Aexp7.asm(查询方式全双工串行通信接口实验) */
;* 查询方式全双工串行通信程序 Source File */
;* Copyright (c) 2001 by HUST */
;*------------------------------------------------------*/
data51 equ 308h ;8251A数据口
ctr151 equ 309h ;8251A命令/状态口
ctr155 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
bps00 dw (?)
mes1 db 'now enter the serial communication',0ah,0dh
db 'end with esc',0ah,0dh,'$'
input_message db '0:110 1:150 2:300 3:600'
db 0dh,0ah
db '4:1200 5:2400 6:4800 7:9600'
db 0dh,0ah
db 'please take a choice(0~7)of baud_rate:'
db 0dh,0ah,'$'
error_message db 'input error! try again'
db 0dh,0ah,'$'
data ends
code segment
assume cs:code, ds:data
int51 proc near ;8251A初始化子程
mov dx,ctr151 ;8251A命令口
xor ax,ax ;空操作
call charout ;送数子程
ll:loop ll
mov al,40h ;内部复位
call charout
mov al,4ah ;8251A方式命令
call charout
mov al,27h ;8251A工作命令
call charout
ret
int51 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 ;通信主程序
mov ax,data
mov ds,ax
mov ah,9 ;提示选择波特率
mov dx,seg input_message
mov ds,dx
mov dx,offset input_message
int 21h
input: mov ah,8 ;输入波特率
int 21h
cmp al,'0' ;输入’0’,表示选择110baud
jne next1
mov bps00,110 ;存入bps00
jmp begin ;跳转开始begin处
next1: cmp al,'1'
jne next2
mov bps00,150 ;’1’表示150b/s
jmp begin
next2: cmp al,'2'
jne next3
mov bps00,300 ;’2’表示300b/s
jmp begin
next3: cmp al,'3'
jne next4
mov bps00,600 ;’3’表示600b/s
jmp begin
next4: cmp al,'4'
jne next5
mov bps00,1200 ;’4’表示1200b/s
jmp begin
next5: cmp al,'5'
jne next6
mov bps00,2400 ;’5’表示2400b/s
jmp begin
next6: cmp al,'6'
jne next7
mov bps00,4800 ;’6’表示150b/s
jmp begin
next7: cmp al,'7'
jne error ;若波特率选择有错,则重新输入
mov bps00,9600 ;’7’表示9600b/s
jmp begin
error:
mov ah,9 ;提示波特率选择出错,则重新输入
mov dx,seg error_message
mov ds,dx
mov dx,offset error_message
int 21h
jmp input
begin: call set_bps ;调用8253-5的set_bps子程序,设置所选波特率的8253-5
;计算初初值
call int51 ;调用8251A子程序,初始化8251A
lea dx,mes1
mov ah,09
int 21h
mov dx,303h ;初始化8255A
mov al,80h
out dx,al
mov al,0dh ;置PC6=1,打开8253-5的GATE2,开始输出方波
out dx,al
checkkey:mov ah,0bh ;按键发送
int 21h
cmp al,0 ;有键按下?
Je receiv ;若无键按下,则转接收
mov ah,01 ;若有键按下,则从KB读入,并在CRT上显示
int 21h
mov bl,al ;保存键值,以备发送
cmp al,1bh ;是ESC?
je over ;是,则退出,并返回DOS
mov dx,ctr151 ;不是,则发送数据
transm: in al,dx
test al,01 ;发送准备好?TXRDY=1?
jz transm ;未准备好,则等待
mov dx,data51 ;已准备好,则将键入的字符发送出去
mov al,bl
out dx,al
jmp checkkey ;发送1个字符后,再转按键发送
receiv: mov dx,ctr151 ;接收数据
in al,dx
test al,02 ;接收数据准备好?RXRDY=1?
jz checkkey ;未准备好,即无数据接收,则转按键发送
mov dx,data51 ;已准备好,即有数据传送过来,则接收1个字符
in al,dx
mov dl,al ;显示接收的字符
mov ah,02h
int 21h
mov ah,0bh
int 21h
cmp al,00h
je checkkey
mov ah,08h
int 21h
cmp al,1bh ;是ESC?
je over ;是,则退出,返回DOS
jmp checkkey ;不是,则接收1个字符后,再转按键发送
over: mov al,0ch ;置PC6=0,关闭8253-5的GATE2,停止输出方波
mov dx,303h
out dx,al
mov ax,4c00h ;程序退出
int 21h
main endp
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -