|
|
View previous topic :: View next topic |
Author |
Message |
Adraen
Joined: 12 Apr 2011 Posts: 4
|
LCD Library troubles |
Posted: Tue Apr 12, 2011 11:11 am |
|
|
Hello,
I am trying to get a 8x2 LCD screen working with the LCD library provided by LCD.c and run into some troubles, I don't know if the issue is in hardware or in software but the hardware is fairly basic therefore I'm assuming its software.
So the LCD module I use is a cheap (£5) Fordata Electronic FDCC0802C-FLYYBW-51LK bought from Farnell and I try to use it in a 4bit mode.
The code I use is:
Code: |
#include <18F25K80.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOPUT
#use delay(clock=8MHZ)
#define LCD_ENABLE_PIN PIN_C0
#define LCD_RS_PIN PIN_C2
#define LCD_RW_PIN PIN_C1
#define LCD_DATA4 PIN_A0
#define LCD_DATA5 PIN_A1
#define LCD_DATA6 PIN_A2
#define LCD_DATA7 PIN_A3
#include <LCD.c>
void mcu_init()
{
setup_oscillator(OSC_8MHZ);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_comparator(NC_NC_NC_NC);
#use fast_io(A)
set_tris_a(0);
output_a(0);
}
void main()
{
mcu_init();
output_high(PIN_A6);
lcd_init();
delay_ms(5);
lcd_putc('s');
while (1)
;
}
|
The DB4-DB7 of the LCD screen are assigned to RA0-RA3 the control lines on RC0-RC2. RA6 is assigned to a LED just to signal that the micro is up and running.
One of the weird thing is it looks like the R/W pin is driven high by the screen which as far as I understand it not should be the case. I tried to ground it (the RW pin) but still does not work.
Any Help would be much appreciated.
Regards,
Simon |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9253 Location: Greensville,Ontario
|
|
Posted: Tue Apr 12, 2011 11:45 am |
|
|
You could try the 8 bit mode first to see if it functions OK. There may be a setup problem(timing, command ,?) with your display that is not compatible with the 4 bit mode driver.
I run the flexLCD driver , write only mode, on several LCDs fine... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Apr 12, 2011 11:46 am |
|
|
Make sure you understand the pin numbering method on the LCD.
Viewed from the LCD side of the Fordata board, the top row is
2, 4, 6, 8, 10, 12, 14, 16
and the bottom row is
1, 3, 5, 7, 9, 11, 13, 15.
Also, you have #use fast_io in your code. I don't see that in any CCS
examples that use their lcd.c driver file. I also don't see it in the driver
file. I wouldn't invoke fast_io mode unless you know it can be used.
LCD data sheet:
http://www.farnell.com/datasheets/653672.pdf
---------
Temtronic,
The CCS lcd.c file doesn't support 8-bit mode. It supports "all pins on
one port mode", as an additional mode, but it's still 4-bit data. |
|
|
Adraen
Joined: 12 Apr 2011 Posts: 4
|
|
Posted: Tue Apr 12, 2011 12:34 pm |
|
|
Hi again,
Cheers for the answers,
Well I read the datasheet quite carefully already and the 4 bit mode is suppose to be supported by the screen might try the 8bit mode anyway if I run out of ideas.
About the Pins yes I noticed that the pinning is like you said which is a bit weird ... I will try the fast_io and maybe flexLCD and let you know the result.
cheers guys. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19561
|
|
Posted: Tue Apr 12, 2011 2:36 pm |
|
|
No.
The point is to _not_ use fast_io. The standard drivers require standard_io mode. You have a fast_io line in your code.
Best Wishes |
|
|
Adraen
Joined: 12 Apr 2011 Posts: 4
|
|
Posted: Tue Apr 12, 2011 3:59 pm |
|
|
So,
I reread the flexible LCD post and like Ttelmah and PCM said fast_io should not be used so I disabled it.
So the problem is still the same it does not work unfortunately and the init stay stuck in "while(bit_test(lcd_read_byte(),7)) ;" I tried to ground the R/W and does not work either (I commented the LCD_RW to use delays instead).
To be sure I used a different LCD screen same model also new.
I rewired everything like this:
And the current code is
Code: |
#include <18F25K80.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOPUT
#use delay(clock=8MHZ)
#define LCD_DB4 PIN_A0
#define LCD_DB5 PIN_A1
#define LCD_DB6 PIN_A2
#define LCD_DB7 PIN_A3
#define LCD_E PIN_C0
#define LCD_RS PIN_C2
#define LCD_RW PIN_A1
#define USE_LCD_RW 1
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line
#define BUZZER PIN_A7
#define LED PIN_A6
int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};
#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3
retval = 0;
output_high(LCD_E);
delay_cycles(1);
retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
output_low(LCD_E);
return(retval);
}
#endif
void lcd_send_nibble(int8 nibble)
{
// Note: !! converts an integer expression
// to a boolean (1 or 0).
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}
#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;
output_high(LCD_RW);
delay_cycles(1);
high = lcd_read_nibble();
low = lcd_read_nibble();
return( (high<<4) | low);
}
#endif
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);
#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif
output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init(void)
{
int8 i;
output_low(LCD_RS);
#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif
output_low(LCD_E);
delay_ms(15);
for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
// If the R/W signal is not used, then
// the busy bit can't be polled. One of
// the init commands takes longer than
// the hard-coded delay of 60 us, so in
// that case, lets just do a 5 ms delay
// after all four of them.
#ifndef USE_LCD_RW
delay_ms(5);
#endif
}
}
void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
if(y != 1)
address = lcd_line_two;
else
address=0;
address += x-1;
lcd_send_byte(0, 0x80 | address);
}
void lcd_putc(char c)
{
switch(c)
{
case '\f':
lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1,2);
break;
case '\b':
lcd_send_byte(0,0x10);
break;
default:
lcd_send_byte(1,c);
break;
}
}
/*
#INT_TIMER0
void timer0_isr()
{
output_toggle(BUZZER);
}
*/
// Frequency of interrupt (clock/(4*divisor)) / (256-reload)
void mcu_init()
{
setup_oscillator(OSC_8MHZ);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_comparator(NC_NC_NC_NC);
/*
// Setup the TIMER0 Interrupt
set_timer0(0);
setup_timer_0(RTCC_INTERNAL | RTCC_8_BIT | RTCC_DIV_4);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
*/
//#use fast_io(A)
set_tris_a(0);
set_tris_c(0);
//output_a(0);
}
void main()
{
mcu_init();
//output_high(LED);
lcd_init();
delay_ms(5);
lcd_putc('s');
while (1)
{
/*
enable_interrupts(INT_TIMER0);
delay_ms(1000);
disable_interrupts(INT_TIMER0);
delay_ms(1000);
*/
}
}
|
Thank you again for the time you spent on this.
Simon. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9253 Location: Greensville,Ontario
|
|
Posted: Tue Apr 12, 2011 5:36 pm |
|
|
re: 8 bit mode test vs. 4 bit mode.
Didn't mean to say use the CCS drivers for 8 bit mode. All I do is wire up the 8 data lines to a port, then send the data byte 55x, ( 'U'), then 'pulse ' the E line as required in the LCD data sheet. I have a simple 'hello world 8bit' program. It's small bit easy to check any LCD,setup contrast pin, write only mode,etc. It should take less than 15 minutes to wireup and test any character LCD using a simple preprogrammed PIC like mine.
Some LCDs, while '4 bit mode' capable may require different setup times than what's in the LCD driver. Nothing worse than wasting hours trying to debug the LCD only find the driver needs to be 'tweaked', contrast pin set wrong, etc.
Sounds like this LCD module has an 'odd' pinout and unless wires are colour coded, cross wiring could cause no end of wasted time.
Maybe a weird contrast requirement ??
misDEFINING PICpins is fun as well......
NEVER use fast_io() unless you're an expert, even then it'll get you one day!! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Apr 12, 2011 7:34 pm |
|
|
Quote: |
So the problem is still the same it does not work unfortunately and the
init stay stuck in "while(bit_test(lcd_read_byte(),7)) ;" I tried to ground
the R/W and does not work either (I commented the LCD_RW to use
delays instead).
|
What's your compiler version? Your version may be buggy with the
18F25K80. The version is given at the top of the .LST file, which will
be in your project directory after a successful compilation.
This CCS page shows what a version number looks like:
http://www.ccsinfo.com/devices.php?page=versioninfo |
|
|
Adraen
Joined: 12 Apr 2011 Posts: 4
|
|
Posted: Sat Apr 16, 2011 8:54 am |
|
|
Hello,
So, it is working the screen now display text, the issue was that my potentiometer value for Vo was wrong therefore I reread the datasheet carefully this time.
I don't know if it is like this for every LCD screen but mines have the first line filled with block so you can see something is here when the voltage is correct.
However I have another issue that I really don't understand is that if I connect the data lines to PORTA it doesn't work but if i connect them to PORTC it works fine :/.
Anyway thanks for your help
Edit: looks like its more the control lines on PORTC than data on PORTA that causes the problem |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9253 Location: Greensville,Ontario
|
|
Posted: Sat Apr 16, 2011 9:42 am |
|
|
You have to disable any onchip peripherals to use pins as general purpose digital I/O pins.
Look carefully on the datasheet for you PIC and see what the 'default' use is for the pins you want to use.
Some PICs have defaults of ADC, SPI,etc. that you must disable. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|