?? aexp7.asm
字號:
;* Aexp7.asm(查詢方式全雙工串行通信接口實驗) */
;* 查詢方式全雙工串行通信程序 Source File */
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 + -