#define F_CPU 14745600UL 

#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "knihovnaLCD.c"


//*******************************************************************************************
//  MOJE UPRAVY
//-------------------------------------------------------------------------------------------
//
#define setb(port,pin)    port |= 1<<pin    //nastav bit
#define clrb(port,pin)    port &= ~(1<<pin) //nuluj bit
#define negb(port,pin)    port ^= 1<<pin    //neguj bit

//***********************************************************************************


unsigned int cas=10;
unsigned char tlacitka_new=255;
unsigned char tlacitka=255;
char tmp [20];
char znak=0;
char muj_pin [5];
char pin [5];
int i;

unsigned char old_ddr;

// na kterem portu je klavesnice
#define DDRport DDRA
#define PINport PINA
#define PORTport PORTA
// na kterem portu je pipak
#define DDRportPIP DDRC
#define PINportPIP PINC
#define PORTportPIP PORTC




void pip(int cas,int ton) // OK pipnuti
{
    // priklad:
    // cas=600
    // ton=1000
    setb(DDRportPIP,5);
    int i;
            for (i=0;i<cas;i++) 
                {
               
                negb(PORTportPIP,5);
                _delay_us(ton);
               
                }
}








int main(void)
{


//////////////////////////////////////////////////////////////////////////////////
//DDRD=0xFF; // vystupní - Ledky
//DDRC=0x00; // vstupní  - Tlacitka



///// LCD INIT

    LCD_Init();
    LCD_Clear();
    _delay_ms(2);

    LCD_Position(0 , 0);
    LCD_WriteString(" Zadej PIN a * ");
    LCD_Position(1 , 0);
    LCD_WriteString("               ");


strcpy(muj_pin,"1234"); // nastaveni hledaneho pinu
pin[4]=0;                // zarucuje aby pole pin byl string (string musi koncit 0)                 

while (1)
      {


////////////////////////Zacatek cteni
tlacitka=255;


old_ddr=DDRport; //zaloha nastaveni DDR


_delay_us(cas);
setb(DDRport,0); // vystupy
setb(DDRport,1);
setb(DDRport,2);
setb(DDRport,3);

clrb(DDRport,4); // vstupy
clrb(DDRport,5);
clrb(DDRport,6);
clrb(DDRport,7);


PORTport=0b00001110;

// 1 sloupec

_delay_us(cas);

if bit_is_clear(PINport,4) tlacitka=1;
if bit_is_clear(PINport,5) tlacitka=4;
if bit_is_clear(PINport,6) tlacitka=7;
if bit_is_clear(PINport,7) tlacitka=100; // #




// 2 sloupec
PORTport=0b00001101;

_delay_us(cas);

if bit_is_clear(PINport,4) tlacitka=2;
if bit_is_clear(PINport,5) tlacitka=5;
if bit_is_clear(PINport,6) tlacitka=8;
if bit_is_clear(PINport,7) tlacitka=0;



// 3 sloupec
PORTport=0b00001011;

_delay_us(cas);


if bit_is_clear(PINport,4) tlacitka=3;
if bit_is_clear(PINport,5) tlacitka=6;
if bit_is_clear(PINport,6) tlacitka=9;
if bit_is_clear(PINport,7) tlacitka=101; // *


// 4 sloupec
PORTport=0b00000111;

_delay_us(cas);


if bit_is_clear(PINport,4) tlacitka=11; //F1
if bit_is_clear(PINport,5) tlacitka=12; //F2
if bit_is_clear(PINport,6) tlacitka=13; //F3
if bit_is_clear(PINport,7) tlacitka=14; //F4



PORTport=0b00001111; // nectu

DDRport=old_ddr; //zaloha nastaveni DDR

/// konec cteni
///////////////////////////////////////////////////////


if (tlacitka!=tlacitka_new) // pokud se stara hodnota nerovna nove znamena to novy stisk
 {
   tlacitka_new=tlacitka ; // novou hodnotu priradime stare
    if (tlacitka<10)      // reakce jen pokud je zmacknuto cislo (ne F1-F4 a # a *)
    {
        if (znak==0)  // pri vynulovani znaku (zmacknuti # driv nez jsou 4 znaky)  se smaze i druhy radek
        {
          LCD_Position(1 ,0);
          LCD_WriteString("                ");
        }
       
        znak=znak+3;     // vhodne rozhozeni cisel
        if (znak>12)      // jestlize je zapsano vice nez 4 znaky (3*4=12) vymaz spodni radek
        {
          LCD_Position(1 ,0);
          LCD_WriteString("                ");
          znak=2;
        }

        pin[i]=tlacitka+48;   // ukladani stisknutych cisel do stringu (prevod na ascii- 0 je 48 v ascii)
        i++;

        if (i==4) i=0;       //  vynulovani pozice a znovu zapisovani PINu

        // zobrazovani zadavanych znaku
        LCD_Position(1 , znak); 
        sprintf (tmp,"%d",tlacitka);
        LCD_WriteString(tmp);
       
        pip(100,1000);

      } // konec reakce na cisla
  } // konec reakce na stisk
 
 
if (tlacitka==100)   // pokud je zmackunto # spusti se porovnani zadaneho a ulozeneho PINu
{
        znak=0;i=0;   // osetreni pokud se zmackne # driv nez je zadano 4 cisla PINu
        LCD_Position(1 , 0);
        if(strcmp(muj_pin,pin) == 0)
        {
        LCD_WriteString("PRISTUP POVOLEN!");
        pip(600,1000);
        }
        else
        {
        LCD_WriteString("PRISTUP ODEPREN!");
        pip(600,500);
        _delay_ms(200);
        pip(600,500);

        }
    _delay_ms(1000);
    LCD_Position(1 , 0);
    LCD_WriteString("                ");
    strcpy(pin,"0000"); // vynulovani nalezeneho pinu   
}






      }
}