Moderadores: andre_luis, 51, guest2003, Renie
#include <16f84a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,PUT
void frequencia1(void);
void frequencia2(void);
void main(void)
{
}
#INT_EXT
void frequencia1(void)
{
}
#inicializacoes, fuses, bla bla bla
// A variavel global abaixo determina a frequencia, se for 0 pisca rapido, se for 1 pisca
// com a metade da frequencia
unsigned char frequencia;
void main(void)
{
inicializa_a _porra_toda();
habilita_as_interrupcoes();
frequencia = 0;
// O loop abaixo nao termina nunca
for(;;)
{
output_high(PIN_A0);
delay_ms(200);
// O if abaixo verifica se a variavel global estah em 1, se estiver, adiciona mais um
// pouco de atraso
if(frequencia != 0)
delay_ms(200);
output_low(PIN_A0);
delay_ms(200);
if(frequencia != 0)
delay_ms(200);
}
}
// Se houver interrupcao na EXT1, seta a variavel frequencia para
// piscada mais lenta
#int_ext1
void ext1_isr(void)
{
frequencia = 1;
}
// Se houver interrupcao na EXT2, seta a variavel frequencia para
// piscar mais rapido
#int_ext2
void ext2_isr(void)
{
frequencia = 0;
}
#int_RB
void RB_isr(void)
{
if(!input(PIN_B4)
frequencia = 0;
else
frequencia = 1;
}
[estado 1]<----|int no pino RB4|<---[estado 0]---->|int no pino RB5|---->[estado 2]
| ^ ^ |
\---------------------------------/ \---------------------------------/
// Esta variavel diz que estado a maquina estah
unsigned char estado;
void main(void)
{
inicicializa_a_porra_toda();
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
// Inicia a maquina de estados no estado zero
estado = 0;
for(;;)
{
// Se o estado for 1, pisca duas vezes lento
if(estado == 1)
{
// Vou desabilitar as interrupcoes pra nao correr o risco
// de ser interrompido durante esta execucao
disable_interrupts(GLOBAL);
// Vou piscar duas vezes lento. O codigo abaixo dah prá
// fazer de modo mais otimizado, mas assim fica mais didatico
output_high(PIN_A0);
delay_ms(400);
output_low(PIN_A0);
delay_ms(400);
output_high(PIN_A0);
delay_ms(400);
output_low(PIN_A0);
delay_ms(400);
// Se por acaso tiver alguma interrupcao na fila,
// eu apago ela pra ser ignorada
clear_interrupts(INT_RB);
enable_interrupts(GLOBAL);
// Terminei a execucao, volto pro estado 0
estado = 0;
}
// Se o estado for 2, pisca 4 vezes rapido
if(estado == 2)
{
// Vou desabilitar as interrupcoes pra nao correr o risco
// de ser interrompido durante esta execucao
disable_interrupts(GLOBAL);
// Vou piscar quatro vezes lento. O codigo abaixo dah prá
// fazer de modo mais otimizado, mas assim fica mais didatico
output_high(PIN_A0);
delay_ms(200);
output_low(PIN_A0);
delay_ms(200);
output_high(PIN_A0);
delay_ms(200);
output_low(PIN_A0);
delay_ms(200);
output_high(PIN_A0);
delay_ms(200);
output_low(PIN_A0);
delay_ms(200);
output_high(PIN_A0);
delay_ms(200);
output_low(PIN_A0);
delay_ms(200);
// Se por acaso tiver alguma interrupcao na fila,
// eu apago ela pra ser ignorada
clear_interrupts(INT_RB);
enable_interrupts(GLOBAL);
// Terminei a execucao, volto pro estado 0
estado = 0;
}
}
}
#int_RB
void RB_isr(void)
{
if(!input(PIN_B4)
estado = 1;
else
estado = 2;
}
Usuários navegando neste fórum: Google [Bot] e 1 visitante