Bonjour tout le monde !
Aujourd’hui je vous ai préparé un article sur comment utiliser un écran de nokia 5110 avec une carte arduino.
Dans ce tutoriel je vais tous faire avec des fonctions "bas niveau",
mais il existe une librairie toute prête pour les féniasses
La librairie -> http://code.google.com/p/pcd8544/
Pour ceux qui voudraient plus de détails sur l’écran : http://skyduino.wordpress.com/2011/08/05/test-ecran-nokia-5110/
(Vous remarquerez surement que le code que je vais vous présenter
ressemble beaucoup à celui fourni par sparkfun, en faite j’ai juste
modifier le code de base pour y intégrer quelques fonctions bien
sympathique )
Tout d’abord le matos :
1 arduino UNO,
1 breakout nokia-5110 de sparkfun,
des câbles M/F
(il n’y a besoin de rien d’autre)
Ensuite le câblage :
LCD -> arduino
SCE -> D7
RESET -> D6
DC -> D5
SDIN -> D4
SCLK -> D3
VCC -> 5v
GND -> GND
LED -> 3v3 (!! pas 5v !!)
Passons maintenant à la partie programmation
Tout d’abord nous allons avoir besoin de convertir une petite image
n&b en une suite d’octets, pour ce faire il existe des logiciels
comme celui ci :
http://en.radzio.dxp.pl/bitmap_converter/ (Pour windows uniquement, amis linuxien il faudra chercher sur google)
File -> Open
Width -> 84
Height -> 48
8 pixels par byte
Avec l’image d’exemple de sparkfun (le smiley awesome) cela donne ceci :
Au passage il va nous falloir afficher du texte, soit des caractéres, ils nous faut donc une table ascii, table que voici :
séquence "magique" de commandes le faisant passer dans un mode que nous
pouvons contrôler.
Voici la fonction qui s’en occupe :
Il va aussi nous falloir une fonction pour déplacer le curseur de dessin et une autre fonction pour effacer l’écran :
Allez on rassemble le tous !
Et maintenant un petit sketch de démo
Et "In Real Life" voila ce que ça donne :
"finger in the nose" hein
Et oui c’est déja la fin de cet article *sniff*, j’ai pas montrer
grand chose, juste deux trois fonctions, à vous de trouver les idées qui
vont bien pour les utiliser au mieux
Plein de truc marrant sont possible, afficher un gif animé, faire une horloge, … à vous de trouver THE idée
Aujourd’hui je vous ai préparé un article sur comment utiliser un écran de nokia 5110 avec une carte arduino.
Dans ce tutoriel je vais tous faire avec des fonctions "bas niveau",
mais il existe une librairie toute prête pour les féniasses
La librairie -> http://code.google.com/p/pcd8544/
Pour ceux qui voudraient plus de détails sur l’écran : http://skyduino.wordpress.com/2011/08/05/test-ecran-nokia-5110/
(Vous remarquerez surement que le code que je vais vous présenter
ressemble beaucoup à celui fourni par sparkfun, en faite j’ai juste
modifier le code de base pour y intégrer quelques fonctions bien
sympathique )
Tout d’abord le matos :
1 arduino UNO,
1 breakout nokia-5110 de sparkfun,
des câbles M/F
(il n’y a besoin de rien d’autre)
Ensuite le câblage :
LCD -> arduino
SCE -> D7
RESET -> D6
DC -> D5
SDIN -> D4
SCLK -> D3
VCC -> 5v
GND -> GND
LED -> 3v3 (!! pas 5v !!)
Passons maintenant à la partie programmation
Tout d’abord nous allons avoir besoin de convertir une petite image
n&b en une suite d’octets, pour ce faire il existe des logiciels
comme celui ci :
http://en.radzio.dxp.pl/bitmap_converter/ (Pour windows uniquement, amis linuxien il faudra chercher sur google)
File -> Open
Width -> 84
Height -> 48
8 pixels par byte
Avec l’image d’exemple de sparkfun (le smiley awesome) cela donne ceci :
- Code:
//This is awesome in bitmap form
PROGMEM prog_uchar awesome[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x30, 0x18, 0x1C,
0x0C, 0x0C, 0x06, 0x06, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
0x07, 0x07, 0x0E, 0x06, 0x1C, 0x1C, 0x38, 0x70, 0x70, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0x3C, 0xCE, 0x67, 0x33, 0x18, 0x08,
0x08, 0xC8, 0xF8, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
0x70, 0x38, 0x18, 0x18, 0x08, 0x08, 0x08, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x01, 0x07,
0x0F, 0x3C, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x0F, 0x00, 0x0C, 0x7F,
0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, 0x63,
0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF,
0xF0, 0x00, 0x00, 0x00, 0x08, 0x08, 0xFC, 0x8C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
0x0C, 0x0C, 0x0C, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x3C, 0x70, 0xE0, 0x80, 0x00, 0x07, 0x0C, 0x38, 0x60, 0xC0,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0,
0xF0, 0xE0, 0xC0, 0x80, 0xC0, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x80, 0xC0, 0x70, 0x3C, 0x1F, 0x07,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06,
0x0E, 0x1C, 0x18, 0x38, 0x31, 0x73, 0x62, 0x66, 0x64, 0xC7, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF,
0xC7, 0xC7, 0xC7, 0x67, 0x63, 0x63, 0x71, 0x30, 0x38, 0x18, 0x1C, 0x0C, 0x06, 0x03, 0x03, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
Au passage il va nous falloir afficher du texte, soit des caractéres, ils nous faut donc une table ascii, table que voici :
- Code:
// Table ascii des carateres, sur 5 pixels de large par 8 pixels de haut
PROGMEM prog_uchar asciiTable[] = {
0x00, 0x00, 0x00, 0x00, 0x00 // 20
,0x00, 0x00, 0x5f, 0x00, 0x00 // 21 !
,0x00, 0x07, 0x00, 0x07, 0x00 // 22 "
,0x14, 0x7f, 0x14, 0x7f, 0x14 // 23 #
,0x24, 0x2a, 0x7f, 0x2a, 0x12 // 24 $
,0x23, 0x13, 0x08, 0x64, 0x62 // 25 %
,0x36, 0x49, 0x55, 0x22, 0x50 // 26 &
,0x00, 0x05, 0x03, 0x00, 0x00 // 27 '
,0x00, 0x1c, 0x22, 0x41, 0x00 // 28 (
,0x00, 0x41, 0x22, 0x1c, 0x00 // 29 )
,0x14, 0x08, 0x3e, 0x08, 0x14 // 2a *
,0x08, 0x08, 0x3e, 0x08, 0x08 // 2b +
,0x00, 0x50, 0x30, 0x00, 0x00 // 2c ,
,0x08, 0x08, 0x08, 0x08, 0x08 // 2d -
,0x00, 0x60, 0x60, 0x00, 0x00 // 2e .
,0x20, 0x10, 0x08, 0x04, 0x02 // 2f /
,0x3e, 0x51, 0x49, 0x45, 0x3e // 30 0
,0x00, 0x42, 0x7f, 0x40, 0x00 // 31 1
,0x42, 0x61, 0x51, 0x49, 0x46 // 32 2
,0x21, 0x41, 0x45, 0x4b, 0x31 // 33 3
,0x18, 0x14, 0x12, 0x7f, 0x10 // 34 4
,0x27, 0x45, 0x45, 0x45, 0x39 // 35 5
,0x3c, 0x4a, 0x49, 0x49, 0x30 // 36 6
,0x01, 0x71, 0x09, 0x05, 0x03 // 37 7
,0x36, 0x49, 0x49, 0x49, 0x36 // 38 8
,0x06, 0x49, 0x49, 0x29, 0x1e // 39 9
,0x00, 0x36, 0x36, 0x00, 0x00 // 3a :
,0x00, 0x56, 0x36, 0x00, 0x00 // 3b ;
,0x08, 0x14, 0x22, 0x41, 0x00 // 3c <
,0x14, 0x14, 0x14, 0x14, 0x14 // 3d =
,0x00, 0x41, 0x22, 0x14, 0x08 // 3e >
,0x02, 0x01, 0x51, 0x09, 0x06 // 3f ?
,0x32, 0x49, 0x79, 0x41, 0x3e // 40 @
,0x7e, 0x11, 0x11, 0x11, 0x7e // 41 A
,0x7f, 0x49, 0x49, 0x49, 0x36 // 42 B
,0x3e, 0x41, 0x41, 0x41, 0x22 // 43 C
,0x7f, 0x41, 0x41, 0x22, 0x1c // 44 D
,0x7f, 0x49, 0x49, 0x49, 0x41 // 45 E
,0x7f, 0x09, 0x09, 0x09, 0x01 // 46 F
,0x3e, 0x41, 0x49, 0x49, 0x7a // 47 G
,0x7f, 0x08, 0x08, 0x08, 0x7f // 48 H
,0x00, 0x41, 0x7f, 0x41, 0x00 // 49 I
,0x20, 0x40, 0x41, 0x3f, 0x01 // 4a J
,0x7f, 0x08, 0x14, 0x22, 0x41 // 4b K
,0x7f, 0x40, 0x40, 0x40, 0x40 // 4c L
,0x7f, 0x02, 0x0c, 0x02, 0x7f // 4d M
,0x7f, 0x04, 0x08, 0x10, 0x7f // 4e N
,0x3e, 0x41, 0x41, 0x41, 0x3e // 4f O
,0x7f, 0x09, 0x09, 0x09, 0x06 // 50 P
,0x3e, 0x41, 0x51, 0x21, 0x5e // 51 Q
,0x7f, 0x09, 0x19, 0x29, 0x46 // 52 R
,0x46, 0x49, 0x49, 0x49, 0x31 // 53 S
,0x01, 0x01, 0x7f, 0x01, 0x01 // 54 T
,0x3f, 0x40, 0x40, 0x40, 0x3f // 55 U
,0x1f, 0x20, 0x40, 0x20, 0x1f // 56 V
,0x3f, 0x40, 0x38, 0x40, 0x3f // 57 W
,0x63, 0x14, 0x08, 0x14, 0x63 // 58 X
,0x07, 0x08, 0x70, 0x08, 0x07 // 59 Y
,0x61, 0x51, 0x49, 0x45, 0x43 // 5a Z
,0x00, 0x7f, 0x41, 0x41, 0x00 // 5b [
,0x02, 0x04, 0x08, 0x10, 0x20 // 5c backslash
,0x00, 0x41, 0x41, 0x7f, 0x00 // 5d ]
,0x04, 0x02, 0x01, 0x02, 0x04 // 5e ^
,0x40, 0x40, 0x40, 0x40, 0x40 // 5f _
,0x00, 0x01, 0x02, 0x04, 0x00 // 60 `
,0x20, 0x54, 0x54, 0x54, 0x78 // 61 a
,0x7f, 0x48, 0x44, 0x44, 0x38 // 62 b
,0x38, 0x44, 0x44, 0x44, 0x20 // 63 c
,0x38, 0x44, 0x44, 0x48, 0x7f // 64 d
,0x38, 0x54, 0x54, 0x54, 0x18 // 65 e
,0x08, 0x7e, 0x09, 0x01, 0x02 // 66 f
,0x0c, 0x52, 0x52, 0x52, 0x3e // 67 g
,0x7f, 0x08, 0x04, 0x04, 0x78 // 68 h
,0x00, 0x44, 0x7d, 0x40, 0x00 // 69 i
,0x20, 0x40, 0x44, 0x3d, 0x00 // 6a j
,0x7f, 0x10, 0x28, 0x44, 0x00 // 6b k
,0x00, 0x41, 0x7f, 0x40, 0x00 // 6c l
,0x7c, 0x04, 0x18, 0x04, 0x78 // 6d m
,0x7c, 0x08, 0x04, 0x04, 0x78 // 6e n
,0x38, 0x44, 0x44, 0x44, 0x38 // 6f o
,0x7c, 0x14, 0x14, 0x14, 0x08 // 70 p
,0x08, 0x14, 0x14, 0x18, 0x7c // 71 q
,0x7c, 0x08, 0x04, 0x04, 0x08 // 72 r
,0x48, 0x54, 0x54, 0x54, 0x20 // 73 s
,0x04, 0x3f, 0x44, 0x40, 0x20 // 74 t
,0x3c, 0x40, 0x40, 0x20, 0x7c // 75 u
,0x1c, 0x20, 0x40, 0x20, 0x1c // 76 v
,0x3c, 0x40, 0x30, 0x40, 0x3c // 77 w
,0x44, 0x28, 0x10, 0x28, 0x44 // 78 x
,0x0c, 0x50, 0x50, 0x50, 0x3c // 79 y
,0x44, 0x64, 0x54, 0x4c, 0x44 // 7a z
,0x00, 0x08, 0x36, 0x41, 0x00 // 7b {
,0x00, 0x00, 0x7f, 0x00, 0x00 // 7c |
,0x00, 0x41, 0x36, 0x08, 0x00 // 7d }
,0x10, 0x08, 0x08, 0x10, 0x08 // 7e ~
,0x78, 0x46, 0x41, 0x46, 0x78 // 7f DEL
};
- Code:
// La broche DC permet de dire à l'écran si on envoi une commande ou une donnée
#define LCD_COMMAND LOW
#define LCD_DATA HIGH
// Définir ici la hauteur / largeur de l'écran en pixel
#define LCD_X 84
#define LCD_Y 48
- Code:
/* Envoi une commande ou un octet de donnée à l'écran */
void lcd_write(byte mode, byte data) {
digitalWrite(PIN_DC, mode); // Place DC suivant le mode voulu (COMMAND ou DATA)
digitalWrite(PIN_SCE, LOW);
shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data); // Envoi la commande / donnée
digitalWrite(PIN_SCE, HIGH);
}
séquence "magique" de commandes le faisant passer dans un mode que nous
pouvons contrôler.
Voici la fonction qui s’en occupe :
- Code:
/* Initialise l'écran en envoyant la séquence "magique" d'initialisation au PCD8544 */
void lcd_init(void) {
// Place les broches de contrôle en sorties
pinMode(PIN_SCE, OUTPUT);
pinMode(PIN_RESET, OUTPUT);
pinMode(PIN_DC, OUTPUT);
pinMode(PIN_SDIN, OUTPUT);
pinMode(PIN_SCLK, OUTPUT);
// Reset l'écran pour être sur de son état intial
digitalWrite(PIN_RESET, LOW);
digitalWrite(PIN_RESET, HIGH);
// Séquence magique
lcd_write(LCD_COMMAND, 0x21); // Extended Commands
lcd_write(LCD_COMMAND, 0xBF); // LCD VOP (contrast) - 0xB1 @ 3v3 ou 0xBF @ 5v
lcd_write(LCD_COMMAND, 0x04); // Temp coefficent
lcd_write(LCD_COMMAND, 0x14); // LCD bias mode = 1:48
lcd_write(LCD_COMMAND, 0x20); // Commit change
lcd_write(LCD_COMMAND, 0x0C); // Display control = normal mode (0x0D pour mode "négatif")
}
- Code:
/* Affiche sur l'écran un image stocké en RAM */
void lcd_image_ram(char data[]){
for (int i = 0 ; i < (LCD_X * LCD_Y / 8) ; i++)
lcd_write(LCD_DATA, data[i]);
}
/* Affiche sur l'écran un image stocké en PROGMEM */
void lcd_image_flash(prog_uchar *data){
for (int i = 0 ; i < (LCD_X * LCD_Y / 8) ; i++)
lcd_write(LCD_DATA, pgm_read_byte_near(data +i));
}
- Code:
/* Affiche sur l'écran un caractére passé en argument, avec un colonne vide de "pagination" pour plus de lisibilité */
void lcd_putChar(char chr) {
lcd_write(LCD_DATA, 0x00); // Colonne vide de pagination
unsigned int val = (pchr - 0x20) * 5; // 0x20 -> 1er caractéres de notre table ascii
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val));
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 1));
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 2));
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 3));
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 4));
lcd_write(LCD_DATA, 0x00); // Colonne vide de pagination
}
/* Affiche sur l'écran une chaine de caratéres stocké en RAM */
void lcd_string_ram(char *str) {
while(*str)
lcd_putChar(*str++);
}
/* Affiche sur l'écran une chaine de caratéres stocké en PROGMEM */
void lcd_string_flash(prog_char *str) {
char c = pgm_read_byte_near(str);
while(c) {
lcd_putChar(c);
c = pgm_read_byte_near(++str);
}
}
Il va aussi nous falloir une fonction pour déplacer le curseur de dessin et une autre fonction pour effacer l’écran :
- Code:
/* Déplace le curseur aux coordonnées xy donnée en arguments */
void lcd_goto(byte x, byte y) {
lcd_write(LCD_COMMAND, 0x80 | x); // Colonne
lcd_write(LCD_COMMAND, 0x40 | y); // Ligne
}
/* Efface l'écran */
void lcd_clear() {
for (int i = 0 ; i < (LCD_X * LCD_Y / 8) ; i++)
lcd_write(LCD_DATA, 0x00);
lcd_goto(0, 0); // Place le curseur à (0, 0)
}
Allez on rassemble le tous !
- Code:
// La broche DC permet de dire à l'écran si on envoi une commande ou une donnée
#define LCD_COMMAND LOW
#define LCD_DATA HIGH
// D�finir ici la hauteur / largeur de l'écran en pixel
#define LCD_X 84
#define LCD_Y 48
/* Envoi une commande ou un octet de donnée à l'écran */
void lcd_write(byte mode, byte data) {
digitalWrite(PIN_DC, mode); // Place DC suivant le mode voulu (COMMAND ou DATA)
digitalWrite(PIN_SCE, LOW);
shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data); // Envoi la commande / donn�e
digitalWrite(PIN_SCE, HIGH);
}
/* Initialise l'écran en envoyant la séquence "magique" d'initialisation au PCD8544 */
void lcd_init(void) {
// Place les broches de contrôle en sorties
pinMode(PIN_SCE, OUTPUT);
pinMode(PIN_RESET, OUTPUT);
pinMode(PIN_DC, OUTPUT);
pinMode(PIN_SDIN, OUTPUT);
pinMode(PIN_SCLK, OUTPUT);
// Reset l'écran pour être sur de sont état initial
digitalWrite(PIN_RESET, LOW);
digitalWrite(PIN_RESET, HIGH);
// Séquence magique
lcd_write(LCD_COMMAND, 0x21); // Extended Commands
lcd_write(LCD_COMMAND, 0xBF); // LCD VOP (contrast) - 0xB1 @ 3v3 ou 0xBF @ 5v
lcd_write(LCD_COMMAND, 0x04); // Temp coefficent
lcd_write(LCD_COMMAND, 0x14); // LCD bias mode = 1:48
lcd_write(LCD_COMMAND, 0x20); // Commit change
lcd_write(LCD_COMMAND, 0x0C); // Display control = normal mode (0x0D pour mode "négatif")
}
/* Affiche sur l'écran un image stockée en RAM */
void lcd_image_ram(char data[]){
for (int i = 0 ; i < (LCD_X * LCD_Y / 8) ; i++)
lcd_write(LCD_DATA, data[i]);
}
/* Affiche sur l'écran un image stockée en PROGMEM */
void lcd_image_flash(prog_uchar *data){
for (int i = 0 ; i < (LCD_X * LCD_Y / 8) ; i++)
lcd_write(LCD_DATA, pgm_read_byte_near(data +i));
}
/* Affiche sur l'écran un caractére passé en argument, avec un colonne vide de "pagination" pour plus de lisibilité */
void lcd_putChar(char pchr) {
lcd_write(LCD_DATA, 0x00); // Colonne vide de pagination
unsigned int val = (pchr - 0x20) * 5;
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val));
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 1));
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 2));
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 3));
lcd_write(LCD_DATA, pgm_read_byte_near(asciiTable + val + 4));
lcd_write(LCD_DATA, 0x00); // Colonne vide de pagination
}
/* Affiche sur l'écran une chaine de caractéres stocké en RAM */
void lcd_string_ram(char *str) {
while(*str)
lcd_putChar(*str++);
}
/* Affiche sur l'écran une chaine de caractéres stocké en PROGMEM */
void lcd_string_flash(prog_char *str) {
char c = pgm_read_byte_near(str);
while(c) {
lcd_putChar(c);
c = pgm_read_byte_near(++str);
}
}
/* Déplace le curseur aux coordonnées xy donnée en arguments */
void lcd_goto(byte x, byte y) {
lcd_write(LCD_COMMAND, 0x80 | x); // Colonne
lcd_write(LCD_COMMAND, 0x40 | y); // Ligne
}
/* Efface l'écran */
void lcd_clear() {
for (int i = 0 ; i < (LCD_X * LCD_Y / 8) ; i++)
lcd_write(LCD_DATA, 0x00);
lcd_goto(0, 0); // Place le curseur à (0, 0)
}
Et maintenant un petit sketch de démo
- Code:
#include <avr/pgmspace.h>
#include "ascii_table.h"
#include "image.h"
/* Definition des broches du lcd */
#define PIN_SCE 7
#define PIN_RESET 6
#define PIN_DC 5
#define PIN_SDIN 4
#define PIN_SCLK 3
void setup(void) {
lcd_init(); // Initialisation de l'écran
lcd_clear(); // Efface l'écran
lcd_image_flash(awesome); // Affiche le smiley "awesome"
delay(5000); // Delai de 2sec avant d'afficher le texte
lcd_clear(); // Efface l'écran
lcd_string_ram("Hello World! (RAM)"); // Affiche "Hello World !"
delay(5000); // Delai de 2sec avant d'afficher le texte
lcd_clear(); // Efface l'écran
lcd_string_flash(PSTR("Hello World! (PROGMEM)")); // Affiche "Hello World !"
}
void loop(void) {
// Rien, c'est juste une démo <img src="[url=http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif?m=1129645325g]http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif?m=1129645325g[/url]" alt=";)" class="wp-smiley">
}
Et "In Real Life" voila ce que ça donne :
"finger in the nose" hein
Et oui c’est déja la fin de cet article *sniff*, j’ai pas montrer
grand chose, juste deux trois fonctions, à vous de trouver les idées qui
vont bien pour les utiliser au mieux
Plein de truc marrant sont possible, afficher un gif animé, faire une horloge, … à vous de trouver THE idée