Olá Renan,
O que você precisa fazer não é difícil, mas precisa de umas idéias um pouco mais complexas. Vou colocar um código aqui para você entender...
cpp code
unsigned char piscaP1_0 ;
unsigned char piscaP1_1 ;
unsigned char piscaP1_2 ;
void timer0_isr(void) interrupt 1
{
static unsigned int tempo = 0 ;
if( ++tempo >= 1000 )
{
if( piscaP1_0 )
P1 ^= 0x01 ;
else
P1 &= 0xFE ;
if( piscaP1_1 )
P1 ^= 0x02 ;
else
P1 &= 0xFD ;
if( piscaP1_3 )
P1 ^= 0x04 ;
else
P1 &= 0xFB ;
tempo = 0 ;
}
}
void main( void )
{
unsigned char dado ;
inicializa_serial() ;
inicializa_timer() ;
piscaP1_0 = 0 ;
piscaP1_1 = 0 ;
piscaP1_2 = 0 ;
while( 1 )
{
dado = recebe_serial() ;
switch( dado )
{
case 'A' :
piscaP1_0 = !piscaP1_0 ;
break ;
case 'B' :
piscaP1_1 = !piscaP1_1 ;
break ;
case 'C' :
piscaP1_2 = !piscaP1_2 ;
break ;
}
}
}
Estou acreditando que você tenha 3 funções, uma chamada inicializa_serial(), para inicializar a serial da maneira que você precisa... outra chamada recebe_serial(), que vai receber os caracteres da serial... e inicializa_timer(), que vai colocar o timer para gerar uma interrupção a cada 1ms.
Na chamada da interrupção, coloquei um contador de 1000, assim ele executa a cada segundo. Quando ele executa, vai verificar a variável piscaP1_0. Se ela valer 0, ele apaga o led (P1.0). Se ela valer 1, ele inverte o estado do led (P1.0). A mesma coisa com piscaP1_1 e piscaP1_2.
Quando o programa principal receber o caractere 'A', ele inverte piscaP1_0. Se ele estiver com 0, vai para 1 e o led começa a piscar. Se você enviar novamente 'A', ele vai de 1 para 0 e pára de piscar.
Espero ter ajudado.
Qualquer problema, conte conosco.
Um abraço.
Francesco