Bonjour,
Je commence à prendre en main l'utilisation d'un afficheur LCD Nokia 3310 et je tombe sur quelques problèmes.
J'ai vu plusieurs librairies sur internet -> très complètes mais assez difficiles à comprendre et très lourdes.
Je suis donc parti pour adapter une librairie très basique que j'ai vu sur le site officiel d'arduino, pour l'adapter à mes envies.
Voici ce que ça donne:
Mes soucis, sont pour le moment la fonction LCDDrawPixel et la LCDGotoXY.Code:/* LIBRAIRIE LCD 3310 POUR ARDUINO => Liste des fonctions: LCDInitialise(void) -> Initialise l'afficheur LCDClear(void) -> Efface l'affichage LCDWriteCMD(byte dc, byte data) -> Envoye une commande à l'afficheur: dc-> Data/Command ; data-> données en hexadécimal LCDGotoXY(int x, int y) -> Positionne le curseur: x->[0 à 6] , y->[0 à 84] LCDCharacter(char character) -> Envoie un symbole LCDString(char *characters) -> Envoie un texte, entre "" */ // Configuration du brochage: // Exemple: PIN_RESET (LCD) -> PIN 2 ARDUINO #define PIN_RESET 2 #define PIN_SCE 3 #define PIN_DC 4 #define PIN_SDIN 5 #define PIN_SCLK 6 // Configuration afficheur LCD #define LCD_C LOW #define LCD_D HIGH #define LCD_X 84 #define LCD_Y 48 #define LCD_CMD 0 void LCDCharacter(char character); void LCDClear(void); void LCDInitialise(void); void LCDString(char *characters); void LCDWriteCMD(byte dc, byte data); void LCDGotoXY(int x, int y); // Caractères afficheur LCD unsigned int ASCII[][5] = { {0x00, 0x00, 0x00, 0x00, 0x00} // 0 ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 1 ! ,{0x00, 0x07, 0x00, 0x07, 0x00} // 2 " ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 3 # ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 4 $ ,{0x23, 0x13, 0x08, 0x64, 0x62} // 5 % ,{0x36, 0x49, 0x55, 0x22, 0x50} // 6 & ,{0x00, 0x05, 0x03, 0x00, 0x00} // 7 ' ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 8 ( ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 9 ) ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 10 * ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 11 + ,{0x00, 0x50, 0x30, 0x00, 0x00} // 12 , ,{0x08, 0x08, 0x08, 0x08, 0x08} // 13 - ,{0x00, 0x60, 0x60, 0x00, 0x00} // 14 . ,{0x20, 0x10, 0x08, 0x04, 0x02} // 15 / ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 16 0 ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 17 1 ,{0x42, 0x61, 0x51, 0x49, 0x46} // 18 2 ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 19 3 ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 20 4 ,{0x27, 0x45, 0x45, 0x45, 0x39} // 21 5 ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 22 6 ,{0x01, 0x71, 0x09, 0x05, 0x03} // 23 7 ,{0x36, 0x49, 0x49, 0x49, 0x36} // 24 8 ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 25 9 ,{0x00, 0x36, 0x36, 0x00, 0x00} // 26 : ,{0x00, 0x56, 0x36, 0x00, 0x00} // 27 ; ,{0x08, 0x14, 0x22, 0x41, 0x00} // 28 < ,{0x14, 0x14, 0x14, 0x14, 0x14} // 29 = ,{0x00, 0x41, 0x22, 0x14, 0x08} // 30 > ,{0x02, 0x01, 0x51, 0x09, 0x06} // 31 ? ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 32 @ ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 33 A ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 34 B ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 35 C ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 36 D ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 37 E ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 38 F ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 39 G ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 40 H ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 41 I ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 42 J ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 43 K ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 44 L ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 45 M ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 46 N ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 47 O ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 48 P ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 49 Q ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 50 R ,{0x46, 0x49, 0x49, 0x49, 0x31} // 51 S ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 52 T ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 53 U ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 54 V ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 55 W ,{0x63, 0x14, 0x08, 0x14, 0x63} // 56 X ,{0x07, 0x08, 0x70, 0x08, 0x07} // 57 Y ,{0x61, 0x51, 0x49, 0x45, 0x43} // 58 Z ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 59 [ ,{0x02, 0x04, 0x08, 0x10, 0x20} // 60 ¥ ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 61 ] ,{0x04, 0x02, 0x01, 0x02, 0x04} // 62 ^ ,{0x40, 0x40, 0x40, 0x40, 0x40} // 63 _ ,{0x00, 0x01, 0x02, 0x04, 0x00} // 64 ` ,{0x20, 0x54, 0x54, 0x54, 0x78} // 65 a ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 66 b ,{0x38, 0x44, 0x44, 0x44, 0x20} // 67 c ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 68 d ,{0x38, 0x54, 0x54, 0x54, 0x18} // 69 e ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 70 f ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 71 g ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 72 h ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 73 i ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 74 j ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 75 k ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 76 l ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 77 m ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 78 n ,{0x38, 0x44, 0x44, 0x44, 0x38} // 79 o ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 80 p ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 81 q ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 82 r ,{0x48, 0x54, 0x54, 0x54, 0x20} // 83 s ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 84 t ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 85 u ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 86 v ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 87 w ,{0x44, 0x28, 0x10, 0x28, 0x44} // 88 x ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 89 y ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 90 z ,{0x00, 0x08, 0x36, 0x41, 0x00} // 91 { ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 92 | ,{0x00, 0x41, 0x36, 0x08, 0x00} // 93 } ,{0x10, 0x08, 0x08, 0x10, 0x08} // 94 ← ,{0x00, 0x06, 0x09, 0x09, 0x06} // 95 → ,{0x55, 0xaa, 0x55, 0xaa, 0x55} // 96 rectangle a moitié rempli ,{0xff, 0xff, 0xe7, 0xff, 0xff} // 97 rectangle rempli ,{0xff, 0x01, 0xfd, 0x05, 0x05} // 98 coin haut gauche double ,{0x05, 0x05, 0xfd, 0x01, 0xff} // 99 coin haut droit double ,{0xff, 0x80, 0xbf, 0xa0, 0xa0} // 100 coin bas gauche double ,{0xa0, 0xa0, 0xbf, 0x80, 0xff} // 101 coin bas droit double ,{0x05, 0x05, 0x05, 0x05, 0x05} // 102 ligne haut horizontal double ,{0xa0, 0xa0, 0xa0, 0xa0, 0xa0} // 103 ligne bas horizontal double ,{0xff, 0x00, 0xff, 0x00, 0x00} // 104 ligne gauche vertical double ,{0x00, 0x00, 0xff, 0x00, 0xff} // 105 ligne droit vertical double ,{0x7e, 0xdb, 0xdf, 0xdb, 0x7e} // 106 smiley plein ,{0x66, 0xef, 0xfb, 0x7e, 0x34} // 107 piaf ,{0x00, 0x18, 0x3c, 0x18, 0x00} // 108 piece plein ,{0x00, 0x18, 0x24, 0x18, 0x00} // 109 piece vide ,{0x18, 0x24, 0x48, 0x24, 0x18} // 110 coeur vide ,{0x18, 0x3c, 0x78, 0x3c, 0x18} // 111 coeur plein ,{0x80, 0x00, 0x00, 0x00, 0x00} // 112 pixel haut gauche }; void LCDCharacter(char character) { LCDWriteCMD(LCD_D, 0x00); for (int index = 0; index < 5; index++) { LCDWriteCMD(LCD_D, ASCII[character][index]); } LCDWriteCMD(LCD_D, 0x00); } void LCDClear(void) { for (int index = 0; index < LCD_X * LCD_Y / 8; index++) { LCDWriteCMD(LCD_D, 0x00); } } void LCDInitialise(void) { pinMode(PIN_SCE, OUTPUT); pinMode(PIN_RESET, OUTPUT); pinMode(PIN_DC, OUTPUT); pinMode(PIN_SDIN, OUTPUT); pinMode(PIN_SCLK, OUTPUT); digitalWrite(PIN_RESET, LOW); digitalWrite(PIN_RESET, HIGH); LCDWriteCMD(LCD_CMD, 0x21); // LCD Extended Commands. LCDWriteCMD(LCD_CMD, 0xB1); // Set LCD Vop (Contrast). //B1 LCDWriteCMD(LCD_CMD, 0x04); // Set Temp coefficent. //0x04 LCDWriteCMD(LCD_CMD, 0x14); // LCD bias mode 1:48. //0x13 LCDWriteCMD(LCD_CMD, 0x0C); // LCD in normal mode. 0x0d for inverse LCDWriteCMD(LCD_C, 0x20); LCDWriteCMD(LCD_C, 0x0C); } void LCDString(char *characters) { while (*characters) { LCDCharacter((*characters++)-0x20); } } void LCDWriteCMD(byte dc, byte data) { digitalWrite(PIN_DC, dc); digitalWrite(PIN_SCE, LOW); shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data); digitalWrite(PIN_SCE, HIGH); } void LCDGotoXY(int x, int y) { LCDWriteCMD( 0, 0x80 | x); // Column. LCDWriteCMD( 0, 0x40 | y); // Row. delay(1); } void LCDDrawPixel(int x, int y) { LCDGotoXY(x, y); LCDCharacter(112); }
La fonction LCDGotoXY a seulement une portée de 0 à 6 en vertical, et moi je voudrais avoir une portée de 0 à 48, vu qu'il y a 48px sur l'axe Y.
La fonction LCDDrawPixel ne fonctionne pas comme je voudrais, vu que ça saute plusieurs pixels à cause de la fonction LCDGotoXY.
Du coup ce que je voudrais savoir, c'est à quoi correspondent les lignes suivantes:
Surtout le "0x80 |x" et "0x40 | y".Code:LCDWriteCMD( 0, 0x80 | x); // Column. LCDWriteCMD( 0, 0x40 | y); // Row.
Comment modifier la fonction LCDGotoXY afin de pouvoir déplacer le curseur de 0 à 84 sur l'axe X et 0 à 48 sur l'axe Y?
Comment réécrire le plus simplement possible la fonction LCDDrawPixel afin de pouvoir afficher un seul pixel et ne pas utiliser un caractère entier (cèest a dire que dans le code ci-dessus le pixel utilise un caractère complet de 5x8 pixels au lieu d'en utiliser qu'un seul).
Merci d'avance
-----