Hola, pues aqui te envio el código fuente que yo escribi y que configura RB7, RB6 y RB5
como entradas. Y RB3 y RB2 como salidas. El prog esta hecho con PIC Basic Pro v3.0.
Al presionar RB7 (set_1), RB3= ON RB2= OF. Al volver a presionar RB7 (set_1), RB3= OFF y RB2= ON
Al presionar RB6 (set_2), RB3= RB2= ON.
Al presionar RB5 (reset), RB3= RB2= OFF.
Se visualiza cada pulsación en un LCD de 2x16 conectado en PORT C
Adapta este prog para cualquier PIC. Si funciona
define osc 4 ' Velocidad del cristal XT= 4.000000 Mhz
DEFINE LCD_DREG PORTC ' Configura el puerto C para datos del LCD
DEFINE LCD_DBIT 0 ' Bit de inicio 0 o 4 para bus de datos, RC0 en este caso
DEFINE LCD_RSREG PORTC ' Configura el Register Select en el pto C
DEFINE LCD_RSBIT 5 ' Configura RC5 para habilitar el RS del LCD
DEFINE LCD_EREG PORTC ' Configura el Enable Register en el pto C
DEFINE LCD_EBIT 4 ' Configura RC4 para habilitar el E (Enable) del LCD
DEFINE LCD_BITS 4 ' Configura el numero de bits del bus de datos del LCD
DEFINE LCD_LINES 2 ' Numero de lineas del LCD
DEFINE LCD_COMMANDUS 2000 ' Configura tiempo de espera para comando en uSeg
DEFINE LCD_DATAUS 50 ' Configura tiempo de espera de datos en uSeg
input portb.7 ' Configura RB7 como entrada
input portb.6 ' Configura RB6 como entrada
input portb.5 ' Configura RB5 como entrada
output portb.3 ' Configura RB3 como salida
output portb.2 ' Configura RB2 como salida
pause 10
conmuta var bit
bandera var bit
option_reg.7= 0
on interrupt goto isr
intcon= %11001000 ' Habilita la GIE y las resistencias pull ups
bandera= 0
conmuta= 0
Ciclo:
if bandera= 1 then ' Verifica que no se ha accionado un push bottom
goto Ciclo
endif
disable
isr:
if portb.7= 0 and conmuta= 0 then
LCDOUT $FE, 1 ' Limpia el LCD
PAUSE 10
lcdout $FE, 1,"RB7: Set_1"
pause 10
lcdout $FE,$C0,"RB3: ON RB2: OFF"
pause 10
portb.3= 1 ' Pone a 1 RB3
portb.2= 0 ' Pone a 0 RB2
conmuta= 1
while portb.7= 0
wend
pause 200
goto salir
endif
if portb.7= 0 and conmuta= 1 then
LCDOUT $FE, 1 ' Limpia el LCD
PAUSE 10
lcdout $FE, 1,"RB7: Set_1"
pause 10
lcdout $FE,$C0,"RB3: OFF RB2: ON"
pause 10
portb.3= 0 ' Pone a 0 RB3
portb.2= 1 ' Pone a 1 RB2
conmuta= 0
while portb.7= 0
wend
pause 200
goto salir
endif
if portb.6= 0 then
LCDOUT $FE, 1 ' Limpia el LCD
PAUSE 10
lcdout $fe, 1, "RB6: Set_2"
pause 10
lcdout $FE, $C0, "RB3: ON RB2: ON"
pause 10
portb.3= 1 ' Pone a 1 RB3
portb.2= 1 ' Pone a 1 RB2
while portb.6= 0
wend
pause 200
goto salir
endif
if portb.5= 0 then
LCDOUT $FE, 1 ' Limpia el LCD
PAUSE 10
lcdout $FE, 1, "RB5: Reset"
pause 10
lcdout $FE, $C0, "RB3_OFF RB2_OFF"
pause 10
portb.3= 0 ' Pone a 0 RB3
portb.2= 0 ' Pone a 0 RB2
while portb.5= 0
wend
pause 200
goto salir
endif
salir:
bandera= 1
intcon.0= 0
resume
enable