;******************************************************************************
                .SYMBOLS
;******************************************************************************
A0              REG     P3.0
CS1             REG     P3.1            ; CS1 = E1
CS2             REG     P3.5            ; CS2 = E2
R_W             REG     P3.7
RES             REG     P3.2
STP             REG     P2.0
S_S             REG     P2.1
BCD             EQU     01H
PAGE_ADDRESS    EQU     30H
COL_ADDRESS     EQU     31H
SET_DATA        EQU     32H

;******************************************************************************

                ORG        0H
                LJMP       START
                ORG        50H

START:                                  ;program reset start here
                CALL    INITIAL
                LJMP    FULL_ON

;******************************************************************************
;               INITIAL SETTING
;******************************************************************************
INITIAL:
                SETB    RES                     ;Reset
                MOV     A,#11100010B            ;Software RESET
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     A,#10100000B            ;Select ADC=0
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     A,#10100100B            ;Satic Drive OFF
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     A,#10101001B            ;Select Duty=1/32
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     A,#11000000B            ;Set Start Line 0(C0H)~31(DFH)
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     A,#10111000B            ;Set Page Address 0(B8H)~3(BBH)
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     A,#10000000B            ;Set Column Address 0(00H)~(4FH)
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     A,#10101111B            ;Set Display ON
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                RET
;******************************************************************************
;               FULL ON
;******************************************************************************
FULL_ON:
                MOV     R0,#0
                MOV     R1,#0
FOLOOP1:
                MOV     A,R1                    ;Set Page Address FROM 00H
                ORL     A,#B8H                  ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     R0,#0                   ;Rest Counter
FOLOOP2:                                        ;Write Data To Chip I
                MOV     A,#FFH
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,FOLOOP2

FOLOOP3:                                        ;Write Data To Chip II
                MOV     A,#FFH
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#122,FOLOOP3

                INC     R1
                CJNE    R1,#4,FOLOOP1

                LCALL   DELAY
                LCALL   STP_SC
                SJMP    SHOWM
;******************************************************************************
;               SHOW MODEL
;******************************************************************************
SHOWM:
                MOV     R0,#0
                MOV     R1,#0
                MOV     DPTR,#GRAPHIC
SMLOOP1:
                MOV     A,#B8H                  ;Set Page Address FROM 00H
                ADD     A,R1                    ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     R0,#0                   ;Rest Counter
SMLOOP2:                                        ;Write Data To Chip I
                XRL     A,A
                MOVC    A,@A+DPTR
                CALL    WRITE_DATA1
                INC     R0
                INC     DPTR
                CJNE    R0,#61,SMLOOP2

SMLOOP3:                                        ;Write Data To Chip II
                XRL     A,A
                MOVC    A,@A+DPTR
                CALL    WRITE_DATA2
                INC     R0
                INC     DPTR
                CJNE    R0,#122,SMLOOP3

                INC     R1
                CJNE    R1,#4,SMLOOP1

                LCALL   DELAY
                LCALL   STP_SC
                SJMP    VLINE
;******************************************************************************
;              VERTICAL LINE
;******************************************************************************
VLINE:
                MOV     R0,#0
                MOV     R1,#0
VLLOOP1:
                MOV     A,R1                    ;Set Page Address FROM 00H
                ORL     A,#B8H                  ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     R0,#0                   ;Rest Counter
VLLOOP21:                                       ;Write Data To Chip I
                MOV     A,#FFH
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,VLLOOP22
                JMP     VLLOOP31
VLLOOP22:
                MOV     A,#00H
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,VLLOOP21

VLLOOP31:                                       ;Write Data To Chip I
                MOV     A,#00H
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#122,VLLOOP32
                JMP     VLLOOP11
VLLOOP32:
                MOV     A,#FFH
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#122,VLLOOP31
VLLOOP11:
                INC     R1
                CJNE    R1,#4,VLLOOP1

                LCALL   DELAY
                LCALL   STP_SC
                SJMP    HLINE
;******************************************************************************
;              HORIZONTAL LINE
;******************************************************************************
HLINE:
                MOV     R0,#0
                MOV     R1,#0
HLLOOP1:
                MOV     A,R1                    ;Set Page Address FROM 00H
                ORL     A,#B8H                  ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     R0,#0                   ;Rest Counter
HLLOOP2:                                        ;Write Data To Chip I
                MOV     A,#AAH
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,HLLOOP2

HLLOOP3:                                        ;Write Data To Chip II
                MOV     A,#AAH
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#122,HLLOOP3

                INC     R1
                CJNE    R1,#4,HLLOOP1

                LCALL   DELAY
                LCALL   STP_SC
                SJMP    CROSSDOT
;******************************************************************************
;               CROSS DOT
;******************************************************************************
CROSSDOT:
                MOV     R0,#0
                MOV     R1,#0
CDLOOP1:
                MOV     A,R1                    ;Set Page Address FROM 00H
                ORL     A,#B8H                  ;Command B8H~BBH
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2
                MOV     A,#00H                  ;Set Column Address FROM 00H
                CALL    WRITE_COMMAND1
                CALL    WRITE_COMMAND2

                MOV     R0,#0                   ;Rest Counter
CDLOOP21:                                       ;Write Data To Chip I
                MOV     A,#AAH
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,CDLOOP22
                JMP     CDLOOP31
CDLOOP22:
                MOV     A,#55H
                CALL    WRITE_DATA1
                INC     R0
                CJNE    R0,#61,CDLOOP21

CDLOOP31:                                       ;Write Data To Chip I
                MOV     A,#55H
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#122,CDLOOP32
                JMP     CDLOOP11
CDLOOP32:
                MOV     A,#AAH
                CALL    WRITE_DATA2
                INC     R0
                CJNE    R0,#122,CDLOOP31
CDLOOP11:
                INC     R1
                CJNE    R1,#4,CDLOOP1

                LCALL   DELAY
                LCALL   STP_SC
                LJMP    START
;******************************************************************************
WRITE_COMMAND1:
                CLR        A0
                CLR        R_W
                MOV        P1,A
                CLR        CS1
                NOP
                SETB       CS1
                RET
;******************************************************************************
WRITE_DATA1:
                SETB       A0
                CLR        R_W
                MOV        P1,A
                CLR        CS1
                NOP
                SETB       CS1
                RET
;******************************************************************************
WRITE_COMMAND2:
                CLR        A0
                CLR        R_W
                MOV        P1,A
                CLR        CS2
                NOP
                SETB       CS2
                RET
;******************************************************************************
WRITE_DATA2:
                SETB       A0
                CLR        R_W
                MOV        P1,A
                CLR        CS2
                NOP
                SETB       CS2
                RET
;******************************************************************************
;   procedure of step by step   and  scan
;******************************************************************************
STP_SC
                MOV        C,S_S
                JC         STEP
                RET

STEP:
                MOV        C,STP
                MOV        R5,#0FH
LOPE:
                MOV        R6,#0FFH
LOPH:
                DJNZ       R6,LOPH
                DJNZ       R5,LOPE
                JNB        S_S,LOUT
                JNC        STEP
LOUT:
                RET
;******************************************************************************
;  BCD      DELAY TIME SELECT
;******************************************************************************
CBCD:
                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,#3FH
LOPB:
                MOV        R6,#0FFH
LOPA:
                DJNZ       R6,LOPA
                DJNZ       R5,LOPB
                DJNZ       R4,LOPC
                RET

GRAPHIC:
          DB      0FFh,011h,001h,001h,003h,001h,041h,081h
          DB      041h,08Fh,041h,081h,041h,081h,043h,081h
          DB      041h,081h,041h,08Fh,041h,081h,041h,081h
          DB      043h,081h,041h,081h,041h,08Fh,041h,081h
          DB      041h,081h,043h,081h,041h,081h,041h,08Fh
          DB      041h,081h,041h,001h,003h,001h,081h,081h
          DB      081h,00Fh,081h,081h,081h,001h,003h,001h
          DB      041h,081h,041h,08Fh,041h,081h,041h,081h
          DB      043h,081h,041h,081h,041h,08Fh,041h,081h
          DB      041h,081h,043h,081h,041h,081h,041h,08Fh
          DB      041h,081h,041h,081h,043h,081h,041h,081h
          DB      041h,08Fh,041h,081h,041h,001h,003h,001h
          DB      081h,001h,081h,08Fh,081h,001h,081h,081h
          DB      083h,001h,001h,001h,041h,08Fh,041h,081h
          DB      041h,081h,043h,081h,041h,081h,041h,08Fh
          DB      041h,0FFh
          DB      0FFh,042h,002h,002h,000h,000h,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,080h,040h,080h,04Bh,08Ah
          DB      04Eh,080h,04Fh,088h,04Fh,080h,040h,080h
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,080h,040h,080h
          DB      04Fh,080h,04Fh,088h,04Fh,080h,04Fh,088h
          DB      04Fh,080h,040h,080h,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0FFh
          DB      0FFh,008h,008h,008h,000h,000h,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh
          DB      055h,0FFh
          DB      0FFh,0A1h,0A0h,0A0h,080h,080h,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0AAh,0D5h,0AAh,0D5h,0AAh,0D5h,0AAh
          DB      0D5h,0FFh

        END
