#include <hidef.h> 
#include "derivative.h" 
 
int dvojtecka=0; //vypínání/ zapínání dvojtečky
int minuty=0;  //minuty
int desMin=0;  //desítky minut
int hodiny=11;  //hodiny
int ctvrtSekunda=0; //čtvrt sekunda   
int dopoledne=1; //prepinani AM, FM
int nastaveni=1; //pro prepinani modu mezi hodinovým a nasavovacím
int Menu=0;   // pro prepinani mezi cisly

void zobrazCislo(int segm1,int segm2,int segm3,int segm4); //funkce pro zobrazeni cisel
void inicLCD(void);//inicializace displeje

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;           

if(nastaveni==1){   
 switch(dvojtecka)  // zobrazovani dvojtecky
   {
    case 2:{LCDWF13=0x02;dvojtecka++;break;}
    case 3:{LCDWF13=0x02;dvojtecka=0;break;}
    default: {LCDWF13=0x00;dvojtecka++;break;}
   }

    
  ctvrtSekunda++;
 

 
 if((ctvrtSekunda/240)==1) {  
ctvrtSekunda=0;           
 minuty++;
 }
 
 if(minuty>9){ //minuty 
 minuty=0;
 desMin++;
 }
 
 if(desMin>5){ //desitky minut
 desMin=0;
 hodiny++;
 }
 
if((hodiny>11)&&(nastaveni==1)){
dopoledne=!dopoledne;
}

 if(hodiny>11) { //ošetření špatného nastavení času
 hodiny=0;
 }
}

 if(dopoledne==0) {  //zobrazeni AM, FM
LCDWF24=0x02;

} 
else 
{
 LCDWF24=0x01;
}

  
 zobrazCislo(hodiny/10,(hodiny-((hodiny/10)*10)),desMin,minuty); //zobrazení aktuálního času
}

void main(void) {

  EnableInterrupts; //povolení přerušení

inicLCD();  //inicializace LCD displeje
PTAPE=0xC0; //připojení pull-up rezistorů k tlačítkům 1 a 2
 
 
//-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
//-------------------------

TPM1MODH=0x1D;  //nastavení modula registrů pro ošetření zákmitů tlačítek (doba 200ms)
TPM1MODL=0x4C; 

  for(;;) {
  
  if((PTCD_PTCD7==0)) {  // snimani tlacitka 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
  //---------------------------------

  nastaveni=!nastaveni; //změna 
  }
  
  if((PTAD_PTAD7==0)&&(nastaveni==0)) {  // snimani tlacitka 2
  
  //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>4) {Menu=0;}
  
  }
  
  
  if((PTAD_PTAD6==0)&&(nastaveni==0)) {  // snimani tlacitka 1, prepinani menu  
 
  //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
  //---------------------------------
 
   
 switch(Menu) {
    case 1:desMin++;break;
    case 2:hodiny++;break;
    case 3:dopoledne=!dopoledne;break;
    default:minuty++;break;
 }
 

if(minuty>9){minuty=0;}
if(desMin>5){desMin=0;}
if(hodiny>11){hodiny=0;}
  }  
    __RESET_WATCHDOG(); 
  }
}





//funkce pro zobrazeni cisel-----------------
 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 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
//--------------------------------------------------------
}




