Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Driving LCD in 4-bit mode

Status
Not open for further replies.

mig29fulcrum

Junior Member level 1
Joined
Sep 29, 2011
Messages
16
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,391
Hi...
I'm trying to drive LCD in 4-bit mode but it doesn't work,I'm completely confused,here is my code.
tnx...
Code:
		LIST P=PIC18F4550
	#INCLUDE P18F4550.INC
	CONFIG FOSC=INTOSC_EC
	CONFIG WDT=OFF
LCDCTRL EQU PORTC
LCDDATA EQU PORTD
RS      EQU RC0
E		EQU RC1
BUFFER  EQU 0X0A
LN		EQU 0X0B
HN 		EQU 0X0C
;---------------mian program-------------
	ORG 0H
	MOVLW 0X62
	MOVWF OSCCON
	RCALL LCD_INIT
	RCALL LCD_WRITE
	BRA   $
;--------------LCD initialization---------
LCD_INIT
	CLRF  TRISD
	CLRF  TRISC
	BCF   LCDCTRL,E
	RCALL POWER_DELAY
	MOVLW 0X28			; Set 4-bit mode, 2 lines
	RCALL COMMAND
	RCALL POWER_DELAY
	MOVLW  0X0F			;lcd on/cursor blinking
	RCALL COMMAND
	RCALL DELAY
	MOVLW 0X01			;clear display
	RCALL COMMAND
	RCALL DELAY
	MOVLW 0X06			;cursor auto inc
	RCALL COMMAND
	RCALL DELAY
	MOVLW 0X80			; zero display address
	RCALL COMMAND
	RCALL DELAY
	RETURN
;--------------DATA ISSUE-------------
LCD_WRITE
	RCALL DELAY
	MOVLW  A'B'
	RCALL WRITE
	RCALL DELAY
	MOVLW  A'U'
	RCALL WRITE
	RCALL DELAY
	MOVLW  A'S'
	RCALL WRITE
	RCALL DELAY
	MOVLW  A'H'
	RCALL WRITE
	RCALL DELAY
	MOVLW  A'I'
	RCALL WRITE
	RCALL DELAY
	MOVLW  A'D'
	RCALL WRITE
	RCALL DELAY
	MOVLW  A'O'
	RCALL WRITE
	RETURN
;-------------command mode-----------
COMMAND
	MOVWF BUFFER
	MOVLW 0XF0
	MOVWF HN
	MOVLW 0X0F
	MOVWF LN
	MOVF  BUFFER,W
	ANDWF HN,F
	SWAPF HN,F
	MOVFF HN,LCDDATA
	NOP
	BCF   LCDCTRL,RS
	BSF   LCDCTRL,E
	RCALL JIFFY
	BCF   LCDCTRL,E
	RCALL DELAY
	MOVF  BUFFER,W
	ANDWF LN,F
	MOVFF LN,LCDDATA
	NOP
	BSF   LCDCTRL,E
	RCALL JIFFY
	BCF   LCDCTRL,E
	RETURN
;------------data mode-----------
WRITE
	MOVWF BUFFER
	MOVLW 0XF0
	MOVWF HN
	MOVLW 0X0F
	MOVWF LN
	MOVF  BUFFER,W
	ANDWF HN,F
	SWAPF HN,F
	MOVFF HN,LCDDATA
	NOP
	BSF   LCDCTRL,RS
	BSF   LCDCTRL,E
	RCALL JIFFY
	BCF   LCDCTRL,E
	RCALL DELAY
	MOVF  BUFFER,W
	ANDWF LN,F
	MOVFF LN,LCDDATA
	NOP
	BSF   LCDCTRL,E
	RCALL JIFFY
	BCF   LCDCTRL,E
	RETURN
;------------------(50msec)---------
POWER_DELAY
	MOVLW 0X3D
	MOVWF TMR0L
	RCALL GENERAL_DELAY
	RETURN
;------------------(4.1msec)--------------
DELAY
	MOVLW 0XF0
	MOVWF TMR0L
	RCALL GENERAL_DELAY
	RETURN
;------------------(256usec)------------
JIFFY
	MOVLW 0XFF
	MOVWF TMR0L
	RCALL GENERAL_DELAY
	RETURN
;------------general delay--------
GENERAL_DELAY
	MOVLW B'01000111'
	MOVWF T0CON
	BCF   INTCON,TMR0IF
	BSF   T0CON,TMR0ON
COUNT
	BTFSS INTCON,TMR0IF
	BRA   COUNT
	BCF   T0CON,TMR0ON
	RETURN
	END
 

there is one come problem of contrast.. when you power up LCD you should be able to see bars(black blocks) if not then adjust the contrast
 

Can you post or upload a schematic of the LCD interface with the PIC?

Have you tied the unused data lines to ground?

BigDog
 

Yes i have.Does my code itself have mistake?because i tested above code in 8-bit mode with the same initialization(0x38instead of 0x28)but command subroutine
and write subroutines was different and i think these parts of my code are malfunction.What's your idea?What about my delays?
here is my schematic
tnx
 

When writing driver code for LCDs, initialization is everything. So, if the LCD is not initialized properly your dead in the water.

I would recommend utilizing the R/W line so that you can monitor the busy flag rather than depend on software delays.

Here is an example in PIC assembly demonstrating the use of the busy flag:

**broken link removed**

BigDog
 
Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top