//Karakter táblázat

#include "betuk.h"

const int karakter[10][5] = {{0x3e,0x41,0x41,0x3e,0x0},{0x08,0x04,0x02,0x7f,0x00},{0x66,0x51,0x49,0x46,0x00},{0x22,0x49,0x49,0x36,0x00},{0x0c,0x0a,0x09,0x7f,0x00},{0x47,0x45,0x45,0x38,0x00},{0x36,0x49,0x49,0x30,0x00},{0x01,0x71,0x09,0x07,0x00},{0x36,0x49,0x49,0x36,0x00},{0x06,0x49,0x49,0x36,0x00}};

int mennyi = 0;
int hol = 0;
char adat[8] = {0,0,0,0,0,0,0,0};
int billkod = 0;
int hanyadik = 0;
int fogad = 1;
int kesz = 0;
int par = 0;
int numlock = 0;

int betu[10] = {0,0,0,0,0,0,0,0,0,0};

//karakter[0] = {0x0,0x36,0x36,0x0,0x0}

//Karakter táblázat

void interrupt(void) {

            if ( INTF_bit && fogad == 1 ) {       //Interrupt ha megvolt

               PORTC = 0x03;
               mennyi++;        //Növeljük a pozicíót.

               if ( mennyi > 1 && mennyi <= 9 ) {     //Ha már megvolt a START bit akkor a mennyi éppen 2-n áll. Paritásnál 10, STOP bit-nél pedig 11.

                  adat[(mennyi-2)]=RA4_bit;        //Mentjük a beérkező adatot.

               }

               if ( mennyi >= 11 ) {        //Ha megvolt a 11 bit azaz egy teljes kód.

                  billkod = ((adat[0]*0x01)+(adat[1]*0x02)+(adat[2]*0x04)+(adat[3]*0x08)+(adat[4]*0x10)+(adat[5]*0x20)+(adat[6]*0x40)+(adat[7]*0x80));
                  mennyi = 0;
                  kesz = 1;

               }

               INTF_bit = 0;
            }
            
            if ( INTF_bit && fogad == 0 ) {
               
               PORTC = 0x09;
               
               if ( mennyi == 0 ) {
               
                  RA4_bit = 0;
               
               }
               
               if ( mennyi > 0 && mennyi <= 8 ) {
               
                  RA4_bit = adat[(mennyi-1)];
                  
                  if ( adat[(mennyi-1)] == 1 ) {
                  
                     par ^= 1;
                  
                  }
               
               }
               
               if ( mennyi == 9 ) {
               
                  RA4_bit = par;
               
               }
               
               if ( mennyi == 10 ) {
               
                  RA4_bit == 1;
               
               }
            
               mennyi++;
               
               if ( mennyi == 12 ) {
               
                  PORTA.B4 = 0;
                  TRISA = 0x1F;
                  mennyi = 0;
                  fogad = 1;
                  
               }
               
               INTF_bit = 0;
            
            }

}

void kiir(int mit,int mi) {

     int a, szam;
     int szamok[8] = {0,0,0,0,0,0,0,0};
     
     PORTD = 0x00;
     //delay_us(1);
     
     for ( a = 7; a >= 0; a-- ) {

         szamok[a] = (mit % 2);
         mit = (mit/2);
     
     }
     
     for ( a = 0; a <= 7; a++ ) {
     
         szam = szamok[a];
        
         PORTD = 0x08;
         //delay_us(1);
         PORTD = (0x08+(0x04*mi));
         //delay_us(1);
         PORTD = (0x08+(0x04*mi)+(szam*0x02));
         //delay_us(1);
         PORTD = (0x08+(0x04*mi)+(szam*0x02)+0x01);
         //delay_us(1);
         PORTD = (0x08+(0x04*mi)+(szam*0x02));
         //delay_us(1);
         PORTD = (0x08+(0x04*mi));
         //delay_us(1);
         PORTD = 0x08;
         //delay_us(1);
        
     }

     /*
     for ( a = 0; a <= 7; a++ ) {

         szam = mit[a];

         PORTD = 0x08;
         delay_us(1);
         PORTD = (0x08+(0x04*mi));
         delay_us(1);
         PORTD = (0x08+(0x04*mi)+(szam*0x02));
         delay_us(1);
         PORTD = (0x08+(0x04*mi)+(szam*0x02)+0x01);
         delay_us(1);
         PORTD = (0x08+(0x04*mi)+(szam*0x02));
         delay_us(1);
         PORTD = (0x08+(0x04*mi));
         delay_us(1);
         PORTD = 0x08;
         delay_us(1);

     }
     */
     
     PORTD = 0x00;
     //delay_us(1);
     
}

void hova(int sor, int oszlop) {

     int a;
     int szamok[8] = {0,0,0,0,0,0,0,0};
     int oszlop_felso;
     int oszlop_also;

     for ( a = 7; a >= 0; a-- ) {

         szamok[a] = (oszlop % 2);
         oszlop = (oszlop/2);

     }

     oszlop_felso = ((szamok[0]*0x08)+(szamok[1]*0x04)+(szamok[2]*0x02)+(szamok[3]*0x01));
     oszlop_also = ((szamok[4]*0x08)+(szamok[5]*0x04)+(szamok[6]*0x02)+(szamok[7]*0x01));

     kiir((0b10110000+sor),0); //Page
     kiir((0b00010000+oszlop_felso),0);          //Oszlop felső bitek
     kiir((0b00000000+oszlop_also),0);           //Oszlop alsó bitek

}

void szokoz() {

     int a;
     int k[5] = {0x00,0x00,0x00,0x00,0x00};

     for (a = 0; a <= 4; a++ ) {

         kiir(k[a],1);

     }

}

void kettospont() {

     int a;
     int k[5] = {0x0,0x36,0x36,0x0,0x0};

     for (a = 0; a <= 4; a++ ) {
     
         kiir(k[a],1);
     
     }

}

void szamok(int mit) {

     int a = 0;
     int szam = 0;
     int szam2 = 0;

     if ( mit >= 100 ) {
     
        szam = (mit/100);

        for ( a = 0; a <= 4; a++ ) {

            kiir(karakter[szam][a],1);

        }
            
     }

     mit = (mit-(szam*100));

     if ( mit >= 10 ) {

        szam2 = (mit/10);
     
        for ( a = 0; a <= 4; a++ ) {
     
            kiir(karakter[szam2][a],1);
         
         }
         
     }

     mit = (mit-(szam2*10));
     
     for ( a = 0; a <= 4; a++ ) {
     
         kiir(karakter[mit][a],1);
         
     }

}

void parancs(int mit) {

     int a;
     fogad = 0;
     mennyi = 0;
     par = 1;
     
     TRISB = 0x00;
     PORTB = 0x00;
     TRISA = 0x0F;
     RA4_bit = 0;
     INTF_bit = 0;

     for ( a = 0; a <= 7; a++ ) {

         adat[a] = (mit % 2);
         mit = (mit/2);

     }
     
     TRISB = 0x03;
}

void main() {

int a = 0;
int c = 0;
int szam = 0;

int perc = 2;
int mperc = 1;
int msperc = 1;
int idozito = 0;

ADCON1 = 0x06;

TRISA = 0x1F;
TRISD = 0x00;
TRISC = 0x00;
TRISB = 0x03;

INTEDG_bit = 0;
//OPTION_REG.B7 = 0;
INTE_bit = 1;
GIE_bit = 1;

        for(;;) {        //Végtelen ciklus a folyamatos futásért
        
                if ( !PORTA.B0 ) {   //Init
                
                   /*kiir((0,1,0,0,0,0,0,0),0);
                   kiir((1,0,1,0,0,0,0,1),0);
                   kiir((1,1,0,0,0,0,0,0),0);
                   kiir((1,0,1,0,0,1,1,0),0);
                   kiir((1,0,1,0,0,0,1,0),0);
                   kiir((0,0,1,0,1,0,1,1),0);
                   kiir((0,0,1,0,0,1,1,1),0);
                   kiir((1,0,0,0,0,0,0,1),0);
                   kiir((0,0,0,1,0,1,1,0),0);
                   kiir((1,0,1,0,1,1,0,0),0);
                   kiir((0,0,0,0,0,0,0,0),0);
                   kiir((1,0,1,0,1,1,1,1),0);*/
                
                   kiir(0x40,0);
                   kiir(0xA1,0);
                   kiir(0xC0,0);
                   kiir(0xA6,0);
                   kiir(0xA2,0);
                   kiir(0x2B,0);
                   kiir(0x27,0);
                   kiir(0x81,0);
                   kiir(0x10,0);
                   kiir(0xAC,0);
                   kiir(0x00,0);
                   kiir(0xAF,0);
                   /*kiir(0xA5,0);
                   delay_ms(2000);
                   kiir(0xA4,0);*/
                   hova(0,0);
                
                }

                if ( !PORTA.B1 ) {             //Törlés
                
                   for ( a = 0; a <= 7; a++ ) {
                   
                       hova(a,0);
                       for ( c = 0; c <= 127; c++ ) {
                       
                           kiir(0x00,1);
                       
                       }
                   
                   }
                   
                   hova(0,0);
                
                }

                /*if ( !PORTA.B1 ) {

                   for ( a = 0; a <= 127; a++ ) {

                       kiir(0b10101010,1);
                   
                   }
                
                }*/
                
                if ( !RA2_bit ) {        //Időzítő be

                   //idozito = 1;
                   numlock = 1;
                   parancs(0xED);
                
                }
                
                if ( !RA3_bit ) {        //Időzítő ki és reset

                   parancs(0xFF);

                   /*
                   idozito = 0;
                   perc = 2;
                   mperc = 0;
                   msperc = 1;
                   */

                }
                
                if ( kesz == 1 ) {

                   PORTC = 0x0C;
                   kesz = 0;
                   betu[hanyadik] = billkod;
                   szamok(billkod);
                   szokoz();
                   
                   if ( hanyadik > 3 || billkod == 0xF0 ) {
                   
                      hanyadik = 0;
                   
                   }
                   
                   if ( betu[hanyadik] < 131 ) {

                      for ( a = 0; a <= 4; a++ ) {

                          kiir(betuk[betu[hanyadik]][a],1);
                          
                      }
                      
                      szokoz();
                   
                   }
                   
                   if ( betu[hanyadik] == 250 && numlock == 1 ) {
                   
                      parancs(0x07);
                      numlock = 0;
                   
                   }
                   
                   hanyadik++;

                }
                
                /*

                if ( hanyadik >= 2 ) {

                      hova(0,0);

                      GIE_bit = 0;
                      TRISB = 0x00;
                      PORTB = 0x00;

                      for ( a = 0; a <= 4; a++ ) {

                          szam = betuk[betu[0]][a];
                          kiir(szam,1);

                      }
                      
                      hol = hol+5;
                      hanyadik = 0;
                      
                      TRISB = 0x03;
                      GIE_bit = 1;
                      
                }
                */
                
                if ( idozito == 1 ) {
                
                   msperc = msperc-5;
                   
                   if ( msperc <= 0 ) {
                   
                      msperc = 99;
                      mperc--;
                      delay_ms(10);
                   
                   }
                   
                   if ( mperc <= 0 ) {
                   
                      mperc = 59;
                      perc--;
                   
                   }

                   if ( perc < 0 ) {
                   
                      idozito = 0;
                   
                   }
                   
                   hova(1,50);
                   szamok(perc);
                   kettospont();
                   szamok(mperc);
                   kettospont();
                   szamok(msperc);
                   
                }

                /*

                if ( idozito == 0 ) {    //Csak teszt, hogy fut e a progi.
                
                   PORTC = 0x06;
                   delay_ms(20);
                   PORTC = 0x00;
                   PORTC = 0x09;
                   delay_ms(20);
                   PORTC = 0x00;
                   
                }
                */
        }

}
