Robotique-Projet
Bonjour et bienvenu sur le forum ROBOTIQUE-PROJET

Merci de nous rejoindre, pour avoir accès aux forum en entier,

il suffis juste de s'inscrire sa prends 2 minutes, et bien sur de faire sa

présentation, au plaisir de se croisé sur le forum.
Robotique-Projet

Forum sur la Robotique & Informatique & Programmation


Vous n'êtes pas connecté. Connectez-vous ou enregistrez-vous

Voir le sujet précédent Voir le sujet suivant Aller en bas  Message [Page 1 sur 1]

Seb03000

avatar
Fondateur
Fondateur
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 :
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, 
};
(Remarque: j’ai remplacé le "char" par "PROGMEM prog_uchar" afin de stocker l’image en flash au lieu de la stocker en ram)

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
};
Nous allons aussi définir certaines constantes qui nous seront utile par la suite :
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
Avant toute chose il nous faut une fonction très bas niveau pour transmettre des octets de commandes ou de données à l’écran :
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);
}
Avant d’utiliser l’écran il faut l’initialiser en lui envoyant une
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")
}
Maintenant nous pouvons passer au commandes plus "graphiques", tout d’abord les fonctions d’affichage d’image :
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));
}
Puis d’affichage de caractéres et de texte :
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


_________________
Voici ma chaîne YouTube: Drone-250-Time https://www.youtube.com/channel/UC3ArL72UR4AjpaF5r-pXpSg
Voici ma chaîne YouTube: Dark-Best https://www.youtube.com/channel/UCqHLYZ9IJyfguosa8_rz9Jg
Faite passé l'information les amies , merci a vous tous.
https://www.youtube.com/c/DarkBest

Voir le sujet précédent Voir le sujet suivant Revenir en haut  Message [Page 1 sur 1]

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum