PDA

View Full Version : LCD and PIC18F2685 - Weird LCD behavior



Castor
- 28th April 2008, 14:10
I'm using the 28 pin demo board from Microchip (see schematic below) with a 18F2685pic, MPLAB IDE and Picbasic pro v2.47, and ICD2 for programming. The LCD pins are connected in the default manner. I'm using the internal oscilator @8 MHZ and the config file in my pbp directory is modified accordingly, that is:

__CONFIG _CONFIG1H, _OSC_IRCIO67_1H

The behavior the LCD is experiencing is bizzare: First, it shows black boxes on the first line (so everything fine until now). When releasing from reset, still black boxes on the first line. If I take LCD's Vdd out for a second I start seeing weird characters. Plug it back in, weird characters again. When I try to output "123456789" I get "1230123"(that is, with the vdd plugged in). If I try to output "hello", werid characters again.

Some of the pins on the demo board are occupied with the default components(leds, pot) but I tried to stay away these pins. Just RB3 (LCD E(nable) is on the same pin as one of the board's LED)

and the code:


' display a message on the lcd
DEFINE OSC 8
DEFINE LCD_DREG PORTB ' portb is the port used for data lines
DEFINE LCD_DBIT 4 'the pin on port connected to LCD pin DB4
DEFINE LCD_RSREG PORTA 'pic port used for the RS line
DEFINE LCD_RSBIT 4 ' port pin where RS pin is connected
DEFINE LCD_EREG PORTB ' PIC port where E pin is connected
DEFINE LCD_EBIT 3 ' port pin where E pin is connected
DEFINE LCD_BITS 4 ' 4 bit mode
DEFINE LCD_LINES 2 ' 2 LCD lines
DEFINE LCD_COMMANDUS 2000 'delay between LCD commands
DEFINE LCD_DATAUS 50 'delay between data sent
adcon1=7
trisb=0 ' port b all outputs
trisa=0 ' port a all outputs
intcon2.7=0 'enable pull ups
OSCCON = %01110000
'---main program

repeta:
high portb.0 ' light led to see when main loop is running
LCDOUT $fe,1 ' Clears LCD
LCDOUT $fe,2, "hello" ' Returns to beginning of line 1 and writes "string"
pause 1000
goto repeta


The lcd is a optorex dmc16207 which is Hitachi HD44780 compatible

skimask
- 28th April 2008, 14:28
Try this:


DEFINE OSC 8
DEFINE LCD_DREG PORTB ' portb is the port used for data lines
DEFINE LCD_DBIT 4 'the pin on port connected to LCD pin DB4
DEFINE LCD_RSREG PORTA 'pic port used for the RS line
DEFINE LCD_RSBIT 4 ' port pin where RS pin is connected
DEFINE LCD_EREG PORTB ' PIC port where E pin is connected
DEFINE LCD_EBIT 3 ' port pin where E pin is connected
DEFINE LCD_BITS 4 ' 4 bit mode
DEFINE LCD_LINES 2 ' 2 LCD lines
DEFINE LCD_COMMANDUS 2000 'delay between LCD commands
DEFINE LCD_DATAUS 50 'delay between data sent
adcon1=7:trisb=0:trisa=0:intcon2.7=0:osccon=$70
PAUSE 1000
repeta:
high portb.0:LCDOUT $fe,1,$fe,2, "hello":pause 1000:goto repeta

Castor
- 28th April 2008, 14:56
Thanks skimask for the suggestion but unfortunately the output is still the same. Initially black boxes. On "release from reset", still black boxes. If I pull out the LCD Vdd - strange characters, plug it back in, I get character boxes filled with strange characters corresponding to the number of characters I output with LCDOUT and a blinking cursor at the end.

mister_e
- 28th April 2008, 16:53
ADCON1 must be = $0F. If =7 AN9 is still analog.

If you still have problem copy ALL your CONFIG fuse settings here.

skimask
- 28th April 2008, 16:56
ADCON1 must be = $0F. If =7 AN9 is still analog.
Which would likely account for the "0123456789" vs. "012301230" error noted in the 1st post.
Good call...

Castor
- 29th April 2008, 09:55
Eventually I moved the data lines on PORTC and voila, the LCD is displaying characters as it should. Thank you guys for the help.

Here is the working code:



' display a message on the lcd

'--- defines
DEFINE OSC 8
DEFINE LCD_DREG PORTC ' portb is the port used for data lines
DEFINE LCD_DBIT 4 'the pin on port connected to LCD pin DB4
DEFINE LCD_RSREG PORTA 'pic port used for the RS line
DEFINE LCD_RSBIT 4 ' port pin where RS pin is connected
DEFINE LCD_EREG PORTB ' PIC port where E pin is connected
DEFINE LCD_EBIT 3 ' port pin where E pin is connected
DEFINE LCD_BITS 4 ' 4 bit mode
DEFINE LCD_LINES 2 ' 2 LCD lines
DEFINE LCD_COMMANDUS 2000 'delay between LCD commands
DEFINE LCD_DATAUS 50 'delay between data sent

'--- register configs
adcon1=$0F ' all digital i/o
trisb=0 ' portb all outputs
trisa=0 'porta all outputs
trisc=0
intcon2.7=0 ' enable pullups
osccon=$70 ' oscilator configure

'--- main program
PAUSE 1000 ' pause to let the LCD initialise
repeta:
high portb.0 ' light led to see when main loop is running
LCDOUT $fe,1 ' Clears LCD
LCDOUT $fe,2, "hello" ' Returns to beginning of line 1 and writes "string"
LCDOUT $fe, $C0, "world" ' line 2
pause 1000 ' pause to see it
goto repeta ' do this forever