/*
 * LAB3 keypad
 * Milan Durkov
 * Zdenek Leitkep
 * */
///19,6Khz


/** C O N F I G U R A T I O N   B I T S ******************************/

#pragma config FOSC = INTIO67   // sets up internal oscillator
#pragma config WDTEN = OFF, LVP = OFF, MCLRE = ON


/** I N C L U D E S **************************************************/
#include "p18f45k20.h"
#include "stdlib.h"
#include "delays.h"
#include "math.h"
#include "ucontroller_LAB3_D_L.h"




/** D E C L A R A T I O N S ******************************************/

/// nastaveni counteru, vychozi, maximalni hodnoty a ostatnich promennych
char count=0;
char maxCount=5;
char psat=0;//0 nevypisuj 1 vypisuj
char vypsano[4];//pole charu k ulozeni do intu
char pocet;
int i;
int max;
int min;
unsigned int intCounter;
unsigned int intCounter2;
int hodnotaCounteru=0, hodnotaCounteruNova=0, hodnotaVysledek=0, frekVysledek=0;
int pocitadlo;
volatile char buffer[4];
unsigned int hodnota;
volatile unsigned char volba;
volatile unsigned char TempReg1;
volatile unsigned char TempReg2;
volatile unsigned char TempReg3;
volatile unsigned char TempReg4;
volatile unsigned char TempReg;
volatile unsigned char OldTempReg;

 /** I N T E R R U P T S ***********************************************/
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
  _asm
    goto InterruptServiceHigh //jump to interrupt routine
  _endasm
}
//
//
//void sendNibble(unsigned char nib, char datCom)
//{
//    unsigned char send = 0;
//    send = nib | datCom << 5; //nastaveni 5 bitu podle parametru data/command
//    PORTD = send;
//    Delay100TCYx(25);
//    PORTD = send | 0b00010000;
//    Delay100TCYx(25);
//    PORTD = send & 00101111;
//    PORTD = 0;
//}
///*
// Funkce pro vypís counteru 0-223
// */
//void counter()
//{
//   min=0;
//   pocitadlo=min;//nastaveni counteru na uvod (0)
//   max=223;
//
//   do
//   {
//
//    lcdClear();//smazat displej
//    pocitadlo++;//zvý?ení po?ítadla
//    for(i=0;i<3;i++)//vynulování bufferu pro dal?í parsování na int
//        buffer[i]=0;
//
//
//    ultoa((long)pocitadlo,buffer); //prevod intu na pole charu
//
//     if(pocitadlo==max)//kdyz jsme na maximu; zacni od nuly
//        pocitadlo=0;
//    for(i=0;i<3;i++)//projití pole charu
//    {
//        switch(buffer[i])//switch podle charu v poli
//        {
//            case '1':
//                sendNibble(0b0011,1);
//                sendNibble(0b0001,1);
//                break;
//            case '2':
//                sendNibble(0b0011,1);
//                sendNibble(0b0010,1);
//                break;
//            case '3':
//                sendNibble(0b0011,1);
//                sendNibble(0b0011,1);
//                break;
//            case '4':
//                sendNibble(0b0011,1);
//                sendNibble(0b0100,1);
//                break;
//            case '5'://5
//                sendNibble(0b0011,1);
//                sendNibble(0b0101,1);
//                break;
//             case '6':
//                sendNibble(0b0011,1);
//                sendNibble(0b0110,1);
//                break;
//            case '7':
//                sendNibble(0b0011,1);
//                sendNibble(0b0111,1);
//                break;
//            case '8':
//                sendNibble(0b0011,1);
//                sendNibble(0b1000,1);
//                break;
//            case '9':
//                sendNibble(0b0011,1);
//                sendNibble(0b1001,1);
//                break;
//            case '0':
//                sendNibble(0b0011,1);
//                sendNibble(0b0000,1);
//                break;
//        }
//    }
//    Delay100TCYx(2500);
//    }
//
//    while(pocitadlo<max);
//}
//
//void lcdInit()//inicializace lcd
//{
//    char k;
//    for(k = 0; k < 3; k++)
//    {
//        sendNibble(0b0011,0);
//        Delay100TCYx(25);
//    }
//
//    sendNibble(0b0010,0);
//    Delay100TCYx(25);
//
//    sendNibble(0b0010,0);
//    Delay100TCYx(25);
//
//    sendNibble(0b1011,0); // NFXX
//    Delay100TCYx(25);
//
//    sendNibble(0b0000,0);
//    Delay100TCYx(25);
//
//    sendNibble(0b1000,0);
//    Delay100TCYx(25);
//
//    sendNibble(0b0000,0);
//    Delay100TCYx(25);
//
//    sendNibble(0b0001,0);
//    Delay100TCYx(25);
//
//    sendNibble(0b0000,0);
//    Delay100TCYx(25);
//
//    sendNibble(0b1111,0);
//    Delay100TCYx(25);
//
//}
///*
// Reset displeje
// */
//void lcdClear(void)
//{
//    sendNibble(0b0000, 0); //smazání displaye
//    Delay100TCYx(25);
//    sendNibble(0b0001, 0); //entry mod
//    Delay100TCYx(25);
//}
///*
// Funkce pro výpis striingu AHOJ na displej
// */
//void vypisString()
//{
//    sendNibble(0b0100,1);//A
//    sendNibble(0b0001,1);
//
//    sendNibble(0b0100,1);//H
//    sendNibble(0b1000,1);
//
//    sendNibble(0b0100,1);//O
//    sendNibble(0b1111,1);
//
//     sendNibble(0b0100,1);//J
//    sendNibble(0b1010,1);
//}



#pragma interrupt InterruptServiceHigh  // "interrupt" pragma for high priority
void InterruptServiceHigh(void)
{
    PORTCbits.RC7 = 1; // entered ISR
    //LATDbits.LATD6=1;
    if(INTCONbits.INT0IF)
    {
        if(T0CONbits.TMR0ON==0)
        {
            T0CONbits.TMR0ON=1;
            hodnotaCounteru = TMR0L;
        }
        else
        {
            hodnotaCounteruNova = TMR0L;
       hodnotaVysledek = hodnotaCounteruNova - hodnotaCounteru;
            T0CONbits.TMR0ON=0;
            TMR0L=0;
            intCounter2=0;
            //hodnotaCounteru=0;
        }

        INTCONbits.INT0IF = 0;
    }

    if(INTCONbits.TMR0IF)
    {
        intCounter2++;
        INTCONbits.TMR0IF=0;//clear the flag
       } 
    PORTCbits.RC7 = 0; // left ISR
}

void main (void)
{
    OSCCONbits.IRCF = 111;  ///osc freq = 16MHz
//ANSELH = 0;
ANSELHbits.ANS12 = 0;
TRISD = 0b00000000;
T0CONbits.T0PS0=0;//prescaler
T0CONbits.T0PS1=0;
T0CONbits.T0PS2=0;
T0CONbits.PSA=1;
T0CONbits.T08BIT=1; //8 bitový mod
T0CONbits.T0CS=0; //internal instruction cycle clock
//T0CONbits.PSA=0;
INTCONbits.INT0IE = 1;
INTCONbits.T0IE=1; // Timer0 interupts enable
T0CONbits.T0SE=0;
INTCONbits.PEIE=1; // Peripheral interupts enable
INTCONbits.GIE=1; // global interupts enable
TRISCbits.RC7 = 0;
PORTCbits.RC7 = 0;

//T0CONbits.TMR0ON=1; // zapnutí ?asova?e

    //lcdInit();//inicializuj lcd
    
    while(1)
{
hodnotaVysledek = hodnotaCounteruNova - hodnotaCounteru;
frekVysledek = 1000000/hodnotaVysledek;

LATDbits.LATD7=1;
}

//    pocet=0;
//    INTCON2bits.RBPU=0;//pull-up
//    WPUB = 0b00111111;
//    ANSELH = 0;
//    ANSELbits.ANS1=0;
//    ANSELbits.ANS2=0;
//    TRISD = 0b11000000;//port D

   

//    while (1){
//        //LATDbits.LATD7=1;
//
//        TRISB = 0b00001111;
//        TRISA = 0b00000000;
//
//        LATA = 0b00000000;
//        TempReg1 = PORTB & 0b00001111; //RB0-RB3
//        TRISA = 0b00000110;
//        TRISB = 0b00110000;
//
//        //precteni
//        TempReg2 = PORTB & 0b00110000;
//        TempReg3 = (PORTA<<5)& 0b11000000;
//        TempReg4  = TempReg1 | TempReg2;
//        TempReg  = TempReg4 | TempReg3;
//
//        // porovnani minuleho a soucasneho stavu
//
//        if(TempReg!=0b11111111)//je stisknuta klávesa
//        {
//            psat=1;//vypis
//            if(OldTempReg==TempReg)//je stisknuta klavesa a uz byl vypsán znak
//            {
//                psat=0;
//            }
//        }
//
//        OldTempReg = TempReg;//nastavení p?ede?lé hodnoty tempregu
//
//        if(psat==1)//vypisuj
//        {
////            vypsano[pocet]=TempReg;
////            pocet++;
//            switch(TempReg)
//            {
//                    case 0b11101110://1
//                    vypsano[pocet]=1;//pridej do pole vypsanyh znaku
//                    pocet++;//zvys index v poli
//                    sendNibble(0b0011,1);
//                    sendNibble(0b0001,1);
//                    break;
//
//                    case 0b11011110://4
//                    vypsano[pocet]=4;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b0100,1);
//                    break;
//
//                    case 0b10111110://7
//                    vypsano[pocet]=7;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b0111,1);
//                    break;
//
//                   case 0b01111110://A
//                    vypisString();
//                    break;
//
//                    case 0b11101101://2
//                    vypsano[pocet]=2;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b0010,1);
//                    break;
//
//                    case 0b11011101://5
//                        vypsano[pocet]=5;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b0101,1);
//                    break;
//
//                    case 0b10111101://8
//                        vypsano[pocet]=8;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b1000,1);
//                    break;
//
//                    case 0b01111101://0
//                        vypsano[pocet]=0;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b0000,1);
//                    break;
//
//                    case 0b11101011://3
//                        vypsano[pocet]=3;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b0011,1);
//                    break;
//
//                    case 0b11011011://6
//                        vypsano[pocet]=6;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b0110,1);
//                    break;
//
//                    case 0b10111011://9
//                        vypsano[pocet]=9;
//                    pocet++;
//                    sendNibble(0b0011,1);
//                    sendNibble(0b1001,1);
//                    break;
//
//                    case 0b01111011://B
////                    sendNibble(0b0100,1);
////                    sendNibble(0b0010,1);
//                    break;
//
//                    case 0b11100111://F
////                    sendNibble(0b0100,1);
////                    sendNibble(0b0110,1);
//                    break;
//
//                    case 0b11010111://stisknuto E
//                    hodnota=0;//vynulut integer hodnotu
//                    for(i=0;i<pocet;i++)
//                        hodnota = hodnota + vypsano[i]*pow(10,(pocet-1)-i);//projdi pole vypsanych znaku a preved do int
//                    pocet=0;
//                    for(i=0;i<pocet;i++)
//                        vypsano[i]=0;//vynulování pole vypsaných znak?
//                    lcdClear();//smazání displeje
//                    break;
//
//                    case 0b10110111://D
////                    sendNibble(0b0100,1);
////                    sendNibble(0b0100,1);
//                    break;
//
//                    case 0b01110111: //C
//                    counter();//spust counter
//                    break;
//
//            }
//            psat=0; //prestan vypisovat
//        }

//  }
}