This project was school project with special shield with LED matrix. So sorry but comments are in my language because I think this program is unusable for others when they haven't this special shield. But functions are simple for understanding ;-).

Dependencies:   MMA8451Q mbed

Revision:
0:a837349b0219
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jan 17 19:57:58 2015 +0000
@@ -0,0 +1,581 @@
+#include "mbed.h"
+#include "MMA8451Q.h" //kniznica akcelerometra
+
+#define MMA8451_I2C_ADDRESS (0x1d<<1) //definicia pre akcelerometer
+
+Ticker disptick;    //definovanie casoveho prerusenia pre volanie funkcie vysvietenia
+AnalogIn   randAdc(A3);
+// definovanie pinov pre zelenu farbu
+DigitalOut gr0(PTC7);
+DigitalOut gr1(PTC6);
+DigitalOut gr2(PTC5);
+DigitalOut gr3(PTC4);
+DigitalOut gr4(PTC3);
+DigitalOut gr5(PTC2);
+DigitalOut gr6(PTC1);
+DigitalOut gr7(PTC0);
+
+//definovanie pinov pre cervenu farbu
+DigitalOut rd0(PTC17);
+DigitalOut rd1(PTC16);
+DigitalOut rd2(PTC13);
+DigitalOut rd3(PTC12);
+DigitalOut rd4(PTC11);
+DigitalOut rd5(PTC10);
+DigitalOut rd6(PTC9);
+DigitalOut rd7(PTC8);
+
+//definovanie pinov pre adresaciu riadkov
+DigitalOut ln0(PTB0);
+DigitalOut ln1(PTB1);
+DigitalOut ln2(PTB2);
+
+// prototypy funkcii
+short RandSegment(void);                                            //funkcia nahodne vybera novy segment pomocou citania A/D vstupu
+void SegmentInit(void);                                             //prida jednotlivym segmentom informacie o ich vlastnostiach - pocet riadkov, stlpcov, rotovany segment, priradi pole s vlastnostou farby
+void SegmentCopy(struct segments *psgm, int segmentIn[2][4]);       //v SegmentInit skopiruje vytvorene pole segmentu do pola v strukture (struct segments)
+void MoveDown(int array[8][16], int line);                          //posun pola smerom dole po odstranení zaplneneho riadku
+void LineCheck(void);                                               //funkcia kontroluje zaplneny riadok
+void SegmentMove(struct segments *psgm);                            //funkcia sa stara o pohyby segmentu
+void WriteClrSeg(int wrtEnab, struct segments *psgm);               //zmazanie alebo zapis segmentu pri pohybe maticou
+int DecLvl(void);                                                   //obsluha akcelerometra  (preco prave Dec som zabudol)
+void LineAdd(int line);                                             //adresacia riadkov
+void Display(void);                                                 //rozsvecovanie farieb v riadkoch podla hlavnej matice
+void OutPortInit(void);                                             //nastavenie portov do pociatocneho stavu - vypnutie/zhasnutie
+
+//_____________________________________________________
+int collision = 0;  //globalna premenna zaznamenania kolizie pricom dany segment ostane ulozeny na danom mieste a vyberie sa novy
+short choice = 0;   //globálna premenna vybranej struktury segmentu (pr. seg[choice])
+
+//nasledujuce segmenty si nesu o sebe vlastnost farby(nulovy a parny stlpec v 1 - svieti zelena, neparny - cervena, obe - oranzova), neskor su priradene do struktury a su pridane dalsie vlastnosti
+//____________________________________________________kocka                   
+int segment0[2][4] = {{1,1, 1,1},   //oranzova
+                     {1,1, 1,1},};                  
+int segment1[2][4] = {{1,0, 1,0},   //zelena
+                     {1,0, 1,0},};                     
+int segment2[2][4] = {{0,1, 0,1},   //cervena
+                     {0,1, 0,1},};
+//_____________________________________________________bodka
+                     
+int segment3[2][4] = {{1,1, 0,0},   //oranzova
+                     {0,0, 0,0},};
+int segment4[2][4] = {{1,0, 0,0},   //zelena  
+                     {0,0, 0,0},}; 
+int segment5[2][4] = {{0,1, 0,0},   //cervena 
+                     {0,0, 0,0},}; 
+//____________________________________________________I
+
+int segment6[2][4] = {{1,1, 1,1},   //oranzova
+                     {0,0, 0,0},};
+int segment61[2][4] = {{1,1, 0,0},   //oranzova rot1
+                     {1,1, 0,0},};
+                     
+int segment7[2][4] = {{1,0, 1,0},   //zelena
+                     {0,0, 0,0},};
+int segment71[2][4] = {{1,0, 0,0},   //zelena rot1
+                     {1,0, 0,0},};
+                     
+int segment8[2][4] = {{0,1, 0,1},   //cervena
+                     {0,0, 0,0},};
+int segment81[2][4] = {{0,1, 0,0},   //cervena rot1
+                     {0,1, 0,0},};
+//______________________________________________________L                                        
+                     
+int segment9[2][4] = {{1,1, 1,1},   //oranzova
+                     {1,1, 0,0},};
+int segment91[2][4] = {{1,1, 1,1},   //oranzova rot1
+                     {0,0, 1,1},};
+int segment92[2][4] = {{0,0, 1,1},   //oranzova rot2
+                     {1,1, 1,1},};
+int segment93[2][4] = {{1,1, 0,0},   //oranzova rot3
+                     {1,1, 1,1},};                     
+                                          
+int segment10[2][4] = {{1,0, 1,0},   //zelena
+                     {1,0, 0,0},};
+int segment101[2][4] = {{1,0, 1,0},   //zelena rot1
+                     {0,0, 1,0},};
+int segment102[2][4] = {{0,0, 1,0},   //zelena rot2
+                     {1,0, 1,0},};
+int segment103[2][4] = {{1,0, 0,0},   //zelena rot3
+                     {1,0, 1,0},};
+                     
+int segment11[2][4] = {{0,1, 0,1},   //cervena
+                     {0,1, 0,0},};
+int segment111[2][4] = {{0,1, 0,1},   //cervena rot1
+                     {0,0, 0,1},};
+int segment112[2][4] = {{0,0, 0,1},   //cervena rot2
+                     {0,1, 0,1},};
+int segment113[2][4] = {{0,1, 0,0},   //cervena rot3
+                     {0,1, 0,1},};
+//________________________________________________________________                     
+struct segments {           //struktura segmentov
+    char line;              //pocet riadkov
+    char colum;             //pocet stlpcov
+    char nextRot;           //cislo noveho rotovaneho segmentu
+    int segmentx[2][4];     //pole pre segmnet
+}seg[30];
+//_________________________________________________________________                     
+                // | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8 |    
+int dispArray[8][16] = {                                        //pracovne pole, v ktorom sa vsetko odohrava, nulovy a parny stlpec v 1 - svieti zelena, neparny - cervena, obe - oranzova
+                   {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0},    //1         
+                   {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0},    //2
+                   {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0},    //3
+                   {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0},    //4
+                   {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0},    //5
+                   {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0},    //6
+                   {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0},    //7
+                   {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0},  };//8
+                   
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+/*+++                    MAIN                          +++*/
+/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
+
+int main() {
+    SegmentInit();                          //nahranie informacii do struktur segmentov (struct segments)
+    OutPortInit();                          //porty vypnute - zhasnuta matica
+    disptick.attach(&Display, 0.002);       //nastavenie prerusenia pre vysvecovanie displeja
+    while(1) {
+            choice = RandSegment();         //nahodny vyber segmentu
+            while(collision != 1){          //pokial nenastane kolizia spodnej hrany segmentu
+                SegmentMove(&seg[choice]);  //pohybuj segmentov - v pravo, v lavo, dole, rotacia
+            }
+            LineCheck();                    //skontroluje riadoky ci nie su zaplnene ak hej posunie sa vrchna cast dole
+            collision = 0;                  
+    }
+}
+/*--------------------------------------------------------*/
+/*---                    MAIN                          ---*/
+/*--------------------------------------------------------*/
+
+/*___________________________________________________________________________________________*/
+
+
+/*++++++++++++++++++++++RandSegment+++++++++++++++++++++++*/
+//funkcia nahodne vybera novy segment pomocou citania A/D vstupu
+short RandSegment(void){                    
+    static short num = 0;
+    num = randAdc.read_u16()%12;            //precitanie A/D s %12 - zvysok od 0 do 11 <-> zakladne segmenty od 0 do 11
+    return(num);                            
+}
+/*---------------------RandSegment-----------------------*/
+
+/*++++++++++++++++++++++SegmentInit+++++++++++++++++++++++*/
+//prida jednotlivym segmentom informacie o ich vlastnostiach - pocet riadkov, stlpcov, rotovany segment, priradi pole s vlastnostou farby
+void SegmentInit(void){                     
+    seg[0].line = 2;    
+    seg[0].colum = 4;
+    seg[0].nextRot = 0;
+    SegmentCopy(&seg[0], segment0);  //oranzova kocka 2x2
+    seg[1].line = 2;
+    seg[1].colum = 4;
+    seg[1].nextRot = 1;
+    SegmentCopy(&seg[1], segment1);  //zelena kocka 2x2
+    seg[2].line = 2;
+    seg[2].colum = 4;
+    seg[2].nextRot = 2;
+    SegmentCopy(&seg[2], segment2);  //cervena kocka 2x2
+//_________________________________________________________________    
+    seg[3].line = 1;
+    seg[3].colum = 2;
+    seg[3].nextRot = 3;
+    SegmentCopy(&seg[3], segment3);  //oranzova bodka
+    seg[4].line = 1;
+    seg[4].colum = 2;
+    seg[4].nextRot = 4;
+    SegmentCopy(&seg[4], segment4);  //zelena bodka
+    seg[5].line = 1;
+    seg[5].colum = 2;
+    seg[5].nextRot = 5;
+    SegmentCopy(&seg[5], segment5);  //cervena bodka
+//__________________________________________________________________    
+    seg[6].line = 1;    
+    seg[6].colum = 4;
+    seg[6].nextRot = 12;
+    SegmentCopy(&seg[6], segment6);  //oranzova ciara 
+    seg[12].line = 2;    
+    seg[12].colum = 2;
+    seg[12].nextRot = 6;
+    SegmentCopy(&seg[12], segment61);  //oranzova ciara rot
+    
+    seg[7].line = 1;
+    seg[7].colum = 4;
+    seg[7].nextRot = 13;
+    SegmentCopy(&seg[7], segment7);  //zelena ciara
+    seg[13].line = 2;
+    seg[13].colum = 2;
+    seg[13].nextRot = 7;
+    SegmentCopy(&seg[13], segment71);  //zelena ciara rot
+    
+    seg[8].line = 1;
+    seg[8].colum = 4;
+    seg[8].nextRot = 14;
+    SegmentCopy(&seg[8], segment8);  //cervena ciara 
+    seg[14].line = 2;
+    seg[14].colum = 2;
+    seg[14].nextRot = 8;
+    SegmentCopy(&seg[14], segment81);  //cervena ciara rot
+//__________________________________________________________________    
+    seg[9].line = 2;    
+    seg[9].colum = 4;
+    seg[9].nextRot = 15;
+    SegmentCopy(&seg[9], segment9);  //oranzova L
+    seg[15].line = 2;    
+    seg[15].colum = 4;
+    seg[15].nextRot = 16;
+    SegmentCopy(&seg[15], segment91);  //oranzova L rot1
+    seg[16].line = 2;    
+    seg[16].colum = 4;
+    seg[16].nextRot = 17;
+    SegmentCopy(&seg[16], segment92);  //oranzova L rot2
+    seg[17].line = 2;    
+    seg[17].colum = 4;
+    seg[17].nextRot = 9;
+    SegmentCopy(&seg[17], segment93);  //oranzova L  rot3
+    
+    seg[10].line = 2;
+    seg[10].colum = 4;
+    seg[10].nextRot = 18;
+    SegmentCopy(&seg[10], segment10);  //zelena L
+    seg[18].line = 2;
+    seg[18].colum = 4;
+    seg[18].nextRot = 19;
+    SegmentCopy(&seg[18], segment101);  //zelena L rot1
+    seg[19].line = 2;
+    seg[19].colum = 4;
+    seg[19].nextRot = 20;
+    SegmentCopy(&seg[19], segment102);  //zelena L rot2
+    seg[20].line = 2;
+    seg[20].colum = 4;
+    seg[20].nextRot = 10;
+    SegmentCopy(&seg[20], segment103);  //zelena L rot3
+    
+    seg[11].line = 2;
+    seg[11].colum = 4;
+    seg[11].nextRot = 21;
+    SegmentCopy(&seg[11], segment11);  //cervena L 
+    seg[21].line = 2;
+    seg[21].colum = 4;
+    seg[21].nextRot = 22;
+    SegmentCopy(&seg[21], segment111);  //cervena L rot1
+    seg[22].line = 2;
+    seg[22].colum = 4;
+    seg[22].nextRot = 23;
+    SegmentCopy(&seg[22], segment112);  //cervena L rot2
+    seg[23].line = 2;
+    seg[23].colum = 4;
+    seg[23].nextRot = 11;
+    SegmentCopy(&seg[23], segment113);  //cervena L rot3
+    
+}
+/*----------------------SegmentInit-----------------------*/
+
+/*++++++++++++++++++++++SegmentCopy+++++++++++++++++++++++*/
+//v SegmentInit skopiruje vytvorene pole segmentu do pola v strukture (struct segments)
+void SegmentCopy(struct segments *psgm, int segmentIn[2][4]){       
+    static int i,j;
+    for(i = 0 ; i < (psgm->line); i++){ //riadok
+        for(j = 0 ; j < (psgm->colum); j++ ){    //slpec
+            psgm->segmentx[i][j] = segmentIn[i][j];
+        }
+    }
+}
+/*--------------------SegmentCopy------------------------*/
+
+/*++++++++++++++++++++++LineCheck+++++++++++++++++++++++*/
+//funkcia kontroluje zaplneny riadok
+void LineCheck(void){
+    static int ch=0;
+    static int lnCh, colCh;
+        
+    for(lnCh = 0; lnCh < 8; lnCh++){
+        ch = 0;
+        for(colCh=0; colCh < 15; colCh+=2){
+            if((dispArray[lnCh][colCh]==1) || (dispArray[lnCh][colCh+1]==1)){       //ak je bod vysvieteny
+                ch++;}                                                              //pripocita k premennej
+            else {
+                colCh = 15;                                                         //ak bod v riadku nie je vysvieteny nema cenu ho cely kontrolovat a skoci sa tak na dalsi riadok
+                ch = 0;
+                }    
+        }
+        if((ch == 8)){                                                              //ak je cely riadok vysvieteny
+            for(colCh=0; colCh < 16; colCh++){                                      //nuluj riadok
+                dispArray[lnCh][colCh] = 0;
+            }
+            MoveDown(dispArray, lnCh);                                              //posunie zvysok pola dole a kontroluje sa zvysok a teda proces sa opakuje kym sa neskontroluje cele pole
+        }
+    }    
+}
+
+/*-------------------------LineCheck----------------------------*/
+
+/*++++++++++++++++++++++++MoveDown++++++++++++++++++++++++++++++*/
+//posun pola smerom dole po odstranení zaplneneho riadku
+void MoveDown(int dispArray[8][16], int line){
+    static int ln, col;
+    for(ln = line; ln>=0; ln--){
+        for(col=0; col < 16; col++){
+            if(ln>=1){
+                dispArray[ln][col] = dispArray[ln-1][col];
+            }
+            if(ln<1){
+                dispArray[ln][col] = 0;
+            }
+        }   
+    }
+}
+
+/*-----------------------MoveDown-------------------------------*/
+
+/*+++++++++++++++++++++SegmentMove++++++++++++++++++++++++*/
+//funkcia sa stara o pohyby segmentu
+static int x=6, y=0;                                        //suradnice segmentu pricom hodnotu na suradnici x,y je vzdy lavy horny roh segmentu
+
+void SegmentMove(struct segments *psgm){
+    static long int counter=0;                              //vytvara zdrzanie pri pohybe
+    static int col, ln, dm;                                 //col, ln - premenne v cykloch pri kontrole kolizii, dm detekcia kolizie, zakaze pohyb danym smerom
+    
+    if( ((x == 6) && (y == 0)) && counter == 0){            //kontrola pri novom segmente ci nedojde ku kolizii
+        for(ln = 0; ln < psgm->line; ln++){                 //skontroluje ci v priestore nedojde ku kolizii
+            for(col=0; col < psgm->colum; col+=2){
+                if((dispArray[y+ln][x+col] | dispArray[y+ln][x+col+1]) & (psgm->segmentx[ln][col] | psgm->segmentx[ln][col+1]) == 1){       //zistuje ci nie je v danom bode kolizia so segmentom
+                    ln = psgm->line;                                //ak je kolizia nema cenu kontrolovat zvysok
+                    col = psgm->colum;                              //
+                    static int lnclr, colclr;                       //vynulovanie celeho pola
+                    for(lnclr = 0; lnclr < 8; lnclr++){             //
+                        for(colclr=0; colclr < 16; colclr++){       //
+                            dispArray[lnclr][colclr] = 0;           //
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+    WriteClrSeg(1, &seg[choice]);                     //zapise segment do pola
+    counter++;                                        //counter zacina pocitat
+    if((counter%4000 == 0)){                          //ak je counter nasobkom 4000 je umozneny pohyb pomocou akcelerometra
+        if(DecLvl()==3) {       //podmienka pre pohyb v pravo 
+            WriteClrSeg(0, &seg[choice]);        //zmaze segment z pola, inak by za sebou nechaval zapisane hodnoty
+            for(ln = 0; ln < psgm->line; ln++){         //skontroluje ci v priestore pohybu nedojde ku kolizii
+                for(col=0; col < psgm->colum; col+=2){
+                    if((dispArray[y+ln][x+col+2] | dispArray[y+ln][x+col+1+2]) & (psgm->segmentx[ln][col] | psgm->segmentx[ln][col+1]) == 1){
+                        ln = psgm->line;
+                        col = psgm->colum;
+                        dm = 1;                     //doslo ku kolizii
+                    }
+                }
+            }
+            if (dm == 0){                       //nedoslo ku kolizii, segment sa moze pohnut
+                x+=2;
+                if (x>16-(psgm->colum)){
+                    x=16-(psgm->colum);
+                }
+            }
+            dm = 0;                             //po kolizii sa premenna vynuluje
+            WriteClrSeg(1, &seg[choice]);       //opatovne zapisanie segmentu do pola
+        }
+        if((DecLvl()==4) ){    //opodmienka pre pohohyb v lavo - analogia s pohybom v pravo
+            WriteClrSeg(0, &seg[choice]);
+            for(ln = 0; ln < psgm->line; ln++){     //skontroluje ci v priestore pohybu nedojde ku kolizii
+                for(col=0; col < psgm->colum; col+=2){
+                    if((dispArray[y+ln][x+col-2] | dispArray[y+ln][x+col+1-2]) & (psgm->segmentx[ln][col] | psgm->segmentx[ln][col+1]) == 1){
+                        ln = psgm->line;
+                        col = psgm->colum;
+                        dm = 1;
+                    }
+                }
+            }
+            if (dm == 0){
+                    x-=2;
+                    if (x<0){
+                        x=0;
+                    }
+            }
+            dm = 0;
+            WriteClrSeg(1, &seg[choice]); 
+        }
+        if(DecLvl()==1){    //pohyb k sebe - segment pada zrychlene dole
+            counter = 40001;    
+        }
+        if(DecLvl()==2){    //pohyb od seba - rotacia segmentu
+            WriteClrSeg(0, &seg[choice]);       //zmaze segment z pola
+            for(ln = 0; ln < seg[psgm->nextRot].line; ln++){        //skontroluje ci v priestore rotovaneho segmentu nedojde ku kolizii
+                for(col=0; col < seg[psgm->nextRot].colum; col+=2){
+                    if(((dispArray[y+ln][x+col] | dispArray[y+ln][x+col+1]) & (seg[psgm->nextRot].segmentx[ln][col] | seg[psgm->nextRot].segmentx[ln][col+1]) == 1) || ((seg[psgm->nextRot].line-1+y) > 7) || ((seg[psgm->nextRot].colum-1+x) > 15)){
+                        ln = seg[psgm->nextRot].line;           //parametre orotovaneho segmentu
+                        col = seg[psgm->nextRot].colum;         //
+                        dm = 1;                                 //premenna naznacujuca koliziu 
+                    }
+                }
+            }
+            if (dm == 0){
+                choice = psgm->nextRot;     //nahradi segment za rotovany
+            }
+            dm = 0;
+            WriteClrSeg(1, &seg[choice]);   //zapise segment do pola
+        }
+    }
+    
+    if(counter >= 40001){         //zdrzanie 
+        WriteClrSeg(0, &seg[choice]);       //zmaze segment z pola
+        counter = 0;                        //vynuluje counter
+        y++;                                //segment sa posunie dole ak splni podmnienku nizsie
+        for(ln = 0; ln < psgm->line; ln++){         //skontroluje ci v priestore pohybu nedojde ku kolizii
+            for(col=0; col < psgm->colum; col+=2){
+                if(((dispArray[y+ln][x+col] | dispArray[y+ln][x+col+1]) & (psgm->segmentx[ln][col] | psgm->segmentx[ln][col+1]) == 1) || ((y+psgm->line-1) > 7) ){
+                        y--;                    //segment sa dostal mimo pola alebo sa dostal do kolizie, suradnica sa vracia
+                        ln = psgm->line;        //aby sa nemusel kontrolovat pripadne zvysok 
+                        col = psgm->colum;      //
+                        dm = 1;                 
+                        collision = 1;          //detekuje sa kolizia a vyberie sa novy segment
+                  }
+             }
+        }
+        WriteClrSeg(1, &seg[choice]);
+        if (dm == 1){                   //po detekcii kolizie sa nastavia pociatocne suradnice
+            y = 0;
+            x = 6; 
+            dm = 0; 
+        }
+    }
+}
+/*---------------------------SegmentMove---------------------------*/
+
+/*+++++++++++++++++++++++++++WriteClrSeg+++++++++++++++++++++++++++*/
+//zmazanie alebo zapis segmentu pri pohybe maticou
+void WriteClrSeg(int wrtEnab, struct segments *psgm){          //ak je wrtEnab 0 zmaze sa ak 1 zapise sa dany segment do pola, segment sa cita zo struktury vybranej randomom
+    static int ln, col;
+    
+    for(ln = 0; ln < psgm->line; ln++){
+        for(col=0; col < psgm->colum; col++){
+            if(wrtEnab == 1){
+                dispArray[ln+y][col+x] |= psgm->segmentx[ln][col];}
+            else{
+                dispArray[ln+y][col+x] = (psgm->segmentx[ln][col] == 1 ? 0:dispArray[ln+y][col+x] );}
+        }
+    }
+}
+/*-------------------------WriteClrSeg-----------------------------*/
+
+/*++++++++++++++++++++++++++++++DecLvl+++++++++++++++++++++++++++++*/
+//obsluha akcelerometra
+MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
+
+int DecLvl(void){
+
+    static float ax, ay;
+    static float point = 0.34;          //nastavenie uhla...cca 30° +- nieco
+    
+    ax = float(acc.getAccX());          //citanie hodnoty v x-ovej osi akcelerometra
+    ay = float(acc.getAccY());          //citanie hodnoty v y-ovej osi akcelerometra
+
+    if((ax > point)){        //k sebe
+            return(1);
+        }
+    else if((ax < -point)){       //od seba
+            return(2);
+        }
+    else if((ay > point)){        //naklon v pravo
+            return(3);
+        }
+    else if((ay < -point)){   //naklon v lavo
+            return(4);
+        }
+    return 0;
+}
+/*--------------------------------DecLvl-------------------------------*/
+
+/*++++++++++++++++++++++++++++++Display+++++++++++++++++++++++++++++*/
+//rozsvecovanie farieb v riadkoch podla hlavnej matice
+void Display(void){
+    static int line = 0;
+
+    LineAdd(line);                      //adresacia riadku pomocou funkcie, 
+        gr0 = !dispArray[line][0];      //parny a nulovy stlpec znaci zelenu farbu (dany bod svieti po pripojeni na zem, ale zapis svietecej casti v poli je pomocou 1)
+        gr1 = !dispArray[line][2];
+        gr2 = !dispArray[line][4];
+        gr3 = !dispArray[line][6];
+        gr4 = !dispArray[line][8];
+        gr5 = !dispArray[line][10];
+        gr6 = !dispArray[line][12];
+        gr7 = !dispArray[line][14];
+        
+        rd0 = !dispArray[line][1];      //neparny riadok znaci cervenu farbu
+        rd1 = !dispArray[line][3];
+        rd2 = !dispArray[line][5];
+        rd3 = !dispArray[line][7];
+        rd4 = !dispArray[line][9];
+        rd5 = !dispArray[line][11];
+        rd6 = !dispArray[line][13];
+        rd7 = !dispArray[line][15];
+                                        //ak su vysvietene obe, svieti oranzova
+        wait(0.001);
+            line++;                     //nasledujuci riadok
+            if(line == 8){          
+                line = 0;
+            }
+}
+/*--------------------------------Display-------------------------------*/
+
+/*++++++++++++++++++++++++++++++++LineAdd++++++++++++++++++++++++++++++++++*/
+//adresacia riadkov
+void LineAdd(int line){
+    switch(line){
+        case 0: ln0 = 0;
+                ln1 = 0;
+                ln2 = 0;
+                break;
+        case 1: ln0 = 1;
+                ln1 = 0;
+                ln2 = 0;
+                break;
+        case 2: ln0 = 0;
+                ln1 = 1;
+                ln2 = 0;
+                break;
+        case 3: ln0 = 1;
+                ln1 = 1;
+                ln2 = 0;
+                break;
+        case 4: ln0 = 0;
+                ln1 = 0;
+                ln2 = 1;
+                break;
+        case 5: ln0 = 1;
+                ln1 = 0;
+                ln2 = 1;
+                break;
+        case 6: ln0 = 0;
+                ln1 = 1;
+                ln2 = 1;
+                break;
+        case 7: ln0 = 1;
+                ln1 = 1;
+                ln2 = 1;
+                break;
+        default: break;
+        }    
+}
+/*-----------------------LineAdd------------------------*/
+
+/*+++++++++++++++++++++++OutPortInit++++++++++++++++++++*/
+//nastavenie portov do pociatocneho stavu - vypnutie/zhasnutie
+void OutPortInit(void){
+    rd0 = 1;
+    rd1 = 1;
+    rd2 = 1;
+    rd3 = 1;
+    rd4 = 1;
+    rd5 = 1;
+    rd6 = 1;
+    rd7 = 1;
+    gr0 = 1;
+    gr1 = 1;
+    gr2 = 1;
+    gr3 = 1;
+    gr4 = 1;
+    gr5 = 1;
+    gr6 = 1;
+    gr7 = 1;
+}
+/*---------------------OutPortInit--------------------*/
\ No newline at end of file