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

📄 pc8251-1.asm

📁 汇编终结....此程序讲述了在软件开发的底层,如何通过汇编来开发高效的驱动程序
💻 ASM
字号:
  DATA51 EQU 208H             ;8251A DATA PORT
  CTRL51 EQU 209H             ;8251A COMMOND PORT
  TIMER2 EQU 202H             ;8253 COUNT2
  TIMCTL EQU 203H             ;8253 CTRL PORT
  CLK00  EQU 250              ;8251A CLK 250KHZ
  BPS00  EQU 1200             ;BPS=1200
  FACTOR EQU 16               ;8251A BPS FACTOR=16
 DATA SEGMENT
 MES1 DB 'NOW YOU CAN PLAY A KEY ON THE CPU_KEYBORD',0AH,0DH
      DB 'IT WILL DISPLAY ON THE TERMINAL_SCREEN!!' ,0AH,0DH
      DB 'END WITH !',0AH,0DH,0AH,0DH,'$'
 DATA ENDS
 CODE SEGMENT
 ASSUME CS :CODE ,DS:DATA
 INIT51 PROC NEAR             ;INIT 8251A 
        MOV DX,CTRL51
        XOR AX,AX
        MOV CX,03
   LL:  CALL CHAROUT
        LOOP LL
        MOV AL,40H            ;RESET 8251A
        CALL CHAROUT
        mov al,4eh            ;DATA 8 BIT,STOP 1 BIT,FACTOR=16
        call charout
        MOV AL,27H            ;ENABLE INPUT AND OUTPUT
        CALL CHAROUT
        RET
  CHAROUT:                    ;OUTPUT A BYTE
        OUT DX,AL
        PUSH CX
        MOV CX,02
    GG: LOOP GG
        POP CX
        RET
  INIT51 ENDP
  SET_BPS PROC NEAR           ;T/R CLOCK FROM TIMER2
      MOV DX,0
      MOV AX,CLK00
      MOV BX,1000             ;COUNT2=CLK00*1000/FACTOR/BPS00
      MUL BX
      MOV BX,BPS00
      DIV BX
      MOV DX,00
      MOV BX,FACTOR
      DIV BX
      MOV BX,AX
      MOV DX,TIMCTL           ;TIMER2 IN MODE3
      MOV AL,0B6H
      OUT DX,AL
      MOV DX,TIMER2
      MOV AX,BX
      OUT DX,AL
      MOV AL,AH
      OUT DX,AL
      RET
 SET_BPS ENDP

  MAIN PROC FAR
  START:
       CALL SET_BPS
       CALL INIT51
       MOV AX,DATA            ;DISPLAY MES1
       MOV DS,AX
       LEA DX,MES1
       MOV AH,09
       INT 21H
   M0:
       MOV AH,01              ;INPUT A CHAR FROM CPU_KEYBORD
       INT 21H
       MOV BL,AL
       MOV DX,CTRL51
    M1:IN AL,DX               ;IF TXRAY=1 IN 8251A?
       TEST AL,01
       JZ M1                  
       MOV DX,DATA51
       MOV AL,BL
       INC AL
       OUT DX,AL              ;CPU OUTPUT THE CHAR TO 8251A
       MOV CX,0FH
   S51:LOOP S51	  
   NEXT:
       MOV DX,CTRL51          ;IF RXRAY=1 IN 8251A?
       IN AL ,DX
       TEST AL,02
       JZ NEXT
       MOV DX,DATA51          ;CPU GET A CHAR FROM 8251A
       IN AL,DX
       MOV DL,AL              ;CPU PUT THE CHAR ON THE SCREEN
       MOV AH,02
       INT 21H
       DEC DL
       CMP DL,'!'             ;CHAR='!' ,END THE PROGRAM
       JNZ M0       
    OVER:
       MOV AX,4C00H
       INT 21H
   MAIN ENDP
   CODE ENDS
        END START

⌨️ 快捷键说明

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