uint8_t counter_value;
uint16_t delay_cycles = 1000;
uint8_t old_state_11 = 0;
uint8_t old_state_12 = 0;
uint8_t new_state_11 = 0;
uint8_t new_state_12 = 0;
void lcd_send(uint8_t type, uint8_t data) {
PORTB = (type == 1 ? PORTB & ~(1 << 0) : PORTB | (1 << 0));
PORTD &= 0x0F;
PORTD |= (data & 0xF0);
PORTB |= (1<<1);
_delay(1);
PORTB &= ~(1<<1);
_delay(1);
}
void lcd_cmd(uint8_t command) {
lcd_send(1, command);
lcd_send(1, (command<<4));
_delay(1);
}
void lcd_text(const char *text) {
while (*text != '\0') {
char _text = *text;
lcd_send(0, _text);
lcd_send(0, (_text<<4));
text++;
}
}
void lcd_number(uint8_t num) {
char num_text[3];
num_text[0] = '0' + (num / 10);
num_text[1] = '0' + (num % 10);
num_text[2] = '\0';
lcd_text(num_text);
}
void lcd_initialize() {
DDRD |= 0xF0;
DDRB |= 0x03;
DDRD &= ~(1 << DDD3);
PORTD |= (1 << PORTD3);
PORTD &= 0x0F;
lcd_cmd(0x03);
lcd_cmd(0x03);
lcd_cmd(0x03);
lcd_cmd(0x02);
lcd_cmd(0x28);
lcd_cmd(0x0C);
lcd_cmd(0x06);
lcd_cmd(0x01);
}
void counter() {
if (counter_value > 99) counter_value = 0;
counter_value++;
lcd_cmd(0xC0);
lcd_text("Counter: ");
lcd_number(counter_value);
}
void button_update(){
if (!(PIND & (1 << PIND3))) {
_delay(5);
if (!(PIND & (1 << PIND3))) {
counter();
lcd_cmd(0xCC);
lcd_text("OK");
while (!(PIND & (1 << PIND3)));
_delay(10);
lcd_cmd(0xCC);
lcd_text(" ");
}
}
}
void encoder_update() {
new_state_11 = PIND & (1 << PIND5);
new_state_12 = PIND & (1 << PIND6);
// Compare with previous state to determine direction
if (old_state_11 != new_state_11 || old_state_12 != new_state_12) {
if (old_state_11 == 0 && new_state_11 == (1 << PIND5)) {
if (old_state_12 == 0 && new_state_12 == (1 << PIND6)) {
// Clockwise rotation
if (counter_value < 99) counter_value++;
} else if (old_state_12 == (1 << PIND6) && new_state_12 == 0) {
// Counterclockwise rotation
if (counter_value > 0) counter_value--;
}
}
}
// Update old state with current state for next comparison
old_state_11 = new_state_11;
old_state_12 = new_state_12;
// Update LCD with new counter value
lcd_cmd(0xC0);
lcd_text("Counter: ");
lcd_number(counter_value);
}
void _delay(uint16_t millisec) {
const unsigned long total_cycles = millisec * delay_cycles;
for (volatile unsigned long i = 0; i < total_cycles; i++) {
}
}
int main(){
lcd_initialize();
delay_cycles = 10000;
lcd_text("Hello");
lcd_cmd(0xC0);
lcd_text("World!");
delay_cycles = 1000;
_delay(1000);
lcd_cmd(0x01);
lcd_cmd(0x81);
delay_cycles = 10000;
lcd_text("Olimpiada 2024");
delay_cycles = 100;
counter();
while(1){
button_update();
encoder_update();
}
return 0;
}