DATAS SEGMENT
MESS DB 'TPCA INTERRUPT3!',0DH,0AH,'$'
WARN DB 'WARNING!',0DH,0AH,'$'
TIPS DB '1-night:[n] 2-change light:[c], 3-exigency red light[e]',0DH,0AH,'$'
D8255A EQU 288H ;常量
D8255B EQU 289H
D8255C EQU 28AH
D8255S EQU 28BH
proth EQU 2a0h
protlr EQU 298h
protly EQU 290h
LIGHT DB 34H ; 0011 0100
DB 54h ; 0101 0100
DB 91H ; 1001 0001
DB 92H ; 1001 0010
DB 0FFH
NUM DB 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH ; 9,8,7,6,5,4,3,2,1,0
TENS DB 5BH,06H,3FH ; 2,1,0
YELLOWNUM DB 5BH,06H,3FH ; 2,1,0
min1 DB 00h,01h,02h,03h,04h,05h,06h,07h
BUFF DB 50H,5FH,52H,10H,0c0H,3fH,90H,50H
MESS1 DB 00H,0F0H,90H,90H,90H,0ffH,00H,00H
DATA ENDS
STACKS SEGMENT
X DB 100 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX ; 载入
MOV DX,OFFSET TIPS
MOV AH,09H
INT 21H
;; 设置8254
MOV DX,283h
MOV AL,36h ; 00110110 方式三,方波
OUT DX,AL
MOV AX,1000
MOV DX,280h
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,283h
MOV AL,76h ; 01110110 方式三,方波
OUT DX,AL
MOV DX,281h
MOV AX,1000
OUT DX,AL
MOV AL,AH
OUT DX,AL
;; 初步设置8259
;; 设置8255
MOV DX,D8255S
MOV AL,80H
OUT DX,AL
MAINLP:
CALL MAIN
JMP MAINLP
EXIT:
MOV AH,4CH
INT 21H
MAIN PROC
MOV BX,0
MOV SI,0
LP1:
MOV DX,D8255C
MOV AL,LIGHT[BX]
CMP AL,0FFH
JZ EX1
OUT DX,AL
CMP AL,91H
JE SHOW_XING
; 其他情况显示"P"
; CALL SHOW_P
CALL DISPLAY_DOT_MATRIX ; 显示点阵字符
INC BX
TEST AL,21H
JZ S1
CALL GREEN
JMP LP1
S1:
CALL YELLOW ; 再次调用{黄色显示}
JMP LP1 ; 循环判断
EX1:
RET
MAIN ENDP
DISPLAY_DOT_MATRIX PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV CX,01H ;共存21组点阵代码,21帧图案
MOV BX,00H
WORDTIMES1:
MOV CX,40H
MOV SI,0
A1:
MOV AH,01H
PUSH CX
MOV CX,8 ; 8x8 点阵
MOV SI,0
NEXT1:
MOV AL,[MESS1+SI+BX] ; 分别得到第1组到第21组行代码首址
MOV DX,2a0H ; 行开始信号 CS1 接 280H
OUT DX,AL
MOV AL,AH ; 得到列代码
MOV DX,298H ; 列开始信号 CS2 接 288H
OUT DX,AL ; 显示行
MOV AL,0
OUT DX,AL
SHL AH,1 ; 滚屏左移一位
INC SI ; SI 加 1
CALL DELAY ; 显示一列后延时
LOOP NEXT1
POP CX
CALL DELAY ; 显示一行后延时
LOOP A1
MOV AL,0
MOV DX,298H
OUT DX,AL
ADD BX,8 ; BX 加 8,8 为每组点阵代码的大小
CALL DELAY
;LOOP WORDTIMES1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DISPLAY_DOT_MATRIX ENDP
SHOW_XING PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV CX,01H ;共存21组点阵代码,21帧图案
MOV BX,00H
WORDTIMES2:
MOV CX,40H
MOV SI,0
A11:
MOV AH,01H
PUSH CX
MOV CX,8 ; 8x8 点阵
MOV SI,0
NEXT2:
MOV AL,[MESS1+SI+BX] ; 分别得到第1组到第21组行代码首址
MOV DX,2a0H ; 行开始信号 CS1 接 280H
OUT DX,AL
MOV AL,AH ; 得到列代码
MOV DX,290H ; 列开始信号 CS2 接 288H
OUT DX,AL ; 显示行
MOV AL,0
OUT DX,AL
SHL AH,1 ; 滚屏左移一位
INC SI ; SI 加 1
CALL DELAY ; 显示一列后延时
LOOP NEXT2
POP CX
CALL DELAY ; 显示一行后延时
LOOP A11
MOV AL,0
MOV DX,290H
OUT DX,AL
ADD BX,8 ; BX 加 8,8 为每组点阵代码的大小
CALL DELAY
;LOOP WORDTIMES1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
SHOW_XING ENDP
DELAY PROC NEAR ; 延时子程序
PUSH CX
MOV CX,0FFH
L: LOOP L
POP CX
RET
DELAY ENDP
DCmotor proc
push dx
push ax
MOV DX,D8255S
MOV AL,82h ; Modify to configure PORT B as input
OUT DX,AL ;8255 PORT B INPUT
LLL: MOV AL,80h
MOV DX,proth
OUT DX,AL ;D/A OUTPUT 0V
INTK: MOV DX,D8255B
IN AL,DX ;READ SWITCH
JMP LLL
pop ax
pop dx
ret
Dcmotor endp
GREEN PROC ;; 绿色显示(和红色)
PUSH CX
PUSH BX
PUSH AX
PUSH DX
PUSH SI ; 保留现场,减少不必要的麻烦
MOV CX,3
MOV SI,0
REDBREAK:
CLI ; 设置红色计时中断
PUSH DS
MOV AX,SEG REDTIME
MOV DS,AX
MOV DX,OFFSET REDTIME
MOV AX,250BH
INT 21H
IN AL,21H
AND AL,0F7H ; 开启三号口
OUT 21H,AL
POP DS
STI
LP2:
MOV DI,0
PUSH CX
LP3:
; MOV CX,5 ; 红绿色延时时间
LP4:
MOV AL,22H ; 由于存在两位数码管,因此需要在两位数码管之间快速刷新
MOV DX,D8255A
OUT DX,AL
MOV AL,TENS[SI]
MOV DX,D8255B
OUT DX,AL
CALL DELAY_02S ; 调用延时函数
MOV AL,NUM[DI]
MOV DX,D8255B
OUT DX,AL
MOV AL,11H
MOV DX,D8255A ; 把0001 0001传递给A口
OUT DX,AL
CALL DELAY_02S
; LOOP LP4 ; 循环50次执行完50次才会改变数值
; JMP LP4
; INC DI
CMP DI,10
JNE LP3
INC SI
POP CX ; CX初始为3,即循环三次
LOOP LP2
POP SI
POP DX
POP AX
POP BX
POP CX ; 还原现场
RET
GREEN ENDP ; 退出数码管倒计显示
REDTIME PROC ; 红灯计时
STI
PUSH AX
INC DI
MOV AL,20H
OUT 20H,AL
POP AX
IRET
REDTIME ENDP
YELLOW PROC ; 黄灯闪烁情况下的计时与显示
PUSH SI
PUSH CX
PUSH BX
PUSH DX ; 保护现场
PUSH AX
CLI
PUSH DS
MOV AX,SEG YELLOTIME
MOV DS,AX
MOV DX,OFFSET YELLOTIME
MOV AX,250BH
INT 21H
IN AL,21H
AND AL,0F7H ; 开启三号口
OUT 21H,AL
POP DS
STI
MOV AL,11H
MOV DX,D8255A ; A口 0001 0001
OUT DX,AL
SHOW:
MOV AL,YELLOWNUM[SI] ; 2 2 1 1 0 0
MOV DX,D8255B
OUT DX,AL ; B口传递2,2,1,1,0,0
BACK:
MOV BX,0003H
CMP SI,BX
JNZ SHOW ; 此处循环三次 用loop比较混乱
POP DX
POP AX
POP BX
POP CX
POP SI
RET
YELLOW ENDP
YELLOTIME PROC ; 实现SI和BX加一
STI
PUSH DX
PUSH AX
INC SI ; 慎重
MOV AL,20H
OUT 20H,AL
POP AX
POP DX
iret
YELLOTIME ENDP
DELAY_02S PROC ; 循环 60*4000次,0.2大约
PUSH CX
PUSH SI
MOV CX,60
DD1: MOV SI,4000
DD2: DEC SI
JNZ DD2
LOOP DD1
POP SI
POP CX
RET
DELAY_02S ENDP
DELAY_05S PROC ; 循环4000*3000次大约0.5秒
PUSH CX
PUSH SI
MOV CX,4000
D1: MOV SI,4000
D2: DEC SI
JNZ D2
LOOP D1
POP SI
POP CX
RET
DELAY_05S ENDP
CODES ENDS
END START