交通灯控制系统课程设计(基于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
















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值