#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
}
}
}