enum {BUTTON=3,LED1 = 4, LED2, LED3}; // logo, LED2=4, LED2=5, LED=6
/*
DDRD -> Controla a direção de cada pino do PORTD;
PORTD -> Altera o estado lógico do pino, desde que
o registrado DDRD permaneça configurado como saída; Exemplo: Led;
->Habilita o pull-up do pino, desde que o
registrador DDRD permaneça configurado como entrada; Exemplo: Botao
PIND -> Reponsá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 do led (PD4)
Set_bit(DDRD, LED2);//Configura DDRD.PD4 como saída;
Clr_bit(PORTD,LED2); // Apaga do led (PD5)
Set_bit(DDRD, LED3);//Configura DDRD.PD7 como saída;
Clr_bit(PORTD,LED3); // Apaga do led (PD7)
Clr_bit(DDRD,BUTTON); //Configura DDRD.PD3 como entrada;
Set_bit(DDRD, BUTTON);//Habilita o pull-up do pino (PD3) de PORTD;Seta (1)
}
void setup()
{
config();
}
void loop() {
static enum{state_1, state_2, state_3} estado = state_1; // máquina de estado finital / Máquina de markow
if(Read_bit(PIND, BUTTON) == 0 ){
switch (estado){
case state_1: Set_bit(PORTD, LED1); Clr_bit(PORTD, LED2);Clr_bit(PORTD, LED3); estado = state_2; break;
case state_2: Set_bit(PORTD, LED2); Clr_bit(PORTD, LED1);Clr_bit(PORTD, LED3); estado = state_3; break;
case state_3: Set_bit(PORTD, LED3); Clr_bit(PORTD, LED1);Clr_bit(PORTD, LED2); estado = state_1; break;
}
delay(200);//ms
}
}