/*
Klávesnice 3x4:
COL1 COL2 COL3
ROW1 1 2 3
ROW2 4 5 6
ROW3 7 8 9
ROW4 10 0 12
*/
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include “lcd.h”
#define F_CPU 4000000UL
//--------------------------------------------------
#define setbit(port,bit) ((port) |= (1<<bit)) //nastav bit
#define clearbit(port,bit) ((port) &= ~(1<<bit)) //nuluj bit
// zapojení klávesnice
#define ROWPORT PORTD // port na kterém jsou připojeny řádky
#define ROWDDR DDRD
#define COLPORT PORTD // port na kterém jsou připojeny sloupce
#define COLDDR DDRD
#define ROW1 0 // ROW1 na ROWPORT.0
#define ROW2 1
#define ROW3 2
#define ROW4 3
#define COL1 4 // COL1 na COLPORT.4
#define COL2 5
#define COL3 6
#define DELKA_HESLA 8 // heslo má 8 znaků
//--------------------------------------------------
void kbd_init(void)
{
COLDDR |= (1<<COL1)|(1<<COL2)|(1<<COL3); // nastav sloupce jako výstupy
ROWDDR &= ~((1<<ROW1)|(1<<ROW2)|(1<<ROW3)|(1<<ROW4)); // řádky jako vstupy
ROWPORT |= (1<<ROW1)|(1<<ROW2)|(1<<ROW3)|(1<<ROW4); // pull-up na vstupech
}
//--------------------------------------------------
// Funkce get_kbd() vrací hodnotu stisknutého tlačítka.
// Pokud není stisknuto žádné tlačítko, vrací 0xff(255).
unsigned char get_kbd(void)
{
COLPORT |= (1<<COL1)|(1<<COL2)|(1<<COL3); // nastav všechny sloupce na hodnotu “1”
clearbit(COLPORT,COL1); // nastav první sloupec na “0”
_delay_us(1);
if(bit_is_clear(ROWPORT,ROW1)) return 1;
if(bit_is_clear(ROWPORT,ROW2)) return 4;
if(bit_is_clear(ROWPORT,ROW3)) return 7;
if(bit_is_clear(ROWPORT,ROW4)) return 10;
COLPORT |= (1<<COL1)|(1<<COL2)|(1<<COL3);
clearbit(COLPORT,COL2);
_delay_us(1);
if(bit_is_clear(ROWPORT,ROW1)) return 2;
if(bit_is_clear(ROWPORT,ROW2)) return 5;
if(bit_is_clear(ROWPORT,ROW3)) return 8;
if(bit_is_clear(ROWPORT,ROW4)) return 0;
COLPORT |= (1<<COL1)|(1<<COL2)|(1<<COL3);
clearbit(COLPORT,COL3);
_delay_us(1);
if(bit_is_clear(ROWPORT,ROW1)) return 3;
if(bit_is_clear(ROWPORT,ROW2)) return 6;
if(bit_is_clear(ROWPORT,ROW3)) return 9;
if(bit_is_clear(ROWPORT,ROW4)) return 12;
return 255; // žádné tlačítko nestisknuto
}
//--------------------------------------------------
char heslo] = “12345678”; // platné heslo
char string[15]; // zadané heslo
unsigned char temp, i;
//----------------------------- MAIN -----------------------------------------
int main()
{
lcd_init(LCD_DISP_ON);
kbd_init();
lcd_gotoxy(0,0);
lcd_puts(“zadej heslo: \r\n”);
while(1)
{
temp = get_kbd(); // čti klávesnici
//--------------------------
if(temp != 255) // pokud je stisknuto některé tlačítko
{
_delay_ms(50); // debounce
while(get_kbd() != 255) {} // čekej na uvolnění tlačítka
_delay_ms(50); // debounce
}
//--------------------------
if(temp < 10) // zadáno číslo 0-9
{
string* = temp + '0'; // ulož zadané číslo jako ascii znak
i++;
if(i > DELKA_HESLA - 1) // příliš dlouhé heslo
{
i = 0;
continue; // jdi na začátek while(1)
}
}
//--------------------------
if(temp == 12) // zadáno tlačítko "12", potvrzení hesla
{
string* = 0; // zakonči string nulou
// porovnej zadaný kód s heslem
if(strcmp(string, heslo) == 0) lcd_puts("spravne heslo \r\n");
else lcd_puts("spatne heslo \r\n");
i = 0;
}
}//while
}**