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

📄 16550-s.asm

📁 用汇编语言通过串行芯片16550实现的PC通信。
💻 ASM
字号:
DATA  SEGMENT
	MY16550_0    EQU  0E480H
	MY16550_1    EQU  0E481H
	MY16550_3    EQU  0E483H
	MY16550_4    EQU  0E484H
	MY16550_5    EQU  0E485H
	ERROR_MESSAGE DB 'ERROR!$'         	;定义出错时显示的提示
DATA  ENDS

CODE SEGMENT
	ASSUME CS:CODE,DS:DATA
START: 						;16500初始化
	MOV AX,DATA
        MOV DS,AX
        MOV DX,MY16550_3
        MOV AL,80H      
        OUT DX,AL				;除数允许寄存器置1
        CALL DALLY
        MOV DX,MY16550_0			;初始化波特率为9600b/s   
        MOV AL,0CH				;除数锁存器低位赋值0CH
        OUT DX,AL
        CALL DALLY
        MOV DX,MY16550_1
        MOV AL,00H				;除数锁存器高位赋值00H
        OUT DX,AL
        CALL DALLY
        MOV DX,MY16550_3
        MOV AL,1BH				;设置线路控制寄存器的格式:偶数校验,1位停止位,字符长度为8位
        OUT DX,AL
        CALL DALLY
        MOV DX,MY16550_4
        MOV AL,03H				;设置MODEM控制寄存器
        OUT DX,AL
        CALL DALLY
        MOV DX,MY16550_1
        MOV AL,00H				;所有中断屏蔽
        OUT DX,AL
        CALL DALLY

READ:
        MOV DX,MY16550_5
        IN  AL,DX
        
	TEST AL,01H				;接收缓冲区满时,最低位为1
	JNZ RECEIVE				;接收缓冲区满,接收数据

	TEST AL,8EH				;AL与8EH按位与
	JNZ ERROR				;结果不全为零,即有错误,跳转到ERROR

	TEST AL,20H				;AL与20H按位与
	JNZ SEND				;结果不全为零,即发送保持寄存器空,跳转到SEND
	JMP READ				;继续循环检测接收缓冲寄存器和发送保持寄存器的状态

ERROR:           				;出错处理,显示一个提示
        MOV DX , OFFSET ERROR_MESSAGE
        MOV AH , 09H
        INT 21H
        MOV DX,MY16550_0
        OUT DX,AL              
        CALL DALLY
	MOV AL,26H
	OUT DX,AL
	CALL DALLY
	JMP     EXIT 
	       
SEND:
        MOV AH,01H               	        ;BIOS功能用以检测是否有字符可读
        INT 16H                     		;BIOS键盘中断
        JZ  READ                   		;若无击键则返回循环
        MOV AH,00H               		;BIOS功能用于取击键码
        INT 16H                     		;击键码现在AL中
        CMP AL,03H           			;检测CTRL+C
        JZ EXIT 
	CMP AL,0DH          			;判断刚才收到的字符是否为回车
        JNZ A 		    			;不是回车,跳到A处
	MOV AL,20H	
        ;MOV DX,MY16550_0
        ;OUT DX,AL              
        ;CALL DALLY
	;MOV DL,AL
	;MOV AH,02H
	;INT 21H
	;MOV AL,0AH
	;MOV DL,AL
	;MOV AH,02H
	;INT 21H
	;JMP READ
A:	MOV DL,AL
	MOV AH,02H
	INT 21H
        MOV DX,MY16550_0
        OUT DX,AL              
        CALL DALLY
        JMP READ
       
RECEIVE:    
        MOV DX,MY16550_0
        IN  AL,DX
        CMP AL,03H           			;检测CTRL+C
        JZ  EXIT                     		;若是 , 转EXIT处结束程序       
        CMP AL,20H          			;判断刚才收到的字符是否为回车
        JNZ B					;不是回车,跳到B处
	MOV AL,0DH				;格式设置
	MOV DL,AL
	MOV AH,02H
	INT 21H
	MOV AL,0AH
	MOV DL,AL
	MOV AH,02H
	INT 21H                 		;不是,转线路检测循环
	CALL SHOW
	JMP READ
B:
        MOV DL,AL            			;准备显示字符
        MOV AH,02H               		;用于显示字符的DOS中断
        INT 21H	
	JMP READ

SHOW PROC NEAR
        MOV DX,MY16550_0
	MOV AL,4FH
        OUT DX,AL
	CALL DALLY
	MOV AL,4BH
	OUT DX,AL
	CALL DALLY
	MOV AL,0DH
	OUT DX,AL
	CALL DALLY
	MOV AL,0AH
	OUT DX,AL
	CALL DALLY
RET
SHOW ENDP

DALLY:  
	PUSH CX
        PUSH AX
	MOV CX,0100H
D1:     
	MOV AX,2000H
D2:     
	DEC AX
        JNZ D2
        LOOP D1
        POP AX
        POP CX
        RET

        
EXIT:                				;程序退出
       MOV AX , 4C00H
       INT 21H

CODE ENDS
END START

⌨️ 快捷键说明

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