/*PIC16F690,MPLABX,XC8
 * karakterisztika felvétele
 * 16 darab adat a megszakításnál 37-t?l 67-ig
 * az els? és a második if-es sor az rab megszakításnál mindig páratlan
 * ha az els? if-es sorban rabifszamlalo == 1-el,és a második if-es sorban
 * rabifszamlalo == 35-tel,akkor timerszamlalo értéke 887 lesz
 * 23,24,25 nulla adat, 48,49,50 egy adat*/
#include "config.h" //bels? órajel,konfigurációs bitek kikapcsolva
#define byte unsigned char

volatile bit lehetKiirni;
volatile unsigned int timerSzamlalo;
volatile unsigned int rabifSzamlalo;
volatile unsigned int mertKod;
volatile unsigned char mertKodSzamlalo;
volatile unsigned char szamlalo;

void LcdParancs(byte data);
void LcdAdat(byte data);
void delay(unsigned int varakozasiIdo);
void KisSzamKiirasa(char szam);
void NagySzamKiirasa(unsigned int szam);
void LcdInit();
void charKiirasa (unsigned char szam);

void interrupt TimerRabif()
{
    if(T0IE && T0IF)
    {
        T0IF = 0;
        timerSzamlalo++;
        lehetKiirni = 1;
        TMR0 = 250;
       /* if(mertKodSzamlalo == 2)
        {
            if (timerSzamlalo < 26)
                mertKod &= 0xbf;
            else mertKod |= 0x40;
            timerSzamlalo = 0;
            mertKodSzamlalo++;
            szamlalo += 2;
        }*/
        if (mertKodSzamlalo == 1)
        {
            if (timerSzamlalo < 26)
                mertKod &= 0x7f;
            else mertKod |= 0x80;
          /*  timerSzamlalo = 0;
            mertKodSzamlalo++;
            szamlalo += 2;*/
        }
    }
    if(RABIE && RABIF)
    {
        RABIF = 0;
        if(!RB6)
        {
            rabifSzamlalo++;
            if(rabifSzamlalo == szamlalo) //ett?l
                T0IE = 1;
            if(rabifSzamlalo == szamlalo + 2) //eddig
            {
                T0IE = 0;
                //RABIE=0;
            }
        }
    }
}
void main()
{
    TRISA = TRISC = ANSEL = ANSELH = 0;
    OPTION_REG = 0;
    GIE = 1;
    T0IE = 0;
    TRISB6 = 1; //infra
    RABIE = 1;
    IOCB6 = 1;

    LcdInit();

    rabifSzamlalo = 0;
    timerSzamlalo = 0;
    lehetKiirni = 0;
    mertKod = 0xff;
    mertKodSzamlalo = 1;
    szamlalo = 36;
    while(1)
    {
        if(lehetKiirni == 1)
        {
            lehetKiirni = 0; //nem engedélyezzük a kiírást
            LcdParancs(0x80); //az els? sor elejére írunk
            NagySzamKiirasa(rabifSzamlalo);
            LcdParancs(0xc0); //a második sor elejére írunk
            NagySzamKiirasa(timerSzamlalo);
            charKiirasa(mertKod);
        }
    }
} //main vége

void LcdParancs(byte adat)
{
RC1 = 0; //RS
RC0 = 0; //R/W (utasítást írunk)
if (adat & 0x80) PORTA |= 0x20; else PORTA &=~0x20; //D7
if (adat & 0x40) PORTA |= 0x10; else PORTA &=~0x10; //D6
if (adat & 0x20) PORTC |= 0x40; else PORTC &=~0x40; //D5
if (adat & 0x10) PORTC |= 0x20; else PORTC &=~0x20; //D4
if (adat & 0x08) PORTC |= 0x10; else PORTC &=~0x10; //D3
if (adat & 0x04) PORTC |= 0x08; else PORTC &=~0x08; //D2
if (adat & 0x02) PORTA |= 0x01; else PORTA &=~0x01; //D1
if (adat & 0x01) PORTA |= 0x02; else PORTA &=~0x02; //D0

delay(1); // Data setup time min. 195 ns
RA2 = 1;
delay(1); // E pulse width min. 450 ns
RA2 = 0;
delay(7); // 50 us // Address, Data hold time, Cicle time, execution time
}
void LcdAdat(byte adat)
{
RC1 = 1; //RS
RC0 = 0; //R/W (adatot írunk)
if (adat & 0x80) PORTA |= 0x20; else PORTA &=~0x20; //D7
if (adat & 0x40) PORTA |= 0x10; else PORTA &=~0x10; //D6
if (adat & 0x20) PORTC |= 0x40; else PORTC &=~0x40; //D5
if (adat & 0x10) PORTC |= 0x20; else PORTC &=~0x20; //D4
if (adat & 0x08) PORTC |= 0x10; else PORTC &=~0x10; //D3
if (adat & 0x04) PORTC |= 0x08; else PORTC &=~0x08; //D2
if (adat & 0x02) PORTA |= 0x01; else PORTA &=~0x01; //D1
if (adat & 0x01) PORTA |= 0x02; else PORTA &=~0x02; //D0

delay(1); // Data setup time min. 195 ns
RA2 = 1;
delay(1); // E pulse width min. 450 ns
RA2 = 0;
delay(7); // 50 us // Address, Data hold time, Cicle time, execution time
}
void delay(unsigned int varakozasIdo)
{
  for (unsigned int counter = 0; counter < varakozasIdo; counter++)
  {
      ;
  }
}
void KisSzamKiirasa (char szam)
{
    if(szam < 10)
    {
        LcdAdat('0' + szam);
    }
    else if(szam < 100)
    {
        LcdAdat('0' + szam/10);
        LcdAdat('0' + szam%10);
    }
    else if(szam < 1000)
    {
        LcdAdat('0' + szam/100);
        LcdAdat('0' + szam%100/10);
        LcdAdat('0' + szam%10);
    }
}
void NagySzamKiirasa (unsigned int szam)
{
    if(szam < 10)
    {
        LcdAdat('0' + szam);
    }
    else if(szam < 100)
    {
        LcdAdat('0' + szam/10);
        LcdAdat('0' + szam%10);
    }
    else if(szam < 1000)
    {
        LcdAdat('0' + szam/100);
        LcdAdat('0' + szam%100/10);
        LcdAdat('0' + szam%10);
    }
    else if(szam < 10000)
    {
        LcdAdat('0' + szam/1000);
        LcdAdat('0' + szam%1000/100);
        LcdAdat('0' + szam%100/10);
        LcdAdat('0' + szam%10);
    }
    else if (szam < 100000)
    {
        LcdAdat('0' + szam/10000);
        LcdAdat('0' + szam%10000/1000);
        LcdAdat('0' + szam%1000/100);
        LcdAdat('0' + szam%100/10);
        LcdAdat('0' + szam%10);
    }
}

void LcdInit()
{
    delay(5000);
    LcdParancs(0b00111000); //funkció beállítás
    delay(3);
    LcdParancs(0b00111000); //funkció beállítás
    delay(3);
    LcdParancs(0b00001100); //kijelz? beállítás
    delay(3);
    LcdParancs(0b00000001); //kijelz? törlés
    delay(100);
    LcdParancs(0b00000110); //entry mód beállítás
    delay(100);
}
void charKiirasa (unsigned char szam)
{
    if (szam & 0x80)
        LcdAdat('1');
    else LcdAdat('0');
    if (szam & 0x40)
        LcdAdat('1');
    else LcdAdat('0');
    if (szam & 0x20)
        LcdAdat('1');
    else LcdAdat('0');
    if (szam & 0x10)
        LcdAdat('1');
    else LcdAdat('0');

    LcdAdat(' ');

    if (szam & 8)
        LcdAdat('1');
    else LcdAdat('0');
    if (szam & 4)
        LcdAdat('1');
    else LcdAdat('0');
    if (szam & 2)
        LcdAdat('1');
    else LcdAdat('0');
    if (szam & 1)
        LcdAdat('1');
    else LcdAdat('0');
}