彙編入門---8255IO控制LED燈實驗

彙編繼續,獻上8255 IO控制LED燈實驗代碼

(1)8255 A口輸出控制流水燈,B口輸入,B口最低位控制流水燈流向

;Made by X-Ray龍
;8255流水燈顯示實驗


IOY0         EQU   3000H          ;片選IOY0對應的端口始地址
MY8255_A     EQU   IOY0+00H*4     ;8255的A口地址
MY8255_B     EQU   IOY0+01H*4     ;8255的B口地址
MY8255_C     EQU   IOY0+02H*4     ;8255的C口地址
MY8255_MODE  EQU   IOY0+03H*4     ;8255的控制寄存器地址

STACK1 SEGMENT STACK
        DW 256 DUP(?)
STACK1 ENDS

DATA SEGMENT 
LA      DB  ?                     ;定義數據變量
DATA ENDS

CODE SEGMENT
        ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
       MOV DS,AX
       
       MOV DX,MY8255_MODE         ;初始化8255工作方式
       MOV AL,82H                 ;工作方式0,A口輸出,B口輸入
       OUT DX,AL

       MOV  LA,01H
LOOP1: 
       MOV  DX,MY8255_B       
       IN   AL,DX                 ;讀B口的一字節數據內存放到AL中
       MOV  BL,AL
       TEST BL,00000001B          ;判斷B口最低位0或1,是0則跳C1左循環,是1則跳C2右循環
       JZ   C1
       JMP  C2

       
C1:    MOV  AL,LA                 ;左循環,用變量LA來存放上一次移位後的數據
       CALL DALLY                 ;延時,方便人眼觀察出燈的變化
       MOV  DX,MY8255_A
       OUT  DX,AL
       ROL  AL,1
       MOV  LA,AL
       JMP  C3
       
C2:    MOV  AL,LA                 ;右循環
       CALL DALLY
       MOV  DX,MY8255_A
       OUT  DX,AL
       ROR  AL,1
       MOV  LA,AL
       JMP  C3
       
C3:    MOV AH,1                   ;判斷是否有按鍵按下
       INT 16H
       JZ  LOOP1                  ;無按鍵則跳回繼續循環,有則退出

QUIT:  MOV AX,4C00H               ;結束程序退出
       INT 21H

DALLY PROC NEAR                   ;軟件延時子程序
       PUSH CX
       PUSH AX
       MOV  CX,0FFFH
D1:    MOV  AX,0FFFFH
D2:    DEC  AX
       JNZ  D2
       LOOP D1
       POP  AX
       POP  CX
       RET
DALLY ENDP

CODE ENDS
     END START

      (2) A口輸出控制LED,B口輸入由開關控制高低電平,實現開關控制LED燈亮滅,同時把八位LED狀態回顯到屏幕

;Made by X-Ray龍
;8255基本輸入輸出實驗


IOY0         EQU   3000H           ;片選IOY0對應的端口始地址
MY8255_A     EQU   IOY0+00H*4     ;8255的A口地址
MY8255_B     EQU   IOY0+01H*4     ;8255的B口地址
MY8255_C     EQU   IOY0+02H*4     ;8255的C口地址
MY8255_MODE  EQU   IOY0+03H*4     ;8255的控制寄存器地址

STACK1 SEGMENT STACK
        DW 256 DUP(?)
STACK1 ENDS

CODE SEGMENT
        ASSUME CS:CODE

START: MOV DX,MY8255_MODE         ;初始化8255工作方式
       MOV AL,82H                 ;工作方式0,A口輸出,B口輸入
       OUT DX,AL

LOOP1: MOV DX,MY8255_B            ;讀B口
       IN  AL,DX
       MOV DX,MY8255_A            ;寫A口
       OUT DX,AL

       MOV CX,0008H
       MOV BL,10000000B
C1:    TEST AL,BL                 
       JZ   C2
       CALL SHOW1                 ;顯示1
C2:    TEST AL,BL
       JNZ  C3
       CALL SHOW2                 ;顯示0     
C3:    SHR BL,1
       LOOP C1
       
       CALL CHANGE                ;換行
       MOV AH,1                   ;判斷是否有按鍵按下
       INT 16H
       JZ  LOOP1                  ;無按鍵則跳回繼續循環,有則退出

QUIT:  MOV AX,4C00H               ;結束程序退出
       INT 21H
       
SHOW1  PROC NEAR
       PUSH AX
       MOV AH,02H
       MOV DL,31H
       INT 21H
       POP AX
       RET 
SHOW1  ENDP
       
SHOW2  PROC NEAR
       PUSH AX
       MOV AH,02H
       MOV DL,30H
       INT 21H 
       POP AX         
       RET 
SHOW2  ENDP   

CHANGE PROC NEAR 
       PUSH AX
       MOV  AH,02H
       MOV  DL,0AH
       INT  21H
       MOV  AH,02H
       MOV  DL,0DH
       INT  21H
       POP  AX   
       RET
CHANGE ENDP        

CODE ENDS
     END START




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章