|
|
View previous topic :: View next topic |
Author |
Message |
problem with flex_lcd.c Guest
|
is not working with me?! |
Posted: Sun Oct 04, 2009 8:11 am |
|
|
Hey
I have a problem , my LCD is not working with the flex_lcd.c driver.
I use pickit2 debug express and my pic number is 16f887A
and my lcd module is Displaytech Ltd LCD MODULE 162F BC BC.
Code: |
#define LCD_DB4 PIN_B0
#define LCD_DB5 PIN_B1
#define LCD_DB6 PIN_B2
#define LCD_DB7 PIN_B3
#define LCD_E PIN_B5
#define LCD_RS PIN_B4
#define LCD_RW PIN_B6
|
plz hlp |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Oct 04, 2009 1:32 pm |
|
|
Quote: |
#define LCD_DB4 PIN_B0
#define LCD_DB5 PIN_B1
#define LCD_DB6 PIN_B2
#define LCD_DB7 PIN_B3
#define LCD_E PIN_B5
#define LCD_RS PIN_B4
#define LCD_RW PIN_B6
|
The Pickit2 uses pins B6 and B7 for Programming and Debugging.
Don't use those pins for the LCD. Choose another pin for LCD_RW. |
|
|
problem with flex_lcd.c Guest
|
|
Posted: Sun Oct 04, 2009 3:04 pm |
|
|
thanks
I have another problem.
I think my pic is burned
coz when I turn the power supply
it was 11 volts and something
and when I build the program they said
"PKWarn0003: Unexpected device ID: Please verify that a PIC16F887 is correctly installed in the application. (Expected ID = 0x2080, ID Read = 0x0)
"
does my pic burned? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Oct 04, 2009 3:18 pm |
|
|
Probably. Get a new PIC. |
|
|
Guest
|
|
Posted: Sun Oct 04, 2009 4:01 pm |
|
|
OOOOOOOOOOOH!!
nooo
I'm going crazy
this mean
I must waaaaaaaait for at least one or two weeks
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_B0
#define LCD_DB5 PIN_B1
#define LCD_DB6 PIN_B2
#define LCD_DB7 PIN_B3
#define LCD_E PIN_B5
#define LCD_RS PIN_B4
// 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
|
Code: |
#include <16F887.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 4000000)
#include "flex_lcd.c"
//==========================
void main()
{
lcd_init(); // Always call this first.
while(1){
output_high(PIN_B5);
delay_ms(1000);
output_low(PIN_B5);
printf(lcd_putc, "Hello World.");
}
}
|
If I connect RW with the GND
how the connections will be?
and there is any error in my main code?? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Oct 04, 2009 4:24 pm |
|
|
Quote: | // 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 |
It says what you should do. Comment out the line above.
Quote: | while(1){
output_high(PIN_B5);
delay_ms(1000);
output_low(PIN_B5);
printf(lcd_putc, "\fHello World.");
} |
If you write to the LCD in a loop, then add \f in the printf to clear the
lcd screen before writing each time, as shown above in bold. |
|
|
Guest
|
|
Posted: Tue Oct 06, 2009 3:50 am |
|
|
Hi,
there is any manual for understand all this staff and language you are talking about?
I mean for example "define LCD_DB4 PIN_B0"
Thanks |
|
|
Ttelmah Guest
|
|
Posted: Tue Oct 06, 2009 7:39 am |
|
|
That is not a language.
define LCD_DB4 PIN_B0
means nothing...
#define (note the '#' - syntax is _everything_), is a _macro_, in the C language, saying 'when you see the following text, replace it with the next text'.
So:
#define LCD_DB4 PIN_B0
means, when the text 'LCD_DB4' is seen, replace it with 'PIN_B0'.
The 'meaning' of 'PIN_B0', is specific to CCS, and is itself 'defined' in the include file for the processor.
The LCD controller itself, has eight 'data' lines called DB0 to DB7. Look at the datas sheet. When you use 4bit mode to talk to the LCD, only the top 4 of these are used, DB4 to DB7. The defines are saying what physical pin on the PIC is connected to what pin on the LCD, assigning 'names' to these, for the LCD driver to use.
Best Wishes |
|
|
bkamen
Joined: 07 Jan 2004 Posts: 1615 Location: Central Illinois, USA
|
|
Posted: Tue Oct 06, 2009 8:44 pm |
|
|
Always buy 2 MCU's when experimenting. (or 3 if you're prone to burning stuff up)
Go to Borders and pick up any book on programming in C.
Personally, (more for laughs and reference) I have the original:
"The C Programming Language" from Kernighan and Ritchie.
ISBN 0-13-110362-8
Cheers,
-Ben _________________ Dazed and confused? I don't think so. Just "plain lost" will do. :D |
|
|
DeadPostPoster Guest
|
Wired Wrong |
Posted: Sun Jan 10, 2010 3:16 pm |
|
|
I know this post is dead, but, I wanted to point something out for anyone that stumbles across it.
The error: PKWarn0003: Unexpected device ID: Please verify that a PIC16F887 is correctly installed in the application. (Expected ID = 0x2080, ID Read = 0x0)
This error usually indicates that you wired the header circuit for your ICSP wrong.
It's worth a look! |
|
|
|
|
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
|