Você está na página 1de 5

;Cronometro em assembly.

;Universidade de Vila Velha


;Prof: Felipe Pedroso
;Grupo: Eduardo Montovanelli Dalmaso, Bernardo, Cayo Pagotto
#INCLUDE <P16F628A.INC> ;ARQUIVO DE FUSES PADR�O PARA PICs.
__CONFIG _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON &
_INTOSC_OSC_NOCLKOUT

;PAGINA��O DE MEM�RIA.
#DEFINE BANK0 BCF STATUS,RP0
#DEFINE BANK1 BSF STATUS,RP0
;VARIAVEIS DE ENTRADA/SAIDA
#define bt_start PORTA,RA3 ;Bot�o start RA4
#define bt_pause PORTA,RA2 ;Bot�o pause RA3
#define bt_reset PORTA,RA1 ;Bot�o reset RA2
;REGISTRADORES.
CBLOCK 0x20
W_TEMP ;Registrador de armazenamento de conteudo
STATUS_TEMP ;Registrador de armazenamento de conteudo
aux_cont ;Auxiliar de contagem
mux_uni ;Multiplexador da unidade
mux_dez ;Multiplexador da dezena
flag ;aux para flags
filtro ;filtro para bot�es
uni ;aux da unidade
dez ;aux da dezena
ENDC

;CONSTANTES
TEMP_FILTRO EQU .255 ;Variavel com valor 255 para contagem no filtro

;FLAGS
#define flag_start flag,1
#define flag_pause flag,2
#define flag_reset flag,3
#define disp_uni PORTA,6 ;Display da Unidade
#define disp_dez PORTA,5 ;Display da Dezena

;RESET
ORG 0x00
GOTO INICIO

;INTERRUP��ES.
ORG 0x04

;Salvamento de contexto
movwf W_TEMP
swapf STATUS,W
BANK0
movwf STATUS_TEMP

TMR0_interrupcao:
btfss INTCON,T0IF ;Timer estourou?
goto sair_int ;N�o,ir para saida
bcf INTCON,T0IF ;Sim, zera a flag do timer
movlw H'0' ;Move valor ZERO para work
movwf TMR0 ;TMR0 contara de 0 at� seu limite 255
btfsc flag_pause ;Bot�o pause pressionado?
goto Multiplexador; Sim, vai para Multiplexador
Contador:
decfsz mux_uni,F ;mux_uni = 0 ?
goto Multiplexador ;N�o repete dados nos displays
movlw .125 ;Sim, move .125 para work
movwf mux_uni ;Reinicia o contador em .125
incf uni,F ;Incrementa uma unidade no display
decfsz mux_dez,F ;Decrementa auxiliar da dezena, zerou ?
goto Multiplexador ;N�o, atualiza display
movlw .0
movwf uni ;Sim,zera display da unidade
incf dez,F ;Incrementa uma unidade na dezena
movlw .10
movwf mux_dez ;Move .10 para a auxiliar da dezena

Multiplexador:
btfss disp_uni ;Variavel = 1 ?
goto display_uni ;N�o, desvia para tratamento da unidade
bcf disp_uni ;sim, reseta flag disp_uni
clrf PORTB ;Limpa PORTB
bsf disp_dez ;Disp_dez = 1
goto display_dez ;Ir para tratamento da dezena

display_uni:
bcf disp_dez ;Zera flag da dezena
clrf PORTB
bsf disp_uni ; flag da unidade =1
movf uni,W ;Atualiza o valor da unidade com valor atual
call converte_dez ; chama conversor BCD
movwf PORTB
goto sair_int ; Vai para saida da interrup��o

display_dez:
movf dez,W ;Atualiza valor da dezena com valor atual
call converte_uni ;Chama conversor BCD
movwf PORTB
goto sair_int ;Vai para saida da interrup��o

sair_int: ;Recupera��o de conteudo


swapf STATUS_TEMP,W
movwf STATUS
swapf W_TEMP,F
swapf W_TEMP,W

RETFIE

;INICIO DO PROGRAMA
INICIO
BANK1 ;muda para o banco 1 de
mem�ria
movlw H'0E' ;move literal 0Eh
para work
movwf TRISA ;configura RA3, RA2, RA1
como sa�da
movlw H'0' ;move literal 0h para work
movwf TRISB ;configura todo PORTB como
sa�da, exceto RB0
movlw H'D4' ;move literal D4h
para work
movwf OPTION_REG ;Timer0 incrementa com ciclo
de m�quina, ps 1:32
BANK0 ;muda para o
banco 0 de mem�ria
movlw H'07' ;move literal 07h para work
movwf CMCON ;desabilita comparadores
movlw H'A0' ;move a literal A0h para work
movwf INTCON ;habilita a interrup��o
global e do timer0

;INICIALIZA��O DAS VARIAV�IS


clrf mux_uni
clrf mux_dez
clrf PORTA
clrf PORTB
clrf dez
clrf uni
clrf flag
clrf filtro
bsf bt_start
bsf bt_pause
bsf bt_reset
bsf flag_start ;Inicia as flags/bot�es em 1 para n�o contar sem pressionar bot�es
bsf flag_pause
bsf flag_reset
movlw .125
movwf mux_uni ;Inicia a variavel com 125
movlw .10
movwf mux_dez ;Inicia a variavel com 10
movlw .0
movwf TMR0 ;TMR0 inicia com 0
movlw .0
movwf dez ;Inicia com 0
movlw .0
movwf uni ;Inicia com 0

;ROTINA PRINCIPAL
MAIN

movlw TEMP_FILTRO ;Chama o filtro de .125 para work


movwf filtro ;Move variavel filtro para onde TEMP_FILTRO est�

status_bt_start:
btfss bt_start ;Bot�o pressionado ?
goto test_start ;Sim desvia para test_start
status_bt_pause:
btfss bt_pause ;N�o, pause pressionado ?
goto test_pause ;Sim, desvia para test_pause
status_bt_reset:
btfss bt_reset ;N�o,reset pressionado?
goto test_reset ;Sim,desvia para test_reset
goto sair ;Vai para sair
test_start:
decfsz filtro,F ;Decrementa o filtro, filtro = 0?
goto status_bt_start ;N�o, volta para o bot�o start
goto acao_bt_start ;Sim, vai para tratamento do bot�o
test_pause:
decfsz filtro,F ;Decrementa o filtro, filtro = 0?
goto status_bt_pause ;N�o,volta para bot�o pause
goto acao_bt_pause ;Sim, vai para tratamento do bot�o
test_reset:
decfsz filtro,F ;Decrementa o filtro, filtro = 0?
goto status_bt_reset ;N�o, volta para bot�o pause
goto acao_bt_reset ;Sim, vai para tratamento do bot�o
acao_bt_start:
bcf flag_pause ;flag_pause =0
bsf INTCON,T0IF ;Habilita TMRO
goto MAIN ;Volta na main
acao_bt_pause:
bsf flag_pause ;flag_pause = 1
goto MAIN ;Vai para main
acao_bt_reset:
bcf flag_pause ;flag_pause=0
movlw .0
movwf mux_dez ;Joga zero na dezena
movlw .0
movwf mux_uni ;Joga zero na unidade
movlw .125
movwf uni ;Aux da unidade inicia em 125
movlw .10
movwf dez ;Aux da dezena inicia com 10
goto MAIN
sair:
goto MAIN

converte_uni ;Conversor unidade


ADDWF PCL,F
RETLW B'11101110' ;0
RETLW B'00101000' ;1
RETLW B'11001101' ;2
RETLW B'01101101' ;3
RETLW B'00101011' ;4
RETLW B'01100111' ;5
RETLW B'11100111' ;6
RETLW B'00101100' ;7
RETLW B'11101111' ;8
RETLW B'01101111' ;9

converte_dez ;conversor dezena


ADDWF PCL,F
RETLW B'11111110' ;0
RETLW B'00111000' ;1
RETLW B'11011101' ;2
RETLW B'01111101' ;3
RETLW B'00111011' ;4
RETLW B'01110111' ;5
RETLW B'11110111' ;6
RETLW B'00111100' ;7
RETLW B'11111111' ;8
RETLW B'01111111' ;9

END