list p=16f873A ; list directive to define processor
#include <p16f873A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_OFF
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
ERRORLEVEL -205
;***** VARIABLE DEFINITIONS
w_temp EQU 0x20 ; variable used for context saving
w_temp1 EQU 0xA0 ; reserve bank1 equivalent of w_temp
status_temp EQU 0x21 ; variable used for context saving
pclath_temp EQU 0x22 ; variable used for context saving
Pulsador EQU 0 ; Definimos Pulsador como el bit 0, en este caso PORTA
CBLOCK 0x23
Contador
PDel0
PDel1
ENDC
;**********************************************************************
ORG 0x000 ; processor reset vector
; nop ; nop required for icd
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
bcf STATUS,RP0 ; ensure file register bank set to 0
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
; isr code can go here or be located as a call subroutine elsewhere
bcf STATUS,RP0 ; ensure file register bank set to 0
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
BCD7SEG:
addwf PCL,1 ; Se incrementa el contador del programa
retlw b'0111111' ; 0
retlw b'0000110' ; 1
retlw b'1011011' ; 2
retlw b'1001111' ; 3
retlw b'1100110' ; 4
retlw b'1101101' ; 5
retlw b'1111101' ; 6
retlw b'0000111' ; 7
retlw b'1111111' ; 8
retlw b'1101111' ; 9
clrf Contador ; Si llega a 10, se resetea contador
retlw b'0111111' ; 0
main
bcf STATUS,RP0
bcf STATUS,RP1 ; Bank0
clrf PORTA ; Initialize PORTA by clearing output data latches
clrf PORTB ; Initialize PORTB by clearing output data latches
bsf STATUS,RP0 ; Bank1
movlw 0x06 ; Configure all pins as digital inputs
movwf ADCON1
movlw b'00000001' ; Value used to initialize data direction
movwf TRISA ; Set RA<0> as input, RA<5:1> as outputs
; TRISA<7:6> are always read as '0'
clrf TRISB
bcf STATUS,RP0 ; Bank0
movlw b'0111111' ; Comienza en '0'
movwf PORTB
clrf Contador
;Testeo del pulsador
Testeo
btfss PORTA,Pulsador ; Testeamos si esta a '1' logico
goto Testeo ; No, seguimos testeando
call Demora15 ; Eliminamos efecto rebote
btfss PORTA,Pulsador ; Testeamos nuevamente
goto Testeo ; Falsa alarma, seguimos testeando
incf Contador,0 ; Se ha pulsado, incrementamos contador
movwf Contador ; Pasamos contador a W
call BCD7SEG ; Llamamos tabla
movwf PORTB ; Cargamos valor recibido por Tabla en PORTB
btfsc PORTA,Pulsador ; Esperamos a que se suelte el pulsador
goto $-1 ; No, PLC - 1, --> btfss
call Demora15 ; Eliminamos efecto rebote
btfsc PORTA,Pulsador ; Testeamos nuevamente
goto $-4 ; No, falsa alarma, volvemos a testear a que se suelte
goto Testeo ; Si, testeamos nuevamente
;-------------------------------------------------------------
; Demora 15ms
; Generado con PDEL ver SP r 1.0 el 04/03/2013 Hs 21:26:04
; Descripcion: Delay 15000 ciclos
;-------------------------------------------------------------
Demora15
movlw .21 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .142 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
END ; directive 'end of program'