////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR'06
// 04/Julio/06
//
// Programa: Boton & led's
// Version: 1.0
//
// Dispositivo: PIC 16F84A Compilador: CCS vs3.249
// Entorno IDE: MPLAB IDE v7.40 Simulador: Proteus 6.7sp3
//
// Notas: Este programa se encarga de cambiar los estados de los led's correspondientes a
// unos pulsadores, al pulsar alguno de ellos cambia el estado del led correspondiente
// produciendo una interrupcion:
// · Boton 1 PIN_B4 -> led PIN_B0
// · Boton 2 PIN_B5 -> led PIN_B1
// · Boton 3 PIN_B6 -> led PIN_B2
// · Boton 4 PIN_B7 -> led PIN_B3
//
// Conexiones: B4 -> Boton 1
// B5 -> Boton 2
// B6 -> Boton 3
// B7 -> Boton 4
// B0 -> Led
// B1 -> Led
// B2 -> Led
// B3 -> Led
//////////////////////////////////////////////////////////////////////////////////
#include <16f84a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,NOPUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fast_io(b) //definimos forma rapida...
#use fast_io(a) //...de configurar los puertos a y b
#byte port_b=0x06 //declaracion del puerto b
#bit RB0=06.0 //definicion de...
#bit RB1=06.1
#bit RB2=06.2
#bit RB3=06.3 //...pines de la parte alta del puerto b
///DECLARACION DE VARIABLES GLOBALES
int last_b; //variable de almacenar el estado del portb
///LLAMADA FUNCION INTERRUPCION
#int_rb
void rb_isr(){
byte changes; //variable que almacena que pin a realizado la interrupcion
changes = last_b ^ port_b; //changes<-pin que genera la interrupcion
last_b = port_b; //last_b=como estaba el portb antes de interrupcion
if (bit_test(changes,4 )&& !bit_test(last_b,4)) //¿PIN_B4 genera interrupcion -> boton1?
RB0=!RB0; //SI -> Actuo sobre led
if (bit_test(changes,5)&& !bit_test (last_b,5)) //¿PIN_B5 genera interrupcion -> boton2?
RB1=!RB1; //SI -> Actuo sobre led
if (bit_test(changes,6)&& !bit_test (last_b,6)) //¿PIN_B6 genera interrupcion -> boton3?
RB2=!RB2; //SI -> Actuo sobre led
if (bit_test(changes,7)&& !bit_test (last_b,7)) //¿PIN_B7 genera interrupcion -> boton4?
RB3=!RB3; //SI -> Actuo sobre led
}
///PROGRAMA
void main(void)
{
set_tris_b (0b11110000); //portb: <0:3>salida y <4:7>entrada
enable_interrupts(INT_RB); //activamos la interrupcion del puertob <4:7>
enable_interrupts(GLOBAL); //damos permiso a las interrupciones
output_b(0x00); //todo los led's off
for(;;); //esperamos a la interrupcion
}