Version avec sortie ABCD sur même connecteur

Dependencies:   SDFileSystemDMA mbed

Fork of DmdFullRGB_0_1 by Christophe Girardot

Committer:
IroCorp
Date:
Wed Dec 13 22:04:26 2017 +0000
Revision:
3:5fc29520dff0
Parent:
2:2f5b7e5faf83
configuration.h : Changement sortie C (A0) pour D2 - Iro 13/12/17 23h04

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Aganyte 0:d5f38b9d7c7a 1 /* Librairie de gestion d'un DMD RGB 128x32 pixels
Aganyte 0:d5f38b9d7c7a 2 * - 256 Couleurs mode RGB332 et Monochrome -
Aganyte 0:d5f38b9d7c7a 3 * decembre 2017 par Christophe Girardot Aka Aganyte
Aganyte 0:d5f38b9d7c7a 4 */
Aganyte 0:d5f38b9d7c7a 5
Aganyte 0:d5f38b9d7c7a 6 /* Ouverture de la liaison série */
Aganyte 0:d5f38b9d7c7a 7 Serial pc(SERIAL_TX, SERIAL_RX, 9600);
Aganyte 0:d5f38b9d7c7a 8
Aganyte 0:d5f38b9d7c7a 9 // Mémoire vidéo de 128x32 pixels avec 1 octet par pixel
Aganyte 0:d5f38b9d7c7a 10 unsigned char Display_Ram[4096];
Aganyte 0:d5f38b9d7c7a 11
Aganyte 0:d5f38b9d7c7a 12 // Mémoire vidéo Monochrome de 128x32 pixels avec 1 bit par pixel (Octet)
Aganyte 0:d5f38b9d7c7a 13 unsigned char Mono_Display_Ram[512];
Aganyte 0:d5f38b9d7c7a 14
Aganyte 0:d5f38b9d7c7a 15 // Mémoire vidéo Monochrome de 128x32 pixels avec 1 bit par pixel(booléen)
Aganyte 0:d5f38b9d7c7a 16 bool Bool_Display_Ram[4096];
Aganyte 0:d5f38b9d7c7a 17
Aganyte 0:d5f38b9d7c7a 18 // Mémoire de stockage des Scrolling de la SD
Aganyte 0:d5f38b9d7c7a 19 unsigned char Scrolling_Buffer[40960];
Aganyte 0:d5f38b9d7c7a 20
Aganyte 0:d5f38b9d7c7a 21 // Paramètres réglables depuis la SD (avec les valeurs par défaut au démarrage)
Aganyte 0:d5f38b9d7c7a 22 unsigned char Replay=1;
Aganyte 0:d5f38b9d7c7a 23 unsigned char Speed=5;
Aganyte 0:d5f38b9d7c7a 24 unsigned char Sleep=5;
Aganyte 0:d5f38b9d7c7a 25 unsigned char Color_R=1;
Aganyte 0:d5f38b9d7c7a 26 unsigned char Color_G=0;
Aganyte 0:d5f38b9d7c7a 27 unsigned char Color_B=0;
Aganyte 0:d5f38b9d7c7a 28 unsigned char Up = 1;
Aganyte 0:d5f38b9d7c7a 29 unsigned char Left = 1;
Aganyte 2:2f5b7e5faf83 30 unsigned char Brightness_level = 9;
Aganyte 1:353c1902483f 31 char Command[6];
Aganyte 0:d5f38b9d7c7a 32
Aganyte 2:2f5b7e5faf83 33 unsigned int Up_Ligne_adress = 0; // Evite une re-déclaration
Aganyte 2:2f5b7e5faf83 34 unsigned int Bottom_Ligne_adress = 0; // Evite une re-déclaration
Aganyte 2:2f5b7e5faf83 35
Aganyte 0:d5f38b9d7c7a 36 /* Masque de décodage */
Aganyte 0:d5f38b9d7c7a 37 // En RGB332 (le Bleu possède moins de nuance car l'oeil humain les distinguent moins)
Aganyte 0:d5f38b9d7c7a 38 // Seulement 7 niveau par masque car la nuance la plus basse correspond à une led éteinte
Aganyte 0:d5f38b9d7c7a 39 // R => 0x11100000
Aganyte 0:d5f38b9d7c7a 40 // G => 0x00011100
Aganyte 0:d5f38b9d7c7a 41 // B => 0x00000011
Aganyte 0:d5f38b9d7c7a 42 unsigned char Red_Mask[7] = {
Aganyte 0:d5f38b9d7c7a 43 0b00100000, // nuance 0, C
Aganyte 0:d5f38b9d7c7a 44 0b01000000, // nuance 1, B
Aganyte 0:d5f38b9d7c7a 45 0b01100000, // nuance 2, B ET C
Aganyte 0:d5f38b9d7c7a 46 0b10000000, // nuance 3, A
Aganyte 0:d5f38b9d7c7a 47 0b10100000, // nuance 4, A ET C
Aganyte 0:d5f38b9d7c7a 48 0b11000000, // nuance 5, A ET B
Aganyte 0:d5f38b9d7c7a 49 0b11100000, // nuance 6, A ET B ET C
Aganyte 0:d5f38b9d7c7a 50 };
Aganyte 0:d5f38b9d7c7a 51 unsigned char Green_Mask[7] = {
Aganyte 0:d5f38b9d7c7a 52 0b00000100, // nuance 0, C
Aganyte 0:d5f38b9d7c7a 53 0b00001000, // nuance 1, B
Aganyte 0:d5f38b9d7c7a 54 0b00001100, // nuance 2, B ET C
Aganyte 0:d5f38b9d7c7a 55 0b00010000, // nuance 3, A
Aganyte 0:d5f38b9d7c7a 56 0b00010100, // nuance 4, A ET C
Aganyte 0:d5f38b9d7c7a 57 0b00011000, // nuance 5, A ET B
Aganyte 0:d5f38b9d7c7a 58 0b00011100, // nuance 6, A ET B ET C
Aganyte 0:d5f38b9d7c7a 59 };
Aganyte 0:d5f38b9d7c7a 60 unsigned char Blue_Mask[7] = { // On compte en double pour créer 7 niveaux (Comme R et G)
Aganyte 1:353c1902483f 61 0b00000000, // nuance 0, rien
Aganyte 0:d5f38b9d7c7a 62 0b00000001, // nuance 1, B
Aganyte 1:353c1902483f 63 0b00000001, // nuance 2, B
Aganyte 0:d5f38b9d7c7a 64 0b00000010, // naunce 3, A
Aganyte 1:353c1902483f 65 0b00000010, // nuance 4, A
Aganyte 0:d5f38b9d7c7a 66 0b00000011, // nuance 5, A ET B
Aganyte 0:d5f38b9d7c7a 67 0b00000011, // nuance 6, A ET B
Aganyte 0:d5f38b9d7c7a 68 };
Aganyte 0:d5f38b9d7c7a 69
Aganyte 1:353c1902483f 70 void Image(unsigned int Time); // Prédéclaration de la fonction Image
Aganyte 1:353c1902483f 71
Aganyte 1:353c1902483f 72 /* Fonction qui efface la mémoire vidéo RGB
Aganyte 1:353c1902483f 73 */
Aganyte 1:353c1902483f 74 void Clear_Display_Ram()
Aganyte 1:353c1902483f 75 {
Aganyte 1:353c1902483f 76 for(unsigned int count = 0 ; count < 4096; count ++)
Aganyte 1:353c1902483f 77 Display_Ram[count] = 0;
Aganyte 1:353c1902483f 78 }
Aganyte 1:353c1902483f 79
Aganyte 0:d5f38b9d7c7a 80 /* Fonction qui convertit le buffer monochrome en octet vers le buffer monochrome en booléen
Aganyte 0:d5f38b9d7c7a 81 *
Aganyte 0:d5f38b9d7c7a 82 */
Aganyte 0:d5f38b9d7c7a 83 void Convert_Mono_To_Bool()
Aganyte 0:d5f38b9d7c7a 84 {
Aganyte 0:d5f38b9d7c7a 85 for(unsigned int count = 0; count < 512 ; count++) // lecture des 512 octets
Aganyte 0:d5f38b9d7c7a 86 {
Aganyte 0:d5f38b9d7c7a 87 unsigned char buffer = Mono_Display_Ram[count]; // lecture d'un octet
Aganyte 0:d5f38b9d7c7a 88 for(unsigned char bit = 0; bit < 8; bit++) // remplir 8 booléen
Aganyte 0:d5f38b9d7c7a 89 {
Aganyte 0:d5f38b9d7c7a 90 if( (buffer & 0x80) == 0x80) // vers la gauche
Aganyte 0:d5f38b9d7c7a 91 Bool_Display_Ram[(count*8)+bit] = 1;
Aganyte 0:d5f38b9d7c7a 92 else
Aganyte 0:d5f38b9d7c7a 93 Bool_Display_Ram[(count*8)+bit] = 0;
Aganyte 0:d5f38b9d7c7a 94 buffer <<= 1;
Aganyte 0:d5f38b9d7c7a 95 }
Aganyte 0:d5f38b9d7c7a 96 }
Aganyte 0:d5f38b9d7c7a 97 }
Aganyte 0:d5f38b9d7c7a 98
Aganyte 1:353c1902483f 99 /* Fonction de convertion du buffer booléen vers le buffer RGB avec superposition
Aganyte 1:353c1902483f 100 *
Aganyte 0:d5f38b9d7c7a 101 */
Aganyte 1:353c1902483f 102 void Convert_Bool_To_RGB()
Aganyte 0:d5f38b9d7c7a 103 {
Aganyte 0:d5f38b9d7c7a 104 Convert_Mono_To_Bool();
Aganyte 0:d5f38b9d7c7a 105
Aganyte 0:d5f38b9d7c7a 106 for(unsigned int count = 0; count < 4096; count++)
Aganyte 0:d5f38b9d7c7a 107 {
Aganyte 0:d5f38b9d7c7a 108 if( (Color_R == 1) & (Bool_Display_Ram[count] == 1) )
Aganyte 0:d5f38b9d7c7a 109 Display_Ram[count] = Display_Ram[count] | Red_Mask[6];
Aganyte 0:d5f38b9d7c7a 110
Aganyte 0:d5f38b9d7c7a 111 if( (Color_G == 1) & (Bool_Display_Ram[count] == 1) )
Aganyte 0:d5f38b9d7c7a 112 Display_Ram[count] = Display_Ram[count] | Green_Mask[6];
Aganyte 0:d5f38b9d7c7a 113
Aganyte 0:d5f38b9d7c7a 114 if( (Color_B == 1) & (Bool_Display_Ram[count] == 1) )
Aganyte 0:d5f38b9d7c7a 115 Display_Ram[count] = Display_Ram[count] | Blue_Mask[6];
Aganyte 1:353c1902483f 116
Aganyte 1:353c1902483f 117 if( (Color_R == 0) & (Color_G == 0) & (Color_B == 0) & (Bool_Display_Ram[count] == 1) )
Aganyte 1:353c1902483f 118 Display_Ram[count] = 0;
Aganyte 0:d5f38b9d7c7a 119 }
Aganyte 0:d5f38b9d7c7a 120 }
Aganyte 0:d5f38b9d7c7a 121
Aganyte 0:d5f38b9d7c7a 122 /* sous programme de gestion des lignes (tous les modes) */
Aganyte 0:d5f38b9d7c7a 123 void Line(unsigned char number)
Aganyte 0:d5f38b9d7c7a 124 {
Aganyte 0:d5f38b9d7c7a 125 D = (number>>3) & 0x01;
Aganyte 0:d5f38b9d7c7a 126 C = (number>>2) & 0x01;
Aganyte 0:d5f38b9d7c7a 127 B = (number>>1) & 0x01;
Aganyte 0:d5f38b9d7c7a 128 A = number & 0x01;
Aganyte 0:d5f38b9d7c7a 129 }
Aganyte 0:d5f38b9d7c7a 130
Aganyte 0:d5f38b9d7c7a 131 /* Envoie de deux octets RGB avec choix de la nuance actuelle (mode RGB332) */
Aganyte 0:d5f38b9d7c7a 132 void Transfer(unsigned char Up_RGB, unsigned char Down_RGB, unsigned char shade)
Aganyte 0:d5f38b9d7c7a 133 {
Aganyte 1:353c1902483f 134 CLK = 0;
Aganyte 2:2f5b7e5faf83 135
Aganyte 2:2f5b7e5faf83 136 if(Up_RGB!=0)
Aganyte 1:353c1902483f 137 {
Aganyte 1:353c1902483f 138 // Préparation de R1,G1 et B1
Aganyte 1:353c1902483f 139 R1 = (Up_RGB & Red_Mask[shade]) == Red_Mask[shade];
Aganyte 1:353c1902483f 140 G1 = (Up_RGB & Green_Mask[shade]) == Green_Mask[shade];
Aganyte 1:353c1902483f 141 B1 = (Up_RGB & Blue_Mask[shade]) == Blue_Mask[shade];
Aganyte 1:353c1902483f 142 }
Aganyte 0:d5f38b9d7c7a 143 else
Aganyte 1:353c1902483f 144 {
Aganyte 2:2f5b7e5faf83 145 // Préparation de R1,G1 et B1
Aganyte 0:d5f38b9d7c7a 146 R1 = 0;
Aganyte 0:d5f38b9d7c7a 147 G1 = 0;
Aganyte 2:2f5b7e5faf83 148 B1 = 0;
Aganyte 1:353c1902483f 149 }
Aganyte 2:2f5b7e5faf83 150
Aganyte 2:2f5b7e5faf83 151 if(Down_RGB!=0)
Aganyte 1:353c1902483f 152 {
Aganyte 1:353c1902483f 153 // Préparation de R2,G2 et B2
Aganyte 1:353c1902483f 154 R2 = (Down_RGB & Red_Mask[shade]) == Red_Mask[shade];
Aganyte 1:353c1902483f 155 G2 = (Down_RGB & Green_Mask[shade]) == Green_Mask[shade];
Aganyte 1:353c1902483f 156 B2 = (Down_RGB & Blue_Mask[shade]) == Blue_Mask[shade];
Aganyte 1:353c1902483f 157 }
Aganyte 0:d5f38b9d7c7a 158 else
Aganyte 1:353c1902483f 159 {
Aganyte 2:2f5b7e5faf83 160 // Préparation de R1,G1 et B1
Aganyte 1:353c1902483f 161 R2 = 0;
Aganyte 0:d5f38b9d7c7a 162 G2 = 0;
Aganyte 2:2f5b7e5faf83 163 B2 = 0;
Aganyte 1:353c1902483f 164 }
Aganyte 1:353c1902483f 165 CLK = 1; // Front montant = Envoie de la donnée
Aganyte 0:d5f38b9d7c7a 166 }
Aganyte 0:d5f38b9d7c7a 167
Aganyte 0:d5f38b9d7c7a 168 /* Envoyer et afficher 256 pixels sur le dot (deux lignes) depuis
Aganyte 0:d5f38b9d7c7a 169 * la mémoire vidéo avec sélection de la nuance (mode RGB332)
Aganyte 0:d5f38b9d7c7a 170 */
Aganyte 0:d5f38b9d7c7a 171 void Send_256pixels(unsigned char ligne, unsigned char shade)
Aganyte 2:2f5b7e5faf83 172 {
Aganyte 0:d5f38b9d7c7a 173 LATCH = 0 ; // Préparer le front montant pour le Latch
Aganyte 2:2f5b7e5faf83 174
Aganyte 2:2f5b7e5faf83 175 Up_Ligne_adress = ligne * 128; // calcul du décalage en fonction de la ligne (moitié haute de l'écran)
Aganyte 2:2f5b7e5faf83 176 Bottom_Ligne_adress = Up_Ligne_adress + 2048; // calcul du décalage en fonction de la ligne (moitié basse de l'écran)
Aganyte 2:2f5b7e5faf83 177
Aganyte 0:d5f38b9d7c7a 178 /* Envoie de 256 octets (128 octets par ligne) */
Aganyte 0:d5f38b9d7c7a 179 for(unsigned char Count_SPI2 = 0 ; Count_SPI2<128 ; Count_SPI2++ )
Aganyte 0:d5f38b9d7c7a 180 Transfer(Display_Ram [Count_SPI2 + Up_Ligne_adress], Display_Ram [Count_SPI2 + Bottom_Ligne_adress], shade);
Aganyte 0:d5f38b9d7c7a 181
Aganyte 2:2f5b7e5faf83 182 /* Pour les nuances 4,5,6 on coupe la ligne avec le timer */
Aganyte 2:2f5b7e5faf83 183 while( Timer_Refresh.read_us() < Time_Shade[shade]);
Aganyte 2:2f5b7e5faf83 184 Timer_Refresh.reset(); // Redemarrer le timer pour le prochain tour
Aganyte 1:353c1902483f 185
Aganyte 2:2f5b7e5faf83 186 EN = 1; // Désactiver la ligne
Aganyte 2:2f5b7e5faf83 187 Line(ligne); // Sélectionner la ligne
Aganyte 2:2f5b7e5faf83 188 LATCH = 1; // Transferer la donnée sur les latchs
Aganyte 2:2f5b7e5faf83 189 EN = 0; // Activer la ligne
Aganyte 2:2f5b7e5faf83 190 if(shade<4) // Pour les nuances 0,1,2 et 3 on coupe la ligne après un wait (trop rapide pour la méthode du timer)
Aganyte 2:2f5b7e5faf83 191 {
Aganyte 2:2f5b7e5faf83 192 wait_us(Time_Shade[shade]); // Gestion du temps d'affichage de la ligne en fonction de sa nuance
Aganyte 2:2f5b7e5faf83 193 EN = 1; // Désactiver la ligne
Aganyte 2:2f5b7e5faf83 194 }
Aganyte 0:d5f38b9d7c7a 195 }
Aganyte 0:d5f38b9d7c7a 196
Aganyte 0:d5f38b9d7c7a 197 /* Rafraichir l'écran 1 fois (mode RGB332) */
Aganyte 0:d5f38b9d7c7a 198 void refresh()
Aganyte 0:d5f38b9d7c7a 199 {
Aganyte 0:d5f38b9d7c7a 200 for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 0
Aganyte 2:2f5b7e5faf83 201 Send_256pixels(ligne,6);
Aganyte 0:d5f38b9d7c7a 202 for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 1
Aganyte 2:2f5b7e5faf83 203 Send_256pixels(ligne,5);
Aganyte 0:d5f38b9d7c7a 204 for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 2
Aganyte 2:2f5b7e5faf83 205 Send_256pixels(ligne,4);
Aganyte 0:d5f38b9d7c7a 206 for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 3
Aganyte 0:d5f38b9d7c7a 207 Send_256pixels(ligne,3);
Aganyte 0:d5f38b9d7c7a 208 for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 4
Aganyte 2:2f5b7e5faf83 209 Send_256pixels(ligne,2);
Aganyte 0:d5f38b9d7c7a 210 for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 5
Aganyte 2:2f5b7e5faf83 211 Send_256pixels(ligne,1);
Aganyte 0:d5f38b9d7c7a 212 for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 6
Aganyte 2:2f5b7e5faf83 213 Send_256pixels(ligne,0);
Aganyte 2:2f5b7e5faf83 214 EN = 1; // Désactiver la ligne en fin de rafraichissement (sinon, elle brille plus que les autres....c'est moche)
Aganyte 0:d5f38b9d7c7a 215 }
Aganyte 0:d5f38b9d7c7a 216
Aganyte 1:353c1902483f 217 /* Rafraichir l'écran avec la mémoire vidéo (mode monochrome) pendant x secondes (Sleep) */
Aganyte 0:d5f38b9d7c7a 218 void refresh_mono()
Aganyte 0:d5f38b9d7c7a 219 {
Aganyte 1:353c1902483f 220 Clear_Display_Ram(); // Effacer la mémoire vidéo RGB (sinon superposition d'image)
Aganyte 1:353c1902483f 221
Aganyte 1:353c1902483f 222 Convert_Bool_To_RGB(); // Convertir le buffer mono avec superposition dans le buffer couleur
Aganyte 1:353c1902483f 223
Aganyte 1:353c1902483f 224 Image(Sleep); // Afficher l'image
Aganyte 0:d5f38b9d7c7a 225 }
Aganyte 0:d5f38b9d7c7a 226
Aganyte 0:d5f38b9d7c7a 227 /* Fonction affichage d'un scrolling vertical stocké dans le micro-controleur
Aganyte 0:d5f38b9d7c7a 228 * height => hauteur de l'image en pixels
Aganyte 0:d5f38b9d7c7a 229 * Array => nom de l'image
Aganyte 0:d5f38b9d7c7a 230 */
Aganyte 0:d5f38b9d7c7a 231 void Scrolling(unsigned int height, const unsigned char *Array)
Aganyte 0:d5f38b9d7c7a 232 {
Aganyte 0:d5f38b9d7c7a 233 pc.printf("Affichage d'un scrolling vertical de 128x%d pixels depuis le STM32\n",height);
Aganyte 0:d5f38b9d7c7a 234 for(unsigned char decal = 0; decal<(height-32); decal++)
Aganyte 0:d5f38b9d7c7a 235 {
Aganyte 0:d5f38b9d7c7a 236 // Remplir la mémoire vidéo avec une image
Aganyte 0:d5f38b9d7c7a 237 for(unsigned int count = 0; count<4096; count++)
Aganyte 0:d5f38b9d7c7a 238 Display_Ram[count] = Array[(decal*128)+count];
Aganyte 0:d5f38b9d7c7a 239 // Affichage de la mémoire vidéo
Aganyte 0:d5f38b9d7c7a 240 refresh();
Aganyte 0:d5f38b9d7c7a 241 refresh();
Aganyte 0:d5f38b9d7c7a 242 refresh();
Aganyte 0:d5f38b9d7c7a 243 }
Aganyte 0:d5f38b9d7c7a 244 }
Aganyte 0:d5f38b9d7c7a 245
Aganyte 0:d5f38b9d7c7a 246 /* Fonction affichage d'un scrolling horizontal stocké dans le micro-controleur
Aganyte 0:d5f38b9d7c7a 247 * width => largeur de l'image en pixels
Aganyte 0:d5f38b9d7c7a 248 * Array => nom de l'image
Aganyte 0:d5f38b9d7c7a 249 */
Aganyte 0:d5f38b9d7c7a 250 void Horizontal_Scrolling(unsigned int width, const unsigned char *Array)
Aganyte 0:d5f38b9d7c7a 251 {
Aganyte 0:d5f38b9d7c7a 252 pc.printf("Affichage d'un scrolling horizontal de %dx32 pixels depuis le STM32\n",width);
Aganyte 0:d5f38b9d7c7a 253 for(unsigned int image = 0 ; image < width-128; image++)
Aganyte 0:d5f38b9d7c7a 254 {
Aganyte 0:d5f38b9d7c7a 255 // Remplir la mémoire vidéo avec une ligne
Aganyte 0:d5f38b9d7c7a 256 for(unsigned char ligne = 0; ligne<32; ligne++)
Aganyte 0:d5f38b9d7c7a 257 {
Aganyte 0:d5f38b9d7c7a 258 for(unsigned char count = 0 ; count<128 ; count++)
Aganyte 0:d5f38b9d7c7a 259 Display_Ram[count+(ligne*128)] = Array[image+count+(width*ligne)];
Aganyte 0:d5f38b9d7c7a 260 }
Aganyte 0:d5f38b9d7c7a 261 // Affichage de la mémoire vidéo
Aganyte 0:d5f38b9d7c7a 262 refresh();
Aganyte 0:d5f38b9d7c7a 263 refresh();
Aganyte 0:d5f38b9d7c7a 264 refresh();
Aganyte 0:d5f38b9d7c7a 265 }
Aganyte 0:d5f38b9d7c7a 266 }
Aganyte 0:d5f38b9d7c7a 267
Aganyte 0:d5f38b9d7c7a 268 /* Fonction affichage d'une animation stockée dans le micro-controleur
Aganyte 0:d5f38b9d7c7a 269 * Size => nombre de trame
Aganyte 0:d5f38b9d7c7a 270 * Array => nom de l'animation
Aganyte 0:d5f38b9d7c7a 271 */
Aganyte 0:d5f38b9d7c7a 272 void Animation(unsigned int size, const unsigned char *Array)
Aganyte 0:d5f38b9d7c7a 273 {
Aganyte 0:d5f38b9d7c7a 274 pc.printf("Affichage d'une animation de %d images depuis le STM32\n",size);
Aganyte 0:d5f38b9d7c7a 275 for(unsigned char decal = 0; decal<size; decal++)
Aganyte 0:d5f38b9d7c7a 276 {
Aganyte 0:d5f38b9d7c7a 277 // Remplir la mémoire vidéo avec une image
Aganyte 0:d5f38b9d7c7a 278 for(unsigned int count = 0; count<4096; count++)
Aganyte 0:d5f38b9d7c7a 279 Display_Ram[count] = Array[(decal*4096)+count];
Aganyte 0:d5f38b9d7c7a 280 // Affichage de la mémoire vidéo
Aganyte 0:d5f38b9d7c7a 281 refresh();
Aganyte 0:d5f38b9d7c7a 282 refresh();
Aganyte 0:d5f38b9d7c7a 283 refresh();
Aganyte 0:d5f38b9d7c7a 284 }
Aganyte 0:d5f38b9d7c7a 285 }
Aganyte 0:d5f38b9d7c7a 286
Aganyte 0:d5f38b9d7c7a 287 /* Fonction affichage d'une image stockée dans buffer vidéo
Aganyte 0:d5f38b9d7c7a 288 * time -> nombre de secondes d'affichage de l'image
Aganyte 0:d5f38b9d7c7a 289 */
Aganyte 0:d5f38b9d7c7a 290 void Image(unsigned int time)
Aganyte 0:d5f38b9d7c7a 291 {
Aganyte 0:d5f38b9d7c7a 292 timer.reset();
Aganyte 0:d5f38b9d7c7a 293 timer.start();
Aganyte 0:d5f38b9d7c7a 294 while(timer.read_ms() < 1000*time)
Aganyte 0:d5f38b9d7c7a 295 refresh();
Aganyte 0:d5f38b9d7c7a 296 timer.stop();
Aganyte 0:d5f38b9d7c7a 297 }
Aganyte 0:d5f38b9d7c7a 298
Aganyte 0:d5f38b9d7c7a 299 /* Fonction écriture 2 lignes de 8 caractères en Mononchrome */
Aganyte 0:d5f38b9d7c7a 300 void print_2_8(const char *chaine,bool Line_2)
Aganyte 0:d5f38b9d7c7a 301 {
Aganyte 0:d5f38b9d7c7a 302 unsigned int FontPosData,select = 0;
Aganyte 0:d5f38b9d7c7a 303 unsigned char Caractere = 0, count = 8;
Aganyte 0:d5f38b9d7c7a 304
Aganyte 0:d5f38b9d7c7a 305 if(Line_2 == true) select = 256;
Aganyte 0:d5f38b9d7c7a 306
Aganyte 0:d5f38b9d7c7a 307 while(count!=0)
Aganyte 0:d5f38b9d7c7a 308 {
Aganyte 0:d5f38b9d7c7a 309 FontPosData=((*chaine++)-32)*32; // FontPosData détermine la position dans font.h du caractére à afficher.
Aganyte 0:d5f38b9d7c7a 310 for(unsigned char Count=0 ; Count<16; Count++) // Font de 16 lignes de haut
Aganyte 0:d5f38b9d7c7a 311 {
Aganyte 0:d5f38b9d7c7a 312 for(unsigned char cT=0; cT<2; cT++) // Font de 2 octets de large
Aganyte 0:d5f38b9d7c7a 313 {
Aganyte 0:d5f38b9d7c7a 314 Mono_Display_Ram[select+cT+(16*Count)+(2*Caractere)] = Robot[(FontPosData+2*Count)+cT];
Aganyte 0:d5f38b9d7c7a 315 }
Aganyte 0:d5f38b9d7c7a 316 }
Aganyte 0:d5f38b9d7c7a 317 Caractere++; // Passer au caractère suivant
Aganyte 0:d5f38b9d7c7a 318 count--;
Aganyte 0:d5f38b9d7c7a 319 }
Aganyte 0:d5f38b9d7c7a 320 }
Aganyte 0:d5f38b9d7c7a 321
Aganyte 0:d5f38b9d7c7a 322 /* Effacer la mémoire vidéo Monochrome */
Aganyte 0:d5f38b9d7c7a 323 void Clear_Mono_Buffer()
Aganyte 0:d5f38b9d7c7a 324 {
Aganyte 0:d5f38b9d7c7a 325 for ( unsigned int count = 0; count < 512 ; count++)
Aganyte 0:d5f38b9d7c7a 326 Mono_Display_Ram[count] = 0x00;
Aganyte 0:d5f38b9d7c7a 327 }
Aganyte 0:d5f38b9d7c7a 328
Aganyte 0:d5f38b9d7c7a 329 /* Rafraichir l'écran avec la mémoire Monochrome pendant X millisecondes (en Blanc si non précisé) */
Aganyte 0:d5f38b9d7c7a 330 void Refresh_in_seconds()
Aganyte 0:d5f38b9d7c7a 331 {
Aganyte 0:d5f38b9d7c7a 332 timer.reset(); // Remise à zéro du timer
Aganyte 0:d5f38b9d7c7a 333 timer.start(); // Démarrer le timer
Aganyte 0:d5f38b9d7c7a 334 while(timer.read_ms() < (1000*Sleep) ) // Tant que le timer n'a pas atteind la valeur
Aganyte 0:d5f38b9d7c7a 335 refresh_mono(); // Rafraichir l'écran
Aganyte 0:d5f38b9d7c7a 336 timer.stop(); // Arreter le timer
Aganyte 0:d5f38b9d7c7a 337 Clear_Mono_Buffer(); // Effacer la mémoire vidéo
Aganyte 0:d5f38b9d7c7a 338 }
Aganyte 0:d5f38b9d7c7a 339
Aganyte 0:d5f38b9d7c7a 340 /* Inversion de 8 bits pour le mode 2 lignes de 16 caractères (font inversée) */
Aganyte 0:d5f38b9d7c7a 341 unsigned char bit_reverse8(unsigned char n)
Aganyte 0:d5f38b9d7c7a 342 {
Aganyte 0:d5f38b9d7c7a 343 n = (n << 4) | (n >> 4);
Aganyte 0:d5f38b9d7c7a 344 n = ((n << 2) & 0xCC) | ((n >> 2) & 0x33);
Aganyte 0:d5f38b9d7c7a 345 n = ((n << 1) & 0xAA) | ((n >> 1) & 0x55);
Aganyte 0:d5f38b9d7c7a 346 return n;
Aganyte 0:d5f38b9d7c7a 347 }
Aganyte 0:d5f38b9d7c7a 348
Aganyte 0:d5f38b9d7c7a 349 /* Fonction écriture d'une ligne en RAM par superposition avec choix de la ligne (mode 4 lignes de 16 caractères) */
Aganyte 0:d5f38b9d7c7a 350 void print_4_16(const char *chaine, unsigned char line)
Aganyte 0:d5f38b9d7c7a 351 {
Aganyte 0:d5f38b9d7c7a 352 unsigned int select = 0;
Aganyte 0:d5f38b9d7c7a 353 if(line > 2)
Aganyte 0:d5f38b9d7c7a 354 {
Aganyte 0:d5f38b9d7c7a 355 select = 256;
Aganyte 0:d5f38b9d7c7a 356 line-=2;
Aganyte 0:d5f38b9d7c7a 357 }
Aganyte 0:d5f38b9d7c7a 358 unsigned int FontPosData;
Aganyte 0:d5f38b9d7c7a 359 unsigned char Count, Buffer, Caractere = 0;
Aganyte 0:d5f38b9d7c7a 360 while(*chaine !='\0')
Aganyte 0:d5f38b9d7c7a 361 {
Aganyte 0:d5f38b9d7c7a 362 FontPosData=((*chaine++)-32)*8; // FontPosData détermine la position dans font.h du caractére à afficher.
Aganyte 0:d5f38b9d7c7a 363
Aganyte 0:d5f38b9d7c7a 364 for(Count=0 ; Count<8; Count++) // Font de 8 lignes de haut
Aganyte 0:d5f38b9d7c7a 365 {
Aganyte 0:d5f38b9d7c7a 366 Buffer = bit_reverse8(Font88[FontPosData+Count]);
Aganyte 0:d5f38b9d7c7a 367 if(line == 1) Mono_Display_Ram[select+(16*Count)+Caractere] = Mono_Display_Ram[select+(16*Count)+Caractere] | Buffer;
Aganyte 0:d5f38b9d7c7a 368 else Mono_Display_Ram[select+128+(16*Count)+Caractere] = Mono_Display_Ram[select+128+(16*Count)+Caractere] | Buffer;
Aganyte 0:d5f38b9d7c7a 369 }
Aganyte 0:d5f38b9d7c7a 370 Caractere++; // Passer au caractère suivant
Aganyte 0:d5f38b9d7c7a 371 }
Aganyte 0:d5f38b9d7c7a 372 }
Aganyte 0:d5f38b9d7c7a 373
Aganyte 0:d5f38b9d7c7a 374 /* Fonction affichage de la date et de l'heure */
Aganyte 0:d5f38b9d7c7a 375 void Clock()
Aganyte 0:d5f38b9d7c7a 376 {
Aganyte 0:d5f38b9d7c7a 377 char buffer[16];
Aganyte 1:353c1902483f 378 unsigned char Sleep_Buffer = Sleep;
Aganyte 1:353c1902483f 379 unsigned char Run_in_second = Sleep;
Aganyte 1:353c1902483f 380 Sleep = 1;
Aganyte 1:353c1902483f 381 while(1)
Aganyte 0:d5f38b9d7c7a 382 {
Aganyte 0:d5f38b9d7c7a 383 Clear_Mono_Buffer(); // Effacer la mémoire vidéo
Aganyte 0:d5f38b9d7c7a 384 time(&Time); // Mettre à jour l'heure
Aganyte 0:d5f38b9d7c7a 385 print_4_16(" ",1); // Ligne 1
Aganyte 0:d5f38b9d7c7a 386 strftime(buffer, 16," %d/%m/%y", localtime(&Time)); // Date au format JJ/MM/AA
Aganyte 0:d5f38b9d7c7a 387 print_4_16(buffer,2); // Ligne 2
Aganyte 0:d5f38b9d7c7a 388 print_4_16(" ",3); // Ligne 3
Aganyte 0:d5f38b9d7c7a 389 //strftime(buffer, 16, " %I:%M:%S %p", localtime(&Time)); // heure au format 0-12
Aganyte 0:d5f38b9d7c7a 390 strftime(buffer, 16," %H:%M:%S", localtime(&Time)); // heure au format 0-24
Aganyte 0:d5f38b9d7c7a 391 print_4_16(buffer,4); // Ligne 4
Aganyte 0:d5f38b9d7c7a 392 refresh_mono(); // Rafraichir l'écran
Aganyte 1:353c1902483f 393 Run_in_second--;
Aganyte 1:353c1902483f 394 if(Run_in_second ==0)
Aganyte 1:353c1902483f 395 break;
Aganyte 0:d5f38b9d7c7a 396 }
Aganyte 1:353c1902483f 397 Sleep = Sleep_Buffer;
Aganyte 0:d5f38b9d7c7a 398 Clear_Mono_Buffer(); // Effacer la mémoire vidéo
Aganyte 0:d5f38b9d7c7a 399 }
Aganyte 0:d5f38b9d7c7a 400
Aganyte 0:d5f38b9d7c7a 401 /* Fonction affichage de la temperature */
Aganyte 0:d5f38b9d7c7a 402 void Temperature()
Aganyte 0:d5f38b9d7c7a 403 {
Aganyte 0:d5f38b9d7c7a 404 char buffer[16];
Aganyte 0:d5f38b9d7c7a 405 print_4_16(" TEMPERATURE ",1); // Ligne 1
Aganyte 0:d5f38b9d7c7a 406 print_4_16(" ",2); // Ligne 2
Aganyte 0:d5f38b9d7c7a 407 sprintf(buffer," %.2f DEGRES", (adc_temp.read()*100));
Aganyte 0:d5f38b9d7c7a 408 print_4_16(buffer,3); // Ligne 3
Aganyte 0:d5f38b9d7c7a 409 print_4_16(" ",4); // Ligne 4
Aganyte 0:d5f38b9d7c7a 410 Refresh_in_seconds(); // Rafraichir l'écran pendant une seconde (2000 millisecondes)
Aganyte 0:d5f38b9d7c7a 411 }
Aganyte 0:d5f38b9d7c7a 412
Aganyte 0:d5f38b9d7c7a 413 /* Fonction affichage de la tension de la pile de sauvegarde */
Aganyte 0:d5f38b9d7c7a 414 void Backup()
Aganyte 0:d5f38b9d7c7a 415 {
Aganyte 0:d5f38b9d7c7a 416 char buffer[16];
Aganyte 0:d5f38b9d7c7a 417 print_4_16(" PILE ",1); // Ligne 1
Aganyte 0:d5f38b9d7c7a 418 print_4_16(" DE SAUVEGARDE ",2); // Ligne 2
Aganyte 0:d5f38b9d7c7a 419 sprintf(buffer," %.2f VOLT", adc_vbat.read());
Aganyte 0:d5f38b9d7c7a 420 print_4_16(buffer,3); // Ligne 3
Aganyte 0:d5f38b9d7c7a 421 print_4_16(" ",4); // Ligne 4
Aganyte 0:d5f38b9d7c7a 422 Refresh_in_seconds(); // Rafraichir l'écran pendant une seconde (2000 millisecondes)
Aganyte 0:d5f38b9d7c7a 423 }
Aganyte 0:d5f38b9d7c7a 424
Aganyte 0:d5f38b9d7c7a 425 /* Fonction affichage de l'intro */
Aganyte 0:d5f38b9d7c7a 426 void Intro()
Aganyte 0:d5f38b9d7c7a 427 {
Aganyte 0:d5f38b9d7c7a 428 pc.printf("Affichage de l'intro pendant %d secondes avec R=%d,G=%d,B=%d\n",Sleep,Color_R,Color_G,Color_B);
Aganyte 0:d5f38b9d7c7a 429 print_4_16(" DIY DMD-CLOCK ",1); // Ligne 1
Aganyte 0:d5f38b9d7c7a 430 print_4_16(" 128x32 Pixels ",2); // Ligne 2
Aganyte 0:d5f38b9d7c7a 431 print_4_16("v0.1 256 colors",3); // Ligne 3
Aganyte 0:d5f38b9d7c7a 432 print_4_16("By Aganyte/Iro ",4); // Ligne 4
Aganyte 0:d5f38b9d7c7a 433 Refresh_in_seconds(); // Rafraichir l'écran pendant une seconde (5000 millisecondes)
Aganyte 2:2f5b7e5faf83 434 }
Aganyte 2:2f5b7e5faf83 435
Aganyte 2:2f5b7e5faf83 436 /* Remplir la mémoire vidéo avec une Mire */
Aganyte 2:2f5b7e5faf83 437 void Mire()
Aganyte 2:2f5b7e5faf83 438 {
Aganyte 2:2f5b7e5faf83 439 for(unsigned char ligne =0; ligne < 8; ligne++)
Aganyte 2:2f5b7e5faf83 440 {
Aganyte 2:2f5b7e5faf83 441 unsigned char bit = 0;
Aganyte 2:2f5b7e5faf83 442 while(bit<16) {
Aganyte 2:2f5b7e5faf83 443 Display_Ram[(128*ligne)+bit] = 0;
Aganyte 2:2f5b7e5faf83 444 bit++;
Aganyte 2:2f5b7e5faf83 445 }
Aganyte 2:2f5b7e5faf83 446 for(unsigned char shade = 2; shade<9; shade++) {
Aganyte 2:2f5b7e5faf83 447 while(bit<(16*shade)) {
Aganyte 2:2f5b7e5faf83 448 Display_Ram[(128*ligne)+bit] = Red_Mask[shade-2];
Aganyte 2:2f5b7e5faf83 449 bit++;
Aganyte 2:2f5b7e5faf83 450 }
Aganyte 2:2f5b7e5faf83 451 }
Aganyte 2:2f5b7e5faf83 452 }
Aganyte 2:2f5b7e5faf83 453 for(unsigned char ligne =0; ligne < 8; ligne++)
Aganyte 2:2f5b7e5faf83 454 {
Aganyte 2:2f5b7e5faf83 455 unsigned char bit = 0;
Aganyte 2:2f5b7e5faf83 456 while(bit<16) {
Aganyte 2:2f5b7e5faf83 457 Display_Ram[(128*ligne)+bit] = 0;
Aganyte 2:2f5b7e5faf83 458 bit++;
Aganyte 2:2f5b7e5faf83 459 }
Aganyte 2:2f5b7e5faf83 460 for(unsigned char shade = 2; shade<9; shade++) {
Aganyte 2:2f5b7e5faf83 461 while(bit<(16*shade)) {
Aganyte 2:2f5b7e5faf83 462 Display_Ram[(128*ligne)+bit] = Red_Mask[shade-2];
Aganyte 2:2f5b7e5faf83 463 bit++;
Aganyte 2:2f5b7e5faf83 464 }
Aganyte 2:2f5b7e5faf83 465 }
Aganyte 2:2f5b7e5faf83 466 }
Aganyte 2:2f5b7e5faf83 467 for(unsigned char ligne =0; ligne < 8; ligne++)
Aganyte 2:2f5b7e5faf83 468 {
Aganyte 2:2f5b7e5faf83 469 unsigned char bit = 0;
Aganyte 2:2f5b7e5faf83 470 while(bit<16) {
Aganyte 2:2f5b7e5faf83 471 Display_Ram[1024+(128*ligne)+bit] = 0;
Aganyte 2:2f5b7e5faf83 472 bit++;
Aganyte 2:2f5b7e5faf83 473 }
Aganyte 2:2f5b7e5faf83 474 for(unsigned char shade = 2; shade<9; shade++) {
Aganyte 2:2f5b7e5faf83 475 while(bit<(16*shade)) {
Aganyte 2:2f5b7e5faf83 476 Display_Ram[1024+(128*ligne)+bit] = Green_Mask[shade-2];
Aganyte 2:2f5b7e5faf83 477 bit++;
Aganyte 2:2f5b7e5faf83 478 }
Aganyte 2:2f5b7e5faf83 479 }
Aganyte 2:2f5b7e5faf83 480 }
Aganyte 2:2f5b7e5faf83 481 for(unsigned char ligne =0; ligne < 8; ligne++)
Aganyte 2:2f5b7e5faf83 482 {
Aganyte 2:2f5b7e5faf83 483 unsigned char bit = 0;
Aganyte 2:2f5b7e5faf83 484 while(bit<16) {
Aganyte 2:2f5b7e5faf83 485 Display_Ram[2048+(128*ligne)+bit] = 0;
Aganyte 2:2f5b7e5faf83 486 bit++;
Aganyte 2:2f5b7e5faf83 487 }
Aganyte 2:2f5b7e5faf83 488 for(unsigned char shade = 2; shade<9; shade++) {
Aganyte 2:2f5b7e5faf83 489 while(bit<(16*shade)) {
Aganyte 2:2f5b7e5faf83 490 Display_Ram[2048+(128*ligne)+bit] = Blue_Mask[shade-2];
Aganyte 2:2f5b7e5faf83 491 bit++;
Aganyte 2:2f5b7e5faf83 492 }
Aganyte 2:2f5b7e5faf83 493 }
Aganyte 2:2f5b7e5faf83 494 }
Aganyte 2:2f5b7e5faf83 495 for(unsigned char ligne =0; ligne < 8; ligne++)
Aganyte 2:2f5b7e5faf83 496 {
Aganyte 2:2f5b7e5faf83 497 unsigned char bit = 0;
Aganyte 2:2f5b7e5faf83 498 while(bit<16) {
Aganyte 2:2f5b7e5faf83 499 Display_Ram[3072+(128*ligne)+bit] = 0;
Aganyte 2:2f5b7e5faf83 500 bit++;
Aganyte 2:2f5b7e5faf83 501 }
Aganyte 2:2f5b7e5faf83 502 for(unsigned char shade = 2; shade<9; shade++) {
Aganyte 2:2f5b7e5faf83 503 while(bit<(16*shade)) {
Aganyte 2:2f5b7e5faf83 504 Display_Ram[3072+(128*ligne)+bit] = Red_Mask[shade-2] | Green_Mask[shade-2] | Blue_Mask[shade-2];
Aganyte 2:2f5b7e5faf83 505 bit++;
Aganyte 2:2f5b7e5faf83 506 }
Aganyte 2:2f5b7e5faf83 507 }
Aganyte 2:2f5b7e5faf83 508 }
Aganyte 0:d5f38b9d7c7a 509 }