#include "16f877a.h" // Pic a utilizar
#use delay(clock=4000000) // Cristal a utilizar
#fuses xt,nowdt,nobrownout,nolvp,noprotect // Fusibles
#include "lcd.c"
int1 cambio;
int tiempo;
int1 start;
int16 word;
int16 i;
int longitud;
int1 dato_recibido;
int adress;
int command;
int j;
void main (void)
{
lcd_init();
if(start==1){ // Si hem rebut START, esperem dades
while(!dato_recibido); // Esperamos mientras recibimos datos
dato_recibido=0; // Ponemos datos recibidos a 0
DISABLE_INTERRUPTS(INT_EXT); // Deshabilitamos INT EXTERNA
// Tratamos los datos
take_adress(); // Cogemos la Dirección
take_command(); // Cogemos el Comando
// En este caso no se utiliza adress
switch (command){ // Mostramos por el LCD la tecla
// del mando pulsada
case 0: printf(lcd_putc,"\fCanal 1");break;
case 1: printf(lcd_putc,"\fCanal 2");break;
case 2: printf(lcd_putc,"\fCanal 3");break;
case 3: printf(lcd_putc,"\fCanal 4");break;
case 4: printf(lcd_putc,"\fCanal 5");break;
case 5: printf(lcd_putc,"\fCanal 6");break;
case 6: printf(lcd_putc,"\fCanal 7");break;
case 7: printf(lcd_putc,"\fCanal 8");break;
case 8: printf(lcd_putc,"\fCanal 9");break;
case 9: printf(lcd_putc,"\fCanal 0");break;
case 16: printf(lcd_putc,"\fCanal +");break;
case 17: printf(lcd_putc,"\fCanal ");break;
case 18: printf(lcd_putc,"\fVolumen +");break;
case 19: printf(lcd_putc,"\fVolumen ");break;
case 20: printf(lcd_putc,"\fSilencio");break;
case 47: printf(lcd_putc,"\fStandby");break;
default: printf(lcd_putc,"\fCom:%3U Adr:%2U",command,adress);
}
ENABLE_INTERRUPTS(INT_EXT); // Habilitamos la interrupción externa
}
}
#INT_EXT
void ext_isr()
{
if(cambio){ // Hemos recibido flanco de subida
tiempo=get_timer0(); // Miramos de cuanto tiempo es el pulso
EXT_INT_EDGE(H_TO_L); //Configuramos para recibir flanco de bajada
cambio=0;
}else { // Hemos recibido flanco de bajada
set_timer0(0); // Timer0 a 0
tiempo=0; // Tiempo a 0
EXT_INT_EDGE(L_TO_H); //Configurramos para recibir flanco de subida
cambio=1;
}
if (tiempo>140 && tiempo<160){ // Comprobamos START
start=1; // flag start a 1
i=0; // Reseteamos el contador de bits
}
if(start){ // Si hemos detectado start...
if(tiempo>27 && tiempo<55){ // es un 0 ?
bit_clear(word,i); // Añadimos el bit a la palabra
i++; // incrementa contador bits
}
if(tiempo>65 && tiempo<90){ // es un 1 ?
bit_set(word,i); // Añadimos el bit a la palabra
i++; // incrementa contador
}
if(i==longitud){ // Si contador = ntotalbits
dato_recibido=1; // flag dato redibido activado
EXT_INT_EDGE(H_TO_L); // Flanco de subida para el START
start=0; // Inicialización para la siguiente palabra
}
}
}
void take_adress(void){ // Separamos la dirección de la palabra
i=longitud-1;
adress=0;
for(j=0;j<longitud-7;j++){ // Hacemos un recorrido al revés
adress=adress<<1; //al revés para separar la direccion
adress=adress+bit_test(word,i);
i--;
}
}
void take_command(void){ //Separamos el comando de la palabra
i=6;
command=0;
for(j=0;j<7;j++){ // Hacemos un recorrido para separar el comando
command=command<<1;
command=command+bit_test(word,i);
i--;
}
}
#include "16f877a.h" // Pic a utilizar
#use delay(clock=4000000) // Cristal a utilizar
#fuses xt,nowdt,nobrownout,nolvp,noprotect // Fusibles
#include <lcd.c>
int1 cambio;
int tiempo;
int1 start;
int16 word;
int16 i;
int longitud;
int1 dato_recibido;
int adress;
int command;
int j;
void take_adress(void){ // Separamos la dirección de la palabra
i=longitud-1;
adress=0;
for(j=0;j<longitud-7;j++){ // Hacemos un recorrido al revés
adress=adress<<1; //al revés para separar la direccion
adress=adress+bit_test(word,i);
i--;
}
}
void take_command(void){ //Separamos el comando de la palabra
i=6;
command=0;
for(j=0;j<7;j++){ // Hacemos un recorrido para separar el comando
command=command<<1;
command=command+bit_test(word,i);
i--;
}
}
void main (void)
{
lcd_init();
printf(lcd_putc,"\fhola");
delay_ms(1000);
if(start==1){ // Si hem rebut START, esperem dades
while(!dato_recibido); // Esperamos mientras recibimos datos
dato_recibido=0; // Ponemos datos recibidos a 0
DISABLE_INTERRUPTS(INT_EXT); // Deshabilitamos INT EXTERNA
// Tratamos los datos
take_adress(); // Cogemos la Dirección
take_command(); // Cogemos el Comando
// En este caso no se utiliza adress
switch (command){ // Mostramos por el LCD la tecla
// del mando pulsada
case 0: printf(lcd_putc,"\fCanal 1");break;
case 1: printf(lcd_putc,"\fCanal 2");break;
case 2: printf(lcd_putc,"\fCanal 3");break;
case 3: printf(lcd_putc,"\fCanal 4");break;
case 4: printf(lcd_putc,"\fCanal 5");break;
case 5: printf(lcd_putc,"\fCanal 6");break;
case 6: printf(lcd_putc,"\fCanal 7");break;
case 7: printf(lcd_putc,"\fCanal 8");break;
case 8: printf(lcd_putc,"\fCanal 9");break;
case 9: printf(lcd_putc,"\fCanal 0");break;
case 16: printf(lcd_putc,"\fCanal +");break;
case 17: printf(lcd_putc,"\fCanal ");break;
case 18: printf(lcd_putc,"\fVolumen +");break;
case 19: printf(lcd_putc,"\fVolumen ");break;
case 20: printf(lcd_putc,"\fSilencio");break;
case 47: printf(lcd_putc,"\fStandby");break;
default: printf(lcd_putc,"\fCom:%3U Adr:%2U",command,adress);
}
ENABLE_INTERRUPTS(INT_EXT); // Habilitamos la interrupción externa
}
}
#INT_EXT
void ext_isr()
{
if(cambio){ // Hemos recibido flanco de subida
tiempo=get_timer0(); // Miramos de cuanto tiempo es el pulso
EXT_INT_EDGE(H_TO_L); //Configuramos para recibir flanco de bajada
cambio=0;
}else { // Hemos recibido flanco de bajada
set_timer0(0); // Timer0 a 0
tiempo=0; // Tiempo a 0
EXT_INT_EDGE(L_TO_H); //Configurramos para recibir flanco de subida
cambio=1;
}
if (tiempo>140 && tiempo<160){ // Comprobamos START
start=1; // flag start a 1
i=0; // Reseteamos el contador de bits
}
if(start){ // Si hemos detectado start...
if(tiempo>27 && tiempo<55){ // es un 0 ?
bit_clear(word,i); // Añadimos el bit a la palabra
i++; // incrementa contador bits
}
if(tiempo>65 && tiempo<90){ // es un 1 ?
bit_set(word,i); // Añadimos el bit a la palabra
i++; // incrementa contador
}
if(i==longitud){ // Si contador = ntotalbits
dato_recibido=1; // flag dato redibido activado
EXT_INT_EDGE(H_TO_L); // Flanco de subida para el START
start=0; // Inicialización para la siguiente palabra
}
}
}