View previous topic :: View next topic |
Author |
Message |
mcad
Joined: 25 Nov 2007 Posts: 48
|
Display Strings on LCD Screen |
Posted: Mon Nov 26, 2007 1:56 pm |
|
|
Hi All,
I wan to display a string on the LCD Screen. For this, I used the lcd_putc() function, but there is nothing appeared on the screen.
So, would you please explain me why ?
And would you please suggest me any alternative function to display strings on the LCD Screen ?
Thanks,
Regards |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Nov 26, 2007 2:07 pm |
|
|
Quote: |
I want to display a string on the LCD Screen. For this, I used the
lcd_putc() function, but there is nothing appeared on the screen. |
Post a small test program that shows how are trying to use lcd_putc()
to display a string.
Example of a small test program:
http://www.ccsinfo.com/forum/viewtopic.php?t=25994&start=3 |
|
|
mcad
Joined: 25 Nov 2007 Posts: 48
|
|
Posted: Mon Nov 26, 2007 2:17 pm |
|
|
My code is as the following, sir.
Code: | taken back for a while |
Last edited by mcad on Mon Nov 26, 2007 5:54 pm; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Nov 26, 2007 2:47 pm |
|
|
You don't have a #fuses statement. You should always have one.
Add one, as shown below, and try it again.
Code: | #include <16F877.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <LCD.C> |
|
|
|
mcad
Joined: 25 Nov 2007 Posts: 48
|
|
Posted: Mon Nov 26, 2007 3:08 pm |
|
|
Is the only problem derived from fuse derictive, sir ? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Nov 26, 2007 3:21 pm |
|
|
Always show a complete test program. For example, if you are missing
the "NOLVP" fuse, the PIC can lock-up. Nothing will work. |
|
|
mcad
Joined: 25 Nov 2007 Posts: 48
|
|
Posted: Mon Nov 26, 2007 3:36 pm |
|
|
Sir, I mean can I use the lcd_putc with strings ?
It seems that it is only used with chars. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Nov 26, 2007 3:45 pm |
|
|
Did you see my example program ? Of course you can use it with strings.
However, they are constant strings.
If you want to display a string that is stored in a RAM array, then
use the re-direction feature of printf() in CCS. You can send the
output of the printf() function to the lcd_putc() function. See this
post for an example:
http://www.ccsinfo.com/forum/viewtopic.php?t=20286&start=3 |
|
|
mcad
Joined: 25 Nov 2007 Posts: 48
|
|
Posted: Mon Nov 26, 2007 3:47 pm |
|
|
Ok, sir
Thanks a lot again.
Best wishes
Regards |
|
|
mcad
Joined: 25 Nov 2007 Posts: 48
|
|
Posted: Wed Nov 28, 2007 1:56 am |
|
|
Hi sir,
I heard that printf( ) will output its string via the rs232 port. So, I wonder that without using serial port, can we use printf function ?
Thanks |
|
|
mcad
Joined: 25 Nov 2007 Posts: 48
|
|
Posted: Wed Nov 28, 2007 3:41 am |
|
|
Hi all,
I am now trying to execute the followng code. But it does not display anything on the lcd screen.
Would anyone please help me ?
Code: |
taken back for a while
|
Last edited by mcad on Thu Nov 29, 2007 6:46 am; edited 1 time in total |
|
|
Audi80
Joined: 07 Sep 2007 Posts: 41
|
|
Posted: Wed Nov 28, 2007 4:51 am |
|
|
Hi there mcad use this example with flexy_lcd.c its working!!!
Don´t forget to check the lcd control pins they are described in the lcd driver.
Code: | #include <16F876A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <flexy_lcd.c>
#include <stdio.h>
//////////////////////////////////////////////
char cartao[10];
int a=0;
char aux;
//////////////////////////////////////////////
void escreve_no_lcd();
//////////////////////////////////////////////
#int_rda
void serial_isr() {
output_high(PIN_B3);
aux=getc();
if(aux=='0'||aux=='1'||aux=='2'||aux=='3'||aux=='4'||aux=='5'||aux=='6'||aux=='7'||aux=='8'||aux=='9'){
cartao[a]=aux;
++a;
}
if(a==10){
a=0;
escreve_no_lcd();
}
delay_ms(400);
output_low(PIN_B3);
}
void main() {
lcd_init();
lcd_putc("\fPasse o cartão!!!\n");
enable_interrupts(global);
enable_interrupts(int_rda);
while(true);
}
void escreve_no_lcd(){
int i;
for(i=0;i<strlen(cartao);++i){
lcd_putc(cartao[i]);
}
lcd_putc('\n');
} |
And the driver...
Code: | // flex_lcd.c
// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver. Change these
// pins to fit your own board.
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_E PIN_B2
#define LCD_RS PIN_B1
//#define LCD_RW PIN_B3
// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.
//#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
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
};
//-------------------------------------
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);
}
//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine. For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.
#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
//---------------------------------------
// Read a byte from the LCD and return it.
#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
//----------------------------------------
// Send a byte to the LCD.
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;
}
}
//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;
lcd_gotoxy(x,y);
// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);
return(value);
}
#endif
|
Don´t forget to check your lcd contrast too it may be to light and you can´t see anything. Keep on the good work |
|
|
mcad
Joined: 25 Nov 2007 Posts: 48
|
|
Posted: Wed Nov 28, 2007 5:10 am |
|
|
Thank you for this,
but I especially want to see where I am making mistakes.
Would any one please help me ?
When I used the above code, there is no any action occured in the boards and the LCD but also there is no any error occured in the program.
I got crazy and stop working on it. Now, I am waiting anyone who can help me on this.
Thanks |
|
|
Audi80
Joined: 07 Sep 2007 Posts: 41
|
|
Posted: Wed Nov 28, 2007 5:33 am |
|
|
There can be many mistakes. i.e. if you only change one control pin of the lcd it will not work if your lcd contrast is to low you think that is not working but it is the only thing is that you cant see it. There may be other problems like your LCD may not be properly connected with vcc and gnd or the A-K connection. Check everything first... |
|
|
mcad
Joined: 25 Nov 2007 Posts: 48
|
|
Posted: Wed Nov 28, 2007 1:12 pm |
|
|
Any other suggestions ? |
|
|
|