30/11/2015
maj:25/10/2020
Bargraphe
100% ANALOGIQUE (avec 10 ou 20 barres) (2015)
* Diagram de
principe LM3914
*
Version 10 segments ou Point
* Version
Mode Cascade 2x10 = 20 segment
Bargraphe
LCD 2 x 16 chars (mode TEXTE uniquement) (2020_1024)
* Creation
cararatere Speciaux en CGRAM
* Barre
Graphe Horizontal ( avec CGRAM chars)
...exemple
avec EA0 analog
* Barre
Graphe Verticale ( avec CGRAM chars)
* Barre
Graphe Verticale ( avec CGROM chars)
* Software
et video
Bargraphe
sur LCD Grafiques :
*Nokia 96x64 ,
en mode GRAFIQUE
*OLED 128x32
*ILI9235 320X240 couleur
Liens
Indicateur de Position avec un Bargraphe Analogique
But:
Indiquer la position d'un élement, representé par la valeur
analogique d'un capteur ou autre..
exemple : recopie de position via un potentiometre.
Documentation sur le (composant) driver de
bargraph :
LM3914 driver data sheet ,
bargraphe à réponse Lineaire et cascadable
le LM3915driver de bargraf à reponse Logarithlique, pour Vumetre
( decibel!)
Boitier DIP18
Schema de principe
:
L'afficheur 10 leds en ligne B10BS
![]() ![]() |
le bargraphe 10 leds .....................................et un enjoliveur |
* Attention à l'orientation de l'afficheur
et numero de pin.
modele led rouge (existe aussi en vert et orange)
à ma connaissance il n'existe pas de bragraph avec 2 leds vertes
au lmilieu..
prevoir 10mA par segment
Montage bargraphe simple :
L'alimentation du module peut varier de 9 à12V , mais doit etre
stable
Un regulateur 9V calme le tout ..
Schema de
principe (version 10 leds):
version mode Point (DOT)
![]() |
![]() |
schema coammnde 10 leds avec driver LM3914 | le prototype de test |
*Option Barre ou Point .. si uniquement Point ,laisser la pin
9 non connectée.
Un reglage fin peut etre necessaire en fonction de la course
reelle du potar
0 à 270° max pour un potar rotatif classqiue ( reponse lineaire
!)
ou xx% de la course d'un potar lineaire.
Version
Bargraphe 20 leds , avec 2 LM3914 chainés
Schema :
Nota: Version Point (DOT) .
On comprend plus facilement le chainage en regardant le schema de principe du LM3914 !
Les resistances de 10K sur segment 1 ,
permettent une extinction complete de celui ci apres depassement.
La liaison PIN 9 du 1er LM3914 à la PIN 1 du 2em
LM3914 (soit le 1er segment) est indispensable
pour que le dernier segment 10 du 1er bargraf s'eteigne apres
passage sur le 1er segment du 2em bargraf
(en mode point, bien sur ..) non utile en mode segment (barre).
Prototype
:
Réalisé en 2 partie (platine trop petite .. beaucoup de strap
!)
![]() |
![]() |
prototype sur 2 plaques d'essais |
La plage de reglage depend de R1 et R2 . et 2xR1 +
2xR2
voir sur le schema ,la relation Volt d'entrée et seuil d'allumage
du segment.
Réalisation assez facile, au detail pres de mauvaises connection
sur "planche à pain "
Circuit imprimé indispensable.!.
Cette solution est 100% hardware .
j'avais envisagé aussi une solution PIC12F1840+ MCP13017 I2C 16sorties
leds.entierment parametrable..
mais rendement :rapport (hardware +developpemnt soft)/ souplesse...
pas assez grand..
Bargraphes sur LCD
2x16 en mode TEXTE
Testé sur une carte Microchip IRDA Board equipée
d'un LCD OCULAR OM16241 2 lignes de 16 chars
et un MCU PIC 18F47K42
Rappel :
MCU 18F47K42 PinOut
Datasheet MCU (PIC18FxxK42
DS 40001919B rev 2017)
Hardware :
// Lcd OCULAR OM16241 2 lignes de 16 cars pinout settings
sbit LCD_RS at LATA3_bit;
sbit LCD_RW at LATA2_bit;
sbit LCD_EN at LATA1_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D4 at LATB0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISA3_bit;
sbit LCD_RW_Direction at TRISA2_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_PWR at RD5_bit; // to power on the LCD
sbit LCD_PWR_Dir at TRISD.B5; // to power on the LCD
Portage su PIC18F47K42
Software :
Création de 3 set de table de characteres
const char *Special_Name[]=
{"DEGREE","EURO ","OHM ","PF
","Droite","Gauche","CANCEL","Check
", // pour caracteres Speciaux
"Zero ","un ","deux ","trois
","quatre","cinq ","six ","Seven
", // pour Barre Graphe Horizontale
"Zero ","un ","deux ","trois
","quatre","cinq ","six ","Seven
"}; // pour barre Graphe Vertical
les 3 set dans l'espace Flash ROPM du PIC :
const unsigned char LCD_Custom_Chars[]
=
{
//---------- set #1 ------------------
0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00, //char #1 Degrée
0x06,0x09,0x08,0x1E,0x1E,0x08,0x09,0x06, //char #2 euro
0x04,0x0A,0x11,0x11,0x0A,0x0A,0x11,0x00, // char #3 Ohm
4,14,14,14,31,0,4,0, // char #4 bell
//0x10,0x18,0x1C,0x1E,0x1C,0x18,0x10,0x00, //char #5 A droite
28,20,27,18,19,18,18,0 , //char #5 initiales PF
0x01,0x03,0x07,0x0F,0x07,0x03,0x01,0x00, //char #6 A gauche
0x00,0x11,0x0A,0x04,0x06,0x11,0x00,0x00, //char #7 cancel
0x00,0x01,0x03,0x16,0x1C,0x10,0x00,0x00, //char #8 Checked
//----- set #2 0 à 6 colonnes Barre horizontale -------
0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,
0b01100000,0b01100000,0b01100000,0b01100000,0b01100000,0b01100000,0b01100000,0b01100000,
0b01110000,0b01110000,0b01110000,0b01110000,0b01110000,0b01110000,0b01110000,0b01110000,
0b01111000,0b01111000,0b01111000,0b01111000,0b01111000,0b01111000,0b01111000,0b01111000,
0b01111100,0b01111100,0b01111100,0b01111100,0b01111100,0b01111100,0b01111100,0b01111100,
0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,
0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,
//---- #set #3 Barre verticales ------------------
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,31,
0,0,0,0,0,31,31,
0,0,0,0,0,31,31,31,
0,0,0,0,31,31,31,31,
0,0,0,31,31,31,31,31,
0,0,31,31,31,31,31,31,
0,31,31,31,31,31,31,31
};
![]() |
![]() |
Set #1 caracteres speciaux | Set #2 pour Bargraphe Horizontal |
Chargement
d'un SET en CGRAM, les chars ainsi crées sont affichés sur le
terminal UART
void LCD_Load_Custom_Chars(char
Set)
{
unsigned int i;
unsigned int k=0;
// Set address counter pointing to CGRAM address 0.
LCD_WriteCmd(0x40);
// Load custom lcd character data into CGRAM.
// It can only hold a maximum of 8 custom characters.
for(i = 0; i <64; i++)
{
if (i%8==0)
{
CPrint1(Special_Name[k+ (Set<<3)]);
k++;
CRLF1();
}
if ( (i>0) && (i%8==0))
{
CRLF1();
}
LCD_WriteData(LCD_Custom_Chars[i+ (Set<<6)]);
Decompile_byte( LCD_Custom_Chars[i+ (Set<<6)]); // <---------
affichage du char sur terminal
CRLF1();
}
// Set address counter pointing back to the DDRAM.
LCD_WriteCmd(0x80);
Delay_ms(150);
}
BARGRAPHE
HORIZONTAL
Utilisation de characteres en CGRAM representant 1,2,3,4,5,6
barres verticales
pour afficher la progression d'une barre horizontale sur 16x8 =128
pas
la fonction modulo 8 est utilisée pour les pas intermediares d'un
caractere, mais comme la largeur est seulement
sur 5 bits , on voit un gap blanc entre les
pas ! C'EST NORMAL ! on est en mode TEXTE !
L'ideal serait d'avoir un LCD avec une ROM incluant les 8 barres
verticales ! et pouvoir afficher des chars 8x8 .
Le SET #1 CGRAM est utilié
un characatere PLEIN de 7 pixel de large , est utilisé pour
chaque espace de 8 pixels en largeur ,
on complete avec la valeur modulo 8 ( N%8) qui permet de
selectionner le BON caractere en CGRAM comportant le nombre
de barres verticale (pixels)
On a donc Nx8=16x8 => 128 steps dans le sens Horizontal, mais
avec un TROU entre les pas de 8 pixels.
le code :
CPrint1(" Load CGRAM set#3 Barre
Horizontales\r\n");
LCD_Load_Custom_Chars(1);
CPrint1(" Test bargraph Horizontal \r\n");
CPrint1(" Progression de Gauche vers la droite\r\n");
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(50);
Lcd_Cmd(_LCD_FIRST_ROW ); Delay_ms(150);
Lcd_Out(1,1,"Bargraph Horiz " );
Lcd_Chr_CP( 245) ; // code fleche à droite sur mon LCD
for (i=0;i<128;i++)
{
j=i/8;
m=i%8;
for (k=0;k<j;k++) // <----- la partie entiere
{
LCD_WriteCmd(0xC0+k);
LCD_WriteData(7); // char near max width
Delay_ms(10);
}
LCD_WriteCmd(0xC0+k); // <----- le complement
LCD_WriteData(m);
Delay_ms(25);
}
Delay_ms(3000);
1 | ![]() |
2 | ![]() |
3 | ![]() |
Exemple d'usage avec EA0 entree
ADC 12 bits :
* il faut rajouter un effacement du
bargraph si la nouvelle valeur Analogique devient inferieure
void Erase_Line(char L)
{
unsigned char Dummy[17]; //" ";
switch(L)
{
case 1:
Lcd_Cmd(_LCD_FIRST_ROW);
strcpy(Dummy," ");
Lcd_Out_CP(Dummy);
Lcd_Cmd(_LCD_FIRST_ROW);
break;
case 2:
Lcd_Cmd(_LCD_SECOND_ROW);
strcpy(Dummy," ");
Lcd_Out_CP(Dummy);
Lcd_Cmd(_LCD_SECOND_ROW);
break;
}
Delay_ms(50);
}
La variable Old_EA0 mémorise la valeur précedente de EA0, pour
savoir si il faut effacer la ligne ou pas.
On pourrait aussi effacer SYSTEMATIQUEMENT la ligne 2 , avant d'ecrire
le Bargraph
its' up to you
CPrint1(" Load CGRAM set#3 Barre
Horizontales\r\n");
LCD_Load_Custom_Chars(1);
CPrint1(" Test bargraph Horizontal \r\n");
CPrint1(" Progression EA0\r\n");
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(50);
Lcd_Cmd(_LCD_FIRST_ROW ); Delay_ms(150);
Lcd_Out(1,1,"EA0 Analog " );
Old_EA0=0;
do
{
EA0=ADC_Get_Sample(0); // 12 bits ADC on my PIC !
i=EA0>>5; // 0 to 128
IntToStr(EA0,CRam1); // <-----------------
Affichage de la mesure en points (ici sur 12 bits !)
Lcd_Out(1,11,CRam1);
j=i/8; // partie entiere
m=i%8; // reste complement
for (k=0;k<j;k++)
{
LCD_WriteCmd(0xC0+k);
LCD_WriteData(7); // char near max width
Delay_ms(10);
}
LCD_WriteCmd(0xC0+k);
LCD_WriteData(m);
if (EA0<Old_EA0) Erase_Line(2);
Old_EA0=EA0;
Delay_ms(1000);
}
while(1);
Resultats:
BARGRAPHE
VERTICAL
Utilisation de characteres en CGRAM representant 1,2,3,4,5,6
barres verticales
pour afficher la progression d'une barre Verticale sur 0 à 15
pas
Le SET #2 CGRAM est utilié
un characatere PLEIN est utilisé pour chaque espace de 7 pixels
en Hauteur ,
on complete avec la valeur modulo 8 qui permet de selectionner le
BON caractere en CGRAM comportant le nombre
de barres Horizontales (pixels)
On a donc Nx8=2x8=16 steps dans le sens Vertical, mais avec un
TROU entre les pas de 8 pixels.
le code :
On evite d'afficher le code char 0 =blanc au 8em empilement ,
déja qu'on le Blanc obligatoire entre les 2 lignes LCD !
CPrint1(" Test Progression
Verticale bargraph 0 à 15 )\r\n");
CPrint1(" Progression de bas vers le haut \r\n");
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(100);
Lcd_Out(1,2,"Progression ");
Lcd_Out(2,2," Verticale ");
Lcd_Cmd(0x80+14);
Lcd_Chr_CP(247);
Lcd_Cmd(0xC0+14);
Lcd_Chr_CP(247); // code fleche vers le haut sur mon LCD
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(100);
j=0;
do
{
switch (j)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
{
Lcd_Cmd(0xC0+j);// ligne 2 position 1
Delay_ms(50);
Lcd_Chr_CP(j);
break ;
}
default :
{
if(j>=8) i=j+1; // <---
evite un blanc supplementaire entre les 2 lignes LCD
Lcd_Cmd(0xC0+j); //2em ligne position j
Lcd_Chr_CP(7);
Lcd_Cmd(0x80+j);// ligne 1 position j
Delay_ms(50);
Lcd_Chr_CP(i-8);
break ;
}
}
j++;
Delay_ms(500);
} while(j<15);
Delay_ms(2000);
}
sur 1 seule colonne |
![]() |
evolution amplitude de 0 à15 |
![]() |
Micro Bargraph
Vertical :
Un autre test utilisant cette fois , les caracters presents en
CGROM pour un mini affichage vertical conteu dans 2
lignes de caracteres
codes 224 à 228 sur mon LCD
soit 6 pas , en comptant le zero !
// avec seulement 5 car en CGROM pour
empilage de ligne de pixel codes 224 à 228
CPrint1(" Test mini bargraph Vertical tres limité (seulement
5 chars en CGROM codes: 224..228 !)\r\n");
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(50);
Lcd_Out(1,1,"CGROM 224 à 228 " );
Lcd_Cmd(_LCD_SECOND_ROW+14);
for (i=0;i<5;i++)
{
Lcd_Cmd(0xC0+i);// ligne 1 position 1
Lcd_Chr_CP(224+i); // 224 = code pour 1 seule barre horizontale
dans le charactere
Delay_ms(100);
}
Lcd_Chr_CP(' ');
Sens degressif
i=4; Lcd_Chr_CP(224+i); // 228 = code pour 5 barres horizontale
dans le charactere
i=3; Lcd_Chr_CP(224+i);
i=2; Lcd_Chr_CP(224+i);
i=1; Lcd_Chr_CP(224+i);
i=0; Lcd_Chr_CP(224+i); // 224 = code pour 1 seule barre
horizontale dans le charactere
Delay_ms(2000);
Projet MikroC 7.60
:
IRDA_Board_18F47K42_UART1_LCD_2x16_Chars_CGRAM_2020_1025.zip
IRDA_Board_18F47K42_UART1_LCD_2x16_Chars_CGRAM_2020_1025.c
IRDA_Board_18F47K42_Tests_UART1_LCD2x16_Chars_CGRAM_2020_1025.hex
Video:
Bargraph_LCD2x16_2020.webm
Bargraph
sur LCD en mode Grafique
Avec une definition au Pixel pres, la qualité / Résolution du
BarGraphe est NETTEMENT supérieure
NOKIA LCD 96x64
OLED SS1306 128x32 / 128x64
.........
ILI9235 couleur 320x240
.......
Liens interessants à
suivre :
Test
exemple MikroC : LCD
Custom Characters MikroC
Outils :
HD44780 LCD
User-Defined Graphics
MikroElektronica LCD Custom Char Geneartor
Tutorial
: CGRAM and Character Building
retour à l'index