Merci Mathieu pour les précisions de compatibilité entre version du soft Arduino (c'est un peu ennuyeux, mais pas dramatique ...)
Autrement, c'est marrant que tu proposes cette possibilité de création de caractères spéciaux "graphiques" car j'avais déjà préparé un code pour montrer cela.
Celui-ci créé 4 flèches (haut, bas, gauche, droite, et un carré (select)
J'espère que Fred ne va pas s'arracher les cheveux car là ça se charge un peu ...
Mais en fait c'est très simple, il suffit de "dessiner" le symbole en plaçant des 1 ou des 0, puis de le déclarer. La librairie LiquidCrystal s'occupe du reste.
Perso je m'aide sur une feuille de papier en dessinant les pixels sur un quadrillage de 5 de large x 8 de haut.
Remarquez au passage le magnifique coup de peinture rouge sur le bouton Reset !
Du vert ou du bleu sur "Select" compléterait bien ...
-
LCD_Car_Speciaux.jpg (121.34 Kio) Vu 15021 fois
Et le code (qui fonctionne bien avec la dernière version du soft Arduino, 1.0) :
- Code: Tout sélectionner
/*******************************************************
* Test activation/désactivation retro-éclairage LCD 5 boutons DFRobot
* Création de caractères spéciaux LCD
* Ch.Aubert, Dec. 2011
*
********************************************************/
/************* Librairie(s) à inclure ****************/
#include <LiquidCrystal.h>
/**************** Définir des caractères spéciaux LCD (8 caractères max) ********************/
byte Char_UP[8] = { // Flèche haut (tableau de 8 octets)
B00000, // définition de chaque octet au format binaire
B00000, // 1 pour pixel affiché - 0 pour pixel éteint
B00100, // les 3 bits de poids forts ne sont pas écrits car inutiles
B01110,
B11111,
B00000,
B00000,
B00000
};
//
byte Char_DOWN[8] = { // Flèche bas
B00000,
B00000,
B11111,
B01110,
B00100,
B00000,
B00000,
B00000
};
//
byte Char_RIGHT[8] = { // Flèche droite
B00000,
B00000,
B10000,
B11000,
B11100,
B11000,
B10000,
B00000
};
//
byte Char_LEFT[8] = { // Flèche gauche
B00000,
B00000,
B00001,
B00011,
B00111,
B00011,
B00001,
B00000
};
//
byte Char_ENTER[8] = { // Enter
B00000,
B00000,
B01110,
B01110,
B01110,
B01110,
B00000,
B00000
};
/**************** Fin caractères spéciaux LCD ********************/
/************* Définition des broches (pins) du LCD 5 boutons DFRobot ****************/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
const byte PinLCDBacklight = 10; // broche LCD Backlight
const byte PinBouton = 0; // broche analogique (A0) utisé pour les 5 boutons
/************* Définition des autres E/S ****************/
//const byte PinLedArduino = 13; // Led sur circuit Arduino
/************* Constantes programme ****************/
const byte btnRIGHT = 0; // define some values used by the panel and buttons
const byte btnUP = 1;
const byte btnDOWN = 2;
const byte btnLEFT = 3;
const byte btnSELECT = 4;
const byte btnNONE = 5;
/************* Variables ****************/
byte lcd_key = 0;
int adc_key_in = 0;
/************* Setup ****************/
void setup()
{
lcd.begin(16, 2); // initialiser la LCD library, 16 caractères, 2 lignes
//pinMode(PinLedArduino, OUTPUT);
lcd.createChar(1, Char_UP); // création du caractère LCD personnalisé numéro 1, etc ...
lcd.createChar(2, Char_DOWN); // A placer après "LCD.begin" (ou .init) sinon ça bug !!
lcd.createChar(3, Char_RIGHT);
lcd.createChar(4, Char_LEFT);
lcd.createChar(5, Char_ENTER);
pinMode(PinLCDBacklight, OUTPUT); // Broche LCD backlight en sortie
digitalWrite(PinLCDBacklight, HIGH); // Retro-éclairage actif (par défaut il est déjà mais je le justifie ici)
}
/************* Boucle principale ****************/
void loop()
{
lcd.setCursor(0,0); // placer le curseur à la première ligne, première position
lcd.print("LCD backlight"); // texte d'accueil
lcd.setCursor(0,1); // placer le curseur au début de la seconde ligne
lcd.print("On"); // texte boutons
lcd.write(4); // fl.gauche
lcd.print(" Off"); // texte boutons
lcd.write(3); // fl.droite
lcd_key = read_LCD_buttons(); // lire la valeur du bouton (->fonction)
switch (lcd_key) // selon le bouton appuyé ...
{
case btnRIGHT:
{
digitalWrite(PinLCDBacklight, LOW); // Retro-éclairage éteint
//lcd.noDisplay(); // désactive l'affichage texte
break;
}
case btnLEFT:
{
digitalWrite(PinLCDBacklight, HIGH); // Retro-éclairage actif
//lcd.display(); // active l'affichage texte
break;
}
case btnUP:
{
break;
}
case btnDOWN:
{
break;
}
case btnSELECT:
{
break;
}
case btnNONE:
{
break;
}
}
}
/************* Sous programmes ****************/
/************* Fonctions ****************/
// Lire la valeur A/D retournée selon le bouton choisi
int read_LCD_buttons()
{
adc_key_in = analogRead(PinBouton);
if (adc_key_in > 1000) return btnNONE; // On commence par la valeur la plus probable : Aucun appui sur bouton !
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
return btnNONE; // si aucun appui sur bouton, on retoune la constante btnNONE ...
}
Edit: Renumérotation des caractères spéciaux (de 1 à 5)