enum {BUTTON=3, LED1=4, LED2, LED3}; //Logo, LED2=5, LED3=6;
/*
DDRD -> Controla a direção de cada pino do PORTD;
PORTD -> Altera o estado lógico do pino, desde que
o registrador DDRD permaneça configurado como saída; Exemplo: led;
-> Habilita o pull-up do pino, desde que o
o registrador DDRD permaneça configurado como entrada; Exemplo: botão;
PIND -> Responsável pela leitura do nível lógico presente nos pinos do PORTD;
Exemplo: usado para leitura de um botão;
*/
#define Set_bit(p, b) (p|=(1<<b)) //macro em C; Usada para setar(1) um bit do port
#define Clr_bit(p, b) (p&=~(1<<b)) //macro em C; Usada para resetar(0) um bit do port
#define Read_bit(p, b) (!(!(p&(1<<b)))) //Faz a leitura do bit do PORT; Caso o botão
//esteja pressionado, será retornado 0, caso contrário, retorna 1;
void config(void){
Set_bit(DDRD, LED1); //Configura DDRD.PD4 como saída;
Clr_bit(PORTD, LED1); //Apaga o led (PD4);
Set_bit(DDRD, LED2); //Configura DDRD.PD5 como saída;
Clr_bit(PORTD, LED2); //Apaga o led (PD5);
Set_bit(DDRD, LED3); //Configura DDRD.PD6 como saída;
Clr_bit(PORTD, LED3); //Apaga o led (PD7);
Clr_bit(DDRD, BUTTON); //Configura DDRD.PD3 como entrada;
Set_bit(PORTD, BUTTON); //Habilita o pull-up do pino (PD3) de PORTD; Seta (1)
}
void setup(void) {
config();
}
void loop(){
static enum {state_1, state_2, state_3} estado = state_1; //máquina de estado finita! Máquina de markov;
if(Read_bit(PIND, BUTTON) == 0) {
switch(estado) {
case state_1: Set_bit(PORTD, LED1); Clr_bit(PORTD, LED3); estado = state_2; break;
case state_2: Set_bit(PORTD, LED2); Clr_bit(PORTD, LED1); estado = state_3; break;
case state_3: Set_bit(PORTD, LED3); Clr_bit(PORTD, LED2); estado = state_1; break;
}
delay(200); //ms
}
}