Escolar Documentos
Profissional Documentos
Cultura Documentos
;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
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
;ROTINA PRINCIPAL
MAIN
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
END