Version avec sortie ABCD sur même connecteur
Dependencies: SDFileSystemDMA mbed
Fork of DmdFullRGB_0_1 by
Diff: Dmd.h
- Revision:
- 2:2f5b7e5faf83
- Parent:
- 1:353c1902483f
diff -r 353c1902483f -r 2f5b7e5faf83 Dmd.h --- a/Dmd.h Sun Dec 03 17:24:56 2017 +0000 +++ b/Dmd.h Mon Dec 04 09:42:23 2017 +0000 @@ -27,9 +27,12 @@ unsigned char Color_B=0; unsigned char Up = 1; unsigned char Left = 1; -unsigned char Brightness_level = 1; +unsigned char Brightness_level = 9; char Command[6]; +unsigned int Up_Ligne_adress = 0; // Evite une re-déclaration +unsigned int Bottom_Ligne_adress = 0; // Evite une re-déclaration + /* Masque de décodage */ // En RGB332 (le Bleu possède moins de nuance car l'oeil humain les distinguent moins) // Seulement 7 niveau par masque car la nuance la plus basse correspond à une led éteinte @@ -129,7 +132,8 @@ void Transfer(unsigned char Up_RGB, unsigned char Down_RGB, unsigned char shade) { CLK = 0; - if(Up_RGB !=0) + + if(Up_RGB!=0) { // Préparation de R1,G1 et B1 R1 = (Up_RGB & Red_Mask[shade]) == Red_Mask[shade]; @@ -138,11 +142,13 @@ } else { + // Préparation de R1,G1 et B1 R1 = 0; G1 = 0; - B1 = 0; + B1 = 0; } - if(Down_RGB !=0) + + if(Down_RGB!=0) { // Préparation de R2,G2 et B2 R2 = (Down_RGB & Red_Mask[shade]) == Red_Mask[shade]; @@ -151,11 +157,11 @@ } else { + // Préparation de R1,G1 et B1 R2 = 0; G2 = 0; - B2 = 0; + B2 = 0; } - CLK = 1; // Front montant = Envoie de la donnée } @@ -163,57 +169,49 @@ * la mémoire vidéo avec sélection de la nuance (mode RGB332) */ void Send_256pixels(unsigned char ligne, unsigned char shade) -{ +{ LATCH = 0 ; // Préparer le front montant pour le Latch - - unsigned int Up_Ligne_adress = ligne * 128; // calcul du décalage en fonction de la ligne (moitié haute de l'écran) - unsigned int Bottom_Ligne_adress = Up_Ligne_adress + 2048; // calcul du décalage en fonction de la ligne (moitié basse de l'écran) - + + Up_Ligne_adress = ligne * 128; // calcul du décalage en fonction de la ligne (moitié haute de l'écran) + Bottom_Ligne_adress = Up_Ligne_adress + 2048; // calcul du décalage en fonction de la ligne (moitié basse de l'écran) + /* Envoie de 256 octets (128 octets par ligne) */ for(unsigned char Count_SPI2 = 0 ; Count_SPI2<128 ; Count_SPI2++ ) Transfer(Display_Ram [Count_SPI2 + Up_Ligne_adress], Display_Ram [Count_SPI2 + Bottom_Ligne_adress], shade); - EN = 1; // Désactiver la ligne - Line(ligne); // Sélectionner la ligne - LATCH = 1; // Transferer la donnée sur les latchs - EN = 0; // Activer la ligne + /* Pour les nuances 4,5,6 on coupe la ligne avec le timer */ + while( Timer_Refresh.read_us() < Time_Shade[shade]); + Timer_Refresh.reset(); // Redemarrer le timer pour le prochain tour - // Gestion du temps d'affichage de la ligne en fonction de sa nuance - if(shade == 0) - wait_us(Time_Shade0); - if(shade == 1) - wait_us(Time_Shade1); - if(shade == 2) - wait_us(Time_Shade2); - if(shade == 3) - wait_us(Time_Shade3); - if(shade == 4) - wait_us(Time_Shade4); - if(shade == 5) - wait_us(Time_Shade5); - if(shade == 6) - wait_us(Time_Shade6); - - EN = 1; // Désactiver la ligne + EN = 1; // Désactiver la ligne + Line(ligne); // Sélectionner la ligne + LATCH = 1; // Transferer la donnée sur les latchs + EN = 0; // Activer la ligne + 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) + { + wait_us(Time_Shade[shade]); // Gestion du temps d'affichage de la ligne en fonction de sa nuance + EN = 1; // Désactiver la ligne + } } /* Rafraichir l'écran 1 fois (mode RGB332) */ void refresh() { for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 0 - Send_256pixels(ligne,0); + Send_256pixels(ligne,6); for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 1 - Send_256pixels(ligne,1); + Send_256pixels(ligne,5); for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 2 - Send_256pixels(ligne,2); + Send_256pixels(ligne,4); for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 3 Send_256pixels(ligne,3); for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 4 - Send_256pixels(ligne,4); + Send_256pixels(ligne,2); for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 5 - Send_256pixels(ligne,5); + Send_256pixels(ligne,1); for (unsigned char ligne = 0; ligne<16 ; ligne++) // Envoyer 16x2 lignes de la nuance 6 - Send_256pixels(ligne,6); + Send_256pixels(ligne,0); + EN = 1; // Désactiver la ligne en fin de rafraichissement (sinon, elle brille plus que les autres....c'est moche) } /* Rafraichir l'écran avec la mémoire vidéo (mode monochrome) pendant x secondes (Sleep) */ @@ -433,4 +431,79 @@ print_4_16("v0.1 256 colors",3); // Ligne 3 print_4_16("By Aganyte/Iro ",4); // Ligne 4 Refresh_in_seconds(); // Rafraichir l'écran pendant une seconde (5000 millisecondes) +} + +/* Remplir la mémoire vidéo avec une Mire */ +void Mire() +{ + for(unsigned char ligne =0; ligne < 8; ligne++) + { + unsigned char bit = 0; + while(bit<16) { + Display_Ram[(128*ligne)+bit] = 0; + bit++; + } + for(unsigned char shade = 2; shade<9; shade++) { + while(bit<(16*shade)) { + Display_Ram[(128*ligne)+bit] = Red_Mask[shade-2]; + bit++; + } + } + } + for(unsigned char ligne =0; ligne < 8; ligne++) + { + unsigned char bit = 0; + while(bit<16) { + Display_Ram[(128*ligne)+bit] = 0; + bit++; + } + for(unsigned char shade = 2; shade<9; shade++) { + while(bit<(16*shade)) { + Display_Ram[(128*ligne)+bit] = Red_Mask[shade-2]; + bit++; + } + } + } + for(unsigned char ligne =0; ligne < 8; ligne++) + { + unsigned char bit = 0; + while(bit<16) { + Display_Ram[1024+(128*ligne)+bit] = 0; + bit++; + } + for(unsigned char shade = 2; shade<9; shade++) { + while(bit<(16*shade)) { + Display_Ram[1024+(128*ligne)+bit] = Green_Mask[shade-2]; + bit++; + } + } + } + for(unsigned char ligne =0; ligne < 8; ligne++) + { + unsigned char bit = 0; + while(bit<16) { + Display_Ram[2048+(128*ligne)+bit] = 0; + bit++; + } + for(unsigned char shade = 2; shade<9; shade++) { + while(bit<(16*shade)) { + Display_Ram[2048+(128*ligne)+bit] = Blue_Mask[shade-2]; + bit++; + } + } + } + for(unsigned char ligne =0; ligne < 8; ligne++) + { + unsigned char bit = 0; + while(bit<16) { + Display_Ram[3072+(128*ligne)+bit] = 0; + bit++; + } + for(unsigned char shade = 2; shade<9; shade++) { + while(bit<(16*shade)) { + Display_Ram[3072+(128*ligne)+bit] = Red_Mask[shade-2] | Green_Mask[shade-2] | Blue_Mask[shade-2]; + bit++; + } + } + } } \ No newline at end of file