CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Pic 16F877 Battery Symbol on LCD

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
engrmunir786



Joined: 25 Jul 2012
Posts: 20

View user's profile Send private message

Pic 16F877 Battery Symbol on LCD
PostPosted: Thu Jul 26, 2012 11:02 pm     Reply with quote

Dear Experts
I am displaying Battery Symbol on LCD by using PIC16F877. My code is mention below.
Code:

#include <16f877.h>
#fuses HS, NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,PUT

#use delay(clock = 16000000)

#byte PORTA = 0x05
#byte PORTB = 0x06
#byte PORTC = 0x07
#byte PORTD = 0x06
#byte TRISA = 0x85
#byte TRISB = 0x86
#byte TRISC = 0x87
#byte TRISD = 0x88

#include <flex_lcd.c>

void CPU_SETUP(void);
void batt_bar(void);

void main()
{
delay_ms(200);
CPU_SETUP();
lcd_init();
delay_ms(200);

while(1)
  {
   batt_bar();
  }
}

void batt_bar()
{
lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);

delay_ms(100);
 
lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
delay_ms(100);
   
lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
delay_ms(100);

lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
delay_ms(100);
   
lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
delay_ms(100);
   
lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
delay_ms(100);
 
lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
delay_ms(100);

}

The above mentioned code is working fine and display battery symbol exactly but when I add this line:
Code:

lcd_gotoxy(1,6);
Printf(lcd_putc, "AC");

after batt_bar();
The battery symbol is again automatically displayed after that message. And if any new message is displayed then battery symbol is automatically displayed after that message. Can you tell me what is the problem ?
Ttelmah



Joined: 11 Mar 2010
Posts: 19537

View user's profile Send private message

PostPosted: Fri Jul 27, 2012 3:15 am     Reply with quote

Of course it is.....

Think:
Code:

   while(1) {
      batt_bar();
      lcd_gotoxy(1,6);
      Printf(lcd_putc, "AC");
  }

Is going to display the bar, then move to location 1,6, then display 'AC', then loop back, and display the bar again, etc. etc...

Best Wishes
engrmunir786



Joined: 25 Jul 2012
Posts: 20

View user's profile Send private message

PostPosted: Sun Jul 29, 2012 11:50 pm     Reply with quote

Dear Ttelmah
But I do not want to display battery bar after any message, I only want to display at first line end location(1,16) and every time battery bar is display at that location. I am displaying different message at first line on different input signal but when any new signal comes and that message appear on lcd after that battery bar is automatically displayed. Can you tell me the procedure to display battery bar exactly at one location ? Not any other location on lcd, even if any message come on lcd.
gpsmikey



Joined: 16 Nov 2010
Posts: 588
Location: Kirkland, WA

View user's profile Send private message

PostPosted: Mon Jul 30, 2012 6:06 pm     Reply with quote

That was Ttelmah's point - if you look at your program flow, "while(1) is always true, so the series of statements within the brackets will execute repeatedly, not stop at the end like you seem to indicate you want.

The way your code is written, the instructions will execute as
batt_bar()
gotoxy
printf
batt_bar()
gotoxy
printf
... continuously because "while(1)" is always true.

mikey
_________________
mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3
engrmunir786



Joined: 25 Jul 2012
Posts: 20

View user's profile Send private message

PostPosted: Tue Jul 31, 2012 10:03 pm     Reply with quote

Dear gpsmikey
Actually I want to display this battery bar at only one location on lcd and different other messages are also displaying on lcd on different inputs. So tell me the procedure how can I display this battery symbol exactly on same location again and again and battery symbol not display automatically anywhere on lcd ? This is my question.
Ttelmah



Joined: 11 Mar 2010
Posts: 19537

View user's profile Send private message

PostPosted: Wed Aug 01, 2012 2:35 am     Reply with quote

First thing. Your define for the battery bar, seems to be 80% pointless. You are overwriting the same memory again and again.

The LCD, has a small area of RAM, for the character generator. This is addressed, by sending 0x40, _plus the address you want to talk to_. So sending '0x40 on it's own, talks to the first address in this RAM. Then data you write into this RAM, is displayable, just like any other character, but uses character 'zero' for the first 8 locations in this memory.
So the only part of you 'bar' definitions that actually does anything, is the last set of ten lines. All the previous ones are overwritten when you send this. You define the character, then display it just as any other character.

Then you have loads of wasted delays. The LCD function, waits till stuff is written already.

So:
Code:

#include <16f877.h>
#fuses HS, NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,PUT

#use delay(clock = 16000000)

#byte PORTA = 0x05
#byte PORTB = 0x06
#byte PORTC = 0x07
#byte PORTD = 0x06
#byte TRISA = 0x85
#byte TRISB = 0x86
#byte TRISC = 0x87
#byte TRISD = 0x88

#include <flex_lcd.c>

void CPU_SETUP(void);
void define_bar(void);
#define display_bar() lcd_send_byte(1,0) //display character 0, which is the bar

void main(void) {
   int n;
   delay_ms(200);
   CPU_SETUP();
   lcd_init();
   define_bar(); //This loads the 'bar' definition as character 0
 
   while(TRUE)   {
      printf(lcd_putc,"\f"); //clear screen
      lcd_gotoxy(1,1); //make sure at top corner
      display_bar(); //display the bar character here
      lcd_gotoxy(6,2);
      printf(lcd_putc,"AC");
      for (n=0;n<100;n++) {
          //Now just as a demo, write a counter in front of the AC text
          lcd_gotoxy(1,2);
          printf(lcd_putc,"%03u",n);
          delay_ms(250); //pause long enough for things to be seen
      }
   }
}

void define_bar(void) {
   lcd_send_byte(0, 0x40);
   lcd_send_byte(1, 0x0E);
   lcd_send_byte(1, 0x1F);
   lcd_send_byte(1, 0x1F);
   lcd_send_byte(1, 0x1F);
   lcd_send_byte(1, 0x1F);
   lcd_send_byte(1, 0x1F);
   lcd_send_byte(1, 0x1F);
   lcd_send_byte(1, 0x1F);
   lcd_send_byte(1,0x00);
}

There are several other little things going wrong. Your lcd_gotoxy(1,6) for example. Values for this, are x,y. Column, row. 6 would only be legal for a six line display.... In fact the code treats anything that is not '1' as equivalent to '2', but use the right values if you expect things to work as you want. A lot of other functions are _not_ so forgiving.....

Best Wishes
engrmunir786



Joined: 25 Jul 2012
Posts: 20

View user's profile Send private message

PostPosted: Wed Aug 01, 2012 10:04 pm     Reply with quote

Dear Ttelmah
Thanks again for your detail response.
You say that my define battery bar is 80% pointless. Why? Yes I am overwriting same memory again and again because I want to display the battery bar charging status from bottom to top. So I must have to display it again and again so that battery charging status is displayed, for example in mobile battery charging symbol. When you plugged it in ac then battery bar is displaying that battery is charging and when you unplugged the ac then battery symbol is still at any point. You have displayed battery bar only once and do not display any other messages. It does not display battery charging status from bottom to top. You are getting my point or not? Tell me your email address. I will send you my complete code.
Ttelmah



Joined: 11 Mar 2010
Posts: 19537

View user's profile Send private message

PostPosted: Thu Aug 02, 2012 2:33 am     Reply with quote

Ah. No.

Write the definitions one after the after the other:
Code:

lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
//lcd_send_byte(0, 0x40); remove this line
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
//delay_ms(100); and remove the delays

Do this for the whole block of definitions

Then you have the seven different characters available to use.

So:
lcd_send_byte(1,0);

Will show the first bar, then

lcd_send_byte(1,1; the second, etc..

The point is you don't keep redefining the characters. You write _once_ the definitions for all the patterns you need, and display these when needed.

Code:

#define display_bar(x) lcd_send_byte(1,x) //display character x, which are the bars

void main(void) {
   int n;
   int bno=0;
   delay_ms(200);
   CPU_SETUP();
   lcd_init();
   define_bar(); //This loads the 'bar' definitions as characters 0..6
 
   while(TRUE)   {
      printf(lcd_putc,"\f"); //clear screen
      lcd_gotoxy(1,1); //make sure at top corner
      display_bar(bno++); //display the bar character here
      if (bno==8) bno=0; //update to next bar
      lcd_gotoxy(6,2);
      printf(lcd_putc,"AC");
      for (n=0;n<100;n++) {
          //Now just as a demo, write a counter in front of the AC text
          lcd_gotoxy(1,2);
          printf(lcd_putc,"%03u",n);
          delay_ms(250); //pause long enough for things to be seen
      }
   }
}

With the new full 7 character definitions, this will give the next battery bar after 100 counts.

Best Wishes
engrmunir786



Joined: 25 Jul 2012
Posts: 20

View user's profile Send private message

PostPosted: Thu Aug 02, 2012 9:32 pm     Reply with quote

Dear Ttelmah
Thanks again for your detail response. did this show battery bar at one location and show charging status like mobile battery bar? i will program and checked it then reply you again.Dear can you tell me your email and skype address.
Regards
Muhammad Munir
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Aug 02, 2012 9:56 pm     Reply with quote

Let me tell you something about this forum. The people on it generally
only want to reply on the forum. They don't want to volunteer to be a
personal teacher of CCS. Most of the people who give answers have
full-time jobs and they answer questions during their breaks, or maybe
after-hours sometimes. They don't have any more time. They have to
do their work. So don't expect anyone to exchange email or skype
addresses. Just ask questions on the forum. That's the best way.
engrmunir786



Joined: 25 Jul 2012
Posts: 20

View user's profile Send private message

PostPosted: Fri Aug 03, 2012 1:34 am     Reply with quote

Dear Ttelmah
Thanks in advance for my detail and quick help.
Code:

lcd_send_byte(0, 0x40);
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1,0x00);
//lcd_send_byte(0, 0x40); remove this line
lcd_send_byte(1, 0x0E);
lcd_send_byte(1, 0x1B);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x11);
lcd_send_byte(1, 0x1F);
lcd_send_byte(1, 0x1F);
//lcd_send_byte(1,0x00); also remove this line then code is working fine.
//delay_ms(100); and remove the delays


Dear when i removed this line from above mention
Code:

lcd_send_byte(1,0x00);

then your code is working fine. I think this line is only used in first location.
Now my lcd display is good and battery symbol now working well. Problem is solved with the help of Ttelmah.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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