用汇编语言对INS8250串行接口芯片编程,实现两台微机之间的全双工异步串行通信
2009-06-03 16:20
453 查看
DATA SEGMENT
SPEED DB 0DH,0AH,'PLEASE CHOOSE THE SPEED:','1.110 2.150 3.300 4.600 5.1200 6.2400 7.4800 8.9600',0DH,0AH,'$'
CBITS DW 110,150,300,600,1200,2400,4800,9600
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX, DATA
MOV DS, AX
OSPEED: MOV DX, OFFSET SPEED
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
PUSH AX;
MOV AH, 7; CLEAR SCREEN
MOV AL,0
MOV BH,70H
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,79
INT 10H
POP AX
SUB AL, 30H
MOV BL, AL
MOV BL, AL
MOV SI, BX
MOV BX, CBITS[SI]
MOV AX, 0C200H
MOV DX, 0001H
DIV BX
PUSH AX
;初始化波特率除数寄存器
MOV DX, 03FBH ;指向线路控制寄存器
MOV AL, 80H ;位7置1
OUT DX, AL ;发送此字节
POP AX ;出栈
MOV DX, 03F8H
OUT DX, AL
MOV DX, 03F9H
MOV AL, AH
OUT DX, AL
;初始化线路控制寄存器
MOV DX, 3FBH; 指向线路控制寄存器
MOV AL, 0AH
OUT DX, AL
;初始化中断寄存器
MOV DX,3F9H; 指向中断允许寄存器
MOV AL,0H ;禁止所有中断
OUT DX,AL
MOV DX,3F9H; 禁止中断
MOV AL,0H
SEND: MOV AH,0BH ;有键按下?
INT 21H
AND AL,AL
JZ SEND ;无键按下,转send,否则,调用1S延时子程序
MOV AH,07H ;从键盘输入一个字符,但不回显
INT 21H
MOV DX, 3F8H ;指向发送保持寄存器
OUT DX, AL
CMP AL,1BH; 1BH=ESC
JE END1
;线路状态检测循环
forever: mov dx, 3fdh; 指向线路状态寄存器LSR
in al, dx ;取状态字节
test al, 01h ;测试是否已收到数据
jnz receive ;转接收例程
test al, 20h ;测试是否可以发送字符
jz forever ;若否,继续检测
;发送部分
MOV AH,0BH ;有键按下?
INT 21H
AND AL,AL
jz forever
MOV AH,07H
INT 21H
cmp al, 1bh
jz END1
mov dx, 3f8h
out dx, al
jmp forever
;接受部分
receive: mov dx, 3f8h ;指向接受数据寄存器
in al, dx ;取新收到的字符
and al, 7fh
push ax
mov bx,0; BL=1,前景色
mov ah,14
int 10h 键盘I/O中断调用,检测有无键入
pop ax
cmp al, 0dh ;判断刚才收到的字符是否为回车
jnz forever ;不是,则转向线路检测循环
mov al, 0ah
mov bx,0
mov ah,14
int 10h
jmp forever
END1: MOV AH,4CH;
INT 21H
CODE ENDS
END START
SPEED DB 0DH,0AH,'PLEASE CHOOSE THE SPEED:','1.110 2.150 3.300 4.600 5.1200 6.2400 7.4800 8.9600',0DH,0AH,'$'
CBITS DW 110,150,300,600,1200,2400,4800,9600
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX, DATA
MOV DS, AX
OSPEED: MOV DX, OFFSET SPEED
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
PUSH AX;
MOV AH, 7; CLEAR SCREEN
MOV AL,0
MOV BH,70H
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,79
INT 10H
POP AX
SUB AL, 30H
MOV BL, AL
MOV BL, AL
MOV SI, BX
MOV BX, CBITS[SI]
MOV AX, 0C200H
MOV DX, 0001H
DIV BX
PUSH AX
;初始化波特率除数寄存器
MOV DX, 03FBH ;指向线路控制寄存器
MOV AL, 80H ;位7置1
OUT DX, AL ;发送此字节
POP AX ;出栈
MOV DX, 03F8H
OUT DX, AL
MOV DX, 03F9H
MOV AL, AH
OUT DX, AL
;初始化线路控制寄存器
MOV DX, 3FBH; 指向线路控制寄存器
MOV AL, 0AH
OUT DX, AL
;初始化中断寄存器
MOV DX,3F9H; 指向中断允许寄存器
MOV AL,0H ;禁止所有中断
OUT DX,AL
MOV DX,3F9H; 禁止中断
MOV AL,0H
SEND: MOV AH,0BH ;有键按下?
INT 21H
AND AL,AL
JZ SEND ;无键按下,转send,否则,调用1S延时子程序
MOV AH,07H ;从键盘输入一个字符,但不回显
INT 21H
MOV DX, 3F8H ;指向发送保持寄存器
OUT DX, AL
CMP AL,1BH; 1BH=ESC
JE END1
;线路状态检测循环
forever: mov dx, 3fdh; 指向线路状态寄存器LSR
in al, dx ;取状态字节
test al, 01h ;测试是否已收到数据
jnz receive ;转接收例程
test al, 20h ;测试是否可以发送字符
jz forever ;若否,继续检测
;发送部分
MOV AH,0BH ;有键按下?
INT 21H
AND AL,AL
jz forever
MOV AH,07H
INT 21H
cmp al, 1bh
jz END1
mov dx, 3f8h
out dx, al
jmp forever
;接受部分
receive: mov dx, 3f8h ;指向接受数据寄存器
in al, dx ;取新收到的字符
and al, 7fh
push ax
mov bx,0; BL=1,前景色
mov ah,14
int 10h 键盘I/O中断调用,检测有无键入
pop ax
cmp al, 0dh ;判断刚才收到的字符是否为回车
jnz forever ;不是,则转向线路检测循环
mov al, 0ah
mov bx,0
mov ah,14
int 10h
jmp forever
END1: MOV AH,4CH;
INT 21H
CODE ENDS
END START
相关文章推荐
- 利用汇编语言编程实现在键盘上输入两个一位数,在屏幕上显示它们的积。
- 利用汇编语言编程实现通过堆栈交换ax,bx的大小
- 利用汇编语言编程实现在屏幕上显示A-Z26个大写英文字母。
- 利用汇编语言编程实现,输入显示字符
- 利用汇编语言编程实现屏幕上输出十进制数字00-29功能
- 利用汇编语言编程实现大小写字母转换
- 80x86 汇编语言编程:编程实现 sum=1+2+…+100
- 利用汇编语言编程实现:将mov ax,4c00h之前的指令复制到内存0:200处,上机调试,跟踪运行结果。
- 多种数制显示的汇编语言编程实现
- 利用汇编语言编程实现在屏幕上显示问候信息
- Win10 + MASM32 + EditPlus 汇编语言编程环境设置
- 编程网站汇编:追求更好实现
- C指针通过编译器实现汇编语言类似内存间接寻址功能,编程语言的差异主要来自编译器的解释
- socket编程(二)通过服务端实现客户端之间通信
- 汇编语言使用加减法实现有符号数除法
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )(转自IT博客)
- .NET(C#)基于Socket编程实现平行主机之间网络通讯有图片传输的Demo演示
- 汇编语言hello world 代码实现
- C语言switch语句的汇编语言实现
- 单片机汇编语言模块化编程-LCD1602驱动