#include #include #include // Definovanie LCD pinov #define RS PD2 #define RW PD3 #define E PD4 #define D4 PD5 #define D5 PD6 #define D6 PD7 #define D7 PB0 // Definovanie klávesnicových pinov #define ROWS 4 #define COLS 4 char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; uint8_t rowPins[ROWS] = {7, 6, 14, 15}; uint8_t colPins[COLS] = {16, 17, 19, 18}; // Function prototypes void lcd_init(void); void lcd_command(uint8_t cmd); void lcd_data(uint8_t data); void lcd_print(const char *str); char klavesa(void); void lcd_init(void) { // Set LCD pins as output DDRD |= (1 << RS) | (1 << RW) | (1 << E) | (1 << D4) | (1 << D5) | (1 << D6); DDRB |= (1 << D7); _delay_ms(20); lcd_command(0x02); // Inicializácia LCD displaya do 4-bitového režimu lcd_command(0x28); lcd_command(0x0C); lcd_command(0x06); lcd_command(0x01); // vyčistenie displaya _delay_ms(2); } void lcd_command(uint8_t cmd) { PORTD = (cmd & 0xF0) | (1 << E); _delay_us(1); PORTD &= ~(1 << E); _delay_us(200); PORTD = ((cmd << 4) & 0xF0) | (1 << E); _delay_us(1); PORTD &= ~(1 << E); _delay_ms(2); } void lcd_data(uint8_t data) { PORTD = (data & 0xF0) | (1 << RS) | (1 << E); _delay_us(1); PORTD &= ~(1 << E); _delay_us(200); PORTD = ((data << 4) & 0xF0) | (1 << RS) | (1 << E); _delay_us(1); PORTD &= ~(1 << E); _delay_ms(2); } void lcd_print(const char *str) { while (*str) { lcd_data(*str++); } } char klavesa(void) { for (uint8_t i = 0; i < COLS; i++) { DDRB = (1 << colPins[i]); PORTB = ~(1 << colPins[i]); _delay_us(5); for (uint8_t j = 0; j < ROWS; j++) { if (!(PINB & (1 << rowPins[j]))) { return keys[j][i]; } } } return 0; } int main(void) { lcd_init(); lcd_print("Press 1: Key"); lcd_command(0xC0); // Nastavenie kurzora do 2 riadku lcd_print("Press 2: Write"); while (1) { char key = klavesa(); if (key == '1') { lcd_command(0x01); // vyčistenie displaya lcd_print("Key pressed: "); while (1) { key = klavesa(); if (key) { lcd_command(0x8D); // Nastavenie kurzora na 13 pozíciu, čiže prvú v druhom riadku lcd_data(key); } } } else if (key == '2') { lcd_command(0x01); // vyčistenie displaya uint8_t cursorPosition = 0; while (1) { key = klavesa(); if (key) { if (cursorPosition == 32) { lcd_command(0x01); // vyčistenie displaya cursorPosition = 0; } lcd_command(0x80 + cursorPosition); // Reset kurzora na pôvodnú pozíciu lcd_data(key); cursorPosition++; } } } } return 0; }