Emonk Posted July 17, 2010 Report Share Posted July 17, 2010 (edited) I use the code in the attachment, 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?? :smile: Thanks for your help! here does the program stay too: ;********************************************************************** ; * ; 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 July 17, 2010 by Emonk Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.