大家好,我刚刚接触汇编,那个大佬能够简单给我讲一讲这个程序。
CTRW EQU 06H;28EH
PORTA EQU 00H;288H
PORTB EQU 02H;289H
PORTC EQU 04H;28AH
STACK SEGMENT STACK
STP DW 100 DUP(?) ; 预先定义的堆栈深度
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 ;初始化数据段
MOV DS,AX
MOV DX,CTRW;设置8255的PA,PB和PC口为输出
MOV AL,80H
OUT DX,AL
LEA DI,LEDDATA;获取变量地址
MAINLOOP:
CALL NORMAL;交通灯控制程序
JMP MAINLOOP
;数码管显示程序
DISPLAY PROC NEAR
MOV AL,0FDH;点亮第一个数码管
MOV DX,PORTB;将AL的数据送到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]数据赋值给AL
MOV DX,PORTA;将AL的数据送到PA口
OUT DX,AL
CALL DELAYMS
MOV AL,00H
MOV DX,PORTA;将AL的数据送到PA口
OUT DX,AL
CALL DELAYMS
MOV AL,0FEH;第二个数码管
MOV DX,PORTB;将AL的数据送到PA口
OUT DX,AL
MOV AH,00H
MOV AL,COUNT
MOV BL,10
DIV BL;AL中存余数,个位
MOV BX,DI;获取变量地址至BX
XLAT;查表将[BX+AL]数据赋值给AL
MOV DX,PORTA;将AL的数据送到PA口
OUT DX,AL
CALL DELAYMS
MOV AL,00H
MOV DX,PORTA;将AL的数据送到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
虽然有讲解,但是还是有点懵逼。
|