Lab 6 final, sur l'écran tactile mlcd_32pt
Revision 0:20cb03f394d5, committed 2013-12-15
- Comitter:
- annicksenecal
- Date:
- Sun Dec 15 16:05:51 2013 +0000
- Commit message:
- version finale
Changed in this revision
mlcd_32pt.cpp | Show annotated file Show diff for this revision Revisions of this file |
mlcd_32pt.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 20cb03f394d5 mlcd_32pt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mlcd_32pt.cpp Sun Dec 15 16:05:51 2013 +0000 @@ -0,0 +1,273 @@ +#include "mbed.h" // Pour accès aux différentes librairies du Mbed +#include "us_ticker_api.h" // Accès à un compteur 32 bits en "free running" +#include "mlcd_32pt.h" // Prototypes des fonctions et constantes pour l'afficheur µLCD32 + +#define LCD_TX p28 // Broches pour communication avec l'afficheur µLCD32 +#define LCD_RX p27 +#define LCD_RAZ p30 // Broche pour remise à zéro de l'afficheur µLCD32 +#define DELAI_RAZ 2000 // Constante pour délai en msec pour la remise à zéro de l'affichewur µLCD32 +#define DELAI_CLIGNOTE 25 // Constante pour délai en msec du clignotement de l'ACK + + +Serial lcd(LCD_TX, LCD_RX); // Objet pour communication série avec l'afficheur µLCD32 +Serial term(USBTX, USBRX); // Terminal série vers le PC pour mise au point +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) +DigitalOut sig_raz(LCD_RAZ); // Sortie pour contrôle de la remise à zéro de l'afficheur µLCD32 +int reponse; + +/* + Remise à zéro de l'afficheur + +*/ +void raz(void) +{ + sig_raz = 0; // Impulsion négative pour raz de l'afficheur + wait_ms(25); + sig_raz = 1; + wait_ms(DELAI_RAZ); // Délai d'attente après une remise à zéro +} + +/* + Clignotement de la del pour l'ACK + + time : durée du clignotement en msec. +*/ +void pulse(int time) +{ + int i; + for(i=0;i<2;i++) // Clignote 2 fois + { + led_ack = 1; // Clignotement de la LED de "time" msec. + wait_ms(time); + led_ack = 0; + wait_ms(time); + } +} + +/* + Lecture de l'ACK de l'afficheur LCD +*/ + +int ack(void) +{ + int rep = NAK; + + if ((rep = lcd.getc()) != ACK) // Lecture de l'ACK + { + led_ack = 1; // Allume le LED en cas d'erreur + rep = NAK; + } + else + pulse(DELAI_CLIGNOTE); // Indique que l'ACK est reçu + + wait_ms(25); + + return rep; +} + +/* + Conversion d'une couleur sur 24 bits en une couleur sur 16 bits pour l'afficheur µLCD32 + + r : Couleur rouge sur 8 bits + g : Couleur verte sur 8 bits + b : Couleur bleu sur 8 bits + + Valeur de sortie : Couleur résultante sur 16 bits pour l'afficheur µLCD32 +*/ +int rgb(char r, char g, char b) +{ + return (r>> 3 << 11) | (g>> 2 << 5) | (b>> 3); // Conversion des la valeur sur 24 bits en 16 bits +} + +/* + Dessin d'un bouton de contrôle pour l'afficheur µLCD32 + + state : État du bouton ( 0 : pressé, 1 : relaché) + x, y : Position du bouton + bgcolor : Couleur de fond du bouton sur 16 bits + font : Police des caractères (0 : 5x7, 1 : 8x8, 2 : 8x12, 3 : 12x16 + fgcolor : Couleur de la police sur 16 bits + width, height : Facteur multiplicatif pour l'affichage des caractères + *str : Pointeur vers chaîne de caractères à afficher dans le bouton + + Valeur de sortie : ACK ou NAK + +*/ +int drawTextButton(char state, int x, int y, int bgcolor,char font, int fgcolor, int width, int height, unsigned char *str) +{ + lcd.putc(BUTTON_TEXT); // Commande pour bouton texte + lcd.putc(state); // Paramètres de la commande + lcd.putc(x>>8); + lcd.putc(x&0xff); + lcd.putc(y>>8); + lcd.putc(y&0xff); + lcd.putc(bgcolor>>8); + lcd.putc(bgcolor&0xff); + lcd.putc(font); + lcd.putc(fgcolor>>8); + lcd.putc(fgcolor&0xff); + lcd.putc(width); + lcd.putc(height); + while(*str) // Chaîne de caractères à afficher + lcd.putc(*str++); + + lcd.putc(0); // Fin de la chaîne + + return ack(); // Retourne la lecture de l'ACK +} + +/* + Dessin d'une chaîne de caractères pour l'afficheur µLCD32 + + x, y : Position du début de la chaîne de caractères + font : Police des caractères (0 : 5x7, 1 : 8x8, 2 : 8x12, 3 : 12x16 + fgcolor : Couleur de la police sur 16 bits + *str : Pointeur vers chaîne de caractères à afficher dans le bouton + + Valeur de sortie : ACK ou NAK + +*/ + +int drawString(int x, int y, char font, int fgcolor, int width, int height, unsigned char *str) +{ + lcd.putc(STRING); // Commande pour le dessin d'une chaîne de caractères sur l'écran µLCD32 + lcd.putc(x>>8); // Paramèrtre de la commande + lcd.putc(x&0xff); + lcd.putc(y>>8); + lcd.putc(y&0xff); + lcd.putc(font); + lcd.putc(fgcolor>>8); + lcd.putc(fgcolor&0xff); + lcd.putc(width); + lcd.putc(height); + + while(*str) // Chaîne de caractères à afficher + lcd.putc(*str++); + + lcd.putc(0); // Fin de la chaîne + + return ack(); +} + +/* + Change la couleur de fond de l'afficheur µLCD32 + + fgcolor : Couleur de fond sur 16 bits + + Valeur de sortie : ACK ou NAK + +*/ +int setbgColor(int fgcolor) +{ + lcd.putc(BGCOLOR); + lcd.putc(fgcolor>>8); + lcd.putc(fgcolor&0xff); + return ack(); +} + +/* + Initialisation du menu (ne fait rien à part d'effacer l'écran µLCD32) + + Valeur de sortie : ACK ou NAK +*/ + +int initMenu() +{ + int rep; + + lcd.putc(ERASE); // Commande pour effacer l'écran + rep = ack(); // Lecture de l'ACK + + return rep; +} + +/* + Initialise la vitesse de communication série avec l'afficheur + + baudrate : Vitesse de communication + + Valeur de sortie : ACK ou NAK + +*/ + +int init_com(int baudrate) +{ + + lcd.putc(SET_BAUD); // Commande pour changer de vitesse de communication + lcd.baud(baudrate); // Nouvelle vitesse + + return 1;//ack(); // Lecture de l'ACK +} + +/* + Initialisation de l'afficheur µLCD32 +*/ + +void init_lcd(void) +{ + raz(); // remise à zéro de l'afficheur µLCD32 + + + lcd.putc(AUTO_BAUD); //Baudrate automatique + ack(); + wait_ms(20); + + // Active l'écran tactile du µLCD32 + lcd.putc('Y'); + lcd.putc(0x05); + lcd.putc(0x00); + ack(); + + // Active toute la surface de l'écran tactile + lcd.putc('Y'); + lcd.putc(0x05); + lcd.putc(0x02); + ack(); + + // Initialise le menu + initMenu(); + + //Initialise le GET TOUCH + lcd.putc('o'); + lcd.putc(0x04); + return reponse; + +} + +int double_clic(void) +{ + + + if (reponse == 2) + { + lcd.putc('w'); + lcd.putc(0x01); + lcd.putc(0xF4); + reponse = ack(); + + if (reponse == 6) + { + lcd.putc('E'); + return ack(); + } + } +} + +int copier_coller(void) +{ + lcd.putc('c'); + lcd.putc(0x00); + lcd.putc(0x00); + lcd.putc(0x00); + lcd.putc(0x0F); + lcd.putc(0x00); + lcd.putc(0x00); + lcd.putc(0x00); + lcd.putc(0x00); + lcd.putc(0x01); + lcd.putc(0x3F); + lcd.putc(0x00); + lcd.putc(0xE0); + return ack(); + +}
diff -r 000000000000 -r 20cb03f394d5 mlcd_32pt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mlcd_32pt.h Sun Dec 15 16:05:51 2013 +0000 @@ -0,0 +1,32 @@ +/* Constantes pour les commandes de l'afficheur µLCD32 : Voir fichierPICASS)-SGC-COMMANDS-SIS-rev8.pdf dans I:\Cours\247-565-SH (SOI)\lab5\4D Systems\doc */ +#define ACK 0x06 +#define NAK 0x15 +#define AUTO_BAUD 'U' +#define ERASE 'E' +#define CHANGE_BAUD 'Q' +#define BGCOLOR 'B' +#define STRING 'S' +#define BUTTON_TEXT 'b' +#define BUTTON_UP 1 +#define BUTTON_DOWN 0 +#define FONT_5_7 0 +#define FONT_8_8 1 +#define FONT_8_12 2 +#define FONT_12_16 3 +#define BAUD9600 0x06 +#define BAUD115200 0x0D +#define SET_BAUD 0x51 + + +void raz(void); // Remise à zéro de l'afficheur +int ack(void); // Lecture de l'ACK +int rgb(char r, char g, char b); // Conversion d'une couleur 24 bits sur 16 bits +int drawString(int x, int y, char font, int fgcolor, int width, int height, unsigned char *str); // Affichage d'une chaîne de caractères +int drawTextButton(char state, int x, int y, int bgcolor,char font, int fgcolor, int width, int height, unsigned char *str); // Affichage d'un bouton de contrôle +int initMenu(void); // Initialise le menu +int setbgColor(int fgcolor); // Change la couleur de fond +void pulse(int time); // Clignotement de la del pour l'ACK +int init_com(int baudrate); // Change la vitesse de communication série +void init_lcd(void); // Initialise l'afficheur avec zone tactile +int double_clic(void); // Double clic... +int copier_coller(void); \ No newline at end of file