Espero que el programa adjunto te solucione el problema. Animo y éxitos
;PROGRAMA # 1 NIVEL PRINCIPIANTE. 16F84-1
;EL OBJETO DEL PROGRAMA ES ENCENDER Y/O APAGAR UN LED DESDE UN SWITCH PULSADOR NORMALMENTE ABIERTO.
;INICIALENTE EL PULSADOR ESTÁ ABIERTO Y EL LED APAGADO, CUANDO SE PRESIONA EL PULSADOR AUTOMATICAMENTE SE FIJA UN "0" LÓGICO
;EN EL PUERTO RA0, EL PROGRAMA COMO CONTINUAMENTE ESTÁ PREGUNTANDO POR ESTE PUERTO SI ESTÁ EN "0", RECIBE UNA RESPUESTA
;AFIRMATIVA Y LLAMA UNA RUTINA DE RETARDO PARA EVITAR EL REBOTE GENERADO POR EL CIERRE DE LOS CONTACTOS DEL SWITCH.
;A CONTINUACION EL PROGRAMA VERIFICA SI YA SE SOLTÓ EL SWICTH, DE LO CONTRARIO ESPERA HASTA QUE ESTE EVENTO SUCEDA.
;DESPUÉS DE SOLTADO EL SWITCH EL PROGRAMA COMPLEMENTA EL PUERTO B (TODO) A TRAVES DE LA INSTRUCCION COMF. SI EL PUERTO RB ESTÁ
;EN "0" SE FIJAN "1" Y VICEVERSA.
;LA RUTINA DE RETARDO ES DE 100.74mS. RECORDEMOS QUE UN RETARDO ACEPTABLE ESTÁ ENTRE 100mS Y 125 mS. TIEMPOS MAS CORTOS
;PUEDEN AÚN INTERPRETAR LOS REBOTES Y TIEMPOS MAS LARGOS PUEDEN TORNAR DEMASIADO LENTO UN SWITCH O TECLADO.
;ESPERO LES SIRVA DE GUIA PARA INICIARSE EN EL MUNDO DE LA PROGRAMACION DE LOS MICROCONTROLADORES, YA QUE ES UN ARTE,
;PROFESION U OFICIO QUE SI SE DOMINA EN SU TOTALIDAD TODAS LAS HERRAMIENTAS DE TODOS LAS FAMILIAS DE LOS PIC YA SE ESTÁ
;EN CAPACIDAD DE DISEÑAR O CREAR PROYECTOS REALES MUY EFICACES Y QUE PUEDEN GENERAR GRAN REMUNERACIÓN A CAMBIO.
;MUCHOS ÉXITOS.
;GHERSON FLÓREZ
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
LIST P=PIC16F84 ;DEFINE EL TIPO DE MICROCONTROLADOR A UTILIZAR
#INCLUDE <P16F84.INC> ;DEFINE LA LIBRERIA DE LOS REGISTROS PARA EL PIC16F84
reg1 equ 0x0c ;definición de registro de propósito general o de usuario. Recordemos que en este pic los registros de propósito general se encuentran a partir de la posición 0ch
REG2 EQU 0X0D ;DEFINICION DE REGISTRO DE PROPÓSITO GENERAL O DE USUARIO
__CONFIG _XT_OSC&_WDT_OFF&_PWRTE_ON&_CP_OFF ;SE CONFIGURAN LOS FUSIBLES DE OPERACIÓN, CRISTAL=XT; WATCHDOG TIMER=OFF; POWER UP TIMER=ON; CODE PROTECTION=OFF
ORG 00 ;POSICION 0 DE LA MEMORIA DE PROGRAMA
BCF STATUS,6 ;BIT 6 DEL REGISTRO ESTATUS=0
BSF STATUS,5 ;BIT 5 DEL REGISTRO ESTATUS=1, BANCO 1
MOVLW 0X01 ;W=1HEX
MOVWF TRISA ;TRISA=W
CLRF TRISB ;TRISB=0
BCF STATUS,5 ;BIT 5 DEL REGISTRO ESTATUS=0, BANCO 0
CLRF PORTB ;PORTB=0
SW BTFSC PORTA,0 ;EL BIT 0 DEL PUERTO A (RA0) ESTÁ EN 0?
GOTO SW ;NO, VA A SW (LABEL)
PROCESO CALL RETARDO ;SI, LLAMA RETARDO
BTFSS PORTA,0 ;EL BIT 0 DEL PUERTO A (RA0) ESTÁ EN 1?
GOTO PROCESO ;NO, VA A PROCESO
Comf portb, 1 ;su, complementya todo el puerto b, es decir si está en 0 coloca unos y viceversa.
GOTO SW ;VUELVE A RELIZAR EL PROCESO. VA A SW (LABEL)
RETARDO MOVLW 0X83 ;RETARDO DE 100.74mS. W=0X83 (HEXA)
MOVWF REG1 ;REG1=W
L1 MOVLW 0XFF ;W=0XFF
MOVWF REG2 ;REG2=W
L2 DECFSZ REG2,1 ;DECREMENTA A REG2, SALTA LA SIGUIENTE INSTRUCCION SI YA LLEGO A 0
GOTO L2 ;VA A L2
DECFSZ REG1,1 ;DECREMENTA A REG1, SALTA LA SIGUIENTE INSTRUCCION SI YA LLEGO A 0
GOTO L1 ;VA A L1
RETURN ;RETORNA DEL LLAMADO
END ;FIN DEL PROGRAMA
;************************
* Dudas o comentarios: *
* ING. GHERSON FLÓREZ *
*
[email protected] *
* Bogota D.C. Colombia *
;************************