|
|
View previous topic :: View next topic |
Author |
Message |
picman62
Joined: 12 Dec 2014 Posts: 77
|
Help with LCD counter code |
Posted: Fri Dec 12, 2014 3:27 pm |
|
|
Hello folks. I am a newbie to CCS and also newbie to code programming. I am presently a beginner in C language. However I am striving to learn all I can.
I am presently trying to program a LCD with a pushbutton in that whenever I push the button the text on the LCD screen changes accordingly and when it reaches the last text, if the pushbutton is pressed again, it will return to the first text again. So this is basically a loop counter and I am sure ridiculously easy for you guys here. In fact I have accomplished this programming as I show in the code below.
Problem is that I am employing delays to keep the text still until the next change. I am using 300ms delays but the texts appear to blink once or twice and sometimes the command will not work in the first press or takes too long to change the screen. Also if I keep pressing the button, the texts keep changing. What I need is that the texts do not keep rolling if I keep pressing the button and only change when the button is released (output_low(ipunt_x) maybe?
So please I would like to know what instruction I should include in place of the delays to accomplish what I have just described.
Thanks a lot in advance for any help.
Here is the code:
Code: |
WHILE(true)
{
if(INPUT(PIN_B4)==0)
{
cont++;
delay_ms(300);
}
if(cont==1)
{
output_low(pin_b4);
delay_ms(200);
lcd_putc("\f<<<<<<TEXT1>>>>>>");
}
if(cont==2)
{
output_low(pin_b4);
delay_ms(200);
lcd_putc("\f<<<<<TEXT2>>>>>");
}
if(cont==3)
{
output_low(pin_b4);
delay_ms(200);
lcd_putc("\f <<<<TEXT3>>>>");
}
if(cont==4)
{
output_low(pin_b4);
delay_ms(200);
printf(lcd_putc,"\f");
lcd_gotoxy(3,1);
lcd_putc("BATTERY FULL");
{
if(cont==4)// repeats the selection group after last entry
for(cont=5;cont>=5;cont++)
{} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Dec 12, 2014 4:11 pm |
|
|
First, your hardware. Does your push-button circuit look like this ?
Hopefully it does.
Code: |
+5v
|
< 4.7K
> resistor
< ___ Switch
To | _|_|_
PIC -----------------o o------
pin |
B4 --- Ground
-
|
|
|
|
picman62
Joined: 12 Dec 2014 Posts: 77
|
|
Posted: Fri Dec 12, 2014 7:25 pm |
|
|
Thanks for your reply PCM programmer.
Yes, it's the same configuration, except the resistor is 10K.
What do you say? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Dec 12, 2014 8:20 pm |
|
|
I would do something like this. Use the button() function from this thread:
http://www.ccsinfo.com/forum/viewtopic.php?t=23837
If I get a button press, then I execute a switch-case statement. The
switch-case will display a message on the LCD, dependent upon the
value of your 'cont' variable. After displaying the message, 'cont'
is incremented, so that when the next button press occurs, the next
message will be displayed. When the last message is displayed,
'cont' is reset back to 0.
There is no delay_ms() statement after the message is displayed,
because the button() function only returns TRUE if a button was pressed
once, or if it was held down and then it will return TRUE at the repeat rate.
Code: |
#include <16F887.h>
#fuses INTRC_IO, NOWDT, BROWNOUT
#use delay(clock=4M)
#include "flex_lcd.c"
int8 B4_var;
#include "button.c"
//======================
void main()
{
int8 cont;
cont = 0;
lcd_init();
while(TRUE)
{
if(button(PIN_B4, 0, 50, 10, B4_var, 1))
{
switch(cont)
{
case 0:
lcd_putc("\f 1st line");
break;
case 1:
lcd_putc("\f 2nd line");
break;
// etc.
}
cont++;
if(cont > 4)
cont = 0;
}
delay_ms(10); // Required for button() function
}
} |
|
|
|
picman62
Joined: 12 Dec 2014 Posts: 77
|
|
Posted: Sat Dec 13, 2014 3:58 am |
|
|
Thank you so much PCM prgrammer. It worked.
The text in the screen does not give sporadic blinks anymore.
I only had to modify the delay time to 50ms so that when I press the button, the LCD screen does not roll the texts. With delay time of 10ms, this was still happening.
Also I noticed that the command takes effect at the moment I press the button and not when I release it, but I can perfectly live with that.
Thanks a lot for being helpful.
I would like to ask you what good and practical source you recommend to learn C language with focus in CCS compiler.
This is how the whole code now looks like:
Code: |
#include <button.c>
#include <LCD.C>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#define read_bit_var(x) bit_test(*(int8 *)(x >> 3), x & 7)
#include <lcd.c>
#int_rb
int Cont;
int8 B4_var;
void main()
{
port_B_pullups(0xFF);
setup_adc_ports(AN0);
lcd_init();
lcd_init();
while(TRUE){
int Cont;
char load[16]; //atividade de barras
{
lcd_gotoxy(3,1);
lcd_putc("text general");// text of display
}
while(TRUE){
Cont=0;
while (Cont<16){
load [Cont]=255;
Printf(lcd_putc,"\n%s",load,);
Cont++;
delay_ms(250); //bargraph
}
Cont=0;
lcd_putc("\f");
lcd_gotoxy(4,1);
lcd_putc("*gen text2*");
delay_ms(1500);
lcd_gotoxy(3,1);
lcd_putc("gern text3");
lcd_gotoxy(4,2);
lcd_putc("gen text4");
int8 cont;
cont = 0;
WHILE(true)
{
if(button(PIN_B4, 0, 50, 10, B4_var, 1))
{
switch(cont)
{
case 0:
lcd_putc("\f TEXT 1");
break;
case 1:
lcd_putc("\f TEXT 2");
break;
case 2:
lcd_putc("\f TEXT 3");
break;
case 3:
printf(lcd_putc,"\f");
lcd_gotoxy(3,1);
lcd_putc("BATTERY ");
break;
}
cont++;
if(cont >= 4)
cont = 0;
}
delay_ms(50); // Required for button() function
}
}
}
} |
Last edited by picman62 on Sun Dec 14, 2014 4:38 am; edited 1 time in total |
|
|
jgschmidt
Joined: 03 Dec 2008 Posts: 184 Location: Gresham, OR USA
|
|
Posted: Sat Dec 13, 2014 7:18 pm |
|
|
To learn C you can always google "C tutorial". I googled "ccs pic c tutorial" and got several good hits. You can also google "pic tutorial" to learn more about the PIC hardware.
I've been going through Mark Siegesmund's book "Embedded C Programming" which focuses on the CCS dialect - it's OK. I think it moves too fast for a total beginner and the typos in some of the example code don't help. Mark is the author of the CCS compiler so I'm just using the book as a refresher for my next project. _________________ Jürgen
www.jgscraft.com |
|
|
picman62
Joined: 12 Dec 2014 Posts: 77
|
|
Posted: Sun Dec 14, 2014 4:40 am |
|
|
Thanks for your suggestions Jurgen. Appreciated. |
|
|
|
|
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
|