En C no te manejas con registros. Solamente pensas en variables, donde estan ubicadas en el micro no es de tu interes.
Lo que vos necesitas es un bit nomas. un flag. Pero ese no es tu problema. Yo ya te dije que tu problema esta en el getch();
si te manejas con el ASM te lo explico con ASM el getch es algo asi:
equivalente a:
GETCH
BTFSS PIR1, RXIF ;Supongamos que es el indicador de que un caracter llego
GOTO GETCH
MOVF RXREG, W
MOVWF C2
Es decir tenes un loop infinito hasta que llegue el dato, sino no sale de ahi.
Entonces tu programa hace esto...
- Comienza el while
- Se queda esperando que llegue un dato, no sale de ese getch()
- Si recibe una 'A' entra al if
- Si entra al if queda atrapado ahora con el otro getch(), supongamos que pones la 'P'
- Sale del primer if ( c1 == 'A' )
- Como se puso en 1 ese bit ahora entra al if con los delays, ejecuta eso
- Se termina el while y comienza todo de nuevo.
Observaras que cada ves que comienze el while va a estar encerrado en el getch() y por lo tanto no va a realizar lo de enceder y apagar el led con el delay ese.
Tu programa funcionaria si: Presionas primero la 'A' , luego la 'P' y luego tenes que presionar CUALQUIER letra ( menos la 'A' ) para que encienda y apague el led de B0, cada ves que la presiones sale del getch, y pregunta por ese bit, la cual va a estar en 1 por ponerle el "AP" antes, y va a hacer los delays, pero luego va a esperar nuevamente para que presiones la tecla.
-------------------------------------------------------
yo pense que querias usar para cambiar algun bit es especial de algun numero. Pero veo que intentas hacer una "flag". para eso C tiene las variables tipo bool o int1 en CCS, que son de 1 bit
Tu MISMO programa pero escrito de otro modo:
//DECLARACION DE VARIABLES
int1 flag = false;
void main(VOID)
{
//PROGRAMA PRINCIPAL
/*******************
WHILE (TRUE)
{
//*******************************************************************************
if (getch()=='A') // CHEQUEO SI EXISTE ALGUN MENSAJE DE ACCION O RESPUESTA
{
switch(getch())
{
case '1':
ouput_high(PIN_B0);
break;
case '2':
ouput_low(PIN_B0);
flag = false;
break;
case 'P':
flag = true;
break;
default:
break;
}
if(flag)
{
delay_ms(300);
output_high(pin_B0);
delay_ms(300);
output_low(pin_B0);
}
}
}
Es decir tiene los mismos problemas, pero escrito de otra forma.