利用汇编语言实现串口的通讯(一)(BISO调用)

本程序是使用汇编语言通过BISO中断来实现多机间串口通讯功能,程序的简要功能有,支持串口号、波特率、奇偶检验、数据位等通讯参数的设置,可以实现两台PC机间的一发一收的功能;

本人刚学的汇编,写的不好(有点像C的风格),还望各位批评指正。

DATAS SEGMENT
    ;此处输入数据段代码
str5	db	0dh,0ah,'Enter your choice:','$'
strerro db 0dh,0ah,'Your choice is erro!	please enter a correct choice!','$'
Str0 db	0dh,0ah,'Please input the number of the com:','$'
Str1 db	0dh,0ah,'Please input the baud rate:','$'
Str2 db	0dh,0ah,'Please input the data bits:','$'
Str3 db	0dh,0ah,'Please input the stop bit:','$'
Str4 db	0dh,0ah,'Please input the parity bit:','$'
Str6 db	0dh,0ah,'Press anykey to send to the other computer:','$'

choice0	 db  '1.com1 	2.com2 		3.com3','$'
choice1	 db  '1.2400bps 2.4800bps 3.9600bps' ,'$'
choice2	 db  '1.7bits	 2.8bits 	','$'
choice3	 db  '1.1bit	 2.2bits	','$'
choice4	 db  '1.none 	 2.odd	 	3.evn','$'

sign db 0
ComNum dw 0
;choice	db 2 dup(?)
StrEnter	db 0dh,0ah,'$'
  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
	
	
	call SetCom
	call SetBand
	call SetDaBits
	call SetSpBit
	call SetParBit
	;初始化串口
	mov ah,0
	mov al,sign
	mov dx,ComNum
	int 14h
	
	call SendData
	
	jmp exit
	
SetCom	proc 
;com的菜单, 
	push bx
	push cx
	push dx

lpcom:
	lea dx,Str0
	mov	ah,9
	int	21h
	
	lea dx,choice0
	mov	ah,9
	int	21h
	
	lea dx,str5
	mov	ah,9
	int	21h

	mov ah,1
	int 21h
	cmp al,'1'
	je lpcom1
	cmp al,'2'
	je lpcom2
	cmp al,'3'
	je lpcom3
	
	;cmp al,27
	;;按下ESC则退出
	;je com_exit
	;显示错误,提示重新输入
	lea dx,Strerro
	mov	ah,9
	int	21h
	;输入错误,重新输入
	jmp lpcom
	
;将串口设为1
lpcom1:
	;mov ah,0;初始化串口1
	;mov dx,0
	;int 14h;调用BISO中断
	mov ComNum,0
	jmp com_exit
;将串口设为2
lpcom2:
	;mov ah,0;初始化串口2
	;mov dx,1
	;int 14h;调用BISO中断
	mov ComNum,1
	jmp com_exit
lpcom3:
	;mov ah,0;初始化串口3
	;mov dx,2
	;int 14h;调用BISO中断
	mov	ComNum,2	
com_exit:
	pop dx
	pop cx
	pop bx
	ret
SetCom	endp

SetBand	proc 
;band的菜单  
	push bx
	push cx
	push dx	
lpband:
	;mov	ah,7
	;int	21h
	lea dx,Str1
	mov	ah,9
	int	21h
	
	lea dx,choice1
	mov	ah,9
	int	21h
	
	lea dx,str5
	mov	ah,9
	int	21h

	mov ah,1
	int 21h
	
	cmp al,'1'
	je lpband1
	cmp al,'2'
	je lpband2
	cmp al,'3'
	je lpband3
	
	cmp al,27
	;按下ESC则退出
	je band_exit
	
	lea dx,Strerro
	mov	ah,9
	int	21h
	;输入错误,重新输入
	jmp lpband
	
	lea dx,StrEnter
	mov	ah,9
	int	21h
	
;将串口设为1
lpband1:
	;mov ah,0;初始化串口1
	;and al,0a0h;10100000;将波特率设为2400bps
	;int 14h;调用BISO中断
	and sign,0a0h;
	jmp band_exit
;将串口设为2
lpband2:
	;mov ah,0;初始化串口2
	;and al,0c0h;11000000;将波特率设为4800bps
	;int 14h;调用BISO中断
	and sign,0c0h
	jmp band_exit
lpband3:
	;mov ah,0;初始化串口3
	;mov al,0e0h;11000000;将波特率设为9600bps
	;int 14h;调用BISO中断
	add sign,0c0h	
band_exit:
	pop dx
	pop cx
	pop bx
	ret
SetBand	endp


SetDaBits	proc 
;com的菜单, 
	push bx
	push cx
	push dx

lpdata:
	lea dx,Str2
	mov	ah,9
	int	21h
	
	lea dx,choice2
	mov	ah,9
	int	21h
	
	lea dx,str5
	mov	ah,9
	int	21h

	mov ah,1
	int 21h
	cmp al,'1'
	je lpdata1
	cmp al,'2'
	je lpdata2

	cmp al,27
	;按下ESC则退出
	je data_exit
	;显示错误,提示重新输入
	lea dx,Strerro
	mov	ah,9
	int	21h
	;输入错误,重新输入
	jmp lpdata
		

lpdata1:
	;mov ah,0;初始化串口1
	;and al,0feh;00000010-f1100,7位数据位
	;or al,02h
	;int 14h;调用BISO中断
	and sign,0feh
	or sign,02h
	jmp data_exit

lpdata2:
	;mov ah,0;初始化串口2
	;or al,03h;00000011,8位数据位
	;int 14h;调用BISO中断
	or sign,03h
	
	jmp data_exit

		
data_exit:
	pop dx
	pop cx
	pop bx
	ret
SetDaBits	endp

SetSpBit	proc 
;的菜单, 
	push bx
	push cx
	push dx

lpstop:
	lea dx,Str3
	mov	ah,9
	int	21h
	
	lea dx,choice3
	mov	ah,9
	int	21h
	
	lea dx,str5
	mov	ah,9
	int	21h

	mov ah,1
	int 21h
	cmp al,'1'
	je lpstop1
	cmp al,'2'
	je lpstop2

	cmp al,27
	;按下ESC则退出
	je stop_exit
	;显示错误,提示重新输入
	lea dx,Strerro
	mov	ah,9
	int	21h
	;输入错误,重新输入
	jmp lpstop
		
lpstop1:
	;mov ah,0;初始化串口1
	;and al,0fdh;00000010-f1011,第3位设为0
	;int 14h;调用BISO中断
	and sign,0fbh;
	
	jmp stop_exit

lpstop2:
	;mov ah,0;初始化串口2
	;or al,02h;00000010-ff,第3位设为1
	;int 14h;调用BISO中断
	or sign,04h
	jmp stop_exit

		
stop_exit:
	pop dx
	pop cx
	pop bx
	ret
SetSpBit	endp


SetParBit	proc 
;的菜单, 
	push bx
	push cx
	push dx

lppar:
	lea dx,Str4
	mov	ah,9
	int	21h
	
	lea dx,choice4
	mov	ah,9
	int	21h
	
	lea dx,str5
	mov	ah,9
	int	21h

	mov ah,1
	int 21h
	cmp al,'1'
	je lppar1
	cmp al,'2'
	je lppar2
	cmp al,'3'
	je lppar3
	
	cmp al,27
	;按下ESC则退出
	je par_exit
	;显示错误,提示重新输入
	lea dx,Strerro
	mov	ah,9
	int	21h
	;输入错误,重新输入
	jmp lppar
		
lppar1:
	;mov ah,0;初始化串口1
	;and al,0f7h;第三位设为0
	;int 14h;调用BISO中断
	and sign,0f7h
	jmp par_exit

lppar2:
	;mov ah,0;初始化串口2
	;or al,08h;第四位设为1
	;and al,0efh;5设为0
	;int 14h;调用BISO中断
	or sign,08h
	and sign,0efh
	jmp par_exit
lppar3:
	;mov ah,0;初始化串口2
	;or al,02h;第4位设为1
	;int 14h;调用BISO中断
	or sign,08h
	or sign,010h
		
par_exit:
	pop dx
	pop cx
	pop bx
	ret
SetParBit	endp

SendData proc
	push ax
	push bx
	push cx
	push dx
	
	lea dx,Str6
	mov ah,9
	int 21h
lpsend:	
	mov ah,1;从键盘的缓冲区读数据(BISO中断)
	int 16h
	jz lpnext
	mov ah,0;读键盘输入数据(BISO中断)
	int 16h
	cmp al,1bh;esc
	jz send_exit
	mov ah,1;send data
	mov dx,ComNum
	int 14h
lpnext:
	mov ah,3;read com state
	mov dx,ComNum
	int 14h
	
	loop lpsend
	mov ah,2;read from com
	mov dx,ComNum
	int 14h
	
	and ah,01h
	cmp ah,1
	jne lpsend
	
	;disp
	mov dl,al
	mov ah,2
	int 21h
	jmp lpsend
	
send_exit:
	pop dx
	pop cx
	pop bx
	pop ax
	ret
SendData endp	

exit:
    MOV AH,4CH
    INT 21H

CODES ENDS
    END START

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值