Version avec sortie ABCD sur même connecteur

Dependencies:   SDFileSystemDMA mbed

Fork of DmdFullRGB_0_1 by Christophe Girardot

Revision:
2:2f5b7e5faf83
Parent:
1:353c1902483f
--- 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