;*******************************************************************************
;               CHARACTER CONTROLLER
;*******************************************************************************
                .SYMBOLS
;*******************************************************************************
RS              REG     P3.0
E               REG     P3.4
R_W             REG     P3.7
STP             REG     P2.0
S_S             REG     P2.1
BCD             EQU     01H
CHAR_ADD        EQU     7FH
;*******************************************************************************
                ORG     0H
                JMP     START

START:
;*******************************************************************************
;               INITIALIZE
;*******************************************************************************
INITIAL:
                CLR     E
;                MOV     A,#00100010B            ;INITIAL SETTING ONCE
;                CALL    COMMAND_4BIT            ;
;                MOV     A,#10000000B            ;2 Line ,5*8 Font
;                CALL    FUNCTION_SET
;                MOV     R3,#50                  ;Set Counter1 = 50
;DLP12:
;                MOV     R2,#255                 ;Set Counter2 = 255
;DLP11:
;                DJNZ    R2,DLP11                ;Waiting 50*256*2 > 4.1 ms
;                DJNZ    R3,DLP12
;
;                MOV     A,#00100010B            ;INITIAL SETTING TWICE
;                CALL    COMMAND_4BIT            ;
;                MOV     A,#10000000B            ;2 Line ,5*8 Font
;                CALL    FUNCTION_SET
;                MOV     R2,#80                  ;Set Counter = 80
;DLP2:
;                DJNZ    R2,DLP2                 ;Waiting 80*2 > 100us
                MOV     R4,#1
                CALL    DELAY1
                MOV     A,#00100010B            ;INITIAL SETTING THIRD
                CALL    COMMAND_4BIT            ;4bit
                MOV     A,#10000000B            ;2 Line ,5*8 Font
                CALL    FUNCTION_SET

                MOV     R2,#80                  ;Set Counter = 80
DLP3:
                DJNZ    R2,DLP3                 ;Waiting 80*2 > 39us

                MOV     A,#00101000B            ;Function Set 0010NF**
                CALL    WRITE_COMMAND           ;4bit ,2 Line ,5*8 Font

                MOV     R2,#80                  ;Set Counter = 80
DLP4:
                DJNZ    R2,DLP4                 ;Waiting 80*2 > 39us

                MOV     A,#00001100B            ;Display ON/OFF = 00001DCB
                CALL    WRITE_COMMAND           ;Display ON,Cursor&Blink OFF

                MOV     A,#00000110B            ;Entry Mode Set = 000001IS
                CALL    WRITE_COMMAND           ;Increment & Shift OFF

                MOV     A,#00000010B            ;Return Home
                CALL    WRITE_COMMAND

                MOV     A,#00000001B            ;Clear Display
                CALL    WRITE_COMMAND           ;Write 20H to DDRAM

                MOV     R4,#10
                CALL    DELAY1

                CALL    CGRAM                   ;Setting CGRAM data
;*******************************************************************************
;               FULL ON
;*******************************************************************************
FULL_ON:
                MOV     A,#10000000B            ;Set display data RAM addr=00H
                CALL    WRITE_COMMAND
                MOV     R1,#40                  ;Set counter 80
FLLOOP1:
                MOV     A,#02H
                CALL    WRITE_DATA
                DJNZ    R1,FLLOOP1

                MOV     A,#11000000B            ;Set display data RAM addr=40H
                CALL    WRITE_COMMAND
                MOV     R1,#40                  ;Set counter 40
FLLOOP2:
                MOV     A,#02H
                CALL    WRITE_DATA
                DJNZ    R1,FLLOOP2

                CALL    DELAY
                CALL    STP_SC
;*******************************************************************************
;               Display 40*2 char Max
;*******************************************************************************
SHOW_CHAR:
                MOV     A,#10000000B            ;Set display data RAM addr=00H
                CALL    WRITE_COMMAND
                MOV     R1,#40                  ;Set counter 80
                MOV     CHAR_ADD,#41H           ;Set character start address
SCLOOP1:
                MOV     A,CHAR_ADD
                CALL    WRITE_DATA
                INC     CHAR_ADD
                DJNZ    R1,SCLOOP1

                MOV     A,#11000000B            ;Set display data RAM addr=40H
                CALL    WRITE_COMMAND
                MOV     R1,#40                  ;Set counter 40
                MOV     CHAR_ADD,#41H           ;Set character start address
SCLOOP2:
                MOV     A,CHAR_ADD
                CALL    WRITE_DATA
                INC     CHAR_ADD
                DJNZ    R1,SCLOOP2

                CALL    DELAY
                CALL    STP_SC
;*******************************************************************************
;               SQUARE
;*******************************************************************************
SQUARE:
                MOV     A,#10000000B            ;Set display data RAM addr=00H
                CALL    WRITE_COMMAND
                MOV     R1,#40                  ;Set counter 40
SQLOOP1:
                MOV     A,#00H                  ;Font Address
                CALL    WRITE_DATA
                DJNZ    R1,SQLOOP1

                MOV     A,#11000000B            ;Set display data RAM addr=40H
                CALL    WRITE_COMMAND
                MOV     R1,#40                  ;Set counter 40
SQLOOP2:
                MOV     A,#00H                  ;Font Address
                CALL    WRITE_DATA
                DJNZ    R1,SQLOOP2

                CALL    DELAY
                CALL    STP_SC
;*******************************************************************************
;               CROSS DOT
;*******************************************************************************
CROSS_DOT:
                MOV     A,#10000000B            ;Set display data RAM addr=00H
                CALL    WRITE_COMMAND
                MOV     R1,#40                  ;Set counter 40
CDLOOP1:
                MOV     A,#01H                  ;Font Address
                CALL    WRITE_DATA
                DJNZ    R1,CDLOOP1

                MOV     A,#11000000B            ;Set display data RAM addr=40H
                CALL    WRITE_COMMAND
                MOV     R1,#40                  ;Set counter 40
CDLOOP2:
                MOV     A,#01H                  ;Font Address
                CALL    WRITE_DATA
                DJNZ    R1,CDLOOP2

                CALL    DELAY
                CALL    STP_SC
;*******************************************************************************
;               SHOW FONT
;*******************************************************************************
SHOW_FONT:
                MOV     A,#10000000B           ;Set display data RAM addr=00H
                CALL    WRITE_COMMAND
                MOV     R1,#40                 ;Set counter 40
SFLOOP1:
                MOV     A,#A7H                 ;Font Address
                CALL    WRITE_DATA
                DJNZ    R1,SFLOOP1

                MOV     A,#11000000B           ;Set display data RAM addr=40H
                CALL    WRITE_COMMAND
                MOV     R1,#40                 ;Set counter 40
SFLOOP2:
                MOV     A,#A7H                 ;Font Address
                CALL    WRITE_DATA
                DJNZ    R1,SFLOOP2

                CALL    DELAY
                CALL    STP_SC
                LJMP    START
;*******************************************************************************
;           SET CG_RAM DATA
;*******************************************************************************
CGRAM:
                MOV     A,#01000000B            ;SET CG_RAM ADDRESS 000000
                CALL    WRITE_COMMAND
                MOV     DPTR,#TABLE_1
                MOV     R7,#24
CGLOOP:
                MOV     A,#0
                MOVC    A,@A+DPTR
                CALL    WRITE_DATA
                INC     DPTR
                DJNZ    R7,CGLOOP
                RET
;*******************************************************************************
CHK_BUSY:
                MOV     P1,#0FFH                ;SET PORT1=INPUT
                CLR     RS                      ;SET IR  MODE RS=0
                SETB    R_W                     ;SET READ MODE R/W=1
                SETB    E                       ;ENABLE LCM
                MOV     C,P1.7                  ;CHECK BUSY FLAGE(BIT7)
                CLR     E
                JC      CHK_BUSY
                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
;*******************************************************************************
DELAY1:
LOP1:
                MOV     R5,#40
LOP2:
                MOV     R6,#25
LOP3:
                DJNZ    R6,LOP3
                DJNZ    R5,LOP2
                DJNZ    R4,LOP1
                RET
;*******************************************************************************
DELAYS:
                MOV     R5,#4
LOP1S:
                MOV     R6,#25
LOP2S:
                DJNZ    R6,LOP2S
                DJNZ    R5,LOP1S
                RET
;*******************************************************************************
COMMAND_4BIT:
                CLR     RS
                CLR     R_W
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                SWAP    A
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                RET
;*******************************************************************************
FUNCTION_SET:
                CLR     RS
                CLR     R_W
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                RET
;*******************************************************************************
WRITE_COMMAND:
                CALL    DELAYS
;               CALL    CHK_BUSY
                CLR     RS
                CLR     R_W
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                SWAP    A
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                RET
;*******************************************************************************
WRITE_DATA:
                CALL    DELAYS
;               CALL    CHK_BUSY
                SETB    RS
                CLR     R_W
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                SWAP    A
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                RET
;*******************************************************************************
READ_DATA:
                CALL    DELAYS
;               CALL    CHK_BUSY
                SETB    RS
                SETB    R_W
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                SWAP    A
                MOV     P1,A
                SETB    E
                NOP
                CLR     E
                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
LOPD:
                DJNZ    R6,LOPD
                DJNZ    R5,LOPE
                JNB     S_S,LOUT
                JNC     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
;*******************************************************************************
;               DISPLAY DATA
;*******************************************************************************

TABLE_1:
        DB      1FH,11H,11H,11H,11H,11H,11H,1FH                   ;00H
        DB      0AH,15H,0AH,15H,0AH,15H,0AH,15H                   ;01H
        DB      FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH                   ;01H

            END

