// Comunicación PC - RS232 v1.0
// Compilador: PCM Compiler V4.038
// Directivas del preprocesador
#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT
#use RS232 (BAUD = 2400, BITS = 8, PARITY = N, XMIT = PIN_A1, RCV = PIN_A2)
#use fast_io (A)
#use fast_io (B)
// Definición de variables
int1 eled1; // estados de los leds
int1 eled2;
int1 eled3;
int1 eled4;
int1 einterr1;
int1 einterr2;
int1 einterr3;
int1 einterr4;
// Llamamos a los pines por nombres más intuitivos
#define led1 48 // B0
#define led2 49 // B1
#define led3 50 // B2
#define led4 51 // B3
#define interr1 52 // B4
#define interr2 53 // B5
#define interr3 54 // B6
#define interr4 55 // B7
// Función principal
void main(VOID)
{
set_tris_b (0b11110000); //puerto B: RB7 a RB4 Entradas, RB3 a RB0 Salidas.
set_tris_a (0b00000010); // Puerto A: pin A1 como Entrada, el resto como salida
output_B (0); //apaga los leds
eled1 = 0; //nos aseguramos de que los estados son cero
eled2 = 0;
eled3 = 0;
eled4 = 0;
puts ("Comunicacion PC - RS232 v1.0"); // Mensaje de bienvenida.
puts ("-----------------------------");
puts ("Pulse 1, 2, 3 o 4");
// inicializamos variables interruptores
einterr1=input(interr1);
einterr2=input(interr2);
einterr3=input(interr3);
einterr4=input(interr4);
DO
{
if (einterr1!=input(interr1))
{
printf("interruptor 1 ha cambiado a %d\n\r",input(interr1));
einterr1=input(interr1);
}
if (einterr2!=input(interr2))
{
printf("interruptor 2 ha cambiado a %d\n\r",input(interr2));
einterr2=input(interr2);
}
if (einterr3!=input(interr3))
{
printf("interruptor 3 ha cambiado a %d\n\r",input(interr3));
einterr3=input(interr3);
}
if (einterr4!=input(interr4))
{
printf("interruptor 4 ha cambiado a %d\n\r",input(interr4));
einterr4=input(interr4);
}
if(kbhit())
{
SWITCH (GETC ()) // actuamos en función de lo recibido (1, 2, 3 ó 4)
{
CASE '1':
{
IF (eled1 == 0)
{
output_high (led1); // si está apagado lo enciende
puts ("Endendido led 1");
eled1 = 1; // cambiamos la variable de estado
}
ELSE
{
output_low (led1); // y viceversa
puts("Apagado led 1");
eled1 = 0;
}
BREAK;
}
CASE '2':
{
IF (eled2 == 0)
{
output_high (led2); // si está apagado lo enciende
puts ("Encendido led 2");
eled2 = 1; // cambiamos la variable de estado
}
ELSE
{
output_low (led2); // y viceversa
puts ("Apagado led 2");
eled2 = 0;
}
BREAK;
}
CASE '3':
{
IF (eled3 == 0)
{
output_high (led3); // si está apagado lo enciende
puts ("Encendido led 3");
eled3 = 1; // cambiamos la variable de estado
}
ELSE
{
output_low (led3); // y viceversa
puts ("Apagado led 3");
eled3 = 0;
}
BREAK;
}
CASE '4':
{
IF (eled4 == 0)
{
output_high (led4); // si está apagado lo enciende
puts ("Encendido led 4");
eled4 = 1; // cambiamos la variable de estado
}
ELSE
{
output_low (led4); // y viceversa
puts ("Apagado led 4");
eled4 = 0;
}
BREAK;
}
}
}
}WHILE (TRUE); // Bucle infinito.
}