#include <hidef.h> 
#include "derivative.h" 
int citac=0; //proměnná pro ukládání hodnoty čítače

void inicLCD(void); //funkce pro inicializaci LCD displeje
void zobrazCislo(int segm1,int segm2,int segm3,int segm4); //funkce pro zobrazeni cisel na LCD
void cislo(int cislo); //funkce pro zobrazeni zadaneho cisla (zobrazi 0 až 1999)


void interrupt VectorNumber_Vtod preruseniTOD(){
TODSC_QSECF=1; //vynulování čtvrt-sekundového přerušení
 
cislo(citac); //zobrazení hodnoty čítače
citac++;      //navýšení hodnoty čítače

if(citac>100) //vynulování čítače
{
citac=0; 
}
   

}

void main(void) {

 EnableInterrupts; //povolení přerušení
  
  inicLCD();
  
  //-inicializace-modulu-TOD-
  TODC_TODEN=0; //vypnutí časovače
  TODC=0x20;    //hodinový zdroj LPO, předdělička pro LPO
  TODSC=0x10;   //povolení čtvrsekundového přerušení
  TODC_TODEN=1; //zapnutí časovače TOD
  //-------------------------


  for(;;) {
    __RESET_WATCHDOG(); //reset registru watchdog
  } 
}


void inicLCD(void){ 
//--------  inicializační kód pro LCD displej  -----------
LCDC0_LCDEN=0; 	//vypínání displeje pro nastavení parametru
LCDC0_SOURCE=0;	//připojení externího zdroje hodinového kmitočtu

//--------nastaveni zdroje hodinového kmitočtu
ICSC2_EREFS=1;  //výběr externí reference
ICSC2_ERCLKEN=1;	//povolení zdroje ICSERCLK
while(ICSSC_CLKST!=ICSC1_CLKS){} //čekání na synchronizaci   
//---------

LCDRVC=0x80;   	//povolení regulovaného napětí
LCDSUPPLY=0xB3; //vybraná nábojová pumpa, výběr napájení
LCDC0=0x21; 	  //nastavení vykreslování, Duty 1/2

//povolení pinů displeje
LCDPEN0=0xFF; LCDPEN1=0xE0;  LCDPEN2=0xFF;LCDPEN3=0x7F; LCDPEN4=0xC0; 
LCDPEN5=0x03; 

//nastavení registrů pro funkci backplane
LCDBPEN0=0x00; LCDBPEN1=0x00; LCDBPEN2=0x00; LCDBPEN3=0x00; LCDBPEN4=0x00; LCDBPEN5=0x03;

LCDWF40=0x01; 	//nastavení COM1
LCDWF41=0x02;  	//nastavení COM2
LCDC0_LCDEN=1;  //zapnuti displeje, konec inicializace
//--------------------------------------------------------
}

void zobrazCislo(int segm1,int segm2,int segm3,int segm4)
{
   switch(segm1) 
   {
     case 1: LCDWF0=0x02;break;
     default: LCDWF0=0x00;break;
   }
        
   switch(segm2) // zobrazeni cisel segment 2
   {
    case 1: LCDWF4=0x00;LCDWF5=0x01;LCDWF6=0x01;LCDWF7=0x00; break;
    case 2: LCDWF4=0x02;LCDWF5=0x01;LCDWF6=0x02;LCDWF7=0x03; break;
    case 3: LCDWF4=0x02;LCDWF5=0x01;LCDWF6=0x03;LCDWF7=0x01; break;
    case 4: LCDWF4=0x00;LCDWF5=0x03;LCDWF6=0x03;LCDWF7=0x00; break;
    case 5: LCDWF4=0x02;LCDWF5=0x02;LCDWF6=0x03;LCDWF7=0x01; break;
    case 6: LCDWF4=0x02;LCDWF5=0x02;LCDWF6=0x03;LCDWF7=0x03; break;
    case 7: LCDWF4=0x02;LCDWF5=0x01;LCDWF6=0x01;LCDWF7=0x00; break;
    case 8: LCDWF4=0x02;LCDWF5=0x03;LCDWF6=0x03;LCDWF7=0x03; break;
    case 9: LCDWF4=0x02;LCDWF5=0x03;LCDWF6=0x03;LCDWF7=0x01; break;
   
    default:LCDWF4=0x02;LCDWF5=0x03;LCDWF6=0x01;LCDWF7=0x03;break; // defaultni je 0
   }


 
   switch(segm3) // zobrazeni cisel segment 3
   {
    case 1: LCDWF14=0x00;LCDWF15=0x01;LCDWF16=0x01;LCDWF17=0x00; break;
    case 2: LCDWF14=0x02;LCDWF15=0x01;LCDWF16=0x02;LCDWF17=0x03; break;
    case 3: LCDWF14=0x02;LCDWF15=0x01;LCDWF16=0x03;LCDWF17=0x01; break;
    case 4: LCDWF14=0x00;LCDWF15=0x03;LCDWF16=0x03;LCDWF17=0x00; break;
    case 5: LCDWF14=0x02;LCDWF15=0x02;LCDWF16=0x03;LCDWF17=0x01; break;
    case 6: LCDWF14=0x02;LCDWF15=0x02;LCDWF16=0x03;LCDWF17=0x03; break;
    case 7: LCDWF14=0x02;LCDWF15=0x01;LCDWF16=0x01;LCDWF17=0x00; break;
    case 8: LCDWF14=0x02;LCDWF15=0x03;LCDWF16=0x03;LCDWF17=0x03; break;
    case 9: LCDWF14=0x02;LCDWF15=0x03;LCDWF16=0x03;LCDWF17=0x01; break;
   
    default:LCDWF14=0x02;LCDWF15=0x03;LCDWF16=0x01;LCDWF17=0x03;break; // defaultni je 0
   } 
   
   
    switch(segm4) // zobrazeni cisel segment 4
   {
    case 1: LCDWF18=0x00;LCDWF21=0x01;LCDWF22=0x01;LCDWF23=0x00; break;
    case 2: LCDWF18=0x02;LCDWF21=0x01;LCDWF22=0x02;LCDWF23=0x03; break;
    case 3: LCDWF18=0x02;LCDWF21=0x01;LCDWF22=0x03;LCDWF23=0x01; break;
    case 4: LCDWF18=0x00;LCDWF21=0x03;LCDWF22=0x03;LCDWF23=0x00; break;
    case 5: LCDWF18=0x02;LCDWF21=0x02;LCDWF22=0x03;LCDWF23=0x01; break;
    case 6: LCDWF18=0x02;LCDWF21=0x02;LCDWF22=0x03;LCDWF23=0x03; break;
    case 7: LCDWF18=0x02;LCDWF21=0x01;LCDWF22=0x01;LCDWF23=0x00; break;
    case 8: LCDWF18=0x02;LCDWF21=0x03;LCDWF22=0x03;LCDWF23=0x03; break;
    case 9: LCDWF18=0x02;LCDWF21=0x03;LCDWF22=0x03;LCDWF23=0x01; break;
   
    default:LCDWF18=0x02;LCDWF21=0x03;LCDWF22=0x01;LCDWF23=0x03;break; // defaultni je 0
   } 
   
       }
       
       
 void cislo(int cislo) // zadane cislo zobrazi (zobrazuje rozsah 0 a 1999)
  {
  int cislo1=0;
  int cislo2=0;
  int cislo3=0;
  int cislo4=0;
    
  if(cislo>1999)  // osetreni spravneho rozsahu 
  {
    cislo=1999;
  }
  
  if(cislo<0)
  {
    cislo=0 ;
  }
  
 cislo1=cislo/1000;   //dostanu tisicovku
 cislo2=(cislo-(cislo1*1000))/100;   //dostanu stovky
 cislo3=(cislo-(cislo1*1000)-(cislo2*100))/10;       //dostanu desitky
 cislo4=cislo-(cislo1*1000)-(cislo2*100)-(cislo3*10); // dostanu jednotky
  
  zobrazCislo(cislo1,cislo2,cislo3,cislo4);//zobrazeni vysledku 
  }





