#include <avr/io.h>
#include <util/delay.h>
 
#define RS PC0
#define EN PC2
 
void w(uint8_t v, uint8_t rs) {
    PORTD = v;
    if(rs) PORTC |=  (1<<RS);
    else   PORTC &= ~(1<<RS);
    PORTC |=  (1<<EN);
    _delay_ms(1);
    PORTC &= ~(1<<EN);
    if(rs) _delay_ms(2);
}
 
char keys[4][4] = {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
};
 
char keypad_read() {
    for(uint8_t row = 0; row < 4; row++) {
        PORTA = ~(1 << row);
        _delay_us(5);
        uint8_t col = (PINA >> 4) & 0x0F;
        if(col != 0x0F) {
            for(uint8_t c = 0; c < 4; c++) {
                if(!(col & (1 << c))) {
                    while(!( (PINA>>4) & (1<<c) ));
                    return keys[row][c];
                }
            }
        }
    }
    return 0;
}
 
int main(void) {
    DDRD = 0xFF;
    DDRC = 0xFF;
    DDRA = 0x0F;
    PORTA = 0xF0;
 
    w(0x38,0); w(0x0C,0); w(0x01,0); w(0x06,0);
 
    w('K',1); w('E',1); w('Y',1); w(':',1);
 
    while(1) {
        char k = keypad_read();
        if(k) w(k,1);
    }
}