RBI.

asm
LIST
P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
CBLOCK 0x20
Contador
DlaySwCountA
DlaySwCountB
count
R0
R1
R2
L_byte
H_byte
temp
ENDC
;************************************************************************************
ORG
goto
ORG
goto

0
Inicio
4
ServicioInterrupcion

call
bsf
bsf
bcf
clrf
call
movlw
movwf

Display
STATUS,RP0
PORTB,7
STATUS,RP0
Contador
VisualizaContador
b'10001000'
INTCON

Inicio

Principal
sleep
goto

Principal

; La línea se configura como entrada.
; Inicializa el contador y lo visualiza.
; Habilita la interrupción RBI y la general.

; Pasa a modo de bajo consumo y espera las
; interrupciones.

; Subrutina "ServicioInterrupcion" ----------------------------------------------------;
; Subrutina de atención a la interrupción. Incrementa el contador y lo visualiza.
ServicioInterrupcion
call
Delay
btfss
PORTB,7
goto
FinInterrupcion
incf
Contador,F
VisualizaContador
call
LCD_Linea1
movf
Contador,W
call
B2_BCD
call
LCD_Byte
EsperaDejePulsar
btfsc
PORTB,7
goto
EsperaDejePulsar

; Para salvaguardar de los rebotes.
; Comprueba si es un rebote.
; Era un rebote y por tanto sale.
; Incrementa el contador y lo visualiza.
; Se pone al principio de la línea 1.
; Se debe visualizar en BCD.

; Para que no interrumpa también en el flanco
; de bajada cuando suelte el pulsador.

FinInterrupcion
bcf
INTCON,RBIF
; Limpia flag de reconocimiento RBIF.
retfie
;************************************************************************************
Delay
movlw
d'10'
movwf
DlaySwCountB
ExtLoop1ms
movlw
d'200'
movwf
DlaySwCountA
IntLoop1ms
nop
decfsz DlaySwCountA,F
goto
IntLoop1ms
decfsz DlaySwCountB,F
goto
ExtLoop1ms
return
;************************************************************************************
B2_BCD
bcf
STATUS,0
; clear the carry bit
movlw
.16
movwf
count
clrf
R0
clrf
R1
clrf
R2
loop16
Página 1

F .Z .yes then skip swapf BcdLow.W . f adjDEC 0 movlw movwf call R2 FSR adjBCD movlw movwf call R1 FSR adjBCD movlw movwf call R0 FSR adjBCD goto loop16 . routine for bcd conversion adjDEC . no bank switching. f R1.else return swapf BcdLow.*************************************************************************** ChkDecZero call ChkCentZero .W movwf temp btfsc temp.Z .2 .W .save sink value in tempC bsf TempC.get 2nd Lsd in w andlw 0x0f .W .yes then do Msd .present sink value in w clrf PORTC .msd != 0 then skip movlw 0x0a return .yes then do Msd .W movwf temp btfsc temp.1 .3 .c=1? bcf TempC.msd = 0 & 2 lsd 0? btfss STATUS.Z .RBI.*************************************************************************** UpdDec call ChkDecZero .no then reset LSD sink . f decfsz goto retlw count.*************************************************************************** DisplayOut call display_table .mask rest goto DisplayOut .************************************************************************************ Display movf PORTC.enable display .3 . f R2. test if result > 7 movwf INDF movlw 30 addwf 0.get Lsd in w andlw 0x0f .0 .see if 3rdLsd goto UpdDec .mask low nibble btfsc STATUS. save as MSD retlw 0 .W .else see if Msd goto UpdCent .get sink value in w movwf PORTC .get Msd in w andlw 0x0f . f R0.W . / goto DisplayOut .drive leds movf TempC.asm rlf rlf rlf rlf rlf L_byte. always . f H_byte.*************************************************************************** UpdUnidad movf BcdLow.get 2nd lsd Página 2 .msd = 0? btfss STATUS.*************************************************************************** btfsc TempC.*************************************************************************** UpdCent movf BcdHigh.enable display .disable all digits sinks andlw 07h movwf TempC .determine next sink value btfss STATUS.W .*************************************************************************** btfsc TempC.C .yes then skip return . test if result > 7 movwf INDF .7 . indirect access for RAM adjBCD movlw 3 addwf 0.preset for lsd sink rrf TempC.get digit output movwf PORTB .

*************************************************************************** ChkCentZero movf BcdHigh.= 0? skip return .*************************************************************************** display_table addwf PCL.Z .RBI.Z . '.else return with 10 . '6' retlw b'00000111' .ret with 10 . '9' retlw b'00000000' . '0' retlw b'00000110' . '.' retlw b'10000000' . '7' retlw b'01111111' .---------------------------------------------------------------------------END Página 3 .f . '5' retlw b'01111101' .get Msd in w btfss STATUS.' . '4' table for segment patterns retlw b'01101101' . '3' retlw b'01100110' . W + PCL -> PCL retlw b'00111111' .10 . '2' retlw b'01001111' .mask of LSD btfss STATUS.W .0? then skip return retlw . '8' retlw b'01100111' .asm andlw 0x0f . '1' retlw b'01011011' .10 .else return retlw .

Sign up to vote on this title
UsefulNot useful