Version avec sortie ABCD sur même connecteur
Dependencies: SDFileSystemDMA mbed
Fork of DmdFullRGB_0_1 by
Dmd.h@3:5fc29520dff0, 2017-12-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |