⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aexp10s.asm

📁 微机接口技术的入门必备试验代码 试验平台msdi
💻 ASM
字号:
;*------------------------------------------------------*
;*    Aexp10s.asm  串行接口应用实验-发送端程序           *
;*    串行通信发送程序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
bps00 dw (?)
input_message  db 'now enter the serial communication',0ah,0dh
              db 'end with esc',0ah,0dh
              db 'please input characters to transmit',0dh,0ah,'$'
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,23h                       ;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                       ;置PC6=1,打开8253的GATE2输出方波
      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,0                          ;有键按下?
      je m0                             ;无键按下等待
      mov ah,01h                        ;将字符在CRT上等待
      int 21h
      mov bl,al                          ;保存键值
      cmp al,1bh                         ;是否为ESC
      jz over                            ;是,则退出
      mov dx,ctrl51                      ;不是,则发送数据
m1:   in al,dx
      test al,01                          ;发送准备好?RxRDY=1?
      jz m1                             ;未准备好,则等待
      mov dx,data51                      ;已准备好,则将键入的字符发出去
      mov al,bl
      out dx,al
      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 + -