47 lines
962 B
C
47 lines
962 B
C
|
#include <avr/io.h>
|
||
|
#include <avr/interrupt.h>
|
||
|
|
||
|
volatile uint8_t current_led = 3;
|
||
|
|
||
|
// czyscimy czy zapalamy
|
||
|
volatile uint8_t reverse = 0;
|
||
|
|
||
|
void update_led(){
|
||
|
// przesuwamy wybrany led
|
||
|
uint8_t next = current_led + 1;
|
||
|
if (next > 3){
|
||
|
next = 0;
|
||
|
reverse = (reverse + 1) % 2;
|
||
|
}
|
||
|
if (!reverse){
|
||
|
// zapalamy kolejna
|
||
|
PORTC |= (1<<next);
|
||
|
}else{
|
||
|
// gasimy kolejna
|
||
|
PORTC &= ~(1<<next);
|
||
|
}
|
||
|
|
||
|
current_led = next;
|
||
|
}
|
||
|
|
||
|
int main(void){
|
||
|
// ustawienie C0-C3 jako wyjscie
|
||
|
DDRC |= 0b00001111;
|
||
|
|
||
|
uint8_t last_state = ACSR & (1<<ACO);
|
||
|
for(;;){
|
||
|
// pobieramy stan komparatora
|
||
|
uint8_t comparator_state = ACSR & (1<<ACO);
|
||
|
|
||
|
// jesli stan sie zmienil na wysoki to przesun ledy
|
||
|
if (comparator_state != last_state && last_state == 0){
|
||
|
update_led();
|
||
|
}
|
||
|
|
||
|
// zaktualizuj ostatni stan
|
||
|
last_state = comparator_state;
|
||
|
}
|
||
|
|
||
|
return 1;
|
||
|
}
|