View previous topic :: View next topic |
Author |
Message |
xero Guest
|
Clear LCD at the LCD end |
Posted: Sun Sep 28, 2008 1:07 am |
|
|
Hi
I'm running keypad to LCD as code below;
Code: |
#include <16f877a.h>
#use delay (clock = 40000000)
#fuses hs,noprotect,nowdt,nolvp
#BYTE PORTA=5
#BYTE PORTB=6
#BYTE PORTC=7
#include <flex_lcd.c>
#include <kbd44.c>
void main()
{
char n;
set_tris_a (0x0f);
set_tris_b (0);
set_tris_c (0);
lcd_init();
kbd_init();
lcd_putc("\fStart...\n");
delay_ms(500);
lcd_putc("\f");
while(TRUE)
{
n=kbd_getc();
if(n!=0)
{
if(n=='*')
lcd_putc('\f');
else
lcd_putc(n);
}
}
}
|
This program only clear after keypad * pushed.
How to make the program:
1. Move to next line when it reach the end of line 1 and,
2. Clear LCD when it reach the end of line 2 and reset back to (1, 1). |
|
![](templates/subSilver/images/spacer.gif) |
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Mon Sep 29, 2008 10:06 pm |
|
|
Hi xero,
Please read the entire flex_lcd.c driver. All functions are documented in it pretty well ( http://www.ccsinfo.com/forum/viewtopic.php?t=24661 ).
You will have to check for the number of characters you are sending to the LCD. If it exceeds 16 then either use lcd_gotoxy() or a simple \n to goto the next line.
A simple suggestion for implementation would be to have a global 'character counter' variable, and a 'line number' bit.
Implement this in the function lcd_putc(), just before the switch statement. Increment the counter each time this function is called. You could check that the value of the character counter remains below 16. If it is greater than 16, check the line number. Accordingly, inject either a \n or a \f character.
Rohit |
|
![](templates/subSilver/images/spacer.gif) |
xero Guest
|
|
Posted: Tue Sep 30, 2008 1:44 am |
|
|
Thanks for reply. It's really helpful. But the problem is i dont know the right command to count until 16. If try using if (n>16) but nothing. What the right command for me to use?
TQ |
|
![](templates/subSilver/images/spacer.gif) |
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Tue Sep 30, 2008 2:50 am |
|
|
xero:
Declare n as a global int8 and linebit as a global int1 as below:
Code: | int8 n= 0;
int1 linebit = 0; |
n is the counter that counts how many chars you have printed to the line; linebit is the flag that checks the current line number.
Then insert the following before the switch statement in the function lcd_putc() in flex_lcd.c
Code: | if ((n>0) && (linebit==0))
{
lcd_gotoxy(1,2);
n = 16;
linebit=1;
}
if ((n>0) && (linebit==1))
{
lcd_send_byte(0,1);
delay_ms(2);
n = 16;
linebit=0;
}
n--; |
I've used a '--' in the last line since with this the zero flag is checked int he STATUS register of the PIC, and hence it is much faster than using a '++'.
I'm at work and I don't have my PC with me so I can't verify the code functioning, though I think it should do the trick.
Rohit |
|
![](templates/subSilver/images/spacer.gif) |
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Tue Sep 30, 2008 3:36 am |
|
|
xero:
I think you've already used n for the keyboard input. Use a different variable name in the code I've given you. Of course, I don't need to tell you this, but just in case you're tearing your hair out wondering why the code isn't working :-P
Rohit |
|
![](templates/subSilver/images/spacer.gif) |
xero Guest
|
|
Posted: Tue Sep 30, 2008 8:40 pm |
|
|
I have tried codes given but nothing appear on LCD. I already change the n to x as below;
Code: |
void main()
{
char x;
set_tris_a (0x0f);
set_tris_b (0);
set_tris_c (0);
lcd_init();
kbd_init();
lcd_putc("\fStart...\n");
delay_ms(500);
lcd_putc("\f");
while(TRUE)
{
x=kbd_getc();
if(x!=0)
{
if(x=='*')
lcd_putc('\f');
else
lcd_putc(x);
}
}
} |
and for flex_lcd the codes u given added;
Code: |
void lcd_putc(char c)
{
int8 n= 0;
int1 linebit = 0;
if ((n>0) && (linebit==0))
{
lcd_gotoxy(1,2);
n = 16;
linebit=1;
}
if ((n>0) && (linebit==1))
{
lcd_send_byte(0,1);
delay_ms(2);
n = 16;
linebit=0;
}
n--;
switch(c)
|
Sorry if I miss something minor. I'm too new in this.
Anyway I'm very thankful for all your help. |
|
![](templates/subSilver/images/spacer.gif) |
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Wed Oct 01, 2008 12:34 am |
|
|
xero:
A couple of questions, (and I should have probably asked you to do this earlier):
-Post a description your system circuit.
-Which pins are you using for the LCD
-Have you modified flex_lcd.c in any way?
-Have you got an LCD to work before modification/addition of the code I gave you?
xero wrote: | I have tried codes given but nothing appear on LCD.
Code: |
void main()
{
.
.
.
set_tris_a (0x0f);
set_tris_b (0);
set_tris_c (0);
.
.
.
|
|
I think your error lies in this segment of code. flex_lcd requires the use of standard_io and not fast_io. The compiler itself handles setting of the pins as inputs or outputs in the standard mode. By using the statement set_tris you are preventing the compiler from using one of the pins (specifically the R/W pin) as an input-output pin. Therefore, you will have a blank LCD (unless you configure some other parameters in flex_lcd - lets leave this aside).
My suggestion to you is to read http://www.ccsinfo.com/forum/viewtopic.php?t=24661 . This is the page for the flex_lcd driver. By default the driver configures the LCD data pins on PORTD and the control pins on PORTA. The R/W pin is on PORTA. The LCD is configured as a 7 pin, 4bit mode LCD. Please make sure that you have connected the pins correctly. First try displaying something on the LCD without modifying the driver. Only after you have successfully got this working, then move onto the automatic line feed/line clearing.
Rohit |
|
![](templates/subSilver/images/spacer.gif) |
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Wed Oct 01, 2008 12:40 am |
|
|
xero:
Please define the int8 n and int1 linebit as global variables. They should be defined before the 'main' function, and not inside lcd_putc(). Defining them inside lcd_putc() makes them local variables, and they will lose their values every time the function exits.
Rohit |
|
![](templates/subSilver/images/spacer.gif) |
xero Guest
|
|
Posted: Wed Oct 01, 2008 4:37 am |
|
|
I'm building a simple keypad to LCD.
LCD connect to port A and D (default connection for flex_lcd).
Keypad connection:
#define ROW0 PIN_C0
#define ROW1 PIN_C1
#define ROW2 PIN_C2
#define ROW3 PIN_C3
#define COL0 PIN_B0
#define COL1 PIN_B1
#define COL2 PIN_B2
#define COL3 PIN_B3
Quote: | First try displaying something on the LCD without modifying the driver. Only after you have successfully got this working, then move onto the automatic line feed/line clearing. |
I have try original flex_lcd driver from link given and try sample coding and success.
After implement your codes into flex_lcd driver the LCD show only one character and overwrite at every time i push the button. Nothing happened after 16times the button pushed.
Quote: | int8 n= 0;
int1 linebit = 0;
void lcd_putc(char c)
{
if ((n>0) && (linebit==0))
{
lcd_gotoxy(1,2);
n = 16;
linebit=1;
}
if ((n>0) && (linebit==1))
{
lcd_send_byte(0,1);
delay_ms(2);
n = 16;
linebit=0;
}
n--;
switch(c) |
|
|
![](templates/subSilver/images/spacer.gif) |
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Thu Oct 02, 2008 1:18 am |
|
|
xero:
Sorry, couple of logical errors on my part. My bad. Please use the following code for the function lcd_putc() in flex_lcd:
Code: | void lcd_putc(char c)
{
if ((chars==0) && (linebit==0)) //add this code
{
lcd_gotoxy(1,2);
chars = 16;
linebit=1;
}
if ((chars==0) && (linebit==1))
{
lcd_send_byte(0,1);
delay_ms(2);
chars = 16;
linebit=0;
} //upto here
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;
}
chars--; //add this also
} |
Here is some sample code to help you:
Code: | #include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
int8 chars= 16; //global declaration
int1 linebit = 0;
#include "FlexLCD.c"
void main ()
{
delay_ms(10);
lcd_init();
delay_ms(10);
printf(lcd_putc,"\f");
delay_ms(10);
while (1)
{
lcd_putc("1");
delay_ms(500);
lcd_putc("2");
delay_ms(500);
lcd_putc("3");
delay_ms(500);
}
} |
Do note that control characters "\f", "\n", "\b" count as characters as well, so sending them will cause the variable chars (which is the 'number of characters displayed' counter) to decrement.
Rohit |
|
![](templates/subSilver/images/spacer.gif) |
xero Guest
|
|
Posted: Thu Oct 02, 2008 7:09 am |
|
|
Thanks a lot!!! your program working perfectly ![Very Happy](images/smiles/icon_biggrin.gif) |
|
![](templates/subSilver/images/spacer.gif) |
|