| ??? 11/19/07 19:06 Read: times |
#147209 - 4 bit LCD trouble |
hi guys
I've designed some software for a 4 bit HD44870 compatible LCD The pinout is like this: RS: P2.3 EN: P2.0 RW: GND D0-D3: tied to GND via a 10k resistor D4: P2.4 D5: P2.5 D6: P2.6 D7: P2.7 The code is this:
; X-tal @ 12 MHz
#include 8051.H
DATA .equ 0A0H ;P2
RS .equ 0A3H ;P2.3
EN .equ 0A0H ;P2.0
.org 0000H
Main acall INIT_LCD ; initialise
run MOV A, #'H'
ACALL WRITE_TEXT
MOV A, #'E'
ACALL WRITE_TEXT
MOV A, #'L'
ACALL WRITE_TEXT
MOV A, #'L'
ACALL WRITE_TEXT
MOV A, #'O'
ACALL WRITE_TEXT
MOV A, #'W'
ACALL WRITE_TEXT
MOV A, #'O'
ACALL WRITE_TEXT
MOV A, #'R'
ACALL WRITE_TEXT
MOV A, #'L'
ACALL WRITE_TEXT
MOV A, #'D'
ACALL WRITE_TEXT
sjmp $
Delay50us ;1+1+R7*2+2 MC =1+1+23*2+2 = 50 MC = 50 us
MOV R7, #023 ;1 MC
NOP ;1 MC
DJNZ R7, $ ;R7*2 MC
RET ;2 MC
INIT_LCD
;-------15 ms Startup Delay---------------
MOV R5, #0150
INIT1 ACALL Delay50us
ACALL Delay50us
DJNZ R5, INIT1
;-------FUnction Set 8bit-----------------
CLR RS
MOV DATA, #030h ; set to 8 bit interface, only D4-D7 connected
SETB EN
NOP
CLR EN
;-------4.1 ms Delay-----------
MOV R5, #082
INIT2 ACALL Delay50us
DJNZ R5, INIT2
;-------FUnction Set 8bit-----------------
CLR RS
MOV DATA, #030h ; set to 8 bit interface, only D4-D7 connected
SETB EN
NOP
CLR EN
;-------100us Delay------------
ACALL Delay50us
ACALL Delay50us
;-------FUnction Set 8bit-----------------
CLR RS
MOV DATA, #030h ; set to 8 bit interface, only D4-D7 connected
SETB EN
NOP
CLR EN
ACALL Delay50us
;-------FUnction Set 4bit-----------------
CLR RS
MOV DATA, #020h ; set to 4 bit interface, only D4-D7 connected
SETB EN
NOP
CLR EN
ACALL Delay50us
;-------Normal settings-------------------
MOV A, #028h ; function set: 4bits, 2 lines, 5x8 dots
ACALL WRITE_CMD
MOV A, #0Eh ; display on/off control: Display on, cursor on, blinking off
ACALL WRITE_CMD
MOV A, #06h ; entry mode set: increcement
ACALL WRITE_CMD
MOV A, #01h ; clear display
ACALL WRITE_CMD
RET
WRITE_CMD
PUSH ACC ;Save A for low nibble
MOV B, DATA ; DDDDCCCC
ORL B, #0F0h ;bits 7..4 <- 1, clear msn xxxxCCCC
ORL A, #00Fh ;Don't affect bits 0-3, clear lsn 7654xxxx
ANL DATA, A ;High nibble to display 7654CCCC
CLR RS
SETB EN
NOP
CLR EN
POP ACC ;Prepare to send DDDDCCCC
SWAP A ; 32107654
MOV B, DATA ; DDDDCCCC
ORL B, #0F0h ;bits 7..4 <- 1, clear msn xxxxCCCC
ORL A, #00Fh ;Don't affect bits 0-3, clear lsn 3210xxxx
ANL DATA, A ;High nibble to display 3210CCCC
CLR RS
SETB EN
NOP
CLR EN
ACALL Delay50us
RET
WRITE_TEXT
PUSH ACC ;Save A for low nibble
MOV B, DATA ; DDDDCCCC
ORL B, #0F0h ;bits 7..4 <- 1, clear msn xxxxCCCC
ORL A, #00Fh ;Don't affect bits 0-3, clear lsn 7654xxxx
ANL DATA, A ;High nibble to display 7654CCCC
SETB RS
SETB EN
NOP
CLR EN
POP ACC ;Prepare to send DDDDCCCC
SWAP A ; 32107654
MOV B, DATA ; DDDDCCCC
ORL B, #0F0h ;bits 7..4 <- 1, clear msn xxxxCCCC
ORL A, #00Fh ;Don't affect bits 0-3, clear lsn 3210xxxx
ANL DATA, A ;High nibble to display 3210CCCC
SETB RS
SETB EN
NOP
CLR EN
ACALL Delay50us
CPL P3.3
RET
.end
I don't know where I screwed up. The display doesn't do a thing. I have tested for endless loops and there are none. Can you help me find the error? (and perhaps tell me what I did wrong) Regards jeroen |
| Topic | Author | Date |
| 4 bit LCD trouble | 01/01/70 00:00 | |
| Possible Error | 01/01/70 00:00 | |
| DATA is port EN is pin | 01/01/70 00:00 | |
| Initialization | 01/01/70 00:00 | |
| I think I did initialize correct | 01/01/70 00:00 | |
| Logical operations | 01/01/70 00:00 | |
| Oops, should have been ANL BA | 01/01/70 00:00 | |
| Clobbering your data | 01/01/70 00:00 | |
| topic gone?? | 01/01/70 00:00 | |
| code library | 01/01/70 00:00 | |
| Try LCD Tutorial in tutorials section | 01/01/70 00:00 | |
| Tutorial uses 2 ports | 01/01/70 00:00 | |
| previous comments... | 01/01/70 00:00 | |
| All tested an nailed the problem | 01/01/70 00:00 | |
| yes, timing | 01/01/70 00:00 | |
Some code shortening: | 01/01/70 00:00 |



