|
|
View previous topic :: View next topic |
Author |
Message |
zamzam23
Joined: 25 Aug 2010 Posts: 47
|
hi. when I separate my lcd from my main board, there is prb. |
Posted: Mon Jul 25, 2011 11:51 pm |
|
|
this is my lcd 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_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7
#define LCD_E PIN_D3
#define LCD_RS PIN_B2
#define LCD_RW PIN_D2
// 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
0x0C,//0xf, // Display on
1, // Clear display
6 // Increment cursor
};
/*
byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xC, 1,6};
Value Cursor Blink
0x0C Off Off
0x0D Off On
0x0E On Off
0x0F On On
*/
//-------------------------------------
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_setcursor_vb(short visible, short blink) {
lcd_send_byte(0, 0xC|(visible<<1)|blink);
}
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
|
when I separate my lcd display from my main board, everything is stopped and don't run. whereas I didnT use lcd commands when I seperate the lcd from my board.
What is that's reason and what is the solution? |
|
|
MiniMe
Joined: 17 Nov 2009 Posts: 50
|
|
Posted: Tue Jul 26, 2011 4:15 am |
|
|
Hi, zamzam23
You need to set up some registers inside LCD, before display something on display. To do that u need simply run function: void lcd_init(void) after every time you connect the LCD to your board. |
|
|
zamzam23
Joined: 25 Aug 2010 Posts: 47
|
|
Posted: Tue Jul 26, 2011 4:39 am |
|
|
no problem with showing characters on lcd. my problem is when I keep apart my lcd display from the main board, my cpu is turn off but when I touch the pin's of lcd, the cpu is turn on again. I think this code is the problem but the programmer of the flex_ldc.c must reply this question how can I fix it?
while(bit_test(lcd_read_byte(),7)) ; |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Tue Jul 26, 2011 5:01 am |
|
|
It sounds like a hardware problem NOT a software problem. If the LCD worked fine when on the main board and you only have problem when it's away, then your wiring is not correct.Recheck all the connections(probably 10, 4 data,3 control ,3 power ?). |
|
|
MiniMe
Joined: 17 Nov 2009 Posts: 50
|
|
Posted: Tue Jul 26, 2011 5:05 am |
|
|
I do not have much experience with similar problems.
Things i can think of:
- If you have one or more power sources u must keep grounds together.
- Check your wire connections, you might think.. believe maybe, that tease soldering are well done, but often the problems like that are originated from bad contact point.
- Check your contrast pin voltage. Use a potentiometer voltage divider.
- Write simplest program to test your hardware with it.
- if you desperate enough, then just re do everything. Usually its the simplest solution. |
|
|
zamzam23
Joined: 25 Aug 2010 Posts: 47
|
|
Posted: Tue Jul 26, 2011 5:08 am |
|
|
My all project works fine( if the connections are wrong, the system doesnT work).
For example my project works for 3-4 hours and then just stopped one where. Then sometimes I touch the lcd pins and it works again sometimes doesn't work. If that time I reset my card and it works again.
So I thought that my lcd driver locked down somewhere. I am tring to find this. Thanks for all replies. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jul 26, 2011 12:09 pm |
|
|
Quote: |
Then sometimes I touch the lcd pins and it works again sometimes
doesn't work. So I thought that my lcd driver locked down somewhere.
must reply this question how can I fix it?
while(bit_test(lcd_read_byte(),7)) ;
|
The Flex LCD driver can be configured so it doesn't read the lcd's busy bit.
This is how to do it:
1. Comment out this line, as shown below:
Code: | // #define USE_LCD_RW 1
|
2. Disconnect the the R/W signal from the PIC. Then connect the R/W pin
on the LCD to ground. Leave PIC pin D2 not connected to anything.
Now you are using a "6-pin" LCD interface.
3. Re-compile the program and test it.
If it's not easy to disconnect the R/W pin from the PIC, there is another
way to do it. Just add a line of code at the start of main() to set the
R/W pin to a logic 0 level. Example:
Code: |
output_low(LCD_RW);
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19506
|
|
Posted: Tue Jul 26, 2011 2:47 pm |
|
|
zamzam23 wrote: | My all project works fine( if the connections are wrong, the system doesnT work).
For example my project works for 3-4 hours and then just stopped one where. Then sometimes I touch the lcd pins and it works again sometimes doesn't work. If that time I reset my card and it works again.
So I thought that my lcd driver locked down somewhere. I am tring to find this. Thanks for all replies. |
Seriously, there are levels of 'wrong connection'. I'd have to agree you have a hardware problem. Probably most of the pins are going to the right places (which is why it works), but at least one is resistive.
Or _grounds_, as the first suggestion from MiniMe. A lot of CMOS components, will 'apparently work', without either ground, or +5v connections. They work, because the internal diodes in the CMOS gates, and the capacitance on the board, act together, so the capacitor's +ve end charges to the highest voltage coming from any of the input signals, and the -ve end charges to the lowest voltage coming from any of the signals. Result is, the circuit powers up, but powered from the logic signals, and with very little noise margin on the signals, so a tiny glitch then stops it working.
You really need to physically 'bus through' each connection wire.
Best Wishes |
|
|
zamzam23
Joined: 25 Aug 2010 Posts: 47
|
|
Posted: Wed Jul 27, 2011 12:18 am |
|
|
thanks for your replies. I have solved the problem with PCM programmer suggestions. Ttelmah and other friends, thanks you all too. |
|
|
|
|
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
|