#include <hidef.h> 
#include "derivative.h"
 
  int teplota=0;
  int stupC=1;
  int menu=0;   // určení minimální, maximální, aktualní teploty
  int minimalni=2000;  // minimální teplota
  int maximalni=0;   // maximální naměřená teplota 
  int aktualni=0;  // nejnovější naměřená teplota

void zobrazCislo(int segm1,int segm2,int segm3,int segm4); //funkce pro zobrazeni cisel
void inicLCD(void); //inicializace displeje
void cislo(int cislo); //funkce pro zobazení čísla na LCD displeji(od 0 do 1999)

 
void interrupt VectorNumber_Vtod obsluha_preruseni(void)      //rika, ze podprogram neni obyc, ale preruseni, vectornumber_virg je vektor toho preruseni (tento vektor má v podstatě číslo 19) 
{
TODSC_QSECF=1; // vynulovani čtvrtsekundového přerušení

while(ADCSC1A_COCOA!=1) {__RESET_WATCHDOG(); /*reset registru watchdog*/}  //čeká dokud není dokončen převod 

//prevod binarniho vysledku do dekadickyho
teplota=(ADCRHA_D11*2048)+(ADCRHA_D10*1024)+(ADCRHA_D9*512)+(ADCRHA_D8*256); //načtení hodnoty registru ADCRHA
teplota=teplota+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 ADCRLA

teplota=234-(((teplota*10)-8750)/19); //přepočet na teplotu ve °C 
aktualni=teplota;

if(teplota<minimalni){minimalni=teplota;}  // aktualizace minimalni/ maximalni teploty
if(teplota>maximalni){maximalni=teplota;}


switch(menu) //přepínání mezi minimální, maximální a aktuální tepolotou
{
  case 1:teplota=minimalni;LCDWF19=0x00;LCDWF20=0x01;break;
  case 2:teplota=maximalni;LCDWF19=0x01;LCDWF20=0x00;break;
  default:teplota=aktualni;LCDWF19=0x00;LCDWF20=0x00; 
}

switch(stupC) {   // realizace prepinani mezi stupni a farady
 case 0: {LCDWF30=0x01;LCDWF38=0x03;LCDWF39=0x01;LCDWF26=0x00;  //F
 teplota=(9*teplota+1600)/5;
 break;}
 default:{LCDWF30=0x01;LCDWF38=0x01;LCDWF39=0x01;LCDWF26=0x02;}  //C
}

cislo(teplota);   // vypis vysledku
ADCSC1A=0x1A; // spuštění AD převodu,vstup tepelny senzor 
}


void main(void) {

  EnableInterrupts; //povolení přerušení
  
  PTAPE_PTAPE4=1; // pripojeni pull-up rezistoru k tlacitku 3 
  
  inicLCD();  // inicializace displeje
  
  //-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 prevodniku
  ADCCFG1=0x54;   //12-bitový převod, normalní napěťová konfiguace, hodinový signál sběrnice, hodinový signál /4 
  ADCSC2=0x00; // software trigger selected, compare function disabled, default voltage reference(nemenit referenci!)
  ADCSC3=0x05; // zakazana kontinualni konverze, povoleni hardwaroveho prumerovani, nast prumerovani 8 vzorku 
  ADCSC1A=0x1A; // zakazano preruseni po konverzi, single-ended conversion,tepelny senzor. 
  //-------------------------- 
   
  //-rozsviceni--°----
  LCDWF29=0x03;
  LCDWF28=0x03; 
   
   
   
   //-rozsviceni----C---
   LCDWF30=0x01;  
   LCDWF38=0x01;
   LCDWF39=0x01;
   LCDWF26=0x02;
   //-------------------
  
  TPM1MODH=0x1D;  //nastavení modula registrů pro ošetření zákmitů tlačítek (doba 200ms)
  TPM1MODL=0x4C;   
    
  for(;;) {   
  if(PTAD_PTAD4==0) {
  
  //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
  //---------------------------------
  
  stupC=!stupC;
  }
  
  if(PTCD_PTCD7==0) {
  
  //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
  //---------------------------------
  
  menu++;
  if(menu>3){menu=1;}
  
  }
  
  
   
  
    __RESET_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 
  }








