Lab 6 final, sur l'écran tactile mlcd_32pt
mlcd_32pt.cpp@0:20cb03f394d5, 2013-12-15 (annotated)
- Committer:
- annicksenecal
- Date:
- Sun Dec 15 16:05:51 2013 +0000
- Revision:
- 0:20cb03f394d5
version finale
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
annicksenecal | 0:20cb03f394d5 | 1 | #include "mbed.h" // Pour accès aux différentes librairies du Mbed |
annicksenecal | 0:20cb03f394d5 | 2 | #include "us_ticker_api.h" // Accès à un compteur 32 bits en "free running" |
annicksenecal | 0:20cb03f394d5 | 3 | #include "mlcd_32pt.h" // Prototypes des fonctions et constantes pour l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 4 | |
annicksenecal | 0:20cb03f394d5 | 5 | #define LCD_TX p28 // Broches pour communication avec l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 6 | #define LCD_RX p27 |
annicksenecal | 0:20cb03f394d5 | 7 | #define LCD_RAZ p30 // Broche pour remise à zéro de l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 8 | #define DELAI_RAZ 2000 // Constante pour délai en msec pour la remise à zéro de l'affichewur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 9 | #define DELAI_CLIGNOTE 25 // Constante pour délai en msec du clignotement de l'ACK |
annicksenecal | 0:20cb03f394d5 | 10 | |
annicksenecal | 0:20cb03f394d5 | 11 | |
annicksenecal | 0:20cb03f394d5 | 12 | Serial lcd(LCD_TX, LCD_RX); // Objet pour communication série avec l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 13 | Serial term(USBTX, USBRX); // Terminal série vers le PC pour mise au point |
annicksenecal | 0:20cb03f394d5 | 14 | DigitalOut led_ack(LED1); // Sortie vers LED1 pour indiquer si il y a réception de l'ACK de l'afficheur µLCD32 (2 clignotements rapides : ACK reçu, LED1 allumé : aucun ACK) |
annicksenecal | 0:20cb03f394d5 | 15 | DigitalOut sig_raz(LCD_RAZ); // Sortie pour contrôle de la remise à zéro de l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 16 | int reponse; |
annicksenecal | 0:20cb03f394d5 | 17 | |
annicksenecal | 0:20cb03f394d5 | 18 | /* |
annicksenecal | 0:20cb03f394d5 | 19 | Remise à zéro de l'afficheur |
annicksenecal | 0:20cb03f394d5 | 20 | |
annicksenecal | 0:20cb03f394d5 | 21 | */ |
annicksenecal | 0:20cb03f394d5 | 22 | void raz(void) |
annicksenecal | 0:20cb03f394d5 | 23 | { |
annicksenecal | 0:20cb03f394d5 | 24 | sig_raz = 0; // Impulsion négative pour raz de l'afficheur |
annicksenecal | 0:20cb03f394d5 | 25 | wait_ms(25); |
annicksenecal | 0:20cb03f394d5 | 26 | sig_raz = 1; |
annicksenecal | 0:20cb03f394d5 | 27 | wait_ms(DELAI_RAZ); // Délai d'attente après une remise à zéro |
annicksenecal | 0:20cb03f394d5 | 28 | } |
annicksenecal | 0:20cb03f394d5 | 29 | |
annicksenecal | 0:20cb03f394d5 | 30 | /* |
annicksenecal | 0:20cb03f394d5 | 31 | Clignotement de la del pour l'ACK |
annicksenecal | 0:20cb03f394d5 | 32 | |
annicksenecal | 0:20cb03f394d5 | 33 | time : durée du clignotement en msec. |
annicksenecal | 0:20cb03f394d5 | 34 | */ |
annicksenecal | 0:20cb03f394d5 | 35 | void pulse(int time) |
annicksenecal | 0:20cb03f394d5 | 36 | { |
annicksenecal | 0:20cb03f394d5 | 37 | int i; |
annicksenecal | 0:20cb03f394d5 | 38 | for(i=0;i<2;i++) // Clignote 2 fois |
annicksenecal | 0:20cb03f394d5 | 39 | { |
annicksenecal | 0:20cb03f394d5 | 40 | led_ack = 1; // Clignotement de la LED de "time" msec. |
annicksenecal | 0:20cb03f394d5 | 41 | wait_ms(time); |
annicksenecal | 0:20cb03f394d5 | 42 | led_ack = 0; |
annicksenecal | 0:20cb03f394d5 | 43 | wait_ms(time); |
annicksenecal | 0:20cb03f394d5 | 44 | } |
annicksenecal | 0:20cb03f394d5 | 45 | } |
annicksenecal | 0:20cb03f394d5 | 46 | |
annicksenecal | 0:20cb03f394d5 | 47 | /* |
annicksenecal | 0:20cb03f394d5 | 48 | Lecture de l'ACK de l'afficheur LCD |
annicksenecal | 0:20cb03f394d5 | 49 | */ |
annicksenecal | 0:20cb03f394d5 | 50 | |
annicksenecal | 0:20cb03f394d5 | 51 | int ack(void) |
annicksenecal | 0:20cb03f394d5 | 52 | { |
annicksenecal | 0:20cb03f394d5 | 53 | int rep = NAK; |
annicksenecal | 0:20cb03f394d5 | 54 | |
annicksenecal | 0:20cb03f394d5 | 55 | if ((rep = lcd.getc()) != ACK) // Lecture de l'ACK |
annicksenecal | 0:20cb03f394d5 | 56 | { |
annicksenecal | 0:20cb03f394d5 | 57 | led_ack = 1; // Allume le LED en cas d'erreur |
annicksenecal | 0:20cb03f394d5 | 58 | rep = NAK; |
annicksenecal | 0:20cb03f394d5 | 59 | } |
annicksenecal | 0:20cb03f394d5 | 60 | else |
annicksenecal | 0:20cb03f394d5 | 61 | pulse(DELAI_CLIGNOTE); // Indique que l'ACK est reçu |
annicksenecal | 0:20cb03f394d5 | 62 | |
annicksenecal | 0:20cb03f394d5 | 63 | wait_ms(25); |
annicksenecal | 0:20cb03f394d5 | 64 | |
annicksenecal | 0:20cb03f394d5 | 65 | return rep; |
annicksenecal | 0:20cb03f394d5 | 66 | } |
annicksenecal | 0:20cb03f394d5 | 67 | |
annicksenecal | 0:20cb03f394d5 | 68 | /* |
annicksenecal | 0:20cb03f394d5 | 69 | Conversion d'une couleur sur 24 bits en une couleur sur 16 bits pour l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 70 | |
annicksenecal | 0:20cb03f394d5 | 71 | r : Couleur rouge sur 8 bits |
annicksenecal | 0:20cb03f394d5 | 72 | g : Couleur verte sur 8 bits |
annicksenecal | 0:20cb03f394d5 | 73 | b : Couleur bleu sur 8 bits |
annicksenecal | 0:20cb03f394d5 | 74 | |
annicksenecal | 0:20cb03f394d5 | 75 | Valeur de sortie : Couleur résultante sur 16 bits pour l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 76 | */ |
annicksenecal | 0:20cb03f394d5 | 77 | int rgb(char r, char g, char b) |
annicksenecal | 0:20cb03f394d5 | 78 | { |
annicksenecal | 0:20cb03f394d5 | 79 | return (r>> 3 << 11) | (g>> 2 << 5) | (b>> 3); // Conversion des la valeur sur 24 bits en 16 bits |
annicksenecal | 0:20cb03f394d5 | 80 | } |
annicksenecal | 0:20cb03f394d5 | 81 | |
annicksenecal | 0:20cb03f394d5 | 82 | /* |
annicksenecal | 0:20cb03f394d5 | 83 | Dessin d'un bouton de contrôle pour l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 84 | |
annicksenecal | 0:20cb03f394d5 | 85 | state : État du bouton ( 0 : pressé, 1 : relaché) |
annicksenecal | 0:20cb03f394d5 | 86 | x, y : Position du bouton |
annicksenecal | 0:20cb03f394d5 | 87 | bgcolor : Couleur de fond du bouton sur 16 bits |
annicksenecal | 0:20cb03f394d5 | 88 | font : Police des caractères (0 : 5x7, 1 : 8x8, 2 : 8x12, 3 : 12x16 |
annicksenecal | 0:20cb03f394d5 | 89 | fgcolor : Couleur de la police sur 16 bits |
annicksenecal | 0:20cb03f394d5 | 90 | width, height : Facteur multiplicatif pour l'affichage des caractères |
annicksenecal | 0:20cb03f394d5 | 91 | *str : Pointeur vers chaîne de caractères à afficher dans le bouton |
annicksenecal | 0:20cb03f394d5 | 92 | |
annicksenecal | 0:20cb03f394d5 | 93 | Valeur de sortie : ACK ou NAK |
annicksenecal | 0:20cb03f394d5 | 94 | |
annicksenecal | 0:20cb03f394d5 | 95 | */ |
annicksenecal | 0:20cb03f394d5 | 96 | int drawTextButton(char state, int x, int y, int bgcolor,char font, int fgcolor, int width, int height, unsigned char *str) |
annicksenecal | 0:20cb03f394d5 | 97 | { |
annicksenecal | 0:20cb03f394d5 | 98 | lcd.putc(BUTTON_TEXT); // Commande pour bouton texte |
annicksenecal | 0:20cb03f394d5 | 99 | lcd.putc(state); // Paramètres de la commande |
annicksenecal | 0:20cb03f394d5 | 100 | lcd.putc(x>>8); |
annicksenecal | 0:20cb03f394d5 | 101 | lcd.putc(x&0xff); |
annicksenecal | 0:20cb03f394d5 | 102 | lcd.putc(y>>8); |
annicksenecal | 0:20cb03f394d5 | 103 | lcd.putc(y&0xff); |
annicksenecal | 0:20cb03f394d5 | 104 | lcd.putc(bgcolor>>8); |
annicksenecal | 0:20cb03f394d5 | 105 | lcd.putc(bgcolor&0xff); |
annicksenecal | 0:20cb03f394d5 | 106 | lcd.putc(font); |
annicksenecal | 0:20cb03f394d5 | 107 | lcd.putc(fgcolor>>8); |
annicksenecal | 0:20cb03f394d5 | 108 | lcd.putc(fgcolor&0xff); |
annicksenecal | 0:20cb03f394d5 | 109 | lcd.putc(width); |
annicksenecal | 0:20cb03f394d5 | 110 | lcd.putc(height); |
annicksenecal | 0:20cb03f394d5 | 111 | while(*str) // Chaîne de caractères à afficher |
annicksenecal | 0:20cb03f394d5 | 112 | lcd.putc(*str++); |
annicksenecal | 0:20cb03f394d5 | 113 | |
annicksenecal | 0:20cb03f394d5 | 114 | lcd.putc(0); // Fin de la chaîne |
annicksenecal | 0:20cb03f394d5 | 115 | |
annicksenecal | 0:20cb03f394d5 | 116 | return ack(); // Retourne la lecture de l'ACK |
annicksenecal | 0:20cb03f394d5 | 117 | } |
annicksenecal | 0:20cb03f394d5 | 118 | |
annicksenecal | 0:20cb03f394d5 | 119 | /* |
annicksenecal | 0:20cb03f394d5 | 120 | Dessin d'une chaîne de caractères pour l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 121 | |
annicksenecal | 0:20cb03f394d5 | 122 | x, y : Position du début de la chaîne de caractères |
annicksenecal | 0:20cb03f394d5 | 123 | font : Police des caractères (0 : 5x7, 1 : 8x8, 2 : 8x12, 3 : 12x16 |
annicksenecal | 0:20cb03f394d5 | 124 | fgcolor : Couleur de la police sur 16 bits |
annicksenecal | 0:20cb03f394d5 | 125 | *str : Pointeur vers chaîne de caractères à afficher dans le bouton |
annicksenecal | 0:20cb03f394d5 | 126 | |
annicksenecal | 0:20cb03f394d5 | 127 | Valeur de sortie : ACK ou NAK |
annicksenecal | 0:20cb03f394d5 | 128 | |
annicksenecal | 0:20cb03f394d5 | 129 | */ |
annicksenecal | 0:20cb03f394d5 | 130 | |
annicksenecal | 0:20cb03f394d5 | 131 | int drawString(int x, int y, char font, int fgcolor, int width, int height, unsigned char *str) |
annicksenecal | 0:20cb03f394d5 | 132 | { |
annicksenecal | 0:20cb03f394d5 | 133 | lcd.putc(STRING); // Commande pour le dessin d'une chaîne de caractères sur l'écran µLCD32 |
annicksenecal | 0:20cb03f394d5 | 134 | lcd.putc(x>>8); // Paramèrtre de la commande |
annicksenecal | 0:20cb03f394d5 | 135 | lcd.putc(x&0xff); |
annicksenecal | 0:20cb03f394d5 | 136 | lcd.putc(y>>8); |
annicksenecal | 0:20cb03f394d5 | 137 | lcd.putc(y&0xff); |
annicksenecal | 0:20cb03f394d5 | 138 | lcd.putc(font); |
annicksenecal | 0:20cb03f394d5 | 139 | lcd.putc(fgcolor>>8); |
annicksenecal | 0:20cb03f394d5 | 140 | lcd.putc(fgcolor&0xff); |
annicksenecal | 0:20cb03f394d5 | 141 | lcd.putc(width); |
annicksenecal | 0:20cb03f394d5 | 142 | lcd.putc(height); |
annicksenecal | 0:20cb03f394d5 | 143 | |
annicksenecal | 0:20cb03f394d5 | 144 | while(*str) // Chaîne de caractères à afficher |
annicksenecal | 0:20cb03f394d5 | 145 | lcd.putc(*str++); |
annicksenecal | 0:20cb03f394d5 | 146 | |
annicksenecal | 0:20cb03f394d5 | 147 | lcd.putc(0); // Fin de la chaîne |
annicksenecal | 0:20cb03f394d5 | 148 | |
annicksenecal | 0:20cb03f394d5 | 149 | return ack(); |
annicksenecal | 0:20cb03f394d5 | 150 | } |
annicksenecal | 0:20cb03f394d5 | 151 | |
annicksenecal | 0:20cb03f394d5 | 152 | /* |
annicksenecal | 0:20cb03f394d5 | 153 | Change la couleur de fond de l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 154 | |
annicksenecal | 0:20cb03f394d5 | 155 | fgcolor : Couleur de fond sur 16 bits |
annicksenecal | 0:20cb03f394d5 | 156 | |
annicksenecal | 0:20cb03f394d5 | 157 | Valeur de sortie : ACK ou NAK |
annicksenecal | 0:20cb03f394d5 | 158 | |
annicksenecal | 0:20cb03f394d5 | 159 | */ |
annicksenecal | 0:20cb03f394d5 | 160 | int setbgColor(int fgcolor) |
annicksenecal | 0:20cb03f394d5 | 161 | { |
annicksenecal | 0:20cb03f394d5 | 162 | lcd.putc(BGCOLOR); |
annicksenecal | 0:20cb03f394d5 | 163 | lcd.putc(fgcolor>>8); |
annicksenecal | 0:20cb03f394d5 | 164 | lcd.putc(fgcolor&0xff); |
annicksenecal | 0:20cb03f394d5 | 165 | return ack(); |
annicksenecal | 0:20cb03f394d5 | 166 | } |
annicksenecal | 0:20cb03f394d5 | 167 | |
annicksenecal | 0:20cb03f394d5 | 168 | /* |
annicksenecal | 0:20cb03f394d5 | 169 | Initialisation du menu (ne fait rien à part d'effacer l'écran µLCD32) |
annicksenecal | 0:20cb03f394d5 | 170 | |
annicksenecal | 0:20cb03f394d5 | 171 | Valeur de sortie : ACK ou NAK |
annicksenecal | 0:20cb03f394d5 | 172 | */ |
annicksenecal | 0:20cb03f394d5 | 173 | |
annicksenecal | 0:20cb03f394d5 | 174 | int initMenu() |
annicksenecal | 0:20cb03f394d5 | 175 | { |
annicksenecal | 0:20cb03f394d5 | 176 | int rep; |
annicksenecal | 0:20cb03f394d5 | 177 | |
annicksenecal | 0:20cb03f394d5 | 178 | lcd.putc(ERASE); // Commande pour effacer l'écran |
annicksenecal | 0:20cb03f394d5 | 179 | rep = ack(); // Lecture de l'ACK |
annicksenecal | 0:20cb03f394d5 | 180 | |
annicksenecal | 0:20cb03f394d5 | 181 | return rep; |
annicksenecal | 0:20cb03f394d5 | 182 | } |
annicksenecal | 0:20cb03f394d5 | 183 | |
annicksenecal | 0:20cb03f394d5 | 184 | /* |
annicksenecal | 0:20cb03f394d5 | 185 | Initialise la vitesse de communication série avec l'afficheur |
annicksenecal | 0:20cb03f394d5 | 186 | |
annicksenecal | 0:20cb03f394d5 | 187 | baudrate : Vitesse de communication |
annicksenecal | 0:20cb03f394d5 | 188 | |
annicksenecal | 0:20cb03f394d5 | 189 | Valeur de sortie : ACK ou NAK |
annicksenecal | 0:20cb03f394d5 | 190 | |
annicksenecal | 0:20cb03f394d5 | 191 | */ |
annicksenecal | 0:20cb03f394d5 | 192 | |
annicksenecal | 0:20cb03f394d5 | 193 | int init_com(int baudrate) |
annicksenecal | 0:20cb03f394d5 | 194 | { |
annicksenecal | 0:20cb03f394d5 | 195 | |
annicksenecal | 0:20cb03f394d5 | 196 | lcd.putc(SET_BAUD); // Commande pour changer de vitesse de communication |
annicksenecal | 0:20cb03f394d5 | 197 | lcd.baud(baudrate); // Nouvelle vitesse |
annicksenecal | 0:20cb03f394d5 | 198 | |
annicksenecal | 0:20cb03f394d5 | 199 | return 1;//ack(); // Lecture de l'ACK |
annicksenecal | 0:20cb03f394d5 | 200 | } |
annicksenecal | 0:20cb03f394d5 | 201 | |
annicksenecal | 0:20cb03f394d5 | 202 | /* |
annicksenecal | 0:20cb03f394d5 | 203 | Initialisation de l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 204 | */ |
annicksenecal | 0:20cb03f394d5 | 205 | |
annicksenecal | 0:20cb03f394d5 | 206 | void init_lcd(void) |
annicksenecal | 0:20cb03f394d5 | 207 | { |
annicksenecal | 0:20cb03f394d5 | 208 | raz(); // remise à zéro de l'afficheur µLCD32 |
annicksenecal | 0:20cb03f394d5 | 209 | |
annicksenecal | 0:20cb03f394d5 | 210 | |
annicksenecal | 0:20cb03f394d5 | 211 | lcd.putc(AUTO_BAUD); //Baudrate automatique |
annicksenecal | 0:20cb03f394d5 | 212 | ack(); |
annicksenecal | 0:20cb03f394d5 | 213 | wait_ms(20); |
annicksenecal | 0:20cb03f394d5 | 214 | |
annicksenecal | 0:20cb03f394d5 | 215 | // Active l'écran tactile du µLCD32 |
annicksenecal | 0:20cb03f394d5 | 216 | lcd.putc('Y'); |
annicksenecal | 0:20cb03f394d5 | 217 | lcd.putc(0x05); |
annicksenecal | 0:20cb03f394d5 | 218 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 219 | ack(); |
annicksenecal | 0:20cb03f394d5 | 220 | |
annicksenecal | 0:20cb03f394d5 | 221 | // Active toute la surface de l'écran tactile |
annicksenecal | 0:20cb03f394d5 | 222 | lcd.putc('Y'); |
annicksenecal | 0:20cb03f394d5 | 223 | lcd.putc(0x05); |
annicksenecal | 0:20cb03f394d5 | 224 | lcd.putc(0x02); |
annicksenecal | 0:20cb03f394d5 | 225 | ack(); |
annicksenecal | 0:20cb03f394d5 | 226 | |
annicksenecal | 0:20cb03f394d5 | 227 | // Initialise le menu |
annicksenecal | 0:20cb03f394d5 | 228 | initMenu(); |
annicksenecal | 0:20cb03f394d5 | 229 | |
annicksenecal | 0:20cb03f394d5 | 230 | //Initialise le GET TOUCH |
annicksenecal | 0:20cb03f394d5 | 231 | lcd.putc('o'); |
annicksenecal | 0:20cb03f394d5 | 232 | lcd.putc(0x04); |
annicksenecal | 0:20cb03f394d5 | 233 | return reponse; |
annicksenecal | 0:20cb03f394d5 | 234 | |
annicksenecal | 0:20cb03f394d5 | 235 | } |
annicksenecal | 0:20cb03f394d5 | 236 | |
annicksenecal | 0:20cb03f394d5 | 237 | int double_clic(void) |
annicksenecal | 0:20cb03f394d5 | 238 | { |
annicksenecal | 0:20cb03f394d5 | 239 | |
annicksenecal | 0:20cb03f394d5 | 240 | |
annicksenecal | 0:20cb03f394d5 | 241 | if (reponse == 2) |
annicksenecal | 0:20cb03f394d5 | 242 | { |
annicksenecal | 0:20cb03f394d5 | 243 | lcd.putc('w'); |
annicksenecal | 0:20cb03f394d5 | 244 | lcd.putc(0x01); |
annicksenecal | 0:20cb03f394d5 | 245 | lcd.putc(0xF4); |
annicksenecal | 0:20cb03f394d5 | 246 | reponse = ack(); |
annicksenecal | 0:20cb03f394d5 | 247 | |
annicksenecal | 0:20cb03f394d5 | 248 | if (reponse == 6) |
annicksenecal | 0:20cb03f394d5 | 249 | { |
annicksenecal | 0:20cb03f394d5 | 250 | lcd.putc('E'); |
annicksenecal | 0:20cb03f394d5 | 251 | return ack(); |
annicksenecal | 0:20cb03f394d5 | 252 | } |
annicksenecal | 0:20cb03f394d5 | 253 | } |
annicksenecal | 0:20cb03f394d5 | 254 | } |
annicksenecal | 0:20cb03f394d5 | 255 | |
annicksenecal | 0:20cb03f394d5 | 256 | int copier_coller(void) |
annicksenecal | 0:20cb03f394d5 | 257 | { |
annicksenecal | 0:20cb03f394d5 | 258 | lcd.putc('c'); |
annicksenecal | 0:20cb03f394d5 | 259 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 260 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 261 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 262 | lcd.putc(0x0F); |
annicksenecal | 0:20cb03f394d5 | 263 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 264 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 265 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 266 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 267 | lcd.putc(0x01); |
annicksenecal | 0:20cb03f394d5 | 268 | lcd.putc(0x3F); |
annicksenecal | 0:20cb03f394d5 | 269 | lcd.putc(0x00); |
annicksenecal | 0:20cb03f394d5 | 270 | lcd.putc(0xE0); |
annicksenecal | 0:20cb03f394d5 | 271 | return ack(); |
annicksenecal | 0:20cb03f394d5 | 272 | |
annicksenecal | 0:20cb03f394d5 | 273 | } |