0

Hi all,

I use the code below, and it's my idea it will give me on my LCDisplay the letters "Camil" (and yes, that is my name)
All the first subroutines i just copied form http://home.iae.nl/users/pouweha/lcd/lcd2.shtml - it has to work.
From label start i did make anything myself.
I'm sure i did connect the LCD and the PIC right, and i am sure the contrast is OK.

I just think i don't understand how to use the subroutines.

What happens is the following: the backlight does work, but there isn't any character.

What's the problem - how do I solve it?

And: I'm dutch, and my english isn't very well - could you please try to make your sentences easy?? :)

Thanks for your help!

;**********************************************************************
;                                                                     *
;    Filename:	    LCDisplay test.asm                                *
;    Date:          17/7/2010                                         *
;    File Version:  v1.0                                              *
;                                                                     *
;    Author:        Camil Staps                                       *
;    Company:       none                                              *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files Required: P16F84A.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;**********************************************************************


	list      p=16F84A            ; list directive to define processor
	#include <p16F84A.inc>        ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;**********************************************************************
		ORG     0000h             ; processor reset vector
  		GOTO    start		      ; go to beginning of program
		ORG     0004h             ; interrupt vector location
		GOTO	start
		
;**********************************************************************
lcdinit		
			LCD_DATA		EQU		06h		;	PORTB
			LCD_DATA_TRIS	EQU		86h		;	TRISB
			LCD_CTRL		EQU		05h		;	PORTA
			LCD_TEMP		EQU		0x020	
			DELAY			EQU		0x023
			X_DELAY			EQU		0x024
			;	PORTA Control Bits
			LCD_E			EQU		02h		;	Enable
			LCD_RW			EQU		01h		;	Read/Write
			LCD_RS			EQU		00h		;	Register Select
			CLRF	LCD_CTRL		;	all RA on 0
			MOVLW	0x01E
			CALL	X_DELAY500
			MOVLW	0x038
			CALL	lcdputcmd
			MOVLW	0x000
			CALL	lcddmode		;	disp.off, curs.off, noblink
			CALL	lcdclear
			MOVLW	0x004
			CALL	lcddmode		;	disp.on, curs.off
			MOVLW	0x002
			CALL	lcdemode		;	auto-inc (shift-cursor)
			RETURN

;**********************************************************************
;Busy Flag
lcdbusy		BSF		03h,05h				;	bank 1
			MOVLW	0x0FF
			MOVWF	LCD_DATA_TRIS		;	PORTB input
			BCF		83h,05h				;	bank 0
			BCF		LCD_CTRL,LCD_RS		;	LCD Command Mode
			BSF		LCD_CTRL,LCD_RW		;	Setup busy flag
			BSF		LCD_CTRL,LCD_E		;	LCD Enable hoog
			MOVF	LCD_DATA,0
			BCF		LCD_CTRL,LCD_E		;	LCD Enable low
			ANDLW	0x080				;	check busy flag, high=busy
			BTFSS	03h,02h				;	Zero Flag
			GOTO	lcdbusy				;	still busy...
lcdnotbusy	BCF		LCD_CTRL,LCD_RW		
			BSF		03h,05h
			CLRF	LCD_DATA_TRIS		;	PORTB output
			BCF		83h,05h
			RETURN

;Clear Display
lcdclear	MOVLW	0x001
			CALL	lcdputcmd
			RETURN

;Cursor Home
lcdhome		MOVLW	0x002
			CALL	lcdputcmd
			RETURN

;Entry Mode
lcdemode	ANDLW	0x003
			IORLW	0x004
			CALL	lcdputcmd
			RETURN

;Display Mode
lcddmode	ANDLW	0x007
			IORLW	0x008
			CALL	lcdputcmd
			RETURN

;Set Character generator RAM address
lcdscga		ANDLW	0x03F
			IORLW	0x040
			CALL	lcdputcmd
			RETURN

;Set Display data RAM address
lcdsdda		IORLW	0x080
			CALL	lcdputcmd
			RETURN

;Get address counter contents
lcdgaddr	BSF		03h,05h
			MOVLW	0x0FF				;	PORTB input
			MOVWF	LCD_DATA_TRIS
			BCF		83h,05h
			BCF		LCD_CTRL,LCD_RS		;	command mode
			BSF		LCD_CTRL,LCD_RW		;	setup busy flag
			BSF		LCD_CTRL,LCD_E		;	Enable high
			MOVF	LCD_DATA,0			;	data to W register
			BCF		LCD_CTRL,LCD_E		;	Enable low
			ANDLW	0x07F
			BCF		LCD_CTRL,LCD_RW
			BSF		03h,05h
			CLRF	LCD_DATA_TRIS		;	PORTB output
			BCF		83h,05h
			RETURN

;Write Character
lcdputchar	MOVWF	LCD_TEMP			;	char is in W
			CALL	lcdbusy
			BCF		LCD_CTRL,LCD_RW		;	Read mode
			BSF		LCD_CTRL,LCD_RS		;	Data mode
			BSF		LCD_CTRL,LCD_E		;	Enable high
			MOVF	LCD_TEMP,0			;	char back to W
			MOVWF	LCD_DATA			;	data to LCD
			BCF		LCD_CTRL,LCD_E		;	Enable low
			RETURN

;Write Command
lcdputcmd	MOVWF	LCD_TEMP			;	Command is in W
			CALL	lcdbusy
			BCF		LCD_CTRL,LCD_RW		;	Read mode
			BCF		LCD_CTRL,LCD_RS		;	Command mode
			BSF		LCD_CTRL,LCD_E		;	Enable high
			MOVF	LCD_TEMP,0			;	char back to W
			MOVWF	LCD_DATA			;	command to LCD
			BCF		LCD_CTRL,LCD_E		;	Enable low
			RETURN

DELAY500	MOVLW	D'165'
			MOVWF	DELAY
DELAY500_LOOP
			DECFSZ	DELAY,1
			GOTO	DELAY500_LOOP
			RETURN

X_DELAY500	MOVWF	X_DELAY
X_DELAY500_LOOP
			CALL	DELAY500
			DECFSZ	X_DELAY,1
			GOTO	X_DELAY500_LOOP
			RETURN

;Here does my program start
start		CALL	lcdinit
			MOVLW	b'01000011'		;	C
			CALL	lcdputchar
			MOVLW	b'01100001'		;	a
			CALL	lcdputchar
			MOVLW	b'01101101'		;	m
			CALL	lcdputchar
			MOVLW	b'01101001'		;	i
			CALL	lcdputchar
			MOVLW	b'01101100'		;	l
			CALL	lcdputchar
			
loop		GOTO	loop
			
			






		END                     ; directive 'end of program'

Edited by Emonk: [code] tags weren't good

2
Contributors
1
Reply
2
Views
6 Years
Discussion Span
Last Post by alphahr
0

First, are you sure you have an LCD character display using An HD44780x controller, and second, are you sure it is physically set up to run in 8bit/4bit mode? There is a massive amount of surplus displays being dumped on the market in various character widths and line densities that do the same job, but use different display driver chips. If you do not have an industry standard HD44780 display driver on you display, you will have to download the specs for the driver you have and the actual character display manufacturer. Even using the specs for the display driver, I have seen display manufacturers lock them into 4bit mode or 8bit mode. You need all this info to determine how to initialize your display, how your character lines are split and what the character DDRAM display addresses are and what control characters you need.

After that, you're good to go

Raymond

Hi all,

I use the code below, and it's my idea it will give me on my LCDisplay the letters "Camil" (and yes, that is my name)
All the first subroutines i just copied form http://home.iae.nl/users/pouweha/lcd/lcd2.shtml - it has to work.
From label start i did make anything myself.
I'm sure i did connect the LCD and the PIC right, and i am sure the contrast is OK.

I just think i don't understand how to use the subroutines.

What happens is the following: the backlight does work, but there isn't any character.

What's the problem - how do I solve it?

And: I'm dutch, and my english isn't very well - could you please try to make your sentences easy?? :)

Thanks for your help!

;**********************************************************************
;                                                                     *
;    Filename:	    LCDisplay test.asm                                *
;    Date:          17/7/2010                                         *
;    File Version:  v1.0                                              *
;                                                                     *
;    Author:        Camil Staps                                       *
;    Company:       none                                              *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files Required: P16F84A.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;**********************************************************************


	list      p=16F84A            ; list directive to define processor
	#include <p16F84A.inc>        ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;**********************************************************************
		ORG     0000h             ; processor reset vector
  		GOTO    start		      ; go to beginning of program
		ORG     0004h             ; interrupt vector location
		GOTO	start
		
;**********************************************************************
lcdinit		
			LCD_DATA		EQU		06h		;	PORTB
			LCD_DATA_TRIS	EQU		86h		;	TRISB
			LCD_CTRL		EQU		05h		;	PORTA
			LCD_TEMP		EQU		0x020	
			DELAY			EQU		0x023
			X_DELAY			EQU		0x024
			;	PORTA Control Bits
			LCD_E			EQU		02h		;	Enable
			LCD_RW			EQU		01h		;	Read/Write
			LCD_RS			EQU		00h		;	Register Select
			CLRF	LCD_CTRL		;	all RA on 0
			MOVLW	0x01E
			CALL	X_DELAY500
			MOVLW	0x038
			CALL	lcdputcmd
			MOVLW	0x000
			CALL	lcddmode		;	disp.off, curs.off, noblink
			CALL	lcdclear
			MOVLW	0x004
			CALL	lcddmode		;	disp.on, curs.off
			MOVLW	0x002
			CALL	lcdemode		;	auto-inc (shift-cursor)
			RETURN

;**********************************************************************
;Busy Flag
lcdbusy		BSF		03h,05h				;	bank 1
			MOVLW	0x0FF
			MOVWF	LCD_DATA_TRIS		;	PORTB input
			BCF		83h,05h				;	bank 0
			BCF		LCD_CTRL,LCD_RS		;	LCD Command Mode
			BSF		LCD_CTRL,LCD_RW		;	Setup busy flag
			BSF		LCD_CTRL,LCD_E		;	LCD Enable hoog
			MOVF	LCD_DATA,0
			BCF		LCD_CTRL,LCD_E		;	LCD Enable low
			ANDLW	0x080				;	check busy flag, high=busy
			BTFSS	03h,02h				;	Zero Flag
			GOTO	lcdbusy				;	still busy...
lcdnotbusy	BCF		LCD_CTRL,LCD_RW		
			BSF		03h,05h
			CLRF	LCD_DATA_TRIS		;	PORTB output
			BCF		83h,05h
			RETURN

;Clear Display
lcdclear	MOVLW	0x001
			CALL	lcdputcmd
			RETURN

;Cursor Home
lcdhome		MOVLW	0x002
			CALL	lcdputcmd
			RETURN

;Entry Mode
lcdemode	ANDLW	0x003
			IORLW	0x004
			CALL	lcdputcmd
			RETURN

;Display Mode
lcddmode	ANDLW	0x007
			IORLW	0x008
			CALL	lcdputcmd
			RETURN

;Set Character generator RAM address
lcdscga		ANDLW	0x03F
			IORLW	0x040
			CALL	lcdputcmd
			RETURN

;Set Display data RAM address
lcdsdda		IORLW	0x080
			CALL	lcdputcmd
			RETURN

;Get address counter contents
lcdgaddr	BSF		03h,05h
			MOVLW	0x0FF				;	PORTB input
			MOVWF	LCD_DATA_TRIS
			BCF		83h,05h
			BCF		LCD_CTRL,LCD_RS		;	command mode
			BSF		LCD_CTRL,LCD_RW		;	setup busy flag
			BSF		LCD_CTRL,LCD_E		;	Enable high
			MOVF	LCD_DATA,0			;	data to W register
			BCF		LCD_CTRL,LCD_E		;	Enable low
			ANDLW	0x07F
			BCF		LCD_CTRL,LCD_RW
			BSF		03h,05h
			CLRF	LCD_DATA_TRIS		;	PORTB output
			BCF		83h,05h
			RETURN

;Write Character
lcdputchar	MOVWF	LCD_TEMP			;	char is in W
			CALL	lcdbusy
			BCF		LCD_CTRL,LCD_RW		;	Read mode
			BSF		LCD_CTRL,LCD_RS		;	Data mode
			BSF		LCD_CTRL,LCD_E		;	Enable high
			MOVF	LCD_TEMP,0			;	char back to W
			MOVWF	LCD_DATA			;	data to LCD
			BCF		LCD_CTRL,LCD_E		;	Enable low
			RETURN

;Write Command
lcdputcmd	MOVWF	LCD_TEMP			;	Command is in W
			CALL	lcdbusy
			BCF		LCD_CTRL,LCD_RW		;	Read mode
			BCF		LCD_CTRL,LCD_RS		;	Command mode
			BSF		LCD_CTRL,LCD_E		;	Enable high
			MOVF	LCD_TEMP,0			;	char back to W
			MOVWF	LCD_DATA			;	command to LCD
			BCF		LCD_CTRL,LCD_E		;	Enable low
			RETURN

DELAY500	MOVLW	D'165'
			MOVWF	DELAY
DELAY500_LOOP
			DECFSZ	DELAY,1
			GOTO	DELAY500_LOOP
			RETURN

X_DELAY500	MOVWF	X_DELAY
X_DELAY500_LOOP
			CALL	DELAY500
			DECFSZ	X_DELAY,1
			GOTO	X_DELAY500_LOOP
			RETURN

;Here does my program start
start		CALL	lcdinit
			MOVLW	b'01000011'		;	C
			CALL	lcdputchar
			MOVLW	b'01100001'		;	a
			CALL	lcdputchar
			MOVLW	b'01101101'		;	m
			CALL	lcdputchar
			MOVLW	b'01101001'		;	i
			CALL	lcdputchar
			MOVLW	b'01101100'		;	l
			CALL	lcdputchar
			
loop		GOTO	loop
			
			






		END                     ; directive 'end of program'
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.