Você está na página 1de 27

;##############################################################################

;
; 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

; VARIÁVEIS PARA ARMAZENAMENTO DAS POSIÇÕES DA TELA


VARPOS1 ; INDICA POSIÇÃO 1 NA TELA (UNIDADES
)
VARPOS2 ; INDICA POSIÇÃO 2 NA TELA (DEZENAS)
; VARIÁVEIS AUXILIARES NAS OPERAÇÕES E CONTAGENS
CONTAUX ; CONTADOR AUXILIAR P/TEMPORIZAÇÃO
NUMBIN ; CONVERTE BINÁRIO EM NÚMERO P/EXPOR NA TELA
CONTLIB ; CONTADOR AUXILIAR P/TRATAR DO RUÍDO DO B
OTÃO
CONTAJUSTE ; CONTADOR P/AJUSTAR TEMPO DE 1s
ENDC ; FIM DO BLOCO DE MEMÓRIA

;#### VETOR DE RESET ########################################################


ORG 0x00 ; ENDEREÇO INICIAL DO PROCESSAMENTO
GOTO INICIO
;#### INTERRUPÇÃO ###########################################################
; *** ROTINA PARA 1ms *******************************************************
ORG 0x04 ; ENDEREÇO INICIAL DA INTERRUPÇÃO
MOVWF W_TEMP ; SALVA W EM W_TEMP
SWAPF STATUS, W
MOVWF STATUS_TEMP ; SALVA STATUS EM STATUS_TEMP
BTFSS INTCON, T0IF ; É INTERRUPÇÃO EM TMR0?
GOTO SAI_INT ; T0IF=0; NÃO
BCF INTCON, T0IF ; T0IF=1; SIM; LIMPA FLAG DE INTERRUPÇÃO (RE
ARMA INT TIMER0)
; *** A INTERRUPÇÃO FOI IDENTIFICADA - PROCESSAR DADOS DE INTERESSE ********
MOVLW .106 ; (256 - 106) * 6,51us = 1ms
MOVWF TMR0 ; INICIALIZA TRM0 COM 6
CLRF FLAGS_TIMER0 ; SINALIZA QUE OCORREU PASSAGEM DE TEMPO
DE 1ms
SAI_INT
SWAPF STATUS_TEMP, W
MOVWF STATUS ; RECUPERA STATUS
SWAPF W_TEMP, F ; RECUPERA F
SWAPF W_TEMP, W ; RECUPERA W
RETFIE ; RETORNA DA INTERRUPÇÃO
;##### INICIALIZAÇÃO ########################################################
INICIO
;*** INICIALIZAÇÃO DO SISTEMA (ESTE BLOCO SÓ RODA UMA VEZ!)*****************
BANK1
MOVLW B'00001011'
MOVWF TRISA ; DEFINE PORT A
; A0, A1, A3 COMO ENTRADA
; A2, A4 COMO SAÍDA
MOVLW B'00000000'
MOVWF TRISB ; DEFINE TODO PORTB COMO SAÍDA
MOVLW B'10000001'
MOVWF OPTION_REG ; PRESCALER 1:4 NO TMR0
; PULL-UPS HABILITADOS
MOVLW B'10100000'
MOVWF INTCON ; HABILITA SÓ A INTERRUPÇÃO DE TMR0
BANK0
CLRF PORTA ; LIMPA O PORT A
CLRF PORTB ; LIMPA O PORT B
CALL INICIA_LCD ; INICIALIZA O LCD
;**** BLOCO DE INICIALIZAÇÃO DAS VARIÁVEIS DO USUÁRIO ***********************
CLRF FLAGS_TIMER0
CLRF SEGUNDO
CLRF MINUTO
CLRF HORA
CLRF SEMANA
CLRF MINDES
CLRF HORADES
CLRF FUNCAO
CLRF PULSO
BCF FLAGS,2 ; LIMPA FLAG DE HABILITAÇÃO DO ALARME
; PARA EVITAR DISPARO SEM PRÉVIO AJUSTE
MOVLW .01
MOVWF DIA ; INICIA COM DIA 01
MOVWF MES ; INICIA COM MÊS 01 (JANEIRO)
CLRF ANO ; INICIA COM ANO 00
CALL LIMPALCD ; LIMPA BUFFER DO LCD
BSF FLAGS,4 ; INICIA COM TELA NORMAL
;############################################################################
; PROGRAMA PRINCIPAL
;############################################################################
MAIN
BTFSS FLAGS,2 ; VERIFICA SE ALARME HABILITADO
GOTO PULA_ALARME ; FLAG=0: NÃO
; FLAG=1: SIM
BTFSC SEGUNDO,0 ; SINCRONIZ. ALARME C/SEGUNDO
GOTO NAOTOCA ; FLAG=1: NÃO TOCA
; FLAG=0: TOCA
BSF PORTA,2
GOTO PULA_ALARME

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

ESCREVEDIASEM ; ATUALIZA DIA DA SEMANA


; 0,1 S APÓS INÍCIO DA CONTAGEM
MOVF PULSO,W
XORLW .15
BTFSC STATUS,Z
CALL DIASEMANA ; Z=1: ATUALIZA
GOTO FIM_MAQPUL ; Z=0: PULA ATUALIZAÇÃO
VERIFICAJUSTE
MOVF CONTAJUSTE,W ; AJUSTE DE TEMPO
XORLW .200 ; COMO O RELÓGIO ADIANTA
; ACRESCENTA UM PULSO A CADA 200s
BTFSS STATUS,Z
GOTO PULA_AJUSTE ; Z=0: NÃO AJUSTA
DECF PULSO,F ; Z=1: AJUSTA
CLRF CONTAJUSTE
PULA_AJUSTE
INCF SEGUNDO,F ; CONTAGEM DE SEGUNDOS
INCF CONTAJUSTE,F ; INCREMENTA CONTADOR P/AJUSTE
MOVF SEGUNDO,W
XORLW .60
BTFSS STATUS,Z ; TESTA SE ALCANÇOU 60
GOTO FIM_MAQPUL ; Z=0: NÃO ALCANÇOU
; Z=1: ALCANÇOU
CLRF SEGUNDO
INCF MINUTO,F ; CONTAGEM DE MINUTOS
MOVF MINUTO,W
XORLW .60
BTFSS STATUS,Z ; TESTA SE ALCANÇOU 60
GOTO ALARME ; Z=0: NÃO ALCANÇOU
; Z=1: ALCANÇOU
CLRF MINUTO
INCF HORA,F ; CONTAGEM DE HORAS
MOVF HORA,W
XORLW .24
BTFSS STATUS,Z ; TESTA SE ALCANÇOU 24
GOTO ALARME ; Z=0: NÃO ALCANÇOU
; Z=1: ALCANÇOU
CLRF HORA
INCF SEMANA,F
MOVF SEMANA,W
XORLW .7
BTFSC STATUS,Z ; TESTA SE ALCANÇOU 7
CLRF SEMANA ; Z=1: ALCANÇOU
; Z=0: NÃO ALCANÇOU
INCF DIA,F ; INCREMENTA DIA DO MÊS
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 ALARME ; Z=0: NÃO ALCANÇOU
; Z=1: ALCANÇOU
MOVLW .01
MOVWF MES

INCF ANO,F ; INCREMENTA O ANO


MOVF ANO,W
XORLW .100
BTFSS STATUS,Z ; TESTA SE ALCANÇOU 100
GOTO ALARME ; Z=0: NÃO ALCANÇOU
; Z=1: ALCANÇOU
CLRF ANO ; VOLTA PARA O ANO 00

; *** ALARME **************************************************************


ALARME
MOVF MINUTO,W
XORWF MINDES,W ; COMPARA O MINUTO DE DESPERTAR
BTFSS STATUS,Z ; SÃO IGUAIS?
GOTO INIBE ; Z=0: NÃO SÃO
; Z=1: SÃO
MOVF HORA,W
XORWF HORADES,W ; COMPARA A HORA DE DESPERTAR
BTFSS STATUS,Z ; SÃO IGUAIS?
GOTO INIBE ; Z=0: NÃO SÃO
; Z=1: SÃO
BSF FLAGS,2 ; ARMA FLAG PARA ACIONAR ALARME
GOTO FIM_MAQPUL
INIBE
BCF FLAGS,2 ; DESABILITA FLAG P/ACIONAR ALARME
FIM_MAQPUL
RETURN

; *** DIA DA SEMANA *********************************************************


DIASEMANA
MOVF SEMANA,W ; VERIFICA SE É DOMINGO
XORLW .0
BTFSS STATUS,Z
GOTO SEGUNDA ; FLAG=0: NÃO É DOMINGO
; FLAG=1: É DOM. COLOCA NA TELA
MOVLW 0x0D
MOVWF FSR
MOVLW "D"
MOVWF INDF
INCF FSR,F
MOVLW "o"
MOVWF INDF
INCF FSR,F
MOVLW "m"
MOVWF INDF
RETURN
SEGUNDA
MOVF SEMANA,W ; VERIFICA SE É SEGUNDA
XORLW .1
BTFSS STATUS,Z
GOTO TERCA ; FLAG=0: NÃO É SEGUNDA
; FLAG=1: É SEG. COLOCA NA TELA
MOVLW 0x0D
MOVWF FSR
MOVLW "S"
MOVWF INDF

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

; **** ÚLTIMO DIA DO MÊS ***************************************************

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

BTFSS FLAGS,4 ; PERGUNTA SE TELA NORMAL/ALARME


GOTO PULANORMAL ; FLAG=0: ALARME
; FLAG=1: PROSSEGUE
; ESCREVE SEGUNDOS NA TELA
MOVF SEGUNDO,W
MOVWF NUMBIN
CALL CONVERTEBYTE
MOVLW 0x28
MOVWF FSR
MOVF VARPOS1,W
MOVWF INDF
MOVLW 0x27
MOVWF FSR
MOVF VARPOS2,W
MOVWF INDF
; ESCREVE MINUTOS NA TELA
MOVF MINUTO,W
MOVWF NUMBIN
CALL CONVERTEBYTE
MOVLW 0x25
MOVWF FSR
MOVF VARPOS1,W
MOVWF INDF
MOVLW 0x24
MOVWF FSR
MOVF VARPOS2,W
MOVWF INDF
; ESCREVE HORAS NA TELA
MOVF HORA,W
MOVWF NUMBIN
CALL CONVERTEBYTE
MOVLW 0x22
MOVWF FSR
MOVF VARPOS1,W
MOVWF INDF
MOVLW 0x21
MOVWF FSR
MOVF VARPOS2,W
MOVWF INDF
; ESCREVE DIA DO MÊS NA TELA
MOVF DIA,W
MOVWF NUMBIN
CALL CONVERTEBYTE
MOVLW 0x12
MOVWF FSR
MOVF VARPOS1,W
MOVWF INDF
MOVLW 0x11
MOVWF FSR
MOVF VARPOS2,W
MOVWF INDF

; ESCREVE MÊS NA TELA


MOVF MES,W
MOVWF NUMBIN
CALL CONVERTEBYTE
MOVLW 0x15
MOVWF FSR
MOVF VARPOS1,W
MOVWF INDF
MOVLW 0x14
MOVWF FSR
MOVF VARPOS2,W
MOVWF INDF
; ESCREVE ANO NA TELA
MOVF ANO,W
MOVWF NUMBIN
CALL CONVERTEBYTE
MOVLW 0x18
MOVWF FSR
MOVF VARPOS1,W
MOVWF INDF
MOVLW 0x17
MOVWF FSR
MOVF VARPOS2,W
MOVWF INDF
PULANORMAL
BTFSC FLAGS,4 ; PERGUNTA SE NORMAL/ALARME
RETURN ; FLAG=1: TELA NORMAL
; FLAG=0: ALARME

; ESCREVE MINUTO DE DESPERTAR NA TELA


MOVF MINDES,W
MOVWF NUMBIN
CALL CONVERTEBYTE
MOVLW 0x25
MOVWF FSR
MOVF VARPOS1,W
MOVWF INDF
MOVLW 0x24
MOVWF FSR
MOVF VARPOS2,W
MOVWF INDF
; ESCREVE HORA DE DESPERTAR NA TELA
MOVF HORADES,W
MOVWF NUMBIN
CALL CONVERTEBYTE
MOVLW 0x22
MOVWF FSR
MOVF VARPOS1,W
MOVWF INDF
MOVLW 0x21
MOVWF FSR
MOVF VARPOS2,W
MOVWF INDF
RETURN
;############################################################################
;# CONVERTE INFORMAÇÃO DE 1 BYTE EM NÚMERO VISÍVEL NO LCD
;############################################################################
CONVERTEBYTE
; ENTRAR COM AS VARIÁVEIS A SEREM CONVERTIDAS
; NUMBIN É A VARIÁVEL A SER CONVERTIDA, EM BINÁRIO
; VARPOS1 É A UNIDADE EM NÚMERO DECIMAL
; VARPOS2 É A DEZENA EM NÚMERO DECIMAL
CLRF VARPOS1
CLRF VARPOS2
BIT0 BTFSS NUMBIN,0
GOTO BIT1
MOVLW 0x01
ADDWF VARPOS1
BIT1 BTFSS NUMBIN,1
GOTO BIT2
MOVLW 0x02
ADDWF VARPOS1
BIT2 BTFSS NUMBIN,2
GOTO BIT3
MOVLW 0x04
ADDWF VARPOS1
BIT3 BTFSS NUMBIN,3
GOTO BIT4
MOVLW 0x08
ADDWF VARPOS1
CALL TESTA10
BIT4 BTFSS NUMBIN,4
GOTO BIT5
MOVLW 0x06
ADDWF VARPOS1
MOVLW 0x01
ADDWF VARPOS2
CALL TESTA10
BIT5 BTFSS NUMBIN,5
GOTO BIT6
MOVLW 0x02
ADDWF VARPOS1
MOVLW 0x03
ADDWF VARPOS2
CALL TESTA10
BIT6 BTFSS NUMBIN,6
GOTO FIMCONVERSAO
MOVLW 0x04
ADDWF VARPOS1
MOVLW 0x06
ADDWF VARPOS2
CALL TESTA10
FIMCONVERSAO
MOVLW 0x30
ADDWF VARPOS1,F ; AJUSTA P/ESCRITA EM CARACTER A
SC II
ADDWF VARPOS2,F ; AJUSTA P/ESCRITA EM CACACTER A
SC II
RETURN
TESTA10 ; TESTA SE DEVE ACRESCENTAR 1 A VARPOS2
MOVF VARPOS1,W
MOVWF VARAUX
MOVLW .10
SUBWF VARAUX,F
BTFSS STATUS,C
RETURN ; C = 0: RESULTADO NEGATIVO
MOVF VARAUX,W ; C = 1: RESULTADO POSITIVO
MOVWF VARPOS1
INCF VARPOS2,F
RETURN

;############################################################################
;# MÁQUINA PARA AJUSTE DO RELÓGIO E DO DESPERTADOR
;############################################################################
MAQAJUSTE

BTFSS PORTA,0 ; VERIFICA SE TECLA FUNCAO PRESSIONADA


GOTO PROSSEGUE ; 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 FUNCAO,F ; INCREMENTA FUNCAO P/CORRECAO
MOVF FUNCAO,W
XORLW 0x0A
BTFSS STATUS,Z ; VERIFICA SE ESTOUROU FUNCAO
GOTO PROSSEGUE ; Z=0: NÃO: AVANÇA
CLRF FUNCAO ; Z=1: SIM: VOLTA A ZERO
BSF FLAGS,4 ; HABILITA TELA NORMAL
BSF FLAGS,5 ; HABILITA LIMPEZA DE TELA

; *** EXECUTA FUNÇAO CONFORME SELECIONADO ***********************************


PROSSEGUE
MOVF FUNCAO,W
XORLW 0x00
BTFSS STATUS,Z ; VERIFICA SE AVANCA OU CORRIGE
GOTO CORRIGIR ; Z=0: CORRIGE
; Z=1: AVANÇA
MOVLW 0x2C
MOVWF FSR
MOVLW 0x5E
MOVWF INDF
MOVLW 0x2B
MOVWF FSR
MOVLW " "
MOVWF INDF
GOTO FIM_MAQAJUSTE
CORRIGIR

; CLRF PULSO ; DETÉM AVANÇO ENQUANTO CORRIGE


MOVF FUNCAO,W
XORLW 0x01
BTFSS STATUS,Z ; VERIFICA SE CORRIGE SEGUNDOS
GOTO CORRMIN ; Z=0: NÃO
; Z=1: CORRIGE
MOVLW 0x2C ; INDICA NA TELA CORREÇÃO DE SEGUNDOS
MOVWF FSR
MOVLW "s"
MOVWF INDF
BTFSS PORTA,1 ; VERIFICA SE TECLA CORREÇÃO PRESSIONADA
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 SEGUNDO,F
MOVF SEGUNDO,W
XORLW .60
BTFSC STATUS,Z ; VERIFICA SE ULTRAPASSOU 60
CLRF SEGUNDO ; Z=1: ULTRAPASSOU
; Z=0: NÃO ULTRAPASSOU
CORRMIN
MOVF FUNCAO,W
XORLW 0x02
BTFSS STATUS,Z ; VERIFICA SE CORRIGE MINUTOS
GOTO CORRHORA ; 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 MINUTO,F
MOVF MINUTO,W
XORLW .60
BTFSC STATUS,Z ; VERIFICA SE ULTRAPASSOU 60
CLRF MINUTO ; Z=1: ULTRAPASSOU
; Z=0: NÃO ULTRAPASSOU
CORRHORA
MOVF FUNCAO,W
XORLW 0x03
BTFSS STATUS,Z ; VERIFICA SE CORRIGE HORAS
GOTO CORRDIASEM ; Z=0: NÃO
; Z=1: CORRIGE
MOVLW 0x2C ; INDICA NA TELA CORREÇÃO DE HORAS
MOVWF FSR
MOVLW "h"
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 HORA,F
MOVF HORA,W
XORLW .24
BTFSC STATUS,Z ; VERIFICA SE ULTRAPASSOU 24
CLRF HORA ; Z=1: ULTRAPASSOU
; Z=0: NÃO ULTRAPASSOU

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

BTFSC STATUS,Z ; VERIFICA SE ULTRAPASSOU 60


CLRF MINDES ; Z=1: ULTRAPASSOU
; Z=0: NÃO ULTRAPASSOU
CORRHORADES
MOVF FUNCAO,W
XORLW 0x09
BTFSS STATUS,Z ; VERIFICA SE CORRIGE HORA DESP.
GOTO FIM_MAQAJUSTE ; 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 HORA DE DESPERT
AR
MOVWF FSR
MOVLW "h"
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 HORADES,F
MOVF HORADES,W
XORLW .24
BTFSC STATUS,Z ; VERIFICA SE ESTOUROU FUNCAO
CLRF HORADES ; Z=1: SIM

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

MOVLW LINE2 ; APONTA LINHA 2


MOVWF FSR
MOVLW "A"
MOVWF INDF
INCF FSR,F
MOVLW "l"
MOVWF INDF
INCF FSR,F
MOVLW "."
MOVWF INDF
MOVLW 0x23
MOVWF FSR
MOVLW ":"
MOVWF INDF
RETURN

;###########################################################################
; FIM DO PROGRAMA
;###########################################################################
END

Você também pode gostar