Escolar Documentos
Profissional Documentos
Cultura Documentos
;
; PROGRAMA DE UM RELÓGIO COM ALARME
;
; UTILIZANDO MICROCONTROLADOR PIC E LCD
;
; FINALIDADE: DIDÁTICA
;
; DESENVOLVIMENTO: PROF. MATHEUS TEODORO DA SILVA FILHO
; COLABORAÇÃO: ENG.º JOSÉ NICODEMOS TRZECIAK
;
; (C) Prof. Matheus, 10 DE DEZEMBRO DE 2003
;
; ESTE RELÓGIO UTILIZA UM MICROCONTROLADOR PIC 16F84 COM UM LCD
; (DISPLAY DE CRISTAL LÍQUIDO) DE DUAS LINHAS DE 16 COLUNAS.
; A COMUNICAÇÃO COM O LCD É FEITA EM 4 BITS, SEM O USO DO BUSY FLAG,
; POIS O RELÓGIO ESTÁ SINCRONIZADO COM O CLOCK DE 4MHz, CRIANDO-SE,
; ENTÃO, UM ATRASO PADRÃO DE 15ms ENTRE OS COMANDOS NECESSÁRIOS PARA
; A INICIALIZAÇÃO.
;
; A ESCRITA NA TELA É FEITA UTILIZANDO UM BUFFER DE 32 POSIÇÕES
;
; NA TELA DO LCD SÃO MOSTRADOS:
; - DIA DA SEMANA;
; - DIA DO MÊS;
; - MÊS;
; - ANO;
; - HORA, MINUTO E SEGUNDO;
; - HORA E MINUTO PROGRAMADO PARA ALARME (EM UMA SEGUNDA TELA);
; - CÓDIGO QUE INDICA AVANÇO (^) OU AJUSTE:
; - s PARA O SEGUNDO
; - m PARA O MINUTO
; - h PARA A HORA (00 A 23)
; - w PARA O DIA DA SEMANA (Dom a Sab)
; - D PARA O DIA DO MÊS (01 A 31)
; - M PARA O MÊS (01 A 12)
; - A PARA O ANO (00 A 99)
; - m PARA O MINUTO DO ALARME (EM OUTRA TELA)
; - h PARA A HORA DO ALARME (EM OUTRA TELA)
;
; ESQUEMA DE UTILIZAÇÃO DOS PINOS DOS PORTS A E B:
;
; PORTA,0 (RA0): BOTÃO DE SELEÇÃO DE FUNÇÃO (AVANÇA OU CORRIGE)
; PORTA,1 (RA1): BOTÃO DE AVANÇO QUANDO NECESSÁRIO AJUSTAR
; PORTA,2 (RA2): ACIONAMENTO DO ALARME
; PORTA,3 (RA3): RECEBIMENTO DOS PULSOS DO CI 4060
;
; PORTB,0 (RB0): COMANDO RS (DADO OU INSTRUÇÃO) DO LCD;
; PORTB,1 (RB1): COMANDO RW (LEITURA OU ESCRITA) DO LCD;
; PORTB,2 (RB2): COMANDO EN (HABILITAÇÃO) DO LCD;
; PORTB,3 (RB3): VAGO
; PORTB,4 A PORTB,7 (RB4 A RB7): BUFFER DO LCD EM 4 BITS
;
;
; UTILIZAÇÃO AUTORIZADA DAS ROTINAS, DESDE QUE CITADA A FONTE
;
;##############################################################################
;########### ARQUIVOS DE DEFINIÇÕES ###########################################
#INCLUDE <P16F84.INC>
__CONFIG _WDT_OFF & _XT_OSC & _CP_OFF
;########### PAGINAÇÃO DE MEMÓRIA ############################################
#DEFINE BANK0 BCF STATUS, RP0 ; SETA BANK 0
#DEFINE BANK1 BSF STATUS, RP0 ; SETA BANK 1
#DEFINE FLAG_LCD FLAGS_TIMER0,0 ; CONTROLE DE TEMPO DA MAQLCD
#DEFINE FLAG_PUL FLAGS_TIMER0,1 ; CONTROLE DE TEMPO DA MAQPUL
#DEFINE FLAG_TELA FLAGS_TIMER0,2 ; CONTROLE DE TEMPO DA MAQTELA
#DEFINE FLAG_BOTAO FLAGS_TIMER0,3 ; CONTROLE DE TEMPO DO BOTÃO
#DEFINE FLAG_LINHA FLAGS,0
#DEFINE FLAG_NOVALINHA FLAGS,1
#DEFINE RS PORTB,0
#DEFINE RW PORTB,1
#DEFINE EN PORTB,2
#DEFINE LINE1 0x0D
#DEFINE LINE2 0x1D
;*********** VARIÁVEIS *****************************************************
CBLOCK 0x2D ; ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO
; 0D A 2C: RESERVADO P/ BUFFER DO LCD (32 POSICOES)
FLAGS ; FLAGS DE USO GERAL NÃO TEMPORIZA
DOS
FLAGS_TIMER0 ; FLAGS TEMPORIZADOS 1ms (TIMER0
)
VARLOC ; VARIAVEL AUXILIAR DE USO TEMPO
RARIO (LOCAL)
VARAUX ; VARIAVEL AUXILIAR DE USO TEMPO
RARIO (LOCAL)
DADO ; VARIAVEL P/ENVIO AO LCD
W_TEMP ; REGISTRADOR TEMPORÁRIO PARA INTE
RRUPÇÕES
STATUS_TEMP ; REGISTRADOR TEMPORÁRIO PARA INTE
RRUPÇÕES
BUFFER_LCD ; ARMAZENA VALOR A SER ESCRITO N
O LCD
CONT_LCD ; PONTEIRO DE BUFFER DE LCD/CONT
ADOR DE TEMPO
; VARIÁVEIS PARA EXECUTAR AS FUNÇÕES PRINCIPAIS DO RELÓGIO
SEGUNDO ; ARMAZENA SEGUNDOS DO RELÓGIO
MINUTO ; ARMAZENA MINUTOS DO RELÓGIO
HORA ; ARMAZENA HORAS DO RELÓGIO
SEMANA ; ARMAZENA DIA DA SEMANA
DIA ; ARMAZENA DIA DO MÊS
MES ; ARMAZENA MES
ANO ; ARMAZENA ANO
HORADES ; ARMAZENA HORA DE DESPERTAR
MINDES ; ARMAZENA MINUTO DE DESPERTAR
FUNCAO ; INDICA FUNCAO A SER EXECUTADA
PULSO ; ARMAZENA PULSO
; PULSO RESULTA EM 1s NO RELÓGIO
NAOTOCA
BCF PORTA,2 ; BLOQUEIA ALARME
PULA_ALARME
CALL TELA ; ROTINA PARA ESCREVER TELAS
CALL MAQLCD ; ROTINA PARA ESCREVER NO LCD
BTFSC FLAGS,5 ; TESTA SE LIMPA A TELA
CALL LIMPALCD ; FLAG=1: LIMPA
; FLAG=0: NÃO LIMPA
CALL MAQPUL ; ROTINA PARA CONTAR TEMPO
CALL MAQTELA ; ROTINA PARA ESCREVER VALORES NA TELA
CALL MAQAJUSTE ; ROTINA P/AJUSTAR RELÓGIO E ALARME
GOTO MAIN
;############################################################################
; INICIALIZAÇÃO DO LCD
;############################################################################
INICIA_LCD ; ROTINA PARA INCIALIZAR O LCD
; VARLOC: VARIÁVEL QUE RECEBE COMANDO P/ENVIO AO LCD
CALL TEMPO_15ms ; ROTINA PARA AGUARDAR 15ms
MOVLW 0x28 ; COMANDO PARA ENVIO A 4 BITS
MOVWF VARLOC
CALL ESCREVE_CMD_LCD
CALL TEMPO_15ms ; ROTINA PARA AGUARDAR 15ms
MOVLW 0x28 ; COMANDO PARA ENVIO A 4 BITS
MOVWF VARLOC
CALL ESCREVE_CMD_LCD
CALL TEMPO_15ms ; ROTINA PARA AGUARDAR 15ms
MOVLW 0x06
MOVWF VARLOC
CALL ESCREVE_CMD_LCD
CALL TEMPO_15ms ; ROTINA PARA AGUARDAR 15ms
MOVLW 0x0E ; COMANDO PARA MOSTRAR CURSOR
MOVWF VARLOC
CALL ESCREVE_CMD_LCD
CALL TEMPO_15ms ; ROTINA PARA AGUARDAR 15ms
MOVLW 0x01
MOVWF VARLOC
CALL ESCREVE_CMD_LCD
CALL TEMPO_15ms ; ROTINA PARA AGUARDAR 15ms
RETURN
;##### ROTINA PARA AGUARDAR TEMPO DE 15ms ###################################
TEMPO_15ms ; ROTINA PARA AGUARDAR TEMPO 15ms
MOVLW .15
MOVWF CONTAUX
TEMPO_AUX
BTFSC FLAGS_TIMER0,0 ; ANALISA SE PASSOU 1ms
GOTO TEMPO_AUX ; FLAG=1; NÃO
BSF FLAGS_TIMER0,0 ; FLAG=0; REARMA NOVA SINALIZAÇÃO DE 1ms
DECFSZ CONTAUX,F ; DECREMENTA CONTAUX
GOTO TEMPO_AUX ; CONTAUX NÃO É 0
RETURN ; SIM (CONTAUX = 0)
;############################################################################
;# MÁQUINA DE LCD - MAQLCD (ESCREVE NO LCD)
;############################################################################
MAQLCD
BTFSC FLAG_LCD ; VERIFICA SE OCORREU 1ms
GOTO FIM_MAQLCD ; Z=1: NÃO
BSF FLAG_LCD ; Z=0: SIM; REARMA FLAG MAQLCD
;**** ANALISA NOVA LINHA ***************************************************
BTFSS FLAG_NOVALINHA ; ANALISA SINALIZADOR DE NOVA LINHA
GOTO NORMAL ; FLAG=0: NÃO É NOVA LINHA; ESCRITA NORMAL
; FLAG=1: VAI TRATAR NOVA LINHA
ENVIO
CALL ESCREVE_DADO_LCD ; ESCREVE DADO DA VEZ NO LCD
BCF FLAG_NOVALINHA ; SINALIZA PROCESSAMENTO DE DADOS
GOTO FIM_MAQLCD ; ENCERRA
NORMAL
INCF CONT_LCD,W ; VARREDURA DE BUFFER D0 LCD
ANDLW 0x0F ; LIMITA EM (0 a 15)
MOVWF CONT_LCD ; SALVA PONTEIRO
;**** ANALISA ESTOURO DO CONTADOR ****
BTFSS STATUS,Z ; VERIFICA SE ÚLTIMA COLUNA DA LINHA
GOTO ENVIO ; Z=0: NÃO; PROCESSAMENTO NORMAL
; Z=1: SIM
;**** TRATAMENTO ESPECIAL - PRECISA MUDAR LINHA ****
BSF FLAG_NOVALINHA ; SINALIZA INICIANDO NOVA LINHA
;*** TROCA DA LINHA ***
MOVF FLAGS,W ; CARREGA FLAGS PARA ATUALIZAÇÃO
XORLW 0x01 ; COMPLEMENTA FLAG_LINHA (SOMENTE FLAGS,
0)
MOVWF FLAGS ; ATUALIZA FLAGS TROCANDO SOMENTE BIT 0
MOVLW 0x80 ; CARREGA W COM INDICAÇÃO DA LINHA1
BTFSC FLAG_LINHA ; ANALISA LINHA ATUAL
MOVLW 0xC0 ; CARREGA W COM INDICAÇÃO DA LINHA2
MOVWF VARLOC ; SALVA EM VARLOC
; FLAG=0: ENDEREÇA DDRAM PARA
; 1.º CARACTER DA LINHA 1
; FLAG=1: ENDEREÇA DDRAM PARA
; 1.º CARACTER DA LINHA 2
CALL ESCREVE_CMD_LCD ; ENVIA COMANDO PARA AJUSTAR A LINHA DA
VEZ
FIM_MAQLCD
RETURN
;############################################################################
;# ESCREVE_DADO_LCD (dados do LCD)
;############################################################################
ESCREVE_DADO_LCD
MOVF CONT_LCD,W ; CARREGA CONTADOR DE COLUNAS EM W
BTFSC FLAG_LINHA ; ANALISA SE LINHA 1 OU 2
GOTO LINHA2 ; FLAG=1: LINHA 2
LINHA1 ; FLAG=0: LINHA 1
ADDLW LINE1 ; ADICIONA 0x0D A W (OFFSET LINHA1)
GOTO CONTINUA ; prossegue
LINHA2
ADDLW LINE2 ; ADICIONA 0x1D A W (OFFSET LINHA2)
CONTINUA
MOVWF FSR ; APONTA PARA VETOR
MOVF INDF,W ; CAPTURA VALOR DO VETOR
MOVWF DADO ; TRANSFERE PARA W
BCF EN ; DESABILITA INICIALMENTE
BSF RS ; CONFIGURA PARA DADO
BCF RW ; CONFIGURA PARA ESCRITA
BSF EN ; HABILITA LCD
CALL ENVIABYTE ; ROTINA P/ENVIAR DADO EM 4 BITS
BCF EN ; DESABILITA LCD
RETURN
;############################################################################
; COMANDOS DO LCD
;############################################################################
ESCREVE_CMD_LCD
MOVF VARLOC,W ; TRANSFERE PARA W
MOVWF DADO ; TRANSFERE PARA DADO
BCF EN ; DESABILITA INICIALMENTE
BCF RS ; CONFIGURA PARA INSTRUÇÃO
BCF RW ; CONFIGURA PARA ESCRITA
BSF EN ; HABILITA LCD
CALL ENVIABYTE ; ROTINA P/ENVIAR DADO EM 4 BITS
BCF EN ; DESABILITA LCD
RETURN
;###########################################################################
; ENVIA BYTE PARA O LCD COM 4 BITS
;###########################################################################
ENVIABYTE
; DADO CONTÉM O BYTE A SER ENVIADO AO LCD
MOVLW 0x0F
ANDWF PORTB,F ; MANTÉM NIBBLE INF.E ZERA NIBBLE SUP. PORTB
MOVLW 0xF0
ANDWF DADO,W ; COLOCA EM W O NIBBLE SUPERIOR DO DADO
IORWF PORTB,F ; "OU" COM NIBBLE SUP. DE W E INF. DE PORTB
; GUARDANDO RESULTADO EM PORTB
BCF EN ; DESABILITA LCD
BSF EN ; HABILITA LCD
SWAPF DADO,F
MOVLW 0x0F
ANDWF PORTB,F ; MANTÉM NIBBLE INF.E ZERA NIBBLE SUP. PORTB
MOVLW 0xF0
ANDWF DADO,W ; COLOCA EM W O NIBBLE INFERIOR DO DADO
IORWF PORTB,F ; "OU" COM NIBBLE INF. DE W E INF. DE PORTB
; GUARDANDO RESULTADO EM PORTB
RETURN
;############################################################################
;# MÁQUINA DE CONTAR PULSOS
;############################################################################
MAQPUL
BTFSS FLAGS,7 ; TESTA SE, ANTES, PORTA,3=1
GOTO GRAVAPULSO ; FLAG=0: NÃO ERA
; FLAG=1: ERA
BTFSS PORTA,3 ; TESTA SE PULSO CONTADO
; CONTINUA VÁLIDO
; UMA VEZ QUE FLAG=1,
; PULSO VÁLIDO QUANDO
; PORTA,3 PASSA A ZERO
GOTO CONTAPULSO ; PORTA,3 ERA 1 E AGORA É ZERO
GOTO FIM_MAQPUL ; PORTA,3 ERA 1 E CONTINUA 1
GRAVAPULSO
BTFSS PORTA,3 ; TESTA SE PORTA,3=1
GOTO FIM_MAQPUL ; PORTA,3 = 0
BSF FLAGS,7 ; PORTA,3=1: SETA FLAG
GOTO FIM_MAQPUL
CONTAPULSO
INCF PULSO,F
BCF FLAGS,7 ; DESARMA FLAG HABILITANDO
; CONTAGEM DE NOVOPULSO
MOVF PULSO,W
XORLW .151
BTFSS STATUS,Z
GOTO ESCREVEDIASEM ; Z=0: NÃO ALCANÇOU 151
; Z=1: ESTOUROU CONTAGEM
; PASSOU 1 SEGUNDO
; REGISTRA CONTAGEM
MOVLW .1 ; COLOCA "1" EM PULSO
MOVWF PULSO
GOTO VERIFICAJUSTE
INCF FSR,F
MOVLW "e"
MOVWF INDF
INCF FSR,F
MOVLW "g"
MOVWF INDF
RETURN
TERCA
MOVF SEMANA,W ; VERIFICA SE É TERÇA
XORLW .2
BTFSS STATUS,Z
GOTO QUARTA ; FLAG=0: NÃO É TERCA
; FLAG=1: É TER. COLOCA NA TELA
MOVLW 0x0D
MOVWF FSR
MOVLW "T"
MOVWF INDF
INCF FSR,F
MOVLW "e"
MOVWF INDF
INCF FSR,F
MOVLW "r"
MOVWF INDF
RETURN
QUARTA
MOVF SEMANA,W ; VERIFICA SE É QUARTA
XORLW .3
BTFSS STATUS,Z
GOTO QUINTA ; FLAG=0: NÃO É QUARTA
; FLAG=1: É QUA. COLOCA NA TELA
MOVLW 0x0D
MOVWF FSR
MOVLW "Q"
MOVWF INDF
INCF FSR,F
MOVLW "u"
MOVWF INDF
INCF FSR,F
MOVLW "a"
MOVWF INDF
RETURN
QUINTA
MOVF SEMANA,W ; VERIFICA SE É QUINTA
XORLW .4
BTFSS STATUS,Z
GOTO SEXTA ; FLAG=0: NÃO É QUINTA
; FLAG=1: É QUI. COLOCA NA TELA
MOVLW 0x0D
MOVWF FSR
MOVLW "Q"
MOVWF INDF
INCF FSR,F
MOVLW "u"
MOVWF INDF
INCF FSR,F
MOVLW "i"
MOVWF INDF
RETURN
SEXTA
MOVF SEMANA,W ; VERIFICA SE É SEXTA
XORLW .5
BTFSS STATUS,Z
GOTO SABADO ; FLAG=0: NÃO É SEXTA
; FLAG=1: É SEX. COLOCA NA TELA
MOVLW 0x0D
MOVWF FSR
MOVLW "S"
MOVWF INDF
INCF FSR,F
MOVLW "e"
MOVWF INDF
INCF FSR,F
MOVLW "x"
MOVWF INDF
RETURN
SABADO
MOVF SEMANA,W ; VERIFICA SE É SÁBADO
XORLW .6
; FLAG=1: É SAB. COLOCA NA TELA
BTFSS STATUS,Z
RETURN ; FLAG=0: NÃO É SABADO
MOVLW 0x0D
MOVWF FSR
MOVLW "S"
MOVWF INDF
INCF FSR,F
MOVLW "a"
MOVWF INDF
INCF FSR,F
MOVLW "b"
MOVWF INDF
RETURN
ULTDIAMES
MOVF DIA,W
XORLW .30 ; TESTA SE DIA 29
BTFSS STATUS,Z
GOTO DIA30 ; Z=0: NÃO É
; Z=1: É
MOVF MES,W
XORLW .2 ; TESTA SE FEVEREIRO
BTFSC STATUS,Z
GOTO DIA1 ; Z=1: É
; Z=0: NÃO É
DIA30
MOVF DIA,W
XORLW .31 ; TESTA SE DIA 30
BTFSS STATUS,Z
GOTO DIA31 ; Z=0: NÃO É
; Z=1: É
MOVF MES,W
XORLW .4 ; TESTA SE ABRIL
BTFSC STATUS,Z
GOTO DIA1 ; Z=1: É
; Z=0: NÃO É
MOVF DIA,W
XORLW .31 ; TESTA SE DIA 30
BTFSS STATUS,Z
GOTO DIA31 ; Z=0: NÃO É
; Z=1: É
MOVF MES,W
XORLW .6 ; TESTA SE JUNHO
BTFSC STATUS,Z
GOTO DIA1 ; Z=1: É
; Z=0: NÃO É
MOVF DIA,W
XORLW .31 ; TESTA SE DIA 30
BTFSS STATUS,Z
GOTO DIA31 ; Z=0: NÃO É
; Z=1: É
MOVF MES,W
XORLW .9 ; TESTA SE SETEMBRO
BTFSC STATUS,Z
GOTO DIA1 ; Z=1: É
; Z=0: NÃO É
MOVF DIA,W
XORLW .31 ; TESTA SE DIA 30
BTFSS STATUS,Z
GOTO DIA31 ; Z=0: NÃO É
; Z=1: É
MOVF MES,W
XORLW .11 ; TESTA SE NOVEMBRO
BTFSC STATUS,Z
GOTO DIA1 ; Z=1: É
; Z=0: NÃO É
DIA31
MOVF DIA,W
XORLW .32 ; TESTA SE DIA 31
BTFSS STATUS,Z
RETURN ; Z=0: NÃO É
DIA1 ; Z=1; É
MOVLW .1
MOVWF DIA
INCF MES,F
RETURN
;############################################################################
;# MÁQUINA DE ESCREVER NA TELA
;############################################################################
MAQTELA ; ROTINA PARA ESCREVER DADOS NA TELA
;############################################################################
;# MÁQUINA PARA AJUSTE DO RELÓGIO E DO DESPERTADOR
;############################################################################
MAQAJUSTE
CORRDIASEM
MOVF FUNCAO,W
XORLW 0x04
BTFSS STATUS,Z ; VERIFICA SE CORRIGE MINUTOS
GOTO CORRDIA ; Z=0: NÃO
; Z=1: CORRIGE
MOVLW 0x2C ; INDICA NA TELA CORREÇÃO DE MINUTOS
MOVWF FSR
MOVLW "w"
MOVWF INDF
BTFSS PORTA,1 ; VERIFICA SE BOTÃO CORREÇÃO PRESSIONADO
GOTO FIM_MAQAJUSTE ; BIT=0: BOTÃO NÃO PRESSIONADO: CONTINUA
; BIT=1: BOTÃO PRESSIONADO
BCF FLAGS,3
CALL BOTAO
BTFSS FLAGS,3 ; VERIFICA FLAG ATUALIZAÇÃO DA FUNCAO
GOTO FIM_MAQAJUSTE ; FLAG=0: CONTAGEM DE TEMPO NÃO TERMINOU
; FLAG=1: CONTAGEM TERMINOU
INCF SEMANA,F
MOVF SEMANA,W
XORLW .7
BTFSC STATUS,Z ; VERIFICA SE ULTRAPASSOU 7
CLRF SEMANA ; Z=1: ULTRAPASSOU
; Z=0: NÃO ULTRAPASSOU
CALL DIASEMANA
CORRDIA
MOVF FUNCAO,W
XORLW 0x05
BTFSS STATUS,Z ; VERIFICA SE CORRIGE MINUTOS
GOTO CORRMES ; Z=0: NÃO
; Z=1: CORRIGE
MOVLW 0x2C ; INDICA NA TELA CORREÇÃO DE MINUTOS
MOVWF FSR
MOVLW "D"
MOVWF INDF
BTFSS PORTA,1 ; VERIFICA SE BOTÃO CORREÇÃO PRESSIONADO
GOTO FIM_MAQAJUSTE ; BIT=0: BOTÃO NÃO PRESSIONADO: CONTINUA
; BIT=1: BOTÃO PRESSIONADO
BCF FLAGS,3
CALL BOTAO
BTFSS FLAGS,3 ; VERIFICA FLAG ATUALIZAÇÃO DA FUNCAO
GOTO FIM_MAQAJUSTE ; FLAG=0: CONTAGEM DE TEMPO NÃO TERMINOU
; FLAG=1: CONTAGEM TERMINOU
INCF DIA,F
CALL ULTDIAMES ; ROTINA PARA VERIFICAR ÚLTIMO DIA DO MÊS
; E INCREMENTAR MÊS
MOVF MES,W
XORLW .13
BTFSS STATUS,Z ; TESTA SE ALCANÇOU 13
GOTO CORRMES ; Z=0: NÃO ALCANÇOU
; Z=1: ALCANÇOU
MOVLW .01
MOVWF MES
CORRMES
MOVF FUNCAO,W
XORLW 0x06
BTFSS STATUS,Z ; VERIFICA SE CORRIGE MINUTOS
GOTO CORRANO ; Z=0: NÃO
; Z=1: CORRIGE
MOVLW 0x2C ; INDICA NA TELA CORREÇÃO DE MINUTOS
MOVWF FSR
MOVLW "M"
MOVWF INDF
BTFSS PORTA,1 ; VERIFICA SE BOTÃO CORREÇÃO PRESSIONADO
GOTO FIM_MAQAJUSTE ; BIT=0: BOTÃO NÃO PRESSIONADO: CONTINUA
; BIT=1: BOTÃO PRESSIONADO
BCF FLAGS,3
CALL BOTAO
BTFSS FLAGS,3 ; VERIFICA FLAG ATUALIZAÇÃO DA FUNCAO
GOTO FIM_MAQAJUSTE ; FLAG=0: CONTAGEM DE TEMPO NÃO TERMINOU
; FLAG=1: CONTAGEM TERMINOU
INCF MES,F
MOVF MES,W
XORLW .13
BTFSS STATUS,Z ; VERIFICA SE ULTRAPASSOU 32
GOTO CORRANO ; Z=0: NÃO ULTRAPASSOU
; Z=1: ULTRAPASSOU
MOVLW .01
MOVWF MES
CORRANO
MOVF FUNCAO,W
XORLW 0x07
BTFSS STATUS,Z ; VERIFICA SE CORRIGE MINUTOS
GOTO CORRMINDES ; Z=0: NÃO
; Z=1: CORRIGE
MOVLW 0x2C ; INDICA NA TELA CORREÇÃO DE MINUTOS
MOVWF FSR
MOVLW "A"
MOVWF INDF
BTFSS PORTA,1 ; VERIFICA SE BOTÃO CORREÇÃO PRESSIONADO
GOTO FIM_MAQAJUSTE ; BIT=0: BOTÃO NÃO PRESSIONADO: CONTINUA
; BIT=1: BOTÃO PRESSIONADO
BCF FLAGS,3
CALL BOTAO
BTFSS FLAGS,3 ; VERIFICA FLAG ATUALIZAÇÃO DA FUNCAO
GOTO FIM_MAQAJUSTE ; FLAG=0: CONTAGEM DE TEMPO NÃO TERMINOU
; FLAG=1: CONTAGEM TERMINOU
INCF ANO,F
MOVF ANO,W
XORLW .100
BTFSS STATUS,Z ; VERIFICA SE ULTRAPASSOU 32
GOTO CORRDIASEM ; Z=0: NÃO ULTRAPASSOU
; Z=1: ULTRAPASSOU
CLRF ANO
CORRMINDES
MOVF FUNCAO,W
XORLW 0x08
BTFSS STATUS,Z ; VERIFICA SE CORRIGE HORAS
GOTO CORRHORADES ; Z=0: AVANÇA SEM CORRIGIR
; Z=1: CORRIGE
BCF FLAGS,4 ; MUDA P/TELA DE ALARME
BSF FLAGS,5 ; HABILITA LIMPEZA DE TELA
MOVLW 0x2C ; INDICA NA TELA CORREÇÃO DE MIN. DESPERTAR
MOVWF FSR
MOVLW "m"
MOVWF INDF
BTFSS PORTA,1 ; VERIFICA SE BOTÃO CORREÇÃO PRESSIONADO
GOTO FIM_MAQAJUSTE ; BIT=0: BOTÃO NÃO PRESSIONADO: CONTINUA
; BIT=1: BOTÃO PRESSIONADO
BCF FLAGS,3
CALL BOTAO
BTFSS FLAGS,3 ; VERIFICA FLAG ATUALIZAÇÃO DA FUNCAO
GOTO FIM_MAQAJUSTE ; FLAG=0: CONTAGEM DE TEMPO NÃO TERMINOU
; FLAG=1: CONTAGEM TERMINOU
INCF MINDES,F
MOVF MINDES,W
XORLW .60
FIM_MAQAJUSTE
RETURN
;############################################################################
;# LEITURA DE BOTÃO
;############################################################################
BOTAO
BTFSC FLAG_BOTAO ; VERIFICA SE OCORREU 1ms
RETURN ; FLAG=1: ENCERRA
BSF FLAG_BOTAO ; FLAG=0: REARMA
INCF CONTLIB,F ; ROTINA PARA DESCONSIDERAR REPIQUE
MOVF CONTLIB,W
XORLW .180
BTFSS STATUS,Z ; VERIFICA SE ATINGIU A CONTAGEM
RETURN ; Z=0: NÃO ATINGIU
; Z=1: ATINGIU
BSF FLAGS,3
CLRF CONTLIB
RETURN
;###########################################################################
;****************** LIMPALCD [ ] ***************
;****************** [ ] ***************
;###########################################################################
LIMPALCD
; FAZER LOOP (2x 0 a 15, enviando " ")
MOVLW 0x0D
MOVWF FSR
MOVLW .33
MOVWF VARLOC
LOOP2
DECFSZ VARLOC,F
GOTO LIMPA_BUFFER
BCF FLAGS,5 ; DESABILITA FLAG DE LIMPEZA
RETURN
LIMPA_BUFFER
MOVLW " "
MOVWF INDF
INCF FSR,F
GOTO LOOP2
;###########################################################################
; TELA:
; www DD.MM.AA
; h: hh.mm.ss
;###########################################################################
TELA
BTFSS FLAGS,4 ; VERIFICA SE TELA NORMAL
; OU DE ALARME
GOTO TELA1 ; FLAG=0: ALARME
; FLAG=1: NORMAL
MOVLW 0x13
MOVWF FSR
MOVLW "."
MOVWF INDF
MOVLW 0x16
MOVWF FSR
MOVLW "."
MOVWF INDF
MOVLW 0x1D
MOVWF FSR
MOVLW "h"
MOVWF INDF
MOVLW 0x1E
MOVWF FSR
MOVLW ":"
MOVWF INDF
MOVLW 0x23
MOVWF FSR
MOVLW ":"
MOVWF INDF
MOVLW 0x26
MOVWF FSR
MOVLW ":"
MOVWF INDF
RETURN
TELA1
;###########################################################################
; FIM DO PROGRAMA
;###########################################################################
END