A problem in interfacing the LCD with 3 wires (using Texas instruments 74HC595)

Thread Starter

KiroloesAmir035

Joined Jan 6, 2021
5
I try to interface with 16x2 LCD using 74HC595 shift register from Texas Instruments. I uploaded the following code :
LCD with 74HC595:
                    ;AT89C51
                    ;24MHz
                    ;SHIFT REGISTER PINS
                    CLK BIT P1.0
                    STR BIT P1.1
                    SERIAL BIT P1.2
                        
                    ;ISRs
                    
                    ORG 00H                    ;RESET ROUTINE
                    LJMP START
                    
                    
                    ORG 1BH                    ;TIMER 1 ROUTINE FOR SHIFT REGISTER CLOCK
                    CPL CLK
                    RETI
                    
START:                MOV P1, #00H
                    MOV SP, #25H
                    MOV TMOD, #21H            ;MODE 1 FOR TIMER 0, MODE 2 FOR TIMER 1
                    MOV TH1, #0FFH            ;ONE MACHINE CYCLE DELAY (MC = 500 nS)
                    SETB TR1
                    MOV IE, #88H           
                    
                    MOV R1, #32H            ;50 MS DELAY BEFORE OPERATING
                    ACALL DELAY_MS
                    
                    MOV R0, #32H            ;SENDING 30H TO THE D4-D7 INPUTS OF LCD AND SET THE ENABLE BIT
                    ACALL SHIFT_OUT
                    ACALL DELAY_MS            ;1 MS DELAY
                    MOV R0, #30H            ;CLEAR ENABLE BIT AND SEND 30H TO DIGITAL INPUTS
                    ACALL SHIFT_OUT           
                    ACALL DELAY_MS
                    MOV R1, #05H            ;5 MS DELAY
                    ACALL DELAY_MS

                    MOV R0, #32H
                    ACALL SHIFT_OUT
                    ACALL DELAY_MS
                    MOV R0, #30H
                    ACALL SHIFT_OUT
                    ACALL DELAY_MS
                    MOV R1, #82H            ;130 US DELAY
                    ACALL DELAY_US

                    MOV R0, #32H
                    ACALL SHIFT_OUT
                    ACALL DELAY_MS
                    MOV R0, #30H
                    ACALL SHIFT_OUT
                    ACALL DELAY_MS
                    MOV R1, #82H           
                    ACALL DELAY_US
                    
                    MOV R0, #22H           
                    ACALL SHIFT_OUT
                    ACALL DELAY_MS
                    MOV R0, #20H
                    ACALL SHIFT_OUT
                    ACALL DELAY_MS
                    MOV R1, #82H           
                    ACALL DELAY_US
                    
                    MOV R4, #28H            ;4-BIT, 2 LINES MODE OF LCD INITIALIZATION
                    ACALL CMD               
                    MOV R1, #82H            ;50 MICROSECONDS DELAY
                    ACALL DELAY_US
                    
                    MOV R4, #08H            ;DISPLAY OFF, CURSOR OFF
                    ACALL CMD               
                    MOV R1, #32H            ;50 MICROSECONDS DELAY
                    ACALL DELAY_US
                
                
                    MOV R4, #01H            ;CLEAR LCD
                    ACALL CMD
                    MOV R1, #02H            ;2 MS DELAY
                    ACALL DELAY_MS

                    MOV R4, #06H            ;ENTRY MODE
                    ACALL CMD               
                    MOV R1, #32H            ;50 MICROSECONDS DELAY
                    ACALL DELAY_US
                
                    MOV R4, #0EH            ;DISPLAY ON, CURSOR ON
                    ACALL CMD
                    MOV R1, #32H            ;50 US DELAY
                    ACALL DELAY_US
                
                    MOV R4, #80H            ;HOME CURSOR
                    ACALL CMD
                    MOV R1, #02H            ;2 MS DELAY
                    ACALL DELAY_MS
                    
                    MOV R1, #14H            ;20 MS DELAY
                    ACALL DELAY_MS
                    
                    MOV R4, #'A'
                    ACALL PRNT

HERE:                SJMP HERE




SHIFT_OUT:            MOV R3, #08H            ;8 TIMES TO SEND ALL THE BYTE
                    MOV A, R0
DATA_LOOP:            RLC A                    ;TRANSFER THE VALUE OF EACH BIT TO CARRY BIT FROM LEFT TO RIGHT
                    MOV SERIAL, C            ;THE VALUE OF DS EQUALS THE VALUE OF CARRY BIT
                    DJNZ R3, DATA_LOOP        ;REPEATING 8 TIMES
                    
                    SETB STR
                    MOV R1, #01H            ;SET LATCH BIT FOR 1 uS         
                    ACALL DELAY_US
                    CLR STR
                    MOV R1, #01H            ;CLEAR LATCH BIT FOR 1 us
                    ACALL DELAY_US
                    
                    RET
                    
CMD:           
;SENDING THE UPPER NIBBLE
                MOV A, R4
                ANL A, #0F0H                ;GET THE VALUE OF UPPER NIBBLE
                MOV R5, A                    ;COPY THIS VALUE TO THE FIFTH REGISTER
                ADD A, #02H                    ;SET ENABLE BIN ON AND CLEAR RS BIN
                MOV R0, A
                ACALL SHIFT_OUT
                ACALL DELAY_MS
                MOV A, R5                    ;CLEAR ENABLE PIN
                MOV R0, A
                ACALL SHIFT_OUT
                ACALL DELAY_MS
;SENDING THE LOWER NIBBLE
                MOV A, R4           
                ANL A, #0FH                    ;GET THE VALUE OF LOWER NIBBLE
                SWAP A                   
                MOV R5, A                   
                ADD A, #02H
                MOV R0, A
                ACALL SHIFT_OUT
                ACALL DELAY_MS
                MOV A, R5
                MOV R0, A
                ACALL SHIFT_OUT
                ACALL DELAY_MS
                RET

PRNT:           
;SENDING THE UPPER NIBBLE
                MOV A, R4
                ANL A, #0F0H
                MOV R5, A
                ADD A, #03H                    ;SET ENABLE AND RS BITS
                MOV R0, A
                ACALL SHIFT_OUT
                ACALL DELAY_MS
                MOV A, R5
                ADD A, #01H                    ;CLEAR ENABLE BIT AND SET RS BIT
                MOV R0, A
                ACALL SHIFT_OUT
                ACALL DELAY_MS
;SENDING THE LOWER NIBBLE
                MOV A, R4
                ANL A, #0FH
                SWAP A
                MOV R5, A
                ADD A, #03H
                MOV R0, A
                ACALL SHIFT_OUT
                ACALL DELAY_MS
                MOV A, R5
                ADD A, #01H
                MOV R0, A
                ACALL SHIFT_OUT
                ACALL DELAY_MS
                RET

DELAY_MS:           
                MOV TH0, #0F8H
                MOV TL0, #30H
                SETB TR0
LOOP:                JNB TF0, LOOP
                CLR TR0
                CLR TF0
                DJNZ R1, DELAY_MS
                RET
                
                
                
DELAY_US:            MOV TH0, #0FFH
                MOV TL0, #0FEH
                SETB TR0
LOOP1:                JNB TF0, LOOP1
                CLR TR0
                CLR TF0
                DJNZ R1, DELAY_US
                RET
DELAY_SEC:            MOV R2, #28H
DDDD:                MOV TH0, #3CH
                MOV TL0, #0B0H
                SETB TR0
LOOP2:                JNB TF0, LOOP2
                CLR TR0
                CLR TF0
                DJNZ R2, DDDD
                DJNZ R1, DELAY_SEC
                RET
                END
I tried this code using proteus simulation. but the LCD didn't write anything. I observed that the data sent in print command is wrong.' A' ASCII code is 0x41. but It's sent as 0x62 and RS bit is enabled. What should I do?
circuit:
Sim.jpg

EA is connected to 5V. Reset connected to RC circuit in which R = 10k and C = 10uF. XTAL 1 & 2 are connected to 24Mhz crystal
 
Top