;******************************************************************************
;               SED 1520
;******************************************************************************
                .SYMBOLS
;******************************************************************************
A0              REG     P3.0
CS1             REG     P3.1            ; 00 = chip1, 01 = chip2
CS2             REG     P3.5            ; 10 = chip3
CL              REG     P3.3
EN              REG     P3.4
R_W             REG     P3.7
RES             REG     P3.2
STP             REG     P2.0
S_S             REG     P2.1
BCD             EQU     7FH

;******************************************************************************

                ORG     00H
                JMP     START
                ORG     0BH
                JMP     CLK_GEN
START:                                          ;program reset start here

                MOV     TMOD,#00000010B         ;set timer0:mode2
                MOV     IE,#10000010B           ;enable timer0 interrupt    *
                MOV     TH0,#(256-250)          ;interrupt period = 250 us  *
                SETB    TR0                     ;turn timer0 on             *
                                                ;INITIAL SETTING
INITIAL:
                SETB    RES                     ;Reset
                MOV     A,#11100010B            ;Software RESET
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     A,#10100000B            ;Select ADC=0
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     A,#10100100B            ;Satic Drive OFF
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     A,#10101001B            ;Select Duty=1/32
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     A,#11000000B            ;Set Start Line 0(C0H)~31(DFH)
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     A,#10111000B            ;Set Page Address 0(B8H)~3(BBH)
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     A,#10000000B            ;Set Column Address 0(00H)~(4FH)
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     A,#10101111B            ;Set Display ON
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3
;******************************************************************************
;               FULL ON
;******************************************************************************
FULL_ON:
                MOV     R1,#0
FOLP11:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1

                MOV     R0,#0                   ;Rest Counter
FOLP12:                                         ;Write Data To Chip I
                MOV     A,#FFH
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,FOLP12
                INC     R1
                CJNE    R1,#4,FOLP11

                MOV     R1,#0
FOLP21:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND2
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND2

                MOV     R0,#0                   ;Rest Counter
FOLP22:                                         ;Write Data To Chip I
                MOV     A,#FFH
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#80,FOLP22
                INC     R1
                CJNE    R1,#4,FOLP21

                MOV     R1,#0
FOLP31:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND3
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND3

                MOV     R0,#0                   ;Rest Counter
FOLP32:                                         ;Write Data To Chip II
                MOV     A,#FFH
                CALL    WRITE_DATA3
                INC     R0
                CJNE    R0,#27,FOLP32
                INC     R1
                CJNE    R1,#4,FOLP31

                CALL    DELAY
                CALL    STP_SC
;*****************************************************************************
;               VERTIAL LINE
;*****************************************************************************
VLINE:
                MOV     R1,#0
VLLP0:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     R0,#0                   ;Rest Counter
VLLP1:                                          ;Write Data To Chip I
                MOV     A,#FFH
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,NEXTV1
                JMP     VLLP2
NEXTV1:
                MOV     A,#00H
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,VLLP1
VLLP2:                                          ;Write Data To Chip II
                MOV     A,#00H
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#141,NEXTV2
                JMP     VLLP3
NEXTV2:
                MOV     A,#FFH
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#141,VLLP2

VLLP3:                                          ;Write Data To Chip III
                MOV     A,#00H
                CALL    WRITE_DATA3
                INC     R0
                CJNE    R0,#168,NEXTV3
                JMP     NEXTV4
NEXTV3:
                MOV     A,#FFH
                CALL    WRITE_DATA3
                INC     R0
                CJNE    R0,#168,VLLP3
NEXTV4:
                INC     R1
                CJNE    R1,#4,VLLP0

                CALL    DELAY
                CALL    STP_SC
;*****************************************************************************
;               HORIZONTAL LINE
;*****************************************************************************
HLINE:
                MOV     R1,#0
HLLP0:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                CALL    WRITE_COMMAND3

                MOV     R0,#0                   ;Rest Counter
HLLP1:                                          ;Write Data To Chip I
                MOV     A,#55H
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,HLLP1
HLLP2:                                          ;Write Data To Chip II
                MOV     A,#55H
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#141,HLLP2
HLLP3:                                          ;Write Data To Chip III
                MOV     A,#55H
                CALL    WRITE_DATA3
                INC     R0
                CJNE    R0,#168,HLLP3

                INC     R1
                CJNE    R1,#4,HLLP0

                CALL    DELAY
                CALL    STP_SC
;*****************************************************************************
;               SHOW PAGE1
;*****************************************************************************
SHOW_P1:
                MOV     R1,#0
                MOV     DPTR,#SHOW_WG
SP1LP1:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1

                MOV     R0,#0                   ;Rest Counter
SP1LP2:                                         ;Write Data To Chip I
                XRL     A,A
                MOVC    A,@A+DPTR
                CALL    WRITE_DATA1
                INC     R0
                INC     DPTR
                CJNE    R0,#61,SP1LP2

                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND2
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND2
SP1LP3:                                         ;Write Data To Chip II
                XRL     A,A
                MOVC    A,@A+DPTR
                CALL    WRITE_DATA2
                INC     R0
                INC     DPTR
                CJNE    R0,#141,SP1LP3

                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND3
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND3
SP1LP4:                                         ;Write Data To Chip III
                XRL     A,A
                MOVC    A,@A+DPTR
                CALL    WRITE_DATA3
                INC     R0
                INC     DPTR
                CJNE    R0,#160,SP1LP4
                INC     R1
                CJNE    R1,#4,SP1LP1

                MOV     A,#B8H                  ;Set Page Address FROM 00H
                CALL    WRITE_COMMAND3
                MOV     A,#13H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND3

                MOV     R0,#0                   ;Rest Counter
FOLP5:                                          ;Write Data To Chip III
                MOV     A,#00H
                CALL    WRITE_DATA3
                INC     R0
                CJNE    R0,#8,FOLP5


                CALL    DELAY
                CALL    STP_SC
                LJMP    INITIAL
;*****************************************************************************
;               CLEAR   SCR
;*****************************************************************************
CLK_GEN:
                CPL     P3.3
                RETI
;*****************************************************************************
;               CLEAR   SCR
;*****************************************************************************
CLEAR_S:
                MOV     R1,#0
CSLP11:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1

                MOV     R0,#0                   ;Rest Counter
CSLP12:                                         ;Write Data To Chip I
                MOV     A,#00H
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#80,CSLP12

                INC     R1
                CJNE    R1,#4,CSLP11

                MOV     R1,#0
CSLP21:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND2
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND2

                MOV     R0,#0                   ;Rest Counter
CSLP22:                                         ;Write Data To Chip I
                MOV     A,#00H
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#80,CSLP22

                INC     R1
                CJNE    R1,#4,CSLP21

                MOV     R1,#0
CSLP31:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND3
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND3

                MOV     R0,#0                   ;Rest Counter
CSLP32:                                         ;Write Data To Chip I
                MOV     A,#00H
                CALL    WRITE_DATA3
                INC     R0
                CJNE    R0,#80,CSLP32

                INC     R1
                CJNE    R1,#4,CSLP31
                RET
;*****************************************************************************
WRITE_COMMAND1:
                CLR     A0
                CLR     CS1                             ;CS1=0
                CLR     CS2                             ;CS2=0, Y1=0
                CLR     R_W
                MOV     P1,A
                SETB    EN
                CLR     EN
                CALL    DELAYS
                SETB    CS1                             ;CS1=1
                SETB    CS2                             ;CS2=0, Y1=1
                RET
;*****************************************************************************
WRITE_DATA1:
                MOV     P1,A
                SETB    A0
                CLR     CS1                             ;CS1=0
                CLR     CS2                             ;CS2=0, Y1=0
                CLR     R_W
                SETB    EN
                CLR     EN
                CALL    DELAYS
                SETB    CS1                             ;CS1=1
                SETB    CS2                             ;CS2=0, Y1=1
                RET
;*****************************************************************************
WRITE_COMMAND2:
                MOV     P1,A
                CLR     A0
                SETB    CS1                             ;CS1=1
                CLR     CS2                             ;CS2=0, Y1=0
                CLR     R_W
                SETB    EN
                CLR     EN
                SETB    CS1                             ;CS1=1
                SETB    CS2                             ;CS2=0, Y1=1
                RET
;*****************************************************************************
WRITE_DATA2:
                MOV     P1,A
                SETB    A0
                SETB    CS1                             ;CS1=1
                CLR     CS2                             ;CS2=0, Y1=0
                CLR     R_W
                SETB    EN
                CLR     EN
                SETB    CS1                             ;CS1=1
                SETB    CS2                             ;CS2=0, Y1=1
                RET
;*****************************************************************************
WRITE_COMMAND3:
                MOV     P1,A
                CLR     A0
                CLR     CS1                             ;CS1=0
                SETB    CS2                             ;CS2=1, Y2=0
                CLR     R_W
                SETB    EN
                CLR     EN
                SETB    CS1                             ;CS1=0
                SETB    CS2                             ;CS2=1, Y2=1
                RET
;*****************************************************************************
WRITE_DATA3:
                MOV     P1,A
                SETB    A0
                CLR     CS1                             ;CS1=0
                SETB    CS2                             ;CS2=1, Y2=0
                CLR     R_W
                SETB    EN
                CLR     EN
                SETB    CS1                             ;CS1=0
                SETB    CS2                             ;CS2=1, Y2=1
                RET
;******************************************************************************
;               Procedure of step by step and scan
;******************************************************************************
STP_SC:
                JB      S_S,STEP
                RET
STEP:
                CLR     STP
                MOV     R5,#4
LOPE:
                MOV     R6,#250
LOPD:
                DJNZ    R6,LOPD
                DJNZ    R5,LOPE
                JNB     S_S,LOUT
                JNB     STP,STEP
LOUT:
                RET
;******************************************************************************
;               BCD DELAY TIME SELECT
;******************************************************************************
CBCD:
                MOV     P0,#00H
                PUSH    A
                MOV     A,P0
                ANL     A,#0FH
                RL      A
                RL      A
                MOV     BCD,A
                POP     A
                RET
;******************************************************************************
DELAY:
                CALL    CBCD
                MOV     R4,BCD
LOPC:
                MOV     R5,#2FH
LOPB:
                MOV     R6,#0FFH
LOPA:
                DJNZ    R6,LOPA
                DJNZ    R5,LOPB
                DJNZ    R4,LOPC
                RET
;******************************************************************************
DELAYS:
                MOV     R6,#5
LOP3:
                DJNZ    R6,LOP3
                RET
;******************************************************************************
SHOW_WG:
        DB      0FFh,011h,001h,001h,003h,001h,041h,081h,041h,08Fh,041h,081h,041h,081h,043h,081h
        DB      041h,081h,041h,08Fh,041h,081h,041h,081h,043h,081h,041h,081h,041h,08Fh,041h,081h
        DB      041h,081h,043h,081h,041h,081h,041h,08Fh,041h,081h,041h,001h,003h,001h,081h,081h
        DB      081h,00Fh,081h,081h,081h,001h,003h,001h,041h,081h,041h,08Fh,041h,081h,041h,081h
        DB      043h,081h,041h,081h,041h,08Fh,041h,081h,041h,081h,043h,081h,041h,081h,041h,08Fh
        DB      041h,081h,041h,081h,043h,081h,041h,081h,041h,08Fh,041h,081h,041h,001h,003h,001h
        DB      081h,001h,081h,08Fh,081h,001h,081h,081h,083h,001h,001h,001h,041h,08Fh,041h,081h
        DB      041h,081h,043h,081h,041h,081h,041h,08Fh,041h,081h,041h,081h,043h,081h,041h,081h
        DB      041h,08Fh,041h,081h,041h,081h,043h,081h,041h,081h,041h,08Fh,041h,081h,041h,001h
        DB      003h,001h,081h,001h,081h,08Fh,081h,001h,081h,081h,083h,001h,055h,0ABh,055h,0FFh
        DB      0FFh,042h,002h,002h,000h,000h,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,080h,040h,080h,04Bh,08Ah
        DB      04Eh,080h,04Fh,088h,04Fh,080h,040h,080h,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,080h,040h,080h
        DB      04Fh,080h,04Fh,088h,04Fh,080h,04Fh,088h,04Fh,080h,040h,080h,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,080h
        DB      040h,080h,04Fh,080h,04Bh,08Ah,04Eh,080h,04Fh,088h,04Fh,080h,055h,0AAh,055h,0FFh
        DB      0FFh,008h,008h,008h,000h,000h,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
        DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh,055h,0FFh
        DB      0FFh,0A1h,0A0h,0A0h,080h,080h,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
        DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0FFh

        END

