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

📄 pcasm.asm

📁 51单片机模拟串口
💻 ASM
字号:
;=========================================================================================
;本程序为在DOS环境下,用微机控制KY系列智能液晶终端最简单的程序。
;在Microsoft (R) Macro Assembler Version 5.00 环境中编译并运行通过.
;使用COM1,2,3,4,  波特率:9600Hz,19200Hz
;本程序运行结果:选择串口和波特率后由键盘输入的字符在终端显示出来.
;输出数据格式:8个数据位,1个停止位,校验位恒0
;本程序仅供KY系列智能液晶终端的用户参考.
;北京金创业科技开发中心
;===========================================================================================
.286
DATAAREA segment
say_input_string db 0ah,0dh,'Input string for transmit:',24h
say_next         db 0dh,0ah,'Select 1=exit 2=continue',24h
saybund19200     db 'Set Com work as 19200bbit/s ...!$',0dh,0ah
receivebuffer    db 1000h dup(0)
sioport          dw 3f8h,2f8h,3e8h,2e8h
saysecio         db 'Select Com  1-COM1 2-COM2 3-COM3 4-COM4:',0dh,0ah,'$'
saybund          db 'Select bund  1-9600 2-19200$'
singbyte         db 0
recivefrom       db 0dh,0ah,'Have recive one from',0dh,0ah,24h
PORTIOBAS        DW 3F8H
SAYFUNCTION      db 'select 1=answer 2=exit',0dh,0ah,'$'
reccomd          db 100h dup(0)
input_buffer     db 100
                 db 100 Dup(0)
DATAAREA ENDS
;-----------------------------
stack_seg segment stack
       dw 100H dup(?)
stack_top label word
stack_seg ends
       READMT SEGMENT
MAIN PROC FAR
         ASSUME CS:READMT,ds:DATAAREA
ASSUME SS:stack_seg
;---开始--------------------------
START:
  mov sp,stack_top
  push ds
  sub ax,ax
  PUSH AX
  mov ax,DATAAREA
  MOV DS,AX
;Here You Can Write The Programe
;GET THE DATA AND YEAR
  mov dx,offset saysecio; db 'Select Com  1-COM1 2-COM2 3 COM3 4COM4:$'
  mov ah,9
  int 21h
  mov ah,0
  int 16h
  dec ax
  and ax,3
  mov bx,offset sioport
  shl ax,1
  add bx,ax
  mov ax,[bx]
  mov PORTIOBAS,ax
  call testsio
mon:mov dx,offset say_input_string
  mov ah,9
  int 21h
  mov dx,offset input_buffer
  mov ah,0ah
  int 21h
  mov bx,offset input_buffer
  add bx,2
lop_tr:mov al,[bx]
  cmp al,0dh
  jne  con_tr
  mov dx,offset say_next
  mov ah,9
  int 21h
  mov ah,0
  int 16h
  cmp al,'1'
  jne mon
  ret
con_tr: call transmit_byte
  inc bx
  jmp lop_tr
MAIN ENDP
;---串口设置-----------------------
testsio proc near
  pusha
  mov dx,PORTIOBAS
  mov al,80h
  add dx,(3fbh-3f8h)
  out dx,al
  mov dx,offset saybund
  mov ah,9
  int 21h
  mov ah,0
  int 16h
  mov ah,12
  cmp al,'1'
  je set_sioas9600
  mov ah,6
set_sioas9600:mov al,ah
  mov dx,PORTIOBAS
  mov al,12       ;波特率9600
  out dx,al
  inc dx
  mov al,0
  out dx,al
  mov dx,PORTIOBAS
  add dx,(3fbh-3f8h)
  mov al,00001011b ;数据格式
  out dx,al
  mov al,0
  dec dx
  dec dx
  out dx,al
  mov dx,portiobas
  add dx,4
  mov al,3
  out dx,al
testioret:popa
  ret
testsio endp
;----发送1字节(在AL中)---------------------
transmit_byte proc near
  pusha
  mov ah,al
  mov dx,portiobas
  add dx,6
  ;portiobas+6为MODEM状态寄存器,D4位为串口的CTS状态 
  ;等待终端发出的"忙"BUSY信号,如BUSY=1则循环等待.BUSY经RS232板电平转换后,接微机串口的CTS端
wait_busy:in al,dx      ;
  test al,10h
  jz wait_busy          ;
  mov dx,portiobas
  mov al,ah
  out dx,al             ;发出数据,将数据送"发送保持寄存器"
  add dx,5
  ;portiobas+5为线路状态寄存器,D6=1:表示"发送保持寄存器"和"发送移位寄存器"都处于空闲状态,如不空则等待 
waittransmit:in al,dx
  test al,40h
  jz waittransmit
  popa
  ret
transmit_byte endp
;--------------------------
READMT ENDS
END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -