Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
04/23/05 01:35
Read: times


 
#92213 - HD44780 showing garbage
After successfully having implemented interrupt-driven delay-routines, I am now trying to attach an HD44780-compatible display (4x40) to my DS89C450.
I opted for a 4-bit connection using P1.0-3 for the data-legs (D4-D7) and P1.4-7 for EN1,EN2,RS,RW. Due to the size of the display it has to Chip Enable lines.

The basic code, as found here http://www.8052.com/tutlcd2.phtml works, but the display shows garbage, which I cannot map to any of the font-tables in the Hitachi HD44780 datasheet.

I had to modify the assembly-routines to take care of my different pinout, but considering that the display does in fact respond, I consider the cabling part a matter well done. I suspect the error to be in the software and thus I would appreciate any suggestions for corrections to the below code.

/Thomas

        P1   	EQU     090h
        DB4     EQU     P1.0
        DB5     EQU     P1.1
        DB6     EQU     P1.2
        DB7     EQU     P1.3
        EN1     EQU     P1.4
        EN2     EQU     P1.5
        RS      EQU     P1.6
        RW      EQU     P1.7
        DAT     EQU     P1


RSEG    ?PR?READ_2_NIBBLES1?LCD_ROUTINES
READ_2_NIBBLES1:
        ORL   DAT,#00Fh       ;Be sure to release datalines (set outputlatches 
                            ;to '1') so we can read the LCD
        SETB  EN1
        NOP
        MOV  A,DAT  	    ;Read first part of the return value (high nibble)
        CLR   EN1
        ANL  A,#00Fh         ;Only low nibble is usable
        SWAP A              ;Last received is actually high nibble, so put it in place
        PUSH  ACC
        SETB  EN1
        NOP
        MOV   A,DAT         ;Read second part of the return value (low nibble)
        CLR   EN1
        ANL   A,#00Fh        ;Only low nibble is usable
        MOV   R7,A 
        POP   ACC 
        ORL   A,R7          ;And combine it with low nibble
        CLR   RS
        CLR   RW
        
        RET

RSEG    ?PR?READ_2_NIBBLES2?LCD_ROUTINES
READ_2_NIBBLES2:
        ORL   DAT,#00Fh       ;Be sure to release datalines (set outputlatches 
                            ;to '1') so we can read the LCD
        SETB  EN2
        NOP
        MOV  A,DAT  	    ;Read first part of the return value (high nibble)
        CLR   EN2
        ANL  A,#00Fh         ;Only low nibble is usable
        SWAP  A             ;Last received is actually high nibble, so put it in place
        PUSH  ACC
        SETB  EN2
        NOP
        MOV   A,DAT         ;Read second part of the return value (low nibble)
        CLR   EN2 
        ANL   A,#00Fh        ;Only low nibble is usable
        MOV   R7,A
        POP   ACC 
        ORL   A,R7          ;And combine it with low nibble
        CLR   RS
        CLR   RW

        RET

RSEG    ?PR?WRITE_2_NIBBLES1?LCD_ROUTINES
WRITE_2_NIBBLES1:
        PUSH  ACC           ;Save A for high nibble
        ORL   DAT,#0Fh      ;Bits 0..3 = 1
        ORL   A,#0Fh        ;Don't affect bits 4-7
        SWAP  A             ;Swap high nibble into low region
        ANL   DAT,A         ;High nibble to display
        SETB  EN1
        NOP
        CLR   EN1 
        POP   ACC           ;Prepare to send the second nibble
        ORL   DAT,#0Fh      ; Bits 0...3 = 1
        ORL   A,#0Fh        ; Don't affect bits 4...7
        ANL   DAT,A         ;Low nibble to display
        SETB  EN1
        NOP
        CLR   EN1 
        CLR   RS
        CLR   RW

        RET

RSEG    ?PR?WRITE_2_NIBBLES2?LCD_ROUTINES
WRITE_2_NIBBLES2:
        PUSH  ACC           ;Save A for low nibble
        ORL   DAT,#0Fh      ;Bits 0..3 = 1
        ORL   A,#0Fh        ;Don't affect bits 4-7
        SWAP  A             ;Swap high nibble into low region
        ANL   DAT,A         ;High nibble to display
        SETB  EN2
        NOP
        CLR   EN2 
        POP   ACC           ;Prepare to send the second nibble
        ORL   DAT,#0Fh      ; Bits 4...7 <- 1
        ORL   A,#0Fh        ; Don't affect bits 0...3
        ANL   DAT,A         ;Low nibble to display
        SETB  EN2
        NOP
        CLR   EN2 
        CLR   RS
        CLR   RW

        RET

RSEG    ?PR?WAIT_LCD1?LCD_ROUTINES
WAIT_LCD1:
        CLR RS                  ;It's a command
        SETB RW                 ;It's a read command
        LCALL READ_2_NIBBLES1   ;Take two nibbles from LCD in A
        JB ACC.7,WAIT_LCD1      ;If bit 7 high, LCD still busy
        CLR RW                  ;Turn off RW for future commands

        RET

RSEG    ?PR?WAIT_LCD2?LCD_ROUTINES
WAIT_LCD2:
        CLR RS                  ;It's a command
        SETB RW                 ;It's a read command
        LCALL READ_2_NIBBLES2   ;Take two nibbles from LCD in A
        JB ACC.7,WAIT_LCD2      ;If bit 7 high, LCD still busy
        CLR RW                  ;Turn off RW for future commands

        RET

RSEG    ?PR?INIT_LCD1?LCD_ROUTINES
INIT_LCD1:
        CLR   RS
        CLR   RW 
        CLR   EN1
        MOV   A,#2Ch
        SWAP  A
        ORL   A,#0Fh
        ANL   DAT,A
        SETB  EN1               ; Init 4-bit mode, take 1
        NOP
        CLR   EN1
        LCALL WAIT_LCD1

        MOV   A,#2Ch            ;Init display for 4-bit mode
        LCALL WRITE_2_NIBBLES1  ;Write A as two separate nibbles to LCD

        CLR   EN1
        LCALL WAIT_LCD1
        MOV   A,#0Eh
        LCALL WRITE_2_NIBBLES1  ;Write A as two separate nibbles to LCD
        LCALL WAIT_LCD1
        MOV   A,#06h
        LCALL WRITE_2_NIBBLES1  ;Write A as two separate nibbles to LCD
        LCALL WAIT_LCD1
        CLR   RS
        CLR   RW

        RET

RSEG    ?PR?INIT_LCD2?LCD_ROUTINES
INIT_LCD2:
        CLR   RS
        CLR   RW 
        CLR   EN2
        MOV   A,#2Ch
        SWAP  A
        ORL   A,#0Fh
        ANL   DAT,A
        SETB  EN2               ; Init 4-bit mode, take 1
        NOP
        CLR   EN2
        LCALL WAIT_LCD2

        MOV   A,#2Ch            ;Init display for 4-bit mode
        LCALL WRITE_2_NIBBLES2  ;Write A as two separate nibbles to LCD

        CLR   EN2
        LCALL WAIT_LCD2
        MOV   A,#0Eh
        LCALL WRITE_2_NIBBLES2  ;Write A as two separate nibbles to LCD
        LCALL WAIT_LCD2
        MOV   A,#06h
        LCALL WRITE_2_NIBBLES2  ;Write A as two separate nibbles to LCD
        LCALL WAIT_LCD2
        CLR   RS
        CLR   RW

        RET

RSEG    ?PR?CLEAR_LCD1?LCD_ROUTINES
CLEAR_LCD1:
        CLR   RS
        MOV   A,#01h
        LCALL WRITE_2_NIBBLES1   ;Write A as two separate nibbles to LCD
        LCALL WAIT_LCD1
        CLR   RS
        CLR   RW

        RET

RSEG    ?PR?CLEAR_LCD2?LCD_ROUTINES
CLEAR_LCD2:
        CLR   RS
        MOV   A,#01h
        LCALL WRITE_2_NIBBLES2   ;Write A as two separate nibbles to LCD
        LCALL WAIT_LCD2
        CLR   RS
        CLR   RW

        RET

RSEG    ?PR?_write_lcd1?LCD_ROUTINES
_write_lcd1:
        MOV A,R7
        SETB  RS
        LCALL WRITE_2_NIBBLES1
        LCALL WAIT_LCD1

        RET

RSEG    ?PR?_WRITE_LCD2?LCD_ROUTINES
_WRITE_LCD2:
        MOV A,R7
        SETB  RS
        LCALL WRITE_2_NIBBLES2
        LCALL WAIT_LCD2

        RET


List of 6 messages in thread
TopicAuthorDate
HD44780 showing garbage            01/01/70 00:00      
   LCD problems            01/01/70 00:00      
   embarassing            01/01/70 00:00      
      Congradulations, You are the first.            01/01/70 00:00      
         honesty with respect to admitting errors            01/01/70 00:00      
         We're all human            01/01/70 00:00      

Back to Subject List