#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
char buffer[16];
unsigned int8 head; //Indice para introducir datos en el buffer
unsigned int8 tail; //indice para sacar datos del buffer
char EstadoAutomata = 'I'; //I = Espera INT en RB0, S = Seleccion dato, R = Ingresar dato 1, C = ...
#int_ext
void ext_isr(){
disable_interrupts(INT_EXT);
printf("Selecciona el dato a Ingresar: \r\n"); printf("R Ingresar Dato1: \r\n"); printf("C Ingresar Dato2: \r\n"); printf("T Ingresar Dato3: \r\n"); EstadoAutomata = 'S';
}
#int_rda
void serial_isr() {
head = (head + 1) % 16;
}
int8 Usart_RxEmpty(){
return(head == tail);
}
char Usart_Get(){
tail = (tail + 1) % 16;
return buffer[tail];
}
void main(){
char c;
int8 dato1;
unsigned int8 EstadoLectura = 0; //0 = leyendo primer digito, 1 = leyendo 2 digito
set_tris_b(0b00000001);
enable_interrupts(int_rda);
enable_interrupts(global);
ext_int_edge (H_TO_L); //interrupcion externa al pasar de 1 a 0
enable_interrupts(INT_EXT); //interrupcion externa RB0
printf("Esto es una Prueba \r\n");
head = 0;
tail = 0;
while(1){
switch(EstadoAutomata){
case 'I':
break;
case 'S':
if(!Usart_RxEmpty()){ //si el buffer de recepción no está vacío leemos un byte
c = Usart_Get(); //obtenemos un byte (caracter) del buffer de recepción
switch(c){
case 'R':
dato1 = 0;
EstadoAutomata = 'R';
printf("R Ingresar Dato1 (0-99): \r\n"); EstadoLectura = 0; //pasamos al primer estado del miniautomata que lee dos digitos numericos de la usart
break;
case 'C': EstadoAutomata = 'C'; break;
case 'T': EstadoAutomata = 'T'; break;
}
}break;
case 'R':
switch(EstadoLectura){
case 0:
if(!Usart_RxEmpty()){
c = Usart_Get();
if((c >= '0')&&(c <= '9')){
dato1 = c - 48; //convierte a entero
EstadoLectura++; //pasamos a leer el siguiente digito
}
}break;
case 1:
if(!Usart_RxEmpty()){
c = Usart_Get();
if((c >= '0')&&(c <= '9')){
dato1 = ((dato1*10) + (c - 48)); //convierte a entero
EstadoLectura++; //pasamos a leer el siguiente digito
printf("Dato leido: %d\r\n", dato1
); EstadoAutomata = 'I'; //volvemos al estado de reposo
enable_interrupts(INT_EXT);
}
}break;
}break;
case 'C': break;
case 'T': break;
}
}
}