#include <hidef.h> 
#include "derivative.h" 
int vysledek=0;
int staryVysledek=0;
int osa=1;

void inicLCD(void); // funkce pro inicializaci displeje
void zobrazCislo(int segm1,int segm2,int segm3,int segm4); //fce pro zobrazení čísel na LCD displeji  
void cislo(int cislo); // zobrazi na LCD zadané číslo

void interrupt VectorNumber_Vtod preruseniTOD(){
TODSC_QSECF=1; //vynulování čtvrt-sekundového přerušení

     if(vysledek!=staryVysledek){ // zapise na displej pouze pokud se hodnota zmenila 
   staryVysledek=vysledek;
   
   switch(osa) {
    case 1:{vysledek=90*(vysledek-65)/62;LCDWF26=0x00; break;}  //osa A
    default:{vysledek=(vysledek-73)*90/63;LCDWF26=0x02;}  //osa B
   }
   cislo(vysledek); // vypis načtené hodnoty AD
   }

}



void main(void) {

  EnableInterrupts; //povolení přerušení
  
  inicLCD(); // inicializace displeje
  
  TPM1MODL=0xF9;  //nastavení modula registrů pro ošetření zákmitů tlačítek
  TPM1MODH=0x25; 
  
  //-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
  //-------------------------


  //-inicializace-AD-převodníku--
  ADCCFG1=0x50; //normální napěťová konfigurace, hodinový signál/4,8-bitový převod, dlouhá vzorkovací doba, hodinový signál sběrnice 
  ADCCFG2=0x00; //výchozí nastavení
  ADCSC2=0x00;  //sofwarový spínač AD převodu 
  ADCSC3=0x05;  //ADC0=0, povolení hardwarového průměrování, hardwarové průměrování z 8 vzorků
  ADCSC1A=0x05; //vstup osa x akcelerometru   
  //-----------------------------

  //-rozsvícení znaku A---
  LCDWF26=0x00;
  LCDWF30=0x03;
  LCDWF38=0x03;
  LCDWF39=0x03;
  //----------------------



  for(;;) {
  
  if(PTCD_PTCD7==0){//snímání lačítka 4
  
  //ošetření zákmitu tlačítka--------
  TPM1SC=0x0F; //zapnutí časovače TPM1
  while(TPM1SC_TOF==0){__RESET_WATCHDOG();} //dokud nedojde k přetečení časovače
  TPM1SC=0x00; //vypnutí časovače TPM1
  //---------------------------------

  osa=!osa;  //záměna osy
  }
  
   if(ADCSC1A_COCOA==1){ // test dokončení převodu
   vysledek=ADCRLA_D0+ADCRLA_D1*2+ADCRLA_D2*4+ADCRLA_D3*8+ADCRLA_D4*16+ADCRLA_D5*32+ADCRLA_D6*64+ADCRLA_D7*128; //načtení hodnoty registru
  
   switch(osa) { // přepíání os A, B
     case 1: {ADCSC1A=0x05;break;} // další AD převod pro osu A
     default:ADCSC1A=0x06; //další AD převod pro osu B
   }
   
  }
  

  
    __RESET_WATCHDOG(); 
  } 
  
}

void inicLCD(void)      // slouzi k inicializaci displeje
{
//--------  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 
  }
 
