; Descripción: Cada vez que presiona el pulsador conectado al pin RB0/INT
; se incrementa un contador que es visualizado en el módulo LCD.
; La lectura del pulsador se hará mediante interrupciones.
LIST P=16F84A ;Procesador PIC16f84A
INCLUDE <P16F84A.INC> ;Incluye las librerias
; CONFIGURACION DEL PIC16F84A
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF
; Definimos donde se conectara el pulsador
#DEFINE Pulsador PORTB,0
CBLOCK 0x0C
Contador ; El contador a visualizar.
ENDC
;CODIGO
ORG 0
GOTO INICIO
ORG 4 ;Vector de la interrupción
GOTO ServicioInterrupcion
INICIO
CALL LCD_Inicializa
BSF STATUS,RP0 ;Accedemos al Banco 1
BSF Pulsador ;El puerto RB0 se coloca como entrada
BCF OPTION_REG,NOT_RBPU ;Activamos las resistencias Pull-Up
BCF OPTION_REG,INTEDG ;Interrupción INT con flanco descendente
BCF STATUS,RP0 ;Accedemos al Banco 0
CLRF Contador ;Inicia el contador y lo visualiza
CALL VisualizaContador
1
MOVLW B'10010000' ; Habilita la interrupción INT y GIE
MOVWF INTCON
START
SLEEP ;El micro se pone en bajo consumo esperando
GOTO START ;las interrupciones
; Subrutina "Servicio Interrupción" ---------------------------------------------
ServicioInterrupcion
CALL Retardo_20ms ;Espera 20ms
BTFSC Pulsador ;¿Se pulso el interruptor?
GOTO FinInterrupcion ;No, era un rebote. Va a Fin
INCF Contador,F ;Si, incrementa el contador
VisualizaContador
CALL LCD_Linea1 ;Y se visualiza
MOVF Contador,W
CALL BIN_a_BCD
CALL LCD_Byte
FinInterrupcion
BCF INTCON,INTF ;Limpia Flag de reconocimiento (INTF)
RETFIE ;Retorna y habilita GIE = 1
INCLUDE <E:\PIC16F84A\Librerias\RETARDOS.INC>
INCLUDE <E:\PIC16F84A\Librerias\LCD.INC>
INCLUDE <E:\PIC16F84A\Librerias\BIN_BCD.INC>
END
2
; Descripción: Cada vez que presiona el pulsador conectado al pin RB0/INT
;se enciende y apaga un led, además se mostrara un mensaje en cada pulsación
LIST P=16F84A ; Procesador PIC16f84A
INCLUDE <P16F84A.INC> ; Incluye las librerías
; CONFIGURACION DEL PIC16F84A
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF
; Definimos donde se conectara el pulsador
#DEFINE Pulsador PORTB,0
#DEFINE LED PORTB,1
CBLOCK 0x0C
Activador ; Hará los cambios en el código
ENDC
;CODIGO
ORG 0
GOTO INICIO
ORG 4 ; Vector de la interrupción
GOTO ServicioInterrupcion
INICIO
CALL LCD_Inicializa
BSF STATUS,RP0 ;Accedemos al Banco 1
BSF Pulsador ;El puerto RB0 se coloca como entrada
BCF LED ;RB1 como salida
BCF OPTION_REG,NOT_RBPU ;Activamos las resistencias Pull-Up
BCF OPTION_REG,INTEDG ;Interrupción INT con flanco descendente
BCF STATUS,RP0 ;Accedemos al Banco 0
CLRF Activador
3
MOVLW B'10010000' ;Habilita la interrupción INT y GIE
MOVWF INTCON
START
CALL LCD_Linea1
MOVLW Mensaje_Predeterminado
BTFSC Activador,0
MOVLW Mensaje_Secundario
CALL LCD_Mensaje
CALL LCD_Linea2
MOVLW Mensaje_SegundaLinea
CALL LCD_Mensaje
CALL Retardo_200ms
CALL LCD_Linea2
BTFSC Activador,0
CALL LCD_LineaEnBlanco
CALL Retardo_200ms
GOTO START
; Subrutina "ServicioInterrupcion" ------------------------------------------------------
; Rutina predeterminada por MICROCHIP
CBLOCK
Guarda_W
Guarda_STATUS
Guarda_R_ContA
Guarda_R_ContB
ENDC
ServicioInterrupcion ; Conmuta el valor "Intermitencia",
movwf Guarda_W ; Guarda W y STATUS.
swapf STATUS,W ; Ya que "movf STATUS,W", corrompe el bit Z.
movwf Guarda_STATUS
4
bcf STATUS,RP0 ; Para asegurarse que trabaja con el banco 0.
movf R_ContA,W ; Guarda los registros utilizados en esta
movwf Guarda_R_ContA ; subrutina y también en la principal.
movf R_ContB,W
movwf Guarda_R_ContB
;Aca comienza el código que deseamos que haga cuando aparece la interrupción
CALL Retardo_20ms
BTFSC Pulsador
GOTO FinInterrupcion
COMF Activador,F
BTFSC LED
GOTO APAGADO
BSF LED
GOTO FinInterrupcion
APAGADO
BCF LED
GOTO FinInterrupcion
; Hasta acá es nuestro código
; Rutina predeterminada por MICROCHIP
FinInterrupcion
swapf Guarda_STATUS,W ; Restaura el STATUS.
movwf STATUS
swapf Guarda_W,F ; Restaura W como estaba antes de producirse
swapf Guarda_W,W ; interrupción.
movf Guarda_R_ContA,W ; Restaura los registros utilizados en esta
movwf R_ContA ; subrutina y también en la principal.
movf Guarda_R_ContB,W
movwf R_ContB
bcf INTCON,INTF
retfie
5
; "Mensajes" ----------------------------------------------------------------------------
Mensajes
ADDWF PCL,F
Mensaje_SegundaLinea
DT " Wels Theory", 0x00
Mensaje_Secundario
DT " Suscribete!! =D ", 0x00
Mensaje_Predeterminado
DT " Tutorial 12 INT", 0x00
INCLUDE <E:\PIC16F84A\Librerias\RETARDOS.INC>
INCLUDE <E:\PIC16F84A\Librerias\LCD.INC>
INCLUDE <E:\PIC16F84A\Librerias\BIN_BCD.INC>
INCLUDE <E:\PIC16F84A\Librerias\LCD_Mensaje.INC>
END
6
; Descripción: Los pines RB6 y RB7 están conectados a dos pulsadores,
; cada vez que son presionados producen una interrupción enviando diferentes
; mensajes a la LCD.
List P=16F84A ; Procesador PIC16f84A
#include "p16f84a.inc" ;Incluye las librerias
; CONFIGURACION DEL PIC16F84A
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF
; Definimos Variables
CBLOCK 0x0C
ENDC
; Variables definidas
#DEFINE Pulsador1 PORTB,7
#DEFINE Pulsador2 PORTB,6
;CODIGO
ORG 0
GOTO INICIO
ORG 4
GOTO ServicioInterrupcion
INICIO
CALL LCD_Inicializa
MOVLW Mensaje_1
CALL LCD_Mensaje
CALL LCD_Linea2
MOVLW .8
CALL LCD_PosicionLinea2
MOVLW Mensaje_2
7
CALL LCD_Mensaje
BSF STATUS,RP0
BSF Pulsador1 ;Entradas Pulsador1 y Pulsado 2
BSF Pulsador2
BCF STATUS,RP0 ; Acceso al Banco 0.
MOVLW B'10001000' ;GIE = 1 - RBI = 1
MOVWF INTCON
START
SLEEP
GOTO START
; Subrutina "ServicioInterrupcion" ------------------------------------------------------
ServicioInterrupcion
CALL Retardo_20ms ;Rebotes
BTFSS Pulsador1 ;
CALL Mensaje_pulsador1
BTFSS Pulsador2
CALL Mensaje_pulsador2
RETFIE ;GIE = 1
Mensaje_pulsador1
CALL LCD_Borra
MOVLW Mensaje_pulsador1_1
CALL LCD_Mensaje
CALL LCD_Linea2
MOVLW Mensaje_pulsador1_2
CALL LCD_Mensaje
RETURN
Mensaje_pulsador2
CALL LCD_Borra
MOVLW Mensaje_pulsador2_1
8
CALL LCD_Mensaje
CALL LCD_Linea2
MOVLW Mensaje_pulsador2_2
CALL LCD_Mensaje
RETURN
;Mensajes
Mensajes
ADDWF PCL,F
Mensaje_1
DT "Presiona un",0x00
Mensaje_2
DT "Pulsador",0x00
Mensaje_pulsador1_1
DT " SUSCRIBETE",0x00
Mensaje_pulsador1_2
DT " WELS THEORY",0x00
Mensaje_pulsador2_1
DT " EUREKA!!!",0x00
Mensaje_pulsador2_2
DT " FUNCIONA!!=D",0x00
INCLUDE <E:\PIC16F84A\Librerias\RETARDOS.INC>
INCLUDE <E:\PIC16F84A\Librerias\LCD.INC>
;INCLUDE <E:\PIC16F84A\Librerias\BIN_BCD.INC>
INCLUDE <E:\PIC16F84A\Librerias\LCD_Mensaje.INC>
END
9
; Descripción: Un led conectado a línea 3 del puerto B se
; enciende cada 600ms y apaga durante otros 300ms. Usar la
; interrupción del Time0
List P=16F84A ; Procesador PIC16f84A
#include "p16f84a.inc" ;Incluye las librerias
; CONFIGURACION DEL PIC16F84A
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF
;Definimos Variables
CBLOCK 0x0C
Reg_Tiempos
ENDC
;Valores de definidos
Periodo_50ms EQU d'195' ; 195*256= 49920us = 50ms
Periodo_600ms EQU d'12'; 50ms*12=600ms
Periodo_300ms EQU d'6'; 50ms * 6 = 300ms
#DEFINE LED PORTB,3; SALIDA DEL LED
;CODIGO
ORG 0
GOTO INICIO
ORG 4
GOTO TMR0_INT
INICIO
BSF STATUS,RP0
BCF LED
MOVLW B'00000111'; 256 PRESCALER TMR0
10
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW Periodo_50ms
MOVWF TMR0
MOVLW Periodo_300ms
MOVWF Reg_Tiempos
MOVLW B'10100000'
MOVWF INTCON ;T0IE - GIE
START
GOTO $
;INTERRUPCION
TMR0_INT
MOVLW Periodo_50ms
MOVWF TMR0
DECFSZ Reg_Tiempos,F
GOTO FIN_INT
BTFSC LED ;ESTADO DEL LED
GOTO ENCENDIDO
APAGADO
BSF LED
MOVLW Periodo_600ms
GOTO Var_Tiempos
ENCENDIDO
BCF LED
MOVLW Periodo_300ms
Var_Tiempos
MOVWF Reg_Tiempos
FIN_INT
BCF INTCON,T0IF
RETFIE ;GIE
END
11