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

📄 comm.asm

📁 用汇编程序实现串行通信 只能传256个数字 但有界面
💻 ASM
字号:
;This program for:Communication
;----------------------------------------------------------------
;define stack segment
STACK           SEGMENT STACK 'STACK'
                DB 500  DUP (0)
STACK           ENDS

;define data segment
DATA            SEGMENT
;--------------------------------------------------
TEMP1           DW      (?)
TEMP2           DW      (?)
TEMP3           DW      (?)
TEMP4           DW      (?)
;
LED1            DB      (?)
LED2            DB      (?)
LED3            DB      (?)

LED4            DB      (?)
LED5            DB      (?)
LED6            DB      (?)
;
BUFFER0         DB      (?)
BUFFER1         DB      (?)
BUFFER2         DB      (?)

RE_COMM_BUFF    DB      (?)
SD_COMM_BUFF    DB      (?)
COUNT           DB      (?)

;------------------------------------
DATA            ENDS
;------------------------------------
;define es segment
VIDEO           SEGMENT AT 0B800H
WD_BUFFER       LABEL   WORD
V_BUFF          DB      25*80*2 DUP (?)
VIDEO           ENDS
;------------------------------------
;define code segment
PROGRAM         SEGMENT
;
MAIN            PROC FAR
                ASSUME  CS:PROGRAM,DS:DATA,SS:STACK,ES:VIDEO
;
START:          PUSH    DS        ;return DOS standard program
                MOV     AX,0
                PUSH    AX
                CALL    INIT_COMM

                MOV     AX,DATA         ;set DS
                MOV     DS,AX
                MOV     AX,VIDEO        ;set ES
                MOV     ES,AX

                MOV     TEMP1,0000H     ;clr screen
                MOV     TEMP2,184FH
                MOV     BH,0FH          ;set background color
                CALL    CLR_SCREEN
 ;----------------------------------------------------------
 SWAIT:         MOV     COUNT,10
 SWAIT1:        MOV     AH,1
                INT     16H
                JZ      YES_KEY
                MOV     AH,0
                INT     16H
                CMP     AL,1BH     ;TEST "ESC"
                JNZ     YES_KEY
                JMP     EXIT

YES_KEY:
                CALL    RE_COMM

                MOV     AL,RE_COMM_BUFF
                MOV     AH,0
                CALL    BCTD
                MOV     CH,AL
                AND     AL,0F0H
                MOV     CL,4
                ROR     AL,CL
                ADD     AL,30H
                MOV     LED2,AL
                AND     CH,0FH
                ADD     CH,30H
                MOV     LED3,CH
                ;
                AND     AH,0FH
                ADD     AH,30H
                MOV     LED1,AH

                MOV     AL,SD_COMM_BUFF
                MOV     AH,0

                CALL    BCTD
                MOV     CH,AL
                AND     AL,0F0H
                MOV     CL,4
                ROR     AL,CL
                ADD     AL,30H
                MOV     LED5,AL
                AND     CH,0FH
                ADD     CH,30H
                MOV     LED6,CH
                ;
                AND     AH,0FH
                ADD     AH,30H
                MOV     LED4,AH
;----------------------------------------------------
                MOV     BUFFER1,3
                LEA     BX,LED1
                MOV     CX,0E23H        ;ROW=14   ,COL=35
                MOV     BUFFER0,1EH
SEND_LED:
                MOV     AL,[BX]
                CALL    DISPL
                INC     BX
                INC     CX
                DEC     BUFFER1
                JNZ     SEND_LED

                MOV     BUFFER1,3
                LEA     BX,LED4
                MOV     CX,0A23H        ;ROW=10   ,COL=35
                MOV     BUFFER0,5FH
SEND_LED1:
                MOV     AL,[BX]
                CALL    DISPL
                INC     BX
                INC     CX
                DEC     BUFFER1
                JNZ     SEND_LED1

                CALL    DELAY
                DEC     COUNT
                JNZ     SWAIT2
                JMP     SWAIT1

SWAIT2:         INC     SD_COMM_BUFF
                CALL    SD_COMM
                JMP     SWAIT

EXIT:
                RET
;------------------------------
MAIN            ENDP
;********************************************************
DELAY           PROC    NEAR
                MOV     CX,10
                MOV     TEMP1,0
DELAY1:         NOP
                DEC     TEMP1
                JNZ     DELAY1
                LOOP    DELAY1
                RET
DELAY           ENDP
;-------------------------------------------------------
BCTD            PROC    NEAR
;input=AX
;out=AX   compress BCD  code
                MOV     DX,AX
                MOV     AX,0
                MOV     CX,16

BCTD1:          CLC
                RCL     DX,1
                ADC     AL,AL
                DAA
                XCHG    AL,AH
                ADC     AL,AL
                DAA
                XCHG    AL,AH
                LOOP    BCTD1
                RET

BCTD            ENDP
;-------------------------------------------------
;display a symbol
;input: symbol=al
;       color=ah
;       row=ch
;       col=cl
;use reg:AX,BX,CX
DISPL           PROC    NEAR    ;address of display
                                ;buffer=row*80*2+col*2
                PUSH    BX
                PUSH    CX
                PUSH    AX
                MOV     AL,160
                MUL     CH      ;ROW*80*2(160)=AX

                MOV     BL,CL
                ROL     BL,1    ;BL*2
                MOV     BH,0
                ADD     BX,AX
                POP     AX
                MOV     AH,BUFFER0
                MOV     ES:[BX],AX
                POP     CX
                POP     BX
                RET
DISPL           ENDP
;----------------------------------------
CLR_SCREEN      PROC    NEAR
                MOV     AH,06H
                MOV     CX,TEMP1
                MOV     DX,TEMP2
                INT     10H
                MOV     AH,02H
                MOV     DH,24
                MOV     DL,80
                MOV     BH,0
                INT     10H
                RET
CLR_SCREEN      ENDP
;---------------------------------------------------------
INIT_COMM       PROC    NEAR
                MOV     AL,10000000B
                MOV     DX,3FBH
                OUT     DX,AL

                MOV     AL,30H
                MOV     DX,3F8H
                OUT     DX,AL

                MOV     AL,0
                MOV     DX,3F9H
                OUT     DX,AL

                MOV     AL,00000011B
                MOV     DX,3FBH
                OUT     DX,AL

                MOV     AL,10001011B
                MOV     DX,3FCH
                OUT     DX,AL

                RET
INIT_COMM       ENDP
;-----------------------------------------------
RE_COMM         PROC    NEAR
                PUSH    AX
                PUSH    DX
                MOV     DX,3FDH
                IN      AL,DX
                TEST    AL,00000001B
                JZ      RE_COMM_EXIT
                MOV     DX,3F8H
                IN      AL,DX
                MOV     RE_COMM_BUFF,AL
;
RE_COMM_EXIT:
                POP     DX
                POP     AX
                RET
RE_COMM         ENDP
;----------------------------------------------
SD_COMM         PROC    NEAR
                PUSH    AX
                PUSH    DX
                MOV     AL,SD_COMM_BUFF
                MOV     DX,3F8H
                OUT     DX,AL
                POP     DX
                POP     AX
                RET
SD_COMM         ENDP
;--------------------------------------
PROGRAM         ENDS
                END     START

⌨️ 快捷键说明

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