| ??? 03/22/12 18:10 Read: times |
#186818 - 4 Bit LCD |
I need help interfacing an LCD With an 8051 in 4 bit mode. I have it working using P1.4 1.5 1,5 p1.7 but need to use p1.0-p1.3. any help would be much appreciated
...$MOD51 ; This includes 8051 definitions for the Metalink assembler
; Please insert your code here.
; Please insert your code here.
DB4 EQU P1.4
DB5 EQU P1.5
DB6 EQU P1.6
DB7 EQU P1.7
EN EQU P3.4
RS EQU P3.5
RW EQU P3.6
DATA1 EQU P1
INIT_LCD:
CLR RS
CLR RW
CLR EN
SETB EN
MOV DATA1,#28h
CLR EN
LCALL WAIT_LCD
MOV A,#28h
LCALL WRITE_2_NIBBLES
LCALL WAIT_LCD
MOV A,#0Eh
LCALL WRITE_2_NIBBLES
LCALL WAIT_LCD
MOV A,#06h
LCALL WRITE_2_NIBBLES
LCALL WAIT_LCD
;program////////////////////////////////////////////////////
main:
LCALL CLEAR_LCD ;clearing lcd.
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT ;sending welcome msg to lcd.
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'M'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
;Calling delay.
jmp main
;////////////////////////////////////////////////////////////
WRITE_TEXT:
SETB RS
LCALL WRITE_2_NIBBLES
LCALL WAIT_LCD
RET
WAIT_LCD: ret ;; Something wrong with this sub
CLR EN ;bring EN low after every instruction
CLR RS ;It's a command
SETB RW ;it's a read command
;; MOV dta, #0FFH ;Set all pins(P1) High initially
SETB EN ;Clock Out Command To LCD
;; MOV A, dta ;Read the return value
;; JB ACC.7, WAIT_LCD ;if bit 7 high, LCD Still busy
CLR EN ;Finish the command
CLR RW ;turn off RW for future commands
RET ;return
WRITE_2_NIBBLES:
PUSH ACC ;Save A for low nibble
ORL DATA1,#0F0h ;Bits 4..7 <- 1
ORL A,#0Fh ;Don't affect bits 0-3
ANL DATA1,A ;High nibble to display
SETB EN
CLR EN
POP ACC ;Prepare to send
SWAP A ;...second nibble
ORL DATA1,#0F0h ; Bits 4...7 <- 1
ORL A,#0Fh ; Don't affect bits 0...3
ANL DATA1,A ;Low nibble to display
SETB EN
CLR EN
RET
CLEAR_LCD:
CLR RS
MOV A,#01h
LCALL WRITE_2_NIBBLES ;Write A as two separate nibbles to LCD
LCALL WAIT_LCD
RET
READ_2_NIBBLES:
ORL DATA1, #0F0h ;Be sure to release datalines (set outputlatches
;to '1') so we can read the LCD
SETB EN
MOV A,DATA1 ;Read first part of the return value (high nibble)
CLR EN
ANL A,#0F0h ;Only high nibble is usable
PUSH ACC
SETB EN
MOV A,DATA1 ;Read second part of the return value (low nibble)
CLR EN
ANL A,#0F0h ;Only high nibble is usable
SWAP A ;Last received is actually low nibble, so put it in place
MOV R7,A
POP ACC
ORL A,R7 ;And combine it with low nibble
RET
line1: CLR RS
MOV A,#80h
LCALL WRITE_2_NIBBLES ;Write A as two separate nibbles to LCD
LCALL WAIT_LCD
RET
line2: CLR RS
MOV A,#0C0h
LCALL WRITE_2_NIBBLES ;Write A as two separate nibbles to LCD
LCALL WAIT_LCD
ret
END
|
| Topic | Author | Date |
| 4 Bit LCD | 01/01/70 00:00 | |
| I am no sherlock Holmes, but ... | 01/01/70 00:00 | |
| LCD | 01/01/70 00:00 | |
| Did you think about accesses using DATA1? | 01/01/70 00:00 | |
| lcd | 01/01/70 00:00 | |
| So you found a solution ... | 01/01/70 00:00 | |
| LCD 4 BIT | 01/01/70 00:00 | |
| where did you get that idea? | 01/01/70 00:00 | |
| Using Read Cycle to LCD | 01/01/70 00:00 | |
| of course, you can not use a signal that is not there | 01/01/70 00:00 | |
| busy flad check | 01/01/70 00:00 | |
| Why not solve your problem BEFORE trying to save pins? | 01/01/70 00:00 | |
Premature optimisation | 01/01/70 00:00 |



