Version avec sortie ABCD sur même connecteur

Dependencies:   SDFileSystemDMA mbed

Fork of DmdFullRGB_0_1 by Christophe Girardot

Committer:
Aganyte
Date:
Sat Dec 02 12:27:01 2017 +0000
Revision:
0:d5f38b9d7c7a
Child:
1:353c1902483f
DMD-Clock 128x32 RGB version 0.1

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