?? aexp7.asm
字號:
;*------------------------------------------------------*/
;* Aexp7.asm(查詢方式全雙工串行通信接口實驗) */
;* 查詢方式全雙工串行通信程序 Source File */
;* Copyright (c) 2001 by HUST */
;*------------------------------------------------------*/
data51 equ 308h ;8251A數(shù)據(jù)口
ctr151 equ 309h ;8251A命令/狀態(tài)口
ctr155 equ 303h ;8255命令口
timer2 equ 306h ;8253的2號計數(shù)器端口
timctl equ 307h ;8253命令口
clk00 equ 12h ;8251輸入時鐘頻率(十六進(jìn)制表示)
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 ;送數(shù)子程
ll:loop ll
mov al,40h ;內(nèi)部復(fù)位
call charout
mov al,4ah ;8251A方式命令
call charout
mov al,27h ;8251A工作命令
call charout
ret
int51 endp
charout proc near
out dx,al ;送數(shù)子程
push cx
mov cx,100 ;延時
gg: loop gg
pop cx
ret ;返回
charout endp
set_bps proc near ;8253-5計數(shù)初值計算與裝入子程
mov dx,clk00 ;取8253-5輸入時鐘頻率clk作被除數(shù)
mov ax,clk01
mov bx,bps00 ;取所選波特率作第一個除數(shù)
div bx ;除法運算,商數(shù)送ax
mov dx,0 ;余數(shù)清零
mov bx,factor ;取波特率因子作第二個除數(shù)
div bx ;除法運算,得計數(shù)初值(商數(shù))送ax
mov bx,ax ;保存計數(shù)初值至bx
mov dx,timctl ;8253-5命令口
mov al,0b6h ;8253-5初始化命令
out dx,al
mov dx,timer2 ;8253-5計數(shù)器2的端口
mov ax,bx ;取計數(shù)初值
out dx,al ;裝計數(shù)初值低字節(jié)
mov al,ah ;裝計數(shù)初值高字節(jié)
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 ;跳轉(zhuǎn)開始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 ;調(diào)用8253-5的set_bps子程序,設(shè)置所選波特率的8253-5
;計算初初值
call int51 ;調(diào)用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 ;按鍵發(fā)送
int 21h
cmp al,0 ;有鍵按下?
Je receiv ;若無鍵按下,則轉(zhuǎn)接收
mov ah,01 ;若有鍵按下,則從KB讀入,并在CRT上顯示
int 21h
mov bl,al ;保存鍵值,以備發(fā)送
cmp al,1bh ;是ESC?
je over ;是,則退出,并返回DOS
mov dx,ctr151 ;不是,則發(fā)送數(shù)據(jù)
transm: in al,dx
test al,01 ;發(fā)送準(zhǔn)備好?TXRDY=1?
jz transm ;未準(zhǔn)備好,則等待
mov dx,data51 ;已準(zhǔn)備好,則將鍵入的字符發(fā)送出去
mov al,bl
out dx,al
jmp checkkey ;發(fā)送1個字符后,再轉(zhuǎn)按鍵發(fā)送
receiv: mov dx,ctr151 ;接收數(shù)據(jù)
in al,dx
test al,02 ;接收數(shù)據(jù)準(zhǔn)備好?RXRDY=1?
jz checkkey ;未準(zhǔn)備好,即無數(shù)據(jù)接收,則轉(zhuǎn)按鍵發(fā)送
mov dx,data51 ;已準(zhǔn)備好,即有數(shù)據(jù)傳送過來,則接收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個字符后,再轉(zhuǎn)按鍵發(fā)送
over: mov al,0ch ;置PC6=0,關(guān)閉8253-5的GATE2,停止輸出方波
mov dx,303h
out dx,al
mov ax,4c00h ;程序退出
int 21h
main endp
code ends
end main
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -