|
|
View previous topic :: View next topic |
Author |
Message |
kel
Joined: 17 Oct 2005 Posts: 68 Location: Brisbane
|
Bargraph on LCD & Pic16f877a |
Posted: Mon Feb 20, 2006 12:20 am |
|
|
The code on bargraph in the code library section work fine but it leaves vertical bars on the first & last last ends of the pixel.
Code: | #include <16F877.h>
#device adc=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#include <LCD.c>
#include <LCD_bargraph.c>
/* bargraph_test.c /***LCD_bargraph.c************************************************************
Purpose: An enhancement to the standard capabilities of LCD.c that enables
one to pass a value to be bargraphed on a LCD.
Prerequisites: Must also include LCD.c in main program or add this code
to your own copy of LCD.c
//****************************************************************************
* void init_user_chars
* Purpose: Set pointer in LCD memory to CGRAM and load first 8 bytes with
* user defined characters. This function must be called once before
* a bargraph is implemented. At exit it resets pointer to line 1,
*/
void init_user_chars(void) {
// User defined characters are 5 x 7 but remember the cursor on 8
int8 i; //counting variable
// ** setup an array of special characters to form the bars ****
// char 0x00 left vertical line of bar
const char user_char[24] = {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
// char 0x01 two units of bar
0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
// char 0x02 three units of bar (full bar)
0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00};
lcd_send_byte(0,64); // Sets ram address to beginning of CGRAM area
for (i=0; i<24;i++) // fill in CGRAM with the data from array above.
lcd_send_byte(1,user_char[i]);
lcd_gotoxy(1,1); // Resets address to top line / position 1
}
/******************************************************************************
* void bargraph(int8 percent)
* Purpose: This function generates the bar graph indicator.
* Written for a 2 X 16 Intelligent LCD Display with HD44780 type controller.
* It expects a 0 to 48 value input to generate 0 to full width bar.
* B_Wdth could be modified for larger LCD's.
*/
void bargraph(BYTE percent) {
//' ** Declare Variables **
int16 Bar_Val; // Value to be graphed.
int Bars; // Number of full ||| bars to draw.
int Balance; // Balance left after all |||s are drawn.
int i; // counting variable
//' ** Declare Constants **
int const B_Wdth = 16; // Max width in characters of bar.
int const Maxbar = B_Wdth * 3; // Max bar counts.
// meat of code **
Bars = percent/3; // how many full bars to print?
Balance = percent%3; // are partial bars required?
lcd_gotoxy(1,2); // go to beginning of line 2
for (i=0; i<Bars;i++)
lcd_send_byte(1,0x02); // print the bars
switch (Balance) {
case 0: break;
case 1: lcd_send_byte(1, 0x00);
break;
case 2: lcd_send_byte(1, 0x01);
break; }
}
/* bargraph_test.c *******************************************************
Authors: John Hansknecht and Daniel Charles
Purpose: This program demonstrates the use of the LCD_bargraph.c in a real
application. A PIC16F877 is set up to write to a 2X16 LCD and read
an incoming voltage on an ADC input pin. The ADC value is written
on the top line and the bottom line displays it in bargraph mode.
*/
long value,Temp;
int A;
void main() {
setup_adc_ports(AN0);
setup_adc(DIV_32);
lcd_init();
delay_ms(2000);
init_user_chars(); // loads special characters into LCD CGRAM for bargraph
set_adc_channel(0);
delay_us(20);
while(1)
{
value=read_adc(); //read the ADC
delay_ms(20); //pause so we don't blur the LCD display
Temp= (value-559L)/2; //Calculate the temperature in degrees
A=Temp; //calculate the full scale for our bar
lcd_putc('\f'); //clear the LCD
printf(lcd_putc, "value = %lu \n",Temp); //Print top line with ADC value
bargraph(A); //print line 2 with the bargraph output.
}
} |
For examples if temp=25oC,then 8 full bars are printed plus the remaining 1 bar.If the temperature increases the numbers printed increases. But when temperature is dropping, two vertical bars areleft at the start and end of the of a pixel i.e.
instead of a blank bar?
Anyone have any idea? coz you won't want have a bargraph that leaves some bars when values are dropping.it suppose to clear them when there are no values.
Thanks |
|
|
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Mon Feb 20, 2006 8:18 am |
|
|
Kel,
I'm not sure if your problem is with "remnants" left over as the value decreases or if it is a problem displaying the bar? I remember when I modified the code for a battery indicator I believe there were some missing characters. Try this:
Code: |
/*******************************************************************************
* void generatebar(int8 percent)
* Purpose: This function generates the text line for the bar graph indicator.
This will generate a 16 character bar graph.
*/
void generate_bar(int16 percent) {
int16 solid;
int16 last;
int8 i = 0;
solid = (percent * 16) / 100; // number of solid characters to display
last = ((percent * 16) - (solid * 100)) / 10; // work out the last character
last /= 2;
if (solid) {
for (i = 0; i < solid; i++)
bar[i] = 0x05;
}
if (last) {
last--;
bar[i] = last; // select last character
i++;
}
bar[i] = 0x00; // null terminator
}
/*****************************************************************************
* init_user_chars
* Purpose: Set pointer in LCD memory to CGRAM and load first 8 bytes with
* user defined characters. Reset pointer to line 1, position 1
*/
void init_bar_graph_chars(void) {
// User defined characters 5 x 7 but remember the cursor on 8
int8 i;
const char user_char[49] = {
// char 0x00 low battery indicator
0x0E, 0x1B, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F,
// char 0x01 20% solid vertical for bar graph
0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
// char 0x02 40% solid vertical for bar graph
0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
// char 0x03 60% solid vertical for bar graph
0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
// char 0x04 80% solid vertical for bar graph
0x00, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
// char 0x05 solid block for bar graph
0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
};
lcd_send_byte(0,64); // Sets ram address
for (i = 0; i < 49; i++)
lcd_send_byte(1,user_char[i]);
lcd_gotoxy(1,1); // Resets address to top line / position 1
} // init_user_chars
|
|
|
|
kel
Joined: 17 Oct 2005 Posts: 68 Location: Brisbane
|
16f877a bargraph problem |
Posted: Mon Feb 20, 2006 9:29 pm |
|
|
Indeed the problem is with "remnants" left over as the values decreases.
By the way did you define as static global? |
|
|
tomal
Joined: 20 Nov 2011 Posts: 9
|
|
Posted: Thu Jul 25, 2013 11:33 am |
|
|
I'm suffering from the same "remnants" (left over as the values decreases) issues for the bargraph.
Anybody have a workaround?
thanks |
|
|
|
|
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
|