.MODEL TINY
EXTRN Display8:NEAR
COM_ADD EQU 0F003H
PA_ADD EQU 0F000H
PB_ADD EQU 0F001H
PC_ADD EQU 0F002H
IO8259_0 EQU 0E000H
IO8259_1 EQU 0E001H
COM_ADDR EQU 0D003H
T0_ADDR EQU 0D000H
T1_ADDR EQU 0D001H
T2_ADDR EQU 0D002H
WR_COM_AD_L EQU 0C004H
WR_COM_AD_R EQU 0C000H
WR_DATA_AD_L EQU 0C006H
WR_DATA_AD_R EQU 0C002H
RD_BUSY_AD EQU 0C001H
RD_DATA_AD EQU 0C003H
X EQU 0B8H
Y EQU 040H
FirstLine EQU 0C0H
.STACK 100
.DATA
BUFFER DB 8 DUP(?)
Counter db ?
ReDisplayFlag DB 0
HUNDREDFLAG DB 0
LRFLAG DB 0
LED_Data DB 01111101B
DB 11111101B
DB 10111101B
DB 11010111B
DB 11011111B
DB 11011011B
Line0_1 DB 0C0H,030H,008H,008H,008H,038H,000H,000H,007H,018H,020H,020H,022H,01EH,002H,000H
Line0_2 DB 000H,000H,080H,080H,080H,080H,000H,000H,000H,019H,024H,022H,022H,022H,03FH,020H
Line0_3 DB 080H,080H,080H,000H,080H,080H,080H,000H,020H,020H,03FH,021H,020H,000H,001H,000H
Line0_4 DB 000H,000H,000H,080H,080H,088H,0F8H,000H,000H,00EH,011H,020H,020H,010H,03FH,020H
Line0_5 DB 000H,000H,080H,080H,080H,080H,000H,000H,000H,01FH,022H,022H,022H,022H,013H,000H
Line0_6 DB 080H,080H,000H,080H,080H,080H,000H,000H,020H,03FH,021H,000H,000H,020H,03FH,020H
Line0_7 DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H
Line0_8 DB 008H,078H,088H,000H,000H,0C8H,038H,008H,000H,000H,007H,038H,00EH,001H,000H,000H
Line0_9 DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H
Line0_10 DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,030H,030H,000H,000H,000H,000H,000H
Line0_11 DB 000H,010H,010H,0F8H,000H,000H,000H,000H,000H,020H,020H,03FH,020H,020H,000H,000H
Line1_1 DB 000H,000H,0F8H,008H,008H,00CH,00AH,009H,008H,008H,008H,008H,0F8H,000H,000H,000H
DB 000H,000H,0FFH,041H,041H,041H,041H,041H,041H,041H,041H,041H,0FFH,000H,000H,000H
Line1_2 DB 040H,040H,042H,042H,042H,042H,042H,0FEH,042H,042H,042H,042H,042H,040H,040H,000H
DB 080H,080H,040H,020H,010H,00CH,003H,000H,003H,00CH,010H,020H,040H,080H,080H,000H
Line1_3 DB 010H,010H,0D0H,0FFH,090H,014H,0E4H,0AFH,0A4H,0A4H,0A4H,0AFH,0E4H,004H,000H,000H
DB 004H,003H,000H,0FFH,000H,089H,04BH,02AH,01AH,00EH,01AH,02AH,04BH,088H,080H,000H
Line1_4 DB 010H,010H,090H,090H,090H,090H,090H,010H,010H,0FFH,010H,010H,011H,016H,010H,000H
DB 000H,020H,060H,020H,03FH,010H,010H,010H,000H,003H,00CH,010H,020H,040H,0F8H,000H
Line2_1 DB 000H,008H,008H,008H,008H,008H,009H,0FAH,008H,008H,008H,008H,008H,008H,000H,000H
DB 040H,040H,041H,041H,041H,041H,041H,07FH,041H,041H,041H,041H,041H,040H,040H,000H
Line2_2 DB 080H,080H,082H,082H,082H,082H,082H,0FEH,082H,082H,082H,082H,082H,080H,080H,000H
DB 000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H
Line2_3 DB 040H,040H,042H,0CCH,000H,008H,0E9H,0AAH,0B8H,0A8H,0A8H,0AAH,0E9H,008H,000H,000H
DB 000H,040H,020H,01FH,020H,040H,05FH,04AH,04AH,04AH,04AH,04AH,05FH,040H,040H,000H
Line2_4 DB 000H,008H,008H,028H,0C8H,008H,008H,0FFH,008H,008H,088H,068H,008H,008H,000H,000H
DB 021H,021H,011H,011H,009H,005H,003H,0FFH,003H,005H,009H,011H,011H,021H,021H,000H
Line2_5 DB 000H,008H,088H,048H,028H,018H,00FH,0E8H,008H,008H,008H,008H,008H,008H,000H,000H
DB 008H,008H,009H,009H,009H,009H,009H,0FFH,009H,009H,009H,009H,009H,008H,008H,000H
Line3_1 DB 004H,004H,084H,0E4H,01CH,004H,005H,0C6H,03CH,0A4H,024H,024H,0E4H,004H,004H,000H
DB 002H,001H,000H,0FFH,000H,082H,081H,046H,028H,010H,029H,046H,041H,080H,080H,000H
Line3_2 DB 000H,0F8H,001H,006H,000H,0F0H,012H,012H,012H,0F2H,002H,002H,002H,0FEH,000H,000H
DB 000H,0FFH,000H,000H,000H,01FH,011H,011H,011H,01FH,000H,040H,080H,07FH,000H,000H
Line3_3 DB 010H,010H,0D0H,0FFH,090H,014H,0E4H,0AFH,0A4H,0A4H,0A4H,0AFH,0E4H,004H,000H,000H
DB 004H,003H,000H,0FFH,000H,089H,04BH,02AH,01AH,00EH,01AH,02AH,04BH,088H,080H,000H
Line3_4 DB 010H,010H,090H,090H,090H,090H,090H,010H,010H,0FFH,010H,010H,011H,016H,010H,000H
DB 000H,020H,060H,020H,03FH,010H,010H,010H,000H,003H,00CH,010H,020H,040H,0F8H,000H
Line4_1 DB 000H,002H,00CH,080H,060H,080H,040H,030H,00FH,0C8H,008H,008H,028H,018H,000H,000H
DB 002H,002H,07EH,001H,080H,040H,020H,018H,006H,001H,006H,018H,020H,040H,080H,000H
Line4_2 DB 080H,080H,082H,082H,082H,082H,082H,0FEH,082H,082H,082H,082H,082H,080H,080H,000H
DB 000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H
Line4_3 DB 040H,040H,042H,0CCH,000H,008H,0E9H,0AAH,0B8H,0A8H,0A8H,0AAH,0E9H,008H,000H,000H
DB 000H,040H,020H,01FH,020H,040H,05FH,04AH,04AH,04AH,04AH,04AH,05FH,040H,040H,000H
Line4_4 DB 000H,008H,008H,028H,0C8H,008H,008H,0FFH,008H,008H,088H,068H,008H,008H,000H,000H
DB 021H,021H,011H,011H,009H,005H,003H,0FFH,003H,005H,009H,011H,011H,021H,021H,000H
Line4_5 DB 000H,008H,088H,048H,028H,018H,00FH,0E8H,008H,008H,008H,008H,008H,008H,000H,000H
DB 008H,008H,009H,009H,009H,009H,009H,0FFH,009H,009H,009H,009H,009H,008H,008H,000H
.CODE
START:
MOV AX,@DATA
MOV DS,AX
NOP
CALL DelayTime
MOV Counter,0
CALL LedDisplay
MOV DX,COM_ADD
MOV AL,88H
OUT DX,AL
MOV DX,PA_ADD
MOV AL,0FFH
OUT DX,AL
MOV DX,COM_ADDR
MOV AL,00110101B
OUT DX,AL
NOP
LEA BX,LED_Data
NOP
CALL Init8259
CALL WriIntver
STI
MAINLOOP:
CALL SWITCHMODE
DAYTIMEMODE:
CALL LCD_INIT
CALL DisLine0
CALL DisLine1
MOV DX,PA_ADD
MOV AL,0
XLAT
OUT DX,AL
MOV LRFLAG,1
MOV HUNDREDFLAG,1
MOV CX,100
MOV Counter,0
START2:
MOV AL,Counter
SUB AL,1
DAS
MOV Counter,AL
CALL LedDisplay
MOV AL,1
XLAT
OUT DX,AL
CALL DL500ms
MOV AL,0
XLAT
OUT DX,AL
CALL DL500ms
LOOP START2
MOV CX,100
MOV Counter,0
STARTn:
MOV HUNDREDFLAG,0
MOV AL,Counter
SUB AL,1
DAS
MOV Counter,AL
CALL LedDisplay
MOV AL,1
XLAT
OUT DX,AL
CALL DL500ms
MOV AL,0
XLAT
OUT DX,AL
CALL DL500ms
LOOP STARTn
MOV AL,2
XLAT
OUT DX,AL
CALL DL3S
MOV AL,3
XLAT
OUT DX,AL
MOV LRFLAG,0
MOV CX,100
MOV Counter,0
START3:
MOV AL,Counter
SUB AL,1
DAS
MOV Counter,AL
CALL LedDisplay
MOV AL,4
XLAT
OUT DX,AL
CALL DL500ms
MOV AL,3
XLAT
OUT DX,AL
CALL DL500ms
LOOP START3
MOV AL,5
XLAT
OUT DX,AL
CALL DL3S
JMP MAINLOOP
SWITCHMODE:
MOV DX,PC_ADD
IN AL,DX
TEST AL,10000000B
JZ NEXT1
JMP NIGHTMODE
NEXT1: MOV DX,PC_ADD
IN AL,DX
TEST AL,01000000B
JZ NEXT2
JMP SPMAINROAD
NEXT2:
MOV DX,PC_ADD
IN AL,DX
TEST AL,00100000B
JZ LONGJMP
JMP SPBRANCHROAD
LONGJMP: JMP DAYTIMEMODE
SPMAINROAD:
MOV DX,PA_ADD
MOV AL,01111101B
OUT DX,AL
NOP
MOV DX,PA_ADD
CALL LCD_INIT
CALL DisLine0
CALL DisLine2
JMP START
SPBRANCHROAD:
MOV DX,PA_ADD
MOV AL,11010111B
OUT DX,AL
CALL LCD_INIT
CALL DisLine0
CALL DisLine4
JMP START
NIGHTMODE:
CALL LCD_INIT
CALL DisLine0
CALL DisLine3
MOV DX,PA_ADD
MOV AL,10111011B
OUT DX,AL
CALL DL500ms
MOV DX,PA_ADD
MOV AL,0FFH
OUT DX,AL
CALL DL500ms
JMP START
LedDisplay PROC NEAR
MOV AL,Counter
MOV AH,AL
AND AL,0FH
MOV BUFFER,AL
AND AH,0F0H
ROR AH,4
MOV BUFFER+1,AH
MOV BUFFER+2,10H
MOV BUFFER+3,10H
MOV BUFFER+4,10H
MOV BUFFER+5,10H
MOV BUFFER+6,10H
MOV BUFFER+7,10H
LEA SI,BUFFER
CALL Display8
RET
LedDisplay ENDP
DL500ms PROC NEAR
MOV DX,T0_ADDR
MOV AL,00H
OUT DX,AL
MOV AL,10H
OUT DX,AL
MOV DX,COM_ADDR
MOV AL,77H
OUT DX,AL
MOV DX,T1_ADDR
MOV AL,00H
OUT DX,AL
MOV AL,10H
OUT DX,AL
DELAY: MOV DX,PC_ADD
IN AL,DX
TEST AL,10H
JZ DELAY
NOP
RET
DL500ms ENDP
DL3S PROC NEAR
PUSH CX
MOV CX,6
DL3S1: CALL DL500ms
LOOP DL3S1
POP CX
RET
ENDP
DL5S PROC NEAR
PUSH CX
MOV CX,10
DL5S1: CALL DL500ms
LOOP DL5S1
POP CX
RET
ENDP
DL10S PROC NEAR
PUSH CX
MOV CX,20
DL10S1: CALL DL500ms
LOOP DL10S1
POP CX
RET
ENDP
Init8259 PROC NEAR
MOV DX,IO8259_0
MOV AL,13H
OUT DX,AL
MOV DX,IO8259_1
MOV AL,08H
OUT DX,AL
MOV AL,09H
OUT DX,AL
MOV AL,0FEH
OUT DX,AL
RET
Init8259 ENDP
WriIntver PROC NEAR
PUSH ES
MOV AX,0
MOV ES,AX
MOV DI,20H
LEA AX,INT_0
STOSW
MOV AX,CS
STOSW
POP ES
RET
WriIntver ENDP
INT_0:
PUSH DX
PUSH AX
MOV AL,Counter
ADD AL,1
DAA
MOV DX,PA_ADD
MOV AL,01111111B
OUT DX,AL
MOV DX,IO8259_0
MOV AL,20H
OUT DX,AL
MOV Counter,0
CALL LedDisplay
JMP START
POP AX
POP DX
IRET
DelayTime PROC NEAR
MOV CX,0
LOOP $
LOOP $
RET
DelayTime ENDP
DisLine1 PROC NEAR
LEA SI,Line1_1
MOV AL,4
MOV AH,32
CALL WordDISL
LEA SI,Line1_2
MOV AL,4
MOV AH,48
CALL WordDISL
LEA SI,Line1_3
MOV AL,4
MOV AH,0
CALL WordDISR
LEA SI,Line1_4
MOV AL,4
MOV AH,16
CALL WordDISR
RET
DisLine1 ENDP
DisLine2 PROC NEAR
LEA SI,Line2_1
MOV AL,4
MOV AH,32
CALL WordDISL
LEA SI,Line2_2
MOV AL,4
MOV AH,48
CALL WordDISL
LEA SI,Line2_3
MOV AL,4
MOV AH,0
CALL WordDISR
LEA SI,Line2_4
MOV AL,4
MOV AH,16
CALL WordDISR
LEA SI,Line2_5
MOV AL,4
MOV AH,32
CALL WordDISR
RET
DisLine2 ENDP
DisLine4 PROC NEAR
LEA SI,Line4_1
MOV AL,4
MOV AH,32
CALL WordDISL
LEA SI,Line4_2
MOV AL,4
MOV AH,48
CALL WordDISL
LEA SI,Line4_3
MOV AL,4
MOV AH,0
CALL WordDISR
LEA SI,Line4_4
MOV AL,4
MOV AH,16
CALL WordDISR
LEA SI,Line4_5
MOV AL,4
MOV AH,32
CALL WordDISR
RET
DisLine4 ENDP
DisLine3 PROC NEAR
LEA SI,Line3_1
MOV AL,4
MOV AH,32
CALL WordDISL
LEA SI,Line3_2
MOV AL,4
MOV AH,48
CALL WordDISL
LEA SI,Line3_3
MOV AL,4
MOV AH,0
CALL WordDISR
LEA SI,Line3_4
MOV AL,4
MOV AH,16
CALL WordDISR
RET
DisLine3 ENDP
LCD_INIT PROC NEAR
MOV AL,3EH
CALL WRComL
MOV AL,FirstLine
CALL WRComL
MOV AL,3EH
CALL WRComR
MOV AL,FirstLine
CALL WRComR
CALL LCDClear
MOV AL,3FH
CALL WRComL
MOV AL,3FH
CALL WRComR
RET
LCD_INIT ENDP
LCDClear PROC NEAR
MOV AL,0
MOV AH,0
LCDClearL1: PUSH AX
MOV CX,64
CALL SETXYL
LCDClearL2: MOV AL,0
CALL WRDATAL
LOOP LCDClearL2
POP AX
INC AX
CMP AL,8
JNZ LCDClearL1
MOV AL,0
MOV AH,0
LCDClearR1: PUSH AX
MOV CX,64
CALL SETXYR
LCDClearR2: XOR AL,AL
CALL WRDATAR
LOOP LCDClearR2
POP AX
INC AL
CMP AL,8
JNZ LCDClearR1
RET
LCDClear ENDP
数据首地址
ByteDisL PROC NEAR
MOV CX,8
CALL DispL
RET
ByteDisL ENDP
WordDisL PROC NEAR
MOV CX,16
CALL DispL
RET
WordDisL ENDP
DispL PROC NEAR
PUSH AX
PUSH CX
CALL SETXYL
CALL DisplayL
POP CX
POP AX
INC AL
CALL SETXYL
CALL DisplayL
RET
DispL ENDP
数据首地址
ByteDisR PROC ENAR
MOV CX,8
CALL DispR
RET
ByteDisR ENDP
WordDisR PROC NEAR
MOV CX,16
CALL DispR
RET
WordDisR ENDP
DispR PROC NEAR
PUSH AX
PUSH CX
CALL SETXYR
CALL DisplayR
POP CX
POP AX
INC AL
CALL SETXYR
CALL DisplayR
RET
DispR ENDP
LineDisL PROC NEAR
MOV CX,64
CALL SETXYL
CALL DisplayL
RET
LineDisL ENDP
LineDisR PROC NEAR
MOV CX,64
CALL SETXYR
CALL DisplayR
RET
LineDisR ENDP
DisplayL PROC NEAR
LODSB
CALL WRDataL
LOOP DisplayL
RET
DisplayL ENDP
DisplayR PROC NEAR
LODSB
CALL WRDataR
LOOP DisplayR
RET
DisplayR ENDP
SETXYL PROC NEAR
OR AL,X
CALL WRComL
MOV AL,AH
OR AL,Y
CALL WRComL
RET
SETXYL ENDP
SETXYR PROC NEAR
OR AL,X
CALL WRComR
MOV AL,AH
OR AL,Y
CALL WRComR
RET
SETXYR ENDP
WRComL PROC NEAR
MOV DX,WR_COM_AD_L
OUT DX,AL
WRComL1: MOV DX,RD_BUSY_AD
IN AL,DX
TEST AL,80H
JNZ WRComL1
RET
WRComL ENDP
WRComR PROC NEAR
MOV DX,WR_COM_AD_R
OUT DX,AL
WRComR1: MOV DX,RD_BUSY_AD
IN AL,DX
TEST AL,80H
JNZ WRComR1
RET
WRComR ENDP
WRDataL PROC NEAR
MOV DX,WR_DATA_AD_L
OUT DX,AL
WRDataL1: MOV DX,RD_BUSY_AD
IN AL,DX
TEST AL,80H
JNZ WRDataL1
RET
WRDataL ENDP
WRDataR PROC NEAR
MOV DX,WR_DATA_AD_R
OUT DX,AL
WRDataR1: MOV DX,RD_BUSY_AD
IN AL,DX
TEST AL,80H
JNZ WRDataR1
RET
WRDataR ENDP
DisLine0 PROC NEAR
LEA SI,Line0_1
MOV AL,2
MOV AH,16
CALL ByteDISL
LEA SI,Line0_2
MOV AL,2
MOV AH,24
CALL ByteDISL
LEA SI,Line0_3
MOV AL,2
MOV AH,32
CALL ByteDISL
LEA SI,Line0_4
MOV AL,2
MOV AH,40
CALL ByteDISL
LEA SI,Line0_5
MOV AL,2
MOV AH,48
CALL ByteDISL
LEA SI,Line0_6
MOV AL,2
MOV AH,56
CALL ByteDISL
LEA SI,Line0_7
MOV AL,2
MOV AH,0
CALL ByteDISR
LEA SI,Line0_8
MOV AL,2
MOV AH,8
CALL ByteDISR
LEA SI,Line0_9
MOV AL,2
MOV AH,16
CALL ByteDISR
LEA SI,Line0_10
MOV AL,2
MOV AH,24
CALL ByteDISR
LEA SI,Line0_11
MOV AL,2
MOV AH,32
CALL ByteDISR
RET
DisLine0 ENDP
END START