|
1黑幣
大家好,我剛剛接觸匯編,那個大佬能夠簡單給我講一講這個程序。
CTRW EQU 06H;28EH
PORTA EQU 00H;288H
PORTB EQU 02H;289H
PORTC EQU 04H;28AH
STACK SEGMENT STACK
STP DW 100 DUP(?) ; 預(yù)先定義的堆棧深度
STACK ENDS
DATA SEGMENT 'DATA'
LEDDATA DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
COUNT DB 00H
DATA ENDS
CODE SEGMENT 'CODE'
ASSUME DS:DATA,CS:CODE,SS:STACK
START:
MOV AX,DATA ;初始化數(shù)據(jù)段
MOV DS,AX
MOV DX,CTRW;設(shè)置8255的PA,PB和PC口為輸出
MOV AL,80H
OUT DX,AL
LEA DI,LEDDATA;獲取變量地址
MAINLOOP:
CALL NORMAL;交通燈控制程序
JMP MAINLOOP
;數(shù)碼管顯示程序
DISPLAY PROC NEAR
MOV AL,0FDH;點(diǎn)亮第一個數(shù)碼管
MOV DX,PORTB;將AL的數(shù)據(jù)送到PA口
OUT DX,AL
MOV AH,00H
MOV AL,COUNT
MOV BL,10
DIV BL
MOV AL,AH;取商,十位
MOV BX,DI;獲取變量地址至BX
XLAT;查表將[BX+AL]數(shù)據(jù)賦值給AL
MOV DX,PORTA;將AL的數(shù)據(jù)送到PA口
OUT DX,AL
CALL DELAYMS
MOV AL,00H
MOV DX,PORTA;將AL的數(shù)據(jù)送到PA口
OUT DX,AL
CALL DELAYMS
MOV AL,0FEH;第二個數(shù)碼管
MOV DX,PORTB;將AL的數(shù)據(jù)送到PA口
OUT DX,AL
MOV AH,00H
MOV AL,COUNT
MOV BL,10
DIV BL;AL中存余數(shù),個位
MOV BX,DI;獲取變量地址至BX
XLAT;查表將[BX+AL]數(shù)據(jù)賦值給AL
MOV DX,PORTA;將AL的數(shù)據(jù)送到PA口
OUT DX,AL
CALL DELAYMS
MOV AL,00H
MOV DX,PORTA;將AL的數(shù)據(jù)送到PA口
OUT DX,AL
CALL DELAYMS
RET
DISPLAY ENDP
;交通燈控制
NORMAL PROC NEAR
MOV DX,PORTC
MOV AL,0BEH;南北綠燈亮,東西紅燈亮1011,1110
OUT DX,AL
CALL DELAY20S
MOV DX,PORTC
MOV AL,0DEH;南北黃燈亮,東西紅燈亮1101,1110
OUT DX,AL
CALL DELAY5S
MOV DX,PORTC
MOV AL,0EBH;南北紅燈亮,東西綠燈亮1110,1011
OUT DX,AL
CALL DELAY20S
MOV DX,PORTC
MOV AL,0EDH;南北紅燈亮,東西黃燈亮1110,1101
OUT DX,AL
CALL DELAY5S
RET
NORMAL ENDP
;20S延時
DELAY20S PROC NEAR
MOV CX,20
MOV AL,20
MOV COUNT,AL
DLY60: CALL DELAY1S
MOV AL,COUNT
DEC AL
MOV COUNT,AL
LOOP DLY60
RET
DELAY20S ENDP
;5S延時
DELAY5S PROC NEAR
MOV CX,5
MOV AL,5
MOV COUNT,AL
DLY5: CALL DELAY1S
MOV AL,COUNT
DEC AL
MOV COUNT,AL
LOOP DLY5
RET
DELAY5S ENDP
;1S延時
DELAY1S PROC NEAR
PUSH CX
MOV CX,200
DLYM1S: CALL DISPLAY
LOOP DLYM1S
POP CX
RET
DELAY1S ENDP
;MS級延時
DELAYMS PROC NEAR
PUSH CX
PUSH BX
MOV BL,02H
DLYM2: MOV CX,8AH
DLYM1: NOP
NOP
LOOP DLYM1
DEC BL
JNZ DLYM2
POP BX
POP CX
RET
DELAYMS ENDP
CODE ENDS
END START
雖然有講解,但是還是有點(diǎn)懵逼。
|
|