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'