交通燈控制系統課程設計(基於STAR-ES598PCI)

;PA LED
;PC7 K7 (特種車)
;PC6 K6 MAINROAD
;PC5 K5 BRANCHROAD

.MODEL TINY
;DISPLAY
EXTRN Display8:NEAR;    CS5
;INIT8255
COM_ADD EQU 0F003H; CS1
PA_ADD  EQU 0F000H
PB_ADD  EQU 0F001H
PC_ADD  EQU 0F002H
;INIT8259
IO8259_0 EQU 0E000H;    CS2
IO8259_1 EQU 0E001H
;INIT8253
COM_ADDR EQU 0D003H;     CS3
T0_ADDR EQU  0D000H
T1_ADDR EQU  0D001H
T2_ADDR  EQU 0D002H

WR_COM_AD_L EQU 0C004H  ;寫左半屏指令地址Cs4
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

;--  文字:  G  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_1 DB  0C0H,030H,008H,008H,008H,038H,000H,000H,007H,018H,020H,020H,022H,01EH,002H,000H
;--  文字:  a  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_2 DB  000H,000H,080H,080H,080H,080H,000H,000H,000H,019H,024H,022H,022H,022H,03FH,020H
;--  文字:  r  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_3 DB  080H,080H,080H,000H,080H,080H,080H,000H,020H,020H,03FH,021H,020H,000H,001H,000H
;--  文字:  d  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_4 DB  000H,000H,000H,080H,080H,088H,0F8H,000H,000H,00EH,011H,020H,020H,010H,03FH,020H
;--  文字:  e  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_5 DB  000H,000H,080H,080H,080H,080H,000H,000H,000H,01FH,022H,022H,022H,022H,013H,000H
;--  文字:  n  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_6 DB  080H,080H,000H,080H,080H,080H,000H,000H,020H,03FH,021H,000H,000H,020H,03FH,020H
;--  文字:     --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_7 DB  000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H
;--  文字:  V  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_8 DB  008H,078H,088H,000H,000H,0C8H,038H,008H,000H,000H,007H,038H,00EH,001H,000H,000H
;--  文字:  0  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_9 DB  000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H
;--  文字:  .  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
Line0_10 DB  000H,000H,000H,000H,000H,000H,000H,000H,000H,030H,030H,000H,000H,000H,000H,000H
;--  文字:  1  --
;--  宋體12;  此字體下對應的點陣爲:寬x高=8x16   --
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:      
;*************8255init*********************
        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
                    ;8253
        MOV DX,COM_ADDR
        MOV AL,00110101B;00110101B
        OUT DX,AL
        NOP
        LEA BX,LED_Data
        NOP
;*************8259init*********************
        CALL Init8259
        CALL WriIntver

    ;   CALL    LCD_INIT    ;液晶初始化
    ;CALL   DelayTime   
    ;CALL   DisLine1    ;第2行顯示”白天模式”
    ;CALL   DelayTime   
    ;CALL   DisLine3    ;第4行顯示”黑夜模式 ”
;   CALL    DelayTime

        STI
;*****************main**********************        

MAINLOOP:   
        CALL SWITCHMODE

DAYTIMEMODE:    
        CALL    LCD_INIT    ;液晶初始化
        CALL    DisLine0
        CALL    DisLine1    ;第2行顯示”白天模式”
        MOV DX,PA_ADD   
        MOV AL,0
        XLAT
        OUT DX,AL
        ;CALL DL10S
        ;MOV BUFFER+3,01H
        ;LEA SI,BUFFER
        ;CALL Display8
    ;   CALL  LedDisplayH
        MOV LRFLAG,1
        MOV HUNDREDFLAG,1
        MOV CX,100
        MOV Counter,0
START2: 
        ;DEC Counter
        ;TEST  Counter,5
        ;JZ K1
        ;MOV HUNDREDFLAG,0
;K1:        
        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
        ;DEC Counter
        ;TEST  Counter,5
        ;JZ K1
        ;MOV HUNDREDFLAG,0
;K1:        
        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


        ;CALL DL5S
        MOV LRFLAG,0    
        MOV CX,100
        MOV Counter,0
START3: 
    ;   DEC Counter
        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***********************
SWITCHMODE:
        MOV DX,PC_ADD
            IN AL,DX
            TEST AL,10000000B            ;10000000選擇PC7口(NIGHT)
            JZ NEXT1
            JMP NIGHTMODE

NEXT1:          MOV DX,PC_ADD
            IN AL,DX
            TEST AL,01000000B            ;01000000選擇PC6口BRANCHROAD&MAINROAD
            JZ NEXT2
            JMP SPMAINROAD
NEXT2:
        MOV DX,PC_ADD
            IN AL,DX
            TEST AL,00100000B            ;00100000選擇PC6口BRANCHROA&MAINROAD
            JZ LONGJMP
            JMP SPBRANCHROAD
LONGJMP:    JMP DAYTIMEMODE
;*****************SPECIALMODE**********************
SPMAINROAD:

        MOV DX,PA_ADD
        MOV AL,01111101B
        OUT DX,AL
        NOP
        ;CALL DL500ms
        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 DL500ms
        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
;*****************ENDOFSPECIALMODE***************
;*****************ENDOFMAIN**********************

;*****************LEDDISPLAY*********************
  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

;*****************DELAY500MS*********************
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;jump if zero
        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
;*****************INTERRUPT*********************
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
;*****************INTERRUPT_HANDLER*********************
INT_0:      
        ;JMP START
        PUSH DX
        PUSH AX
        MOV AL,Counter
        ADD AL,1
        DAA
        MOV DX,PA_ADD
        MOV AL,01111111B
        OUT DX,AL
;       MOV Counter,AL
;       MOV ReDisplayFlag,1
        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        ;A-起始顯示行地址,第2行
    MOV AH,32   ;B-起始顯示列地址,第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        ;A-起始顯示行地址,第2行
    MOV AH,32   ;B-起始顯示列地址,第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        ;A-起始顯示行地址,第2行
    MOV AH,32   ;B-起始顯示列地址,第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

;第4行顯示黑夜模式”
DisLine3        PROC        NEAR    
    LEA SI,Line3_1  
    MOV AL,4        ;A-起始顯示行地址,第6行
    MOV     AH,32   ;B-起始顯示列地址,第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    ;設置起始顯示行,第0行
    CALL    WRComL  
    MOV AL,3EH  ;初始化右半屏,關顯示
    CALL    WRComR  ;寫指令子程序
    MOV     AL,FirstLine    ;設置起始顯示行,第0行
    CALL    WRComR  
    CALL    LCDClear    ;清屏
    MOV AL,3FH  ;開顯示
    CALL    WRComL  
    MOV AL,3FH  ;開顯示
    CALL        WRComR  
    RET     
LCD_INIT        ENDP        
;清屏
LCDClear    PROC        NEAR    
;清左半屏
    MOV AL,0    ;起始行,第0行
    MOV AH,0        ;起始列,第0列
LCDClearL1: PUSH        AX  
    MOV     CX,64   
    CALL        SETXYL  ;設置起始顯示行列地址
LCDClearL2: MOV AL,0    
    CALL    WRDATAL 
    LOOP    LCDClearL2  
    POP AX  
    INC AX  
    CMP AL,8    ;共8行
    JNZ LCDClearL1  
;清右半屏
    MOV     AL,0        ;起始行,第0行
    MOV AH,0        ;起始列,第0列
LCDClearR1: PUSH        AX  
    MOV     CX,64   
    CALL    SETXYR  ;設置起始顯示行列地址
LCDClearR2: XOR AL,AL   
    CALL    WRDATAR 
    LOOP    LCDClearR2  
    POP AX  
    INC     AL  
    CMP AL,8        ;共8行
    JNZ LCDClearR1  
    RET     
LCDClear    ENDP        
;顯示字體,顯示一個數據要佔用X行兩行位置
;左半屏顯示一個字節/字:AL-起始顯示行序數X(0-7);AH-起始顯示列序數Y(0-63);SI-顯示字
數據首地址
ByteDisL        PROC    NEAR    
    MOV     CX,8      ;顯示8個字節數據,用於顯示一個英文/符號
    CALL        DispL   
    RET     
ByteDisL    ENDP        
WordDisL    PROC    NEAR    
    MOV CX,16   ;顯示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        
;右半屏顯示一個字節/字:AL-起始顯示行序數X(0-7);AH-起始顯示列序數Y(0-63);SI-顯示字
數據首地址
ByteDisR        PROC    ENAR    
    MOV CX,8       ;顯示8個字節數據,用於顯示一個英文/符號
    CALL    DispR   
    RET     
ByteDisR    ENDP        
WordDisR    PROC    NEAR    
    MOV CX,16   ;顯示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        
;顯示圖形   
;顯示左半屏一行圖形,AL-X起始行序數(0-7),AH-Y起始列地址序數(0-63)
LineDisL    PROC    NEAR    
    MOV     CX,64   
    CALL    SETXYL  ;設置起始顯示行列
    CALL    DisplayL        ;顯示數據
    RET         
LineDisL    ENDP        
;顯示右半屏一行圖形,AL-X起始行地址序數(0-7),AH-Y起始列地址序數(0-63)
LineDisR    PROC    NEAR    
    MOV CX,64   
    CALL    SETXYR  ;設置起始顯示行列
    CALL    DisplayR    ;顯示數據
    RET         
LineDisR    ENDP        
;基本控制
;顯示左半屏數據,R7-顯示數據個數
DisplayL        PROC        NEAR    
    LODSB       
    CALL        WRDataL ;寫左半屏數據
    LOOP    DisplayL    
    RET     
DisplayL    ENDP        
;顯示右半屏數據,R7-顯示數據個數
DisplayR    PROC        NEAR    
    LODSB       
    CALL        WRDataR ;寫左半屏數據
    LOOP    DisplayR    
    RET     
DisplayR    ENDP        
;設置左半屏起始顯示行列地址,AL-X起始行序數(0-7),AH-Y起始列序數(0-63)
SETXYL  PROC    NEAR    
    OR  AL,X        ;行地址=行序數+行基址
    CALL    WRComL  
    MOV AL,AH   
    OR  AL,Y        ;列地址=列序數+列基址
    CALL        WRComL  
    RET     
SETXYL  ENDP        
;設置右半屏起始顯示行列地址,AL-X起始行序數(0-7),AH-Y起始列序數(0-63)
SETXYR  PROC    NEAR    
    OR  AL,X        ;行地址=行序數+行基址
    CALL        WRComR  
    MOV AL,AH   
    OR  AL,Y        ;列地址=列序數+列基址
    CALL    WRComR  
    RET     
SETXYR  ENDP        
;寫左半屏控制指令,A-寫入指令
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        
;寫右半屏控制指令,A-寫入指令
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        
;寫左半屏數據,A-寫入數據  
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        
;寫右半屏數據,A-寫入數據  
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        

;第3行顯示"STAR ES51PRO"
DisLine0    PROC    NEAR    
    LEA SI,Line0_1  
    MOV AL,2    ;A-起始顯示行地址,第4行
    MOV AH,16   ;B-起始顯示列地址,第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
















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