;********************************************************************************************************************* ; ; RELOGIO_CTR_DS1307.ASM ; ; ; ; RELOGIO CONTROLADOR COM SAIDAS PROGRAMAVEIS ; C/ PIC 16F628A ; VERSÃO COM RTC DS1307 (I2C) ; INICIO : 10/10/13 TERMINO : 11/10/13 ; AUTOR: CLAUDIO LARIOS ; OBJETIVO: VISUALIZAR HORAS,MINUTOS, DATA E DIA DA SEMANA EM LCD. ; PROGRAMAR CANAIS PARA LIGAR/DESLIGAR CARGAS NAS HORAS/MIN PROGRAMADOS. ; USO: SIMULADOR DE PRESENÇA, AUTOMAÇÃO DE TAREFAS ROTINEIRAS E DIÁRIAS ; NO LAR, USO INDUSTRIAL PARA SEQUENCIAR EVENTOS,ETC. ;********************************************************************************************************************** ;ARQUIVOS PARA COMPILAÇÃO LIST P=16f628a , R=DEC INCLUDE "P16F628a.INC" ;ARQUIVO PADRAO ERRORLEVEL -302 , -202 ;ELIMINA MENSAGEM DE ERRO ;============================================================================================================== ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON & _LVP_OFF ;=============================================================================================================== ;TROCA DE BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;LCD Control lines #DEFINE LCD_DB7 PORTB,7 ;PINO 13 - DISPLAYS #DEFINE LCD_DB6 PORTB,6 ;PINO 12 - DISPLAY #DEFINE LCD_DB5 PORTB,5 ;PINO 11 - DISPLAYS #DEFINE LCD_DB4 PORTB,4 ;PINO 10 - DISPLAY ;INTERRUPTORES #DEFINE SW_MENU PORTB,7 ;PINO 13 - BOTÃO MENU (AJUSTES E PROGRAMAÇÃO) #DEFINE SW_HORAS PORTB,6 ;PINO 12 - BOTÃO DE AJUSTE DE HORAS #DEFINE SW_MIN PORTB,5 ;PINO 11 - BOTÃO DE AJUSTE DE MINUTOS #DEFINE SW_SEG PORTB,4 ;PINO 10 - BOTÃO DE AJUSTE DE SEGUNDOS #DEFINE LCD_RS PORTB,3 ;PINO 9 - DISPLAY #DEFINE LCD_E PORTB,2 ;PINO 8 - DISPLAY #DEFINE SDA PORTA,2 ;PINO 1 #DEFINE TRIS_SDA TRISA,2 ;PINO 1 (IN/OUT) #DEFINE SCL PORTA,3 ;PINO 2 ;FLAGS #DEFINE FLAG_1SEG FLAGS,0 ;FLAG INDICADOR DE 1 SEGUNDOS #DEFINE RELE_1 PORTA,1 ;SAIDA DO RELE 1 (CANAL 1) #DEFINE RELE_2 PORTA,0 ;SAIDA DO RELE 2 (CANAL 2) #DEFINE RELE_3 PORTA,7 ;SAIDA DO RELE 3 (CANAL 3) #DEFINE RELE_4 PORTA,6 ;SAIDA DO RELE 4 (CANAL 4) #DEFINE RELE_5 PORTB,1 ;SAIDA DO RELE 5 (CANAL 5) #DEFINE RELE_6 PORTB,0 ;SAIDA DO RELE 6 (CANAL 6) ;MACROS ;================================================================================================================ ;RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA SEG,MIN,HR,DATE,MONTH,DAY,YEAR,CONTROL,TEMP2,TEMP1,TEMP,AUX2,AUX1,AUX,PONT CNT0,CNT1,FLAGS,DEL0,DEL1,DEL2,CNT,BUFFER,C0,R0,R1,R7,R_MENU,TMP,JK1 PCAUX,TR,FSR_E,FSR_E1,ADDRESS ENDC CBLOCK 0X70 W_TEMP,STATUS_TEMP ;REGISTRADORES ESPELHADOS NOS BANCOS ENDC ;EQUATES TRIS_SW EQU B'11110000' ;SENTIDO PARA LEITURA DE CHAVES TRIS_LCD EQU B'00000000' ;SENTIDO PARA ENVIO DE CARACTERES PARA LCD ;EQUATES P/ COMANDO DS1307 C_SEC EQU 0X00 C_MIN EQU 0X01 C_HORA EQU 0X02 C_DATA EQU 0X04 C_MES EQU 0X05 C_DIA EQU 0X03 C_ANO EQU 0X06 ;C_CONTROL EQU 0X07 ;EQUATES ACESSO A RAM DO DS1307 C_CANAL1L_H EQU .2 C_CANAL1L_M EQU .1 C_CANAL1L_S EQU .0 C_CANAL1D_H EQU .5 C_CANAL1D_M EQU .4 C_CANAL1D_S EQU .3 C_CANAL2L_H EQU .8 C_CANAL2L_M EQU .7 C_CANAL2L_S EQU .6 C_CANAL2D_H EQU .11 C_CANAL2D_M EQU .10 C_CANAL2D_S EQU .9 C_CANAL3L_H EQU .14 C_CANAL3L_M EQU .13 C_CANAL3L_S EQU .12 C_CANAL3D_H EQU .17 C_CANAL3D_M EQU .16 C_CANAL3D_S EQU .15 C_CANAL4L_H EQU .20 C_CANAL4L_M EQU .19 C_CANAL4L_S EQU .18 C_CANAL4D_H EQU .23 C_CANAL4D_M EQU .22 C_CANAL4D_S EQU .21 C_CANAL5L_H EQU .26 C_CANAL5L_M EQU .25 C_CANAL5L_S EQU .24 C_CANAL5D_H EQU .29 C_CANAL5D_M EQU .28 C_CANAL5D_S EQU .27 C_CANAL6L_H EQU .32 C_CANAL6L_M EQU .31 C_CANAL6L_S EQU .30 C_CANAL6D_H EQU .35 C_CANAL6D_M EQU .34 C_CANAL6D_S EQU .33 ;================================================================================================== ; VETOR DE RESET ;================================================================================================== ORG 0X00 GOTO INICIO ;================================================================================================== ; VETOR DE INTERRUPÇÃO ;================================================================================================== ORG 0X04 GOTO INT_TMR1 ;VAI PARA ROTINA DE INTERRUPÇÃO DO TIMER 1 ;================================================================================================= ; MENSAGENS PARA O LCD - PÁGINA ZERO ;================================================================================================= ;;MENSAGENS PEGA_M MOVWF JK1 MOVFW PCAUX MOVWF PCLATH MOVFW JK1 MOVWF PCL MSG1: DT "TIMER_CONTROLER",0 ;NOME DO APARELHO MSG2: DT "LARIOS.TECNOL.WS",0 ;BLOG MSG3: DT "AJUSTAR RELOGIO ",0 ;AJUSTE DE RELÓGIO MSG4: DT "AJ.DIA DA SEMANA",0 ;DIA MSG5: DT "AJ. CALENDARIO ",0 ;CALENDÁRIO MSG6: DT "CANAL1 - LIGARA ",0 ; MSG7: DT "CANAL1-DESLIGARA",0 ; MSG8: DT "CANAL2 - LIGARA ",0 ; MSG9: DT "CANAL2-DESLIGARA",0 ; MSG10: DT "CANAL3 - LIGARA ",0 ; MSG11: DT "CANAL3-DESLIGAR ",0 ; MSG12: DT "CANAL4 - LIGARA ",0 ; MSG13: DT "CANAL4-DESLIGARA",0 ; MSG14: DT "CANAL5 - LIGARA ",0 ; ;================================================================================================= ; MENSAGENS PARA O LCD - PÁGINA HUM ;================================================================================================= ORG 0X0100 ; A PARTIR DAQUI, CARREGAR .1 EM 'PCAUX' PARA UM SALTO GOTO CORRETO MSG15: DT "CANAL5-DESLIGARA",0 ; MSG16: DT "CANAL6 - LIGARA ",0 ; MSG17: DT "CANAL6-DESLIGARA",0 ; MSG18: DT "CANAL7 - LIGARA ",0 ; MSG19: DT "CANAL7-DESLIGARA",0 ; ;MSG20: ; DT " ",0 ;APAGAR LINHA INTEIRA MSG_SEG: DT "SEG",0 MSG_TER: DT "TER",0 MSG_QUA: DT "QUA",0 MSG_QUI: DT "QUI",0 MSG_SEX: DT "SEX",0 MSG_SAB: DT "SAB",0 MSG_DOM: DT "DOM",0 MSG21: DT "ENCERRAR AJUSTES",0 ;FINALIZA AJUSTES ;================================================================================================= ; INICIO DO PROGRAMA ;================================================================================================= INICIO BANK1 ;BANCO 1 CLRF TRISA ;TUDO SAIDA CLRF TRISB ;TUDO SAIDA CLRF OPTION_REG ;HABILITA PULL UP BSF PIE1,0 ;LIGA INTERRUPÇÃO DO TIMER1 BANK0 MOVLW .7 ;DESLIGA COMPARADORES MOVWF CMCON CLRF PORTA ;ZERA SAIDAS CLRF PORTB CLRF PCAUX CLRF PCLATH MOVLW 0X21 ;PRESCALLER /4 NO TMR1 MOVWF T1CON ;LIGA TIMER 1 MOVLW B'11000000' ;LIGA INTERRUPÇÃO GERAL E PERIFÉRICOS MOVWF INTCON CALL LcdInit ;INICIA LCD CALL LcdClear MOVLW 0XFF CALL DELAY_MS MOVLW MSG1 ;NOME DO EQUIPAMENTO CALL ENV_LCD CALL LINHA_2 MOVLW MSG2 ;BLOG CALL ENV_LCD MOVLW 0X20 ;TEMPO DA APRESENTAÇÃO CALL DELAYW CLRF BUFFER ;LIGA O OSCILADOR DO DS1307 MOVLW C_SEC CALL DS_WRITE CLRF R_MENU ;================================================================================================= ; PROGRAMA PRINCIPAL ;================================================================================================= MAIN BANK0 ;================================================================================================= ; ATUALIZA CONTADORES DE TEMPO E CALENDÁRIO ;================================================================================================= MOVF R_MENU,F BTFSS STATUS,Z GOTO AJUSTAR_PROG1 BTFSS FLAG_1SEG ;TEST FLAG DE ATUALIZAÇÃO GOTO SAI_ATUALIZAÇÃO BCF FLAG_1SEG ;=1, ENTÃO VAI ATUALIZAR DADOS MOVLW C_SEC CALL DS_READ MOVWF SEG ;ATUALIZA SEGUNDOS MOVLW C_MIN CALL DS_READ MOVWF MIN ;ATUALIZA MINUTOS MOVLW C_HORA CALL DS_READ MOVWF HR ;ATUALIZA HORAS MOVLW C_DATA CALL DS_READ MOVWF DATE ;ATUALIZA DATA MOVLW C_MES CALL DS_READ MOVWF MONTH ;ATUALIZA MES MOVLW C_DIA CALL DS_READ MOVWF DAY ;ATUALIZA DIA DA SEMANA MOVLW C_ANO CALL DS_READ MOVWF YEAR ;ATUALIZA ANO ;================================================================================================= ; COMPARAÇÃO ENTRE DADOS ATUALIZADOS E OS PROGRAMADOS ;================================================================================================= CALL APONTA_SEG ;APONTA FSR PARA REGISTRADOR DE SEGUNDOS CLRF FSR_E ;ENDEREÇO INICIAL DA EEPROM CLRF FSR_E1 ;================================================================================================= ; COMPARA A PROGRAMAÇÃO DO CANAL 1 COM O VALOR ATUALIZADO ;================================================================================================= LOOP_E1 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUAL1 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_E1 BSF RELE_1 N_IGUAL1 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG LOOP_D1 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUALD1 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_D1 BCF RELE_1 N_IGUALD1 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG ;APONTA FSR PARA REGISTRADOR DE SEGUNDOS ;================================================================================================= ; COMPARA A PROGRAMAÇÃO DO CANAL 2 COM O VALOR ATUALIZADO ;================================================================================================= LOOP_E2 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUAL2 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_E2 BSF RELE_2 N_IGUAL2 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG LOOP_D2 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUALD2 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_D2 BCF RELE_2 N_IGUALD2 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG ;APONTA FSR PARA REGISTRADOR DE SEGUNDOS ;================================================================================================= ; COMPARA A PROGRAMAÇÃO DO CANAL 3 COM O VALOR ATUALIZADO ;================================================================================================= LOOP_E3 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUAL3 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_E3 BSF RELE_3 N_IGUAL3 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG LOOP_D3 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUALD3 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_D3 BCF RELE_3 N_IGUALD3 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG ;APONTA FSR PARA REGISTRADOR DE SEGUNDOS ;================================================================================================= ; COMPARA A PROGRAMAÇÃO DO CANAL 4 COM O VALOR ATUALIZADO ;================================================================================================= LOOP_E4 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUAL4 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_E4 BSF RELE_4 N_IGUAL4 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG LOOP_D4 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUALD4 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_D4 BCF RELE_4 N_IGUALD4 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG ;APONTA FSR PARA REGISTRADOR DE SEGUNDOS ;================================================================================================= ; COMPARA A PROGRAMAÇÃO DO CANAL 5 COM O VALOR ATUALIZADO ;================================================================================================= LOOP_E5 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUAL5 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_E5 BSF RELE_5 N_IGUAL5 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG LOOP_D5 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUALD5 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_D5 BCF RELE_5 N_IGUALD5 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG ;APONTA FSR PARA REGISTRADOR DE SEGUNDOS ;================================================================================================= ; COMPARA A PROGRAMAÇÃO DO CANAL 6 COM O VALOR ATUALIZADO ;================================================================================================= LOOP_E6 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUAL6 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_E6 BSF RELE_6 N_IGUAL6 CALL FSR_MAIS3 ;ACERTA ENDEREÇO PARA LER EEPROM CALL APONTA_SEG LOOP_D6 CALL BUSCA_EEPROM BTFSS STATUS,Z GOTO N_IGUALD6 INCF FSR_E,F INCF FSR,F DECFSZ CNT,F GOTO LOOP_D6 BCF RELE_6 N_IGUALD6 ;================================================================================================= ; VISUALIZAÇÃO DE RELÓGIO E CALENDÁRIO NO LCD (MODO NORMAL) ;================================================================================================= CALL CLEAR_LCD ;LIMPA LCD MOVLW 0X84 CALL EC ;INDICA LINHA INICIAL PARA A APRESENTAÇÃO MOVFW HR ;PEGA 'HORAS' CALL ENV_BYTE ;ENVIA PARA LCD MOVLW ':' CALL ED ;ENVIA 2 PONTOS MOVFW MIN ;PEGA 'MINUTOS' CALL ENV_BYTE ;ENVIA PARA LCD MOVLW ':' CALL ED ;ENVIA 2 PONTOS MOVFW SEG ;PEGA 'SEGUNDOS' CALL ENV_BYTE ;ENVIA PARA LCD MOVLW 0XC2 CALL EC ;POSICIONA NA LINHA 2 CALL PAGINA_1 MOVFW DAY XORLW .1 BTFSS STATUS,Z GOTO PRTEST1 MOVLW MSG_SEG ;MENSAGEM 'SEG' CALL ENV_LCD GOTO SAI_DIA PRTEST1 MOVFW DAY XORLW .2 BTFSS STATUS,Z GOTO PRTEST2 MOVLW MSG_TER ;MENSAGEM 'TER' CALL ENV_LCD GOTO SAI_DIA PRTEST2 MOVFW DAY XORLW .3 BTFSS STATUS,Z GOTO PRTEST3 MOVLW MSG_QUA ;MENSAGEM 'QUA' CALL ENV_LCD GOTO SAI_DIA PRTEST3 MOVFW DAY XORLW .4 BTFSS STATUS,Z GOTO PRTEST4 MOVLW MSG_QUI ;MENSAGEM 'QUI' CALL ENV_LCD GOTO SAI_DIA PRTEST4 MOVFW DAY XORLW .5 BTFSS STATUS,Z GOTO PRTEST5 MOVLW MSG_SEX ;MENSAGEM 'SEX' CALL ENV_LCD GOTO SAI_DIA PRTEST5 MOVFW DAY XORLW .6 BTFSS STATUS,Z GOTO PRTEST6 MOVLW MSG_SAB ;MENSAGEM 'SAB' CALL ENV_LCD GOTO SAI_DIA PRTEST6 MOVFW DAY XORLW .7 BTFSS STATUS,Z GOTO SAI_DIA MOVLW MSG_DOM ;MENSAGEM 'DOM' CALL ENV_LCD GOTO SAI_DIA SAI_DIA MOVLW 0XC6 CALL EC MOVFW DATE ;PEGA 'DATA' CALL ENV_BYTE ;ENVIA PARA LCD MOVLW '/' CALL ED ;ENVIA / MOVFW MONTH ;PEGA 'MES' CALL ENV_BYTE ;ENVIA PARA LCD MOVLW '/' CALL ED ;ENVIA / MOVFW YEAR ;PEGA 'ANO' CALL ENV_BYTE ;ENVIA PARA LCD SAI_ATUALIZAÇÃO ;================================================================================================= ; VERIFICA SE TECLA PARA AJUSTES FOI APERTADA ;================================================================================================= ;AJUSTAR_PROG1 CALL IN_SW ;PINOS DAS CHAVES COMO ENTRADAS BTFSC SW_MENU ; GOTO SEGL3 GOTO MAIN BCF INTCON,GIE ;DESLIGA INTERRUPÇÕES BTFSC INTCON,GIE GOTO $-2 AJUSTAR_PROG1 INCF R_MENU,F CALL DELAY_INCREMENTOS MOVLW HIGH($) MOVWF PCLATH MOVFW R_MENU ANDLW 0X0F ;LIMITA ADDWF PCL,F GOTO SAIR_AJUSTES GOTO ACERTAR_RELOGIO GOTO ACERTAR_DIA GOTO ACERTAR_CALENDARIO GOTO PROG_CANA1_LIGA GOTO PROG_CANA1_DESLIGA GOTO PROG_CANA2_LIGA GOTO PROG_CANA2_DESLIGA GOTO PROG_CANA3_LIGA GOTO PROG_CANA3_DESLIGA GOTO PROG_CANA4_LIGA GOTO PROG_CANA4_DESLIGA GOTO PROG_CANA5_LIGA GOTO PROG_CANA5_DESLIGA GOTO PROG_CANA6_LIGA GOTO PROG_CANA6_DESLIGA ;================================================================================================= ; SAIR DO AJUSTE ;================================================================================================= SAIR_AJUSTES CALL LcdClear ;LIMPA LCD CALL PAGINA_1 ;ACERTA PAGINA DA MENSAGEM MOVLW MSG21 CALL ENV_LCD CALL IN_SW LOOP1 BTFSS SW_HORAS GOTO FIM_AJUSTE BTFSS SW_MIN GOTO FIM_AJUSTE BTFSS SW_SEG GOTO FIM_AJUSTE MOVLW .5 CALL DELAYW BTFSS SW_MENU GOTO AJUSTAR_PROG1 ;xxx GOTO LOOP1 FIM_AJUSTE CLRF R_MENU CLRF PCLATH BSF INTCON,GIE ;LIGA INTERRUPÇÕES GOTO MAIN ;================================================================================================= ; FUNÇÃO: AJUSTAR RELÓGIO ;================================================================================================= ACERTAR_RELOGIO CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG3 ;MENSAGEM: 'AJUSTAR RELOGIO' CALL ENV_LCD CALL POS_C4 MOVLW C_HORA ;PEGA HORAS CALL DS_READ CALL ENV_BYTE ;ENVIA PARA LCD MOVLW ':' CALL ED ;ENVIA 2 PONTOS MOVLW C_MIN ;PEGA MINUTOS CALL DS_READ CALL ENV_BYTE ;ENVIA PARA LCD MOVLW ':' CALL ED ;ENVIA 2 PONTOS MOVLW C_SEC ;PEGA 'SEGUNDOS' CALL DS_READ CALL ENV_BYTE ;ENVIA PARA LCD LOOP2 CALL IN_SW BTFSS SW_HORAS GOTO AJUSTE_HR1 BTFSS SW_MIN GOTO AJUSTE_MIN1 BTFSS SW_SEG GOTO AJUSTE_SEG1 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP2 AJUSTAR_PROG CALL DELAY_INCREMENTOS GOTO AJUSTAR_PROG1 ;================================================================================================= ; AJUSTANDO HORAS ;================================================================================================= AJUSTE_HR1 MOVLW C_HORA CALL DS_READ ;LE HORA CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT1 CALL INC_DEZ_BUFFER PULT1 MOVFW BUFFER XORLW 0X24 BTFSC STATUS,Z CLRF BUFFER MOVLW 0XC4 ;POSICIONA CURSOR CALL EC MOVFW BUFFER ;ENVIA PARA PARA LCD CALL ENV_BYTE MOVLW C_HORA CALL DS_WRITE ;ENVIA BUFFER PARA DS1307 CALL DELAY_INCREMENTOS GOTO LOOP2 ;================================================================================================= ; AJUSTANDO MINUTOS ;================================================================================================= AJUSTE_MIN1 MOVLW C_MIN CALL DS_READ ;LE MINUTOS CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT2 CALL INC_DEZ_BUFFER PULT2 MOVFW BUFFER XORLW 0X60 BTFSC STATUS,Z CLRF BUFFER MOVLW 0XC7 ;POSICIONA CURSOR CALL EC MOVFW BUFFER ;ENVIA PARA PARA LCD CALL ENV_BYTE MOVLW C_MIN CALL DS_WRITE ;ENVIA BUFFER PARA DS1307 CALL DELAY_INCREMENTOS GOTO LOOP2 ;================================================================================================= ; AJUSTANDO SEGUNDOS ;================================================================================================= AJUSTE_SEG1 MOVLW C_SEC CALL DS_READ ;LE SEGUNDOS CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT3 CALL INC_DEZ_BUFFER PULT3 MOVFW BUFFER XORLW 0X60 BTFSC STATUS,Z CLRF BUFFER MOVLW 0XCA ;POSICIONA CURSOR CALL EC MOVFW BUFFER ;ENVIA PARA PARA LCD CALL ENV_BYTE MOVLW C_SEC CALL DS_WRITE ;ENVIA BUFFER PARA DS1307 CALL DELAY_INCREMENTOS GOTO LOOP2 ;RETORNA COM ENDEREÇO LOW DA MENSAGEM PEGA_DIA_SEMANA MOVWF JK1 MOVLW HIGH($) MOVWF PCLATH MOVFW JK1 ANDLW 0X07 ADDWF PCL,F NOP RETLW MSG_SEG RETLW MSG_TER RETLW MSG_QUA RETLW MSG_QUI RETLW MSG_SEX RETLW MSG_SAB RETLW MSG_DOM ;================================================================================================= ; FUNÇÃO: AJUSTAR DIA ;================================================================================================= ACERTAR_DIA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG4 ;MENSAGEM: 'AJUSTAR RELOGIO' CALL ENV_LCD MOVLW 0XC7 CALL EC ;POSICIONA CURSOR MOVLW .2 MOVWF PCLATH MOVLW C_DIA ;PEGA HORAS CALL DS_READ ANDLW 0X07 CALL PEGA_DIA_SEMANA MOVWF TEMP ;SALVA CALL PAGINA_1 ;ACERTA PAGINA DA MENSAGEM MOVFW TEMP CALL ENV_LCD ; TESTE DE CHAVES LOOP3 CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_DIA1 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_DIA1 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_DIA1 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP3 AJUSTE_DIA1 MOVLW 0XC7 CALL EC ;POSICIONA CURSOR MOVLW .2 MOVWF PCLATH MOVLW C_DIA ;PEGA HORAS CALL DS_READ ADDLW .1 ANDLW 0X07 BTFSC STATUS,Z ADDLW .1 ;ELIMINA O ZERO (1-7) MOVWF BUFFER ;SALVA CALL PEGA_DIA_SEMANA MOVWF TEMP ;SALVA CALL PAGINA_1 ;ACERTA PAGINA DA MENSAGEM MOVFW TEMP CALL ENV_LCD MOVLW C_DIA CALL DS_WRITE ;ENVIA BUFFER PARA DS1307 CALL DELAY_INCREMENTOS GOTO LOOP3 ;================================================================================================= ; AJUSTAR CALENDÁRIO ;================================================================================================= ACERTAR_CALENDARIO CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG5 ;MENSAGEM: 'AJUSTAR CALENDÁRIO' CALL ENV_LCD MOVLW 0XC5 CALL EC MOVLW C_DATA ;PEGA 'DATA' CALL DS_READ CALL ENV_BYTE ;ENVIA PARA LCD MOVLW '/' CALL ED ;ENVIA / MOVLW C_MES ;PEGA 'MES' CALL DS_READ CALL ENV_BYTE ;ENVIA PARA LCD MOVLW '/' CALL ED ;ENVIA / MOVLW C_ANO ;PEGA 'ANO' CALL DS_READ CALL ENV_BYTE ;ENVIA PARA LCD LOOP4 CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_DATA1 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MES1 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_ANO1 BTFSC SW_MENU GOTO LOOP4 GOTO AJUSTAR_PROG ;DESCOMENTAR APÓS ELIMINAR TESTE AJUSTE_DATA1 MOVLW C_DATA CALL DS_READ ;LE DATA CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT7 CALL INC_DEZ_BUFFER PULT7 MOVFW BUFFER XORLW 0X32 BTFSS STATUS,Z GOTO PULN3 CLRF BUFFER INCF BUFFER,F ;ELIMINA DIA '0' PULN3 MOVLW 0XC5 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_DATA CALL DS_WRITE ;ENVIA BUFFER PARA DS1307 CALL DELAY_INCREMENTOS GOTO LOOP4 AJUSTE_MES1 MOVLW C_MES CALL DS_READ ;LE MES CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT8 CALL INC_DEZ_BUFFER PULT8 MOVFW BUFFER XORLW 0X13 BTFSS STATUS,Z GOTO SEGL6 CLRF BUFFER INCF BUFFER,F ;ELIMINA MES '0' SEGL6 MOVLW 0XC8 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_MES CALL DS_WRITE ;ENVIA BUFFER PARA DS1307 CALL DELAY_INCREMENTOS GOTO LOOP4 AJUSTE_ANO1 MOVLW C_ANO CALL DS_READ ;LE ANO CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT9 CALL INC_DEZ_BUFFER PULT9 MOVFW BUFFER XORLW 0XA0 BTFSC STATUS,Z CLRF BUFFER MOVFW BUFFER MOVLW 0XCB ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_ANO CALL DS_WRITE ;ENVIA BUFFER PARA DS1307 CALL DELAY_INCREMENTOS GOTO LOOP4 ;================================================================================================= ; PROGRAMAR HORA DE LIGAR PARA O CANAL 1 ;================================================================================================= PROG_CANA1_LIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG6 ;MENSAGEM: 'CANAL1- LIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL1L_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL1L_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL1L_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP5 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_L_C1 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_L_C1 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_L_C1 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP5 AJUSTE_HORA_L_C1 MOVLW C_CANAL1L_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5 CALL INC_DEZ_BUFFER PULT5 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL1L_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP5 AJUSTE_MIN_L_C1 MOVLW C_CANAL1L_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6 CALL INC_DEZ_BUFFER PULT6 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL1L_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP5 AJUSTE_SEG_L_C1 MOVLW C_CANAL1L_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7 CALL INC_DEZ_BUFFER PULE7 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL1L_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP5 ;================================================================================================= ; PROGRAMAR HORA DE DESLIGAR PARA O CANAL 1 ;================================================================================================= PROG_CANA1_DESLIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG7 ;MENSAGEM: 'CANAL1- DESLIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL1D_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL1D_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL1D_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP6 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_D_C1 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_D_C1 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_D_C1 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP6 AJUSTE_HORA_D_C1 MOVLW C_CANAL1D_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5B CALL INC_DEZ_BUFFER PULT5B CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL1D_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP6 AJUSTE_MIN_D_C1 MOVLW C_CANAL1D_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6B CALL INC_DEZ_BUFFER PULT6B CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL1D_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP6 AJUSTE_SEG_D_C1 MOVLW C_CANAL1D_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7B CALL INC_DEZ_BUFFER PULE7B CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL1D_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP6 ;================================================================================================= ; PROGRAMAR HORA DE LIGAR PARA O CANAL 2 ;================================================================================================= PROG_CANA2_LIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG8 ;MENSAGEM: 'CANAL2- LIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL2L_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL2L_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL2L_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP7 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_L_C2 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_L_C2 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_L_C2 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP7 AJUSTE_HORA_L_C2 MOVLW C_CANAL2L_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5A1 CALL INC_DEZ_BUFFER PULT5A1 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL2L_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP7 AJUSTE_MIN_L_C2 MOVLW C_CANAL2L_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6A1 CALL INC_DEZ_BUFFER PULT6A1 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL2L_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP7 AJUSTE_SEG_L_C2 MOVLW C_CANAL2L_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7A1 CALL INC_DEZ_BUFFER PULE7A1 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL2L_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP7 ;================================================================================================= ; PROGRAMAR HORA DE DESLIGAR PARA O CANAL 2 ;================================================================================================= PROG_CANA2_DESLIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG9 ;MENSAGEM: 'CANAL2- DESLIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL2D_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL2D_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL2D_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP8 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_D_C2 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_D_C2 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_D_C2 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP8 AJUSTE_HORA_D_C2 MOVLW C_CANAL2D_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5BA1 CALL INC_DEZ_BUFFER PULT5BA1 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 MOVLW 0XC4 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL2D_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP8 AJUSTE_MIN_D_C2 MOVLW C_CANAL2D_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6BA1 CALL INC_DEZ_BUFFER PULT6BA1 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL2D_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP8 AJUSTE_SEG_D_C2 MOVLW C_CANAL2D_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7BA1 CALL INC_DEZ_BUFFER PULE7BA1 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL2D_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP8 ;================================================================================================= ; PROGRAMAR HORA DE LIGAR PARA O CANAL 3 ;================================================================================================= PROG_CANA3_LIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG10 ;MENSAGEM: 'CANAL3 - LIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL3L_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL3L_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL3L_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP9 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_L_C3 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_L_C3 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_L_C3 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP9 AJUSTE_HORA_L_C3 MOVLW C_CANAL3L_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5A2 CALL INC_DEZ_BUFFER PULT5A2 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 MOVLW 0XC4 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL3L_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP9 AJUSTE_MIN_L_C3 MOVLW C_CANAL3L_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6A2 CALL INC_DEZ_BUFFER PULT6A2 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL3L_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP9 AJUSTE_SEG_L_C3 MOVLW C_CANAL3L_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7A2 CALL INC_DEZ_BUFFER PULE7A2 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL3L_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP9 ;================================================================================================= ; PROGRAMAR HORA DE DESLIGAR PARA O CANAL 3 ;================================================================================================= PROG_CANA3_DESLIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG11 ;MENSAGEM: 'CANAL3- DESLIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL3D_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL3D_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL3D_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP10 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_D_C3 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_D_C3 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_D_C3 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP10 AJUSTE_HORA_D_C3 MOVLW C_CANAL3D_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5BA2 CALL INC_DEZ_BUFFER PULT5BA2 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL3D_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP10 AJUSTE_MIN_D_C3 MOVLW C_CANAL3D_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6BA2 CALL INC_DEZ_BUFFER PULT6BA2 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL3D_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP10 AJUSTE_SEG_D_C3 MOVLW C_CANAL3D_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7BA2 CALL INC_DEZ_BUFFER PULE7BA2 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL3D_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP10 ;================================================================================================= ; PROGRAMAR HORA DE LIGAR PARA O CANAL 4 ;================================================================================================= PROG_CANA4_LIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG12 ;MENSAGEM: 'CANAL4 - LIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL4L_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL4L_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL4L_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP11 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_L_C4 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_L_C4 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_L_C4 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP11 AJUSTE_HORA_L_C4 MOVLW C_CANAL4L_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5A3 CALL INC_DEZ_BUFFER PULT5A3 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVFW BUFFER ;ENVIA PARA PARA LCD CALL ENV_BYTE MOVLW C_CANAL4L_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP11 AJUSTE_MIN_L_C4 MOVLW C_CANAL4L_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6A3 CALL INC_DEZ_BUFFER PULT6A3 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL4L_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP11 AJUSTE_SEG_L_C4 MOVLW C_CANAL4L_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7A3 CALL INC_DEZ_BUFFER PULE7A3 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL4L_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP11 ;================================================================================================= ; PROGRAMAR HORA DE DESLIGAR PARA O CANAL 4 ;================================================================================================= PROG_CANA4_DESLIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG13 ;MENSAGEM: 'CANAL4- DESLIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL4D_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL4D_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL4D_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP12 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_D_C4 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_D_C4 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_D_C4 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP12 AJUSTE_HORA_D_C4 MOVLW C_CANAL4D_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5BA4 CALL INC_DEZ_BUFFER PULT5BA4 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL4D_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP12 AJUSTE_MIN_D_C4 MOVLW C_CANAL4D_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6BR4 CALL INC_DEZ_BUFFER PULT6BR4 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL4D_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP12 AJUSTE_SEG_D_C4 MOVLW C_CANAL4D_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7BA4 CALL INC_DEZ_BUFFER PULE7BA4 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL4D_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP12 ;================================================================================================= ; PROGRAMAR HORA DE LIGAR PARA O CANAL 5 ;================================================================================================= PROG_CANA5_LIGA CALL LcdClear ;LIMPA LCD CLRF PCAUX ;ACERTA PAGINA DA MENSAGEM MOVLW MSG14 ;MENSAGEM: 'CANAL5 - LIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL5L_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL5L_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL5L_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP13 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_L_C5 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_L_C5 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_L_C5 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP13 AJUSTE_HORA_L_C5 MOVLW C_CANAL5L_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5A5 CALL INC_DEZ_BUFFER PULT5A5 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL5L_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP13 AJUSTE_MIN_L_C5 MOVLW C_CANAL5L_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6A5 CALL INC_DEZ_BUFFER PULT6A5 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL5L_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP13 AJUSTE_SEG_L_C5 MOVLW C_CANAL5L_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7A5 CALL INC_DEZ_BUFFER PULE7A5 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL5L_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP13 ;================================================================================================= ; PROGRAMAR HORA DE DESLIGAR PARA O CANAL 5 ;================================================================================================= PROG_CANA5_DESLIGA CALL LcdClear ;LIMPA LCD CALL PAGINA_1 ;ACERTA PAGINA DA MENSAGEM MOVLW MSG15 ;MENSAGEM: 'CANAL5- DESLIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL5D_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL5D_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL5D_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP14 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_D_C5 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_D_C5 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_D_C5 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP14 AJUSTE_HORA_D_C5 MOVLW C_CANAL5D_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5BA6 CALL INC_DEZ_BUFFER PULT5BA6 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL5D_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP14 AJUSTE_MIN_D_C5 MOVLW C_CANAL5D_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6BR6 CALL INC_DEZ_BUFFER PULT6BR6 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL5D_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP14 AJUSTE_SEG_D_C5 MOVLW C_CANAL5D_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7BA6 CALL INC_DEZ_BUFFER PULE7BA6 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL5D_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP14 ;================================================================================================= ; PROGRAMAR HORA DE LIGAR PARA O CANAL 6 ;================================================================================================= PROG_CANA6_LIGA CALL LcdClear ;LIMPA LCD CALL PAGINA_1 ;ACERTA PAGINA DA MENSAGEM MOVLW MSG16 ;MENSAGEM: 'CANAL6 - LIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL6L_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL6L_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL6L_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP15 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_L_C6 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_L_C6 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_L_C6 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP15 AJUSTE_HORA_L_C6 MOVLW C_CANAL6L_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5A7 CALL INC_DEZ_BUFFER PULT5A7 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL6L_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP15 AJUSTE_MIN_L_C6 MOVLW C_CANAL6L_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6A7 CALL INC_DEZ_BUFFER PULT6A7 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL6L_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP15 AJUSTE_SEG_L_C6 MOVLW C_CANAL6L_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7A7 CALL INC_DEZ_BUFFER PULE7A7 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL6L_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP15 ;================================================================================================= ; PROGRAMAR HORA DE DESLIGAR PARA O CANAL 6 ;================================================================================================= PROG_CANA6_DESLIGA CALL LcdClear ;LIMPA LCD CALL PAGINA_1 ;ACERTA PAGINA DA MENSAGEM MOVLW MSG17 ;MENSAGEM: 'CANAL6- DESLIGARA' CALL ENV_LCD CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA MOVLW C_CANAL6D_H CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL6D_M CALL EEREAD ;LE EEPROM CALL ENV_BYTE MOVLW ':' CALL ED MOVLW C_CANAL6D_S CALL EEREAD ;LE EEPROM CALL ENV_BYTE LOOP16 CALL DELAY_INCREMENTOS CALL IN_SW BTFSS SW_HORAS ;TESTA BOTÃO DE HORAS GOTO AJUSTE_HORA_D_C6 BTFSS SW_MIN ;TESTA BOTÃO DE MINUTOS GOTO AJUSTE_MIN_D_C6 BTFSS SW_SEG ;TESTA BOTÃO DE SEGUNDOS GOTO AJUSTE_SEG_D_C6 BTFSS SW_MENU GOTO AJUSTAR_PROG GOTO LOOP16 AJUSTE_HORA_D_C6 MOVLW C_CANAL6D_H CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT5BA8 CALL INC_DEZ_BUFFER PULT5BA8 CALL BUFFER_E24 ;TESTA SE CHEGOU A 24 CALL POS_C4 ;ENVIA POSICÃO A SER ESCRITA CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL6D_H CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP16 AJUSTE_MIN_D_C6 MOVLW C_CANAL6D_M CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULT6BR8 CALL INC_DEZ_BUFFER PULT6BR8 CALL BUFFER_E60 MOVLW 0XC7 ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL6D_M CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP16 AJUSTE_SEG_D_C6 MOVLW C_CANAL6D_S CALL EEREAD ;LE EEPROM CALL INC_BUFFER BTFSS STATUS,Z GOTO PULE7BA8 CALL INC_DEZ_BUFFER PULE7BA8 CALL BUFFER_E60 MOVLW 0XCA ;POSICIONA CURSOR CALL EC CALL ENV_BUFFER_TO_LCD ;ENVIA PARA PARA LCD MOVLW C_CANAL6D_S CALL EEWRITE ;ESCREVE NA EEPROM GOTO LOOP16 ENV_BUFFER_TO_LCD MOVFW BUFFER ;ENVIA PARA PARA LCD CALL ENV_BYTE RETURN ;=============================================================================== ; ACERTA PINOS DAS CHAVES PARA ENTRADA ;=============================================================================== IN_SW BANK1 MOVLW TRIS_SW MOVWF TRISB BANK0 RETURN ;================================================================================================= ; ROTINAS PARA O DS1307 - I2C ;================================================================================================= I2C_READ: ;LER 8 BITS DO DS1307 MOVLW .8 MOVWF R7 GFD: CALL SDA_VIRA_IN BSF SCL BCF STATUS,C BTFSC SDA BSF STATUS,C RLF TEMP,F BCF SCL DECFSZ R7,F GOTO GFD MOVFW TEMP ;RETORNA EM 'W' OS 8 BITS LIDOS GOTO SDA_VIRA_SAIDA SDA_VIRA_IN BANK1 BSF TRIS_SDA ;SDA= ENTRADA BANK0 RETURN I2C_WRITE: ;ESCREVER 8 BITS NO DS1307 MOVWF TEMP ;SALVA O DADO A ESCREVER MOVLW .8 MOVWF R7 WRITING: RLF TEMP,F BCF SDA BTFSC STATUS,C BSF SDA CALL CLOCK DECFSZ R7,F GOTO WRITING RETURN I2C_START: ;CONDIÇÃO DE 'START' BSF SCL BSF SDA NOP BCF SDA GOTO SAI_SCL_0 I2C_STOP: ;ENCERRA COMUNICAÇÃO I2C BCF SDA BSF SCL NOP BSF SDA GOTO SAI_SCL_0 CLOCK: ;CLOCK BSF SCL GOTO $+1 SAI_SCL_0 NOP BCF SCL RETURN ACK: ;ENVIA 'ACK' BSF SCL CALL SDA_VIRA_IN BTFSC SDA GOTO $-1 BCF SCL GOTO SDA_VIRA_SAIDA NO_ACK: ;ENVIA 'NO ACK' BCF SCL CALL SDA_VIRA_IN BTFSS SDA GOTO $-1 BSF SCL SDA_VIRA_SAIDA ;MUDA PINO 'SDA' PARA SAÍDA BANK1 BCF TRIS_SDA ;saida BANK0 RETURN ;***************************************************************** ; ROTINA DE ESCRITA NA DS1307 ;****************************************************************** ;COLOQUE ENDEREÇO DE 'W' EM 'ADDRESS' E DADO A ESCREVER EM 'BUFFER' DS_WRITE: CALL INIT_I2C_COMUM MOVFW BUFFER CALL I2C_WRITE CALL ACK CALL I2C_STOP RETURN ;*********************************************************************** ; ROTINA DE LEITURA NA DS1307 ;*********************************************************************** ;COLOQUE ENDEREÇO DE 'W' EM 'ADDRESS' E RECEBA O DADO EM 'BUFFER' E 'W' DS_READ: ;LENDO DS CALL INIT_I2C_COMUM CALL I2C_START CALL DS_READ_ADDR CALL ACK CALL I2C_READ CALL NO_ACK CALL I2C_STOP MOVWF BUFFER RETURN INIT_I2C_COMUM MOVWF ADDRESS CALL I2C_START CALL DS_WRITE_ADDR CALL ACK MOVFW ADDRESS CALL I2C_WRITE CALL ACK RETURN DS_READ_ADDR: MOVLW 0XD1 ;SOMA OS 11010001B PARA DS1307 GOTO ESC_I2C DS_WRITE_ADDR: MOVLW 0XD0 ;SOMA OS 11010000B PARA DS1307 ESC_I2C CALL I2C_WRITE RETURN ;=============================FIM I2C=========================== ;============================================================================== ; ROTINA DE EEPROM ;============================================================================== EEWRITE ; ******* EEPROM WRITE ENABLE ****************** ;endereço esta em ADDRESS ;DADOS A ESCREVER ESTA EM TMP(MSB) BANK1 MOVWF EEADR BANK0 MOVFW BUFFER ; MOVFW TMP ;PEGA PRIMEIRO DADO BANK1 MOVWF EEDATA BCF EECON1, EEIF BSF EECON1, WREN ; HABILITA ESCRITA MOVLW 0x55 MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BSF EECON1, WR LOOP_EEPROM CLRWDT BTFSC EECON1, WR ; ACABOU A ESCRITA ? GOTO LOOP_EEPROM BCF EECON1, WREN ; DESABILITA ESCRITA BANK0 RETURN EEREAD ;endereço esta em ADDRESS ;DADOS LIDOS SERÃO ESCRITOS EM TMP0 BANK1 MOVWF EEADR BSF EECON1, RD ; FARÁ UMA LEITURA BTFSC EECON1, RD ; JÁ FEZ? GOTO $-1 ;NÃO, ENTÃO AGUARDA; MOVF EEDATA,W ;FEZ, PASSA PARA 'W' BANK0 ; MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM MOVWF BUFFER RETURN ;============================================================================== ; ROTINAS DE DELAY ;============================================================================== DELAYW DELAY_W ; CARGA DE 'W' X 50 MS MOVWF DEL2 CALL DELAY_50MS DECFSZ DEL2,F GOTO $-2 RETURN DELAY_50MS MOVLW .50 DELAY_MS ;TEMPO EM MS PASSADO EM 'W' MOVWF DEL1 CLRF DEL0 NOP DECFSZ DEL0,F GOTO $-2 DECFSZ DEL1,F GOTO $-5 RETURN ;=========================================================== DELAY_INCREMENTOS MOVLW .7 CALL DELAYW RETURN ;================================================================================= ; ROTINAS DE CONTROLE DO LCD ;================================================================================= LcdInit ;ROTINA INICIALIZAÇÃO DO LCD MOVLW .30 ;Wait 30 ms CALL DELAY_MS bcf LCD_RS ;Set LCD command mode bsf LCD_DB4 ;0011->48 bsf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 call LcdPulse_E ;sequência de reset call LcdPulse_E call LcdPulse_E bcf LCD_DB4 bcf LCD_DB6 bcf LCD_DB7 bsf LCD_DB5 call LcdPulse_E movlw 28H ;Set 4 bit data bus length call EC movlw 06H ;Entry mode set, increment, no shift call EC ; movlw 0DH ;Display ON, Cursor ON, Blink ON ; movlw 0FH ;Display ON, Cursor ALTERADO ON, Blink ON ; movlw 0EH ;Display ON, Cursor ON, Blink OFF movlw 0CH ;Display ON, Cursor OFF, Blink OFF call EC LcdClear CLEAR_LCD movlw 01H ;clear display call EC movlw .5 ;Wait 2 ms call DELAY_MS return BIN_ASC_ED ;ROTINA DE BINARIO PARA HEX 0-F COM ENVIO PARA LCD ANDLW 0X0F ;LIMITA 0-F ADDLW 0XF6 ;SOMA 0XF6 BTFSC STATUS,C ;TESTA CARRY ADDLW 0X07 ;C=1 ,ENTÃO SOMA + 7 ADDLW 0X3A ;SOMA 0X3A ;ENVIA PARA O LCD E RETORNA PARA O PONTO DE CHAMADA ED LcdSendData bsf LCD_RS GOTO XENV LINE1 MOVLW 0X80 GOTO EC LINE2 MOVLW 0XC0 EC LcdSendCommand bcf LCD_RS XENV LcdSendByte movwf TR ;Send a byte to LCD by 4 bit data bus ;====================== ;ACERTA PINOS COMO SAIDA BANK1 MOVLW TRIS_LCD MOVWF TRISB BANK0 bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 btfsc TR,4 bsf LCD_DB4 btfsc TR,5 bsf LCD_DB5 btfsc TR,6 bsf LCD_DB6 btfsc TR,7 bsf LCD_DB7 call LcdPulse_E bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 btfsc TR,0 bsf LCD_DB4 btfsc TR,1 bsf LCD_DB5 btfsc TR,2 bsf LCD_DB6 btfsc TR,3 bsf LCD_DB7 ; call LcdPulse_E ; return LcdPulse_E bsf LCD_E ;Enables LCD clrw addlw .4 btfss STATUS,C goto $-2 bcf LCD_E ;Disabled LCD return CLEAR_L2 MOVLW 0XC0 CALL EC MOVLW MSG5 ;APAGAR LINHA 2 CALL ENV_LCD MOVLW 0XC0 CALL EC RETURN LINHA1 LINHA_1 MOVLW 0X80 CALL EC RETURN LINHA_2 LINHA2 MOVLW 0XC0 CALL EC RETURN ;=============================================================================== ;ROTINA DE ENVIO DE FRASES PARA O LCD ENV_LCD MOVWF AUX RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z GOTO SAI_34 CALL ED INCF AUX,F MOVFW AUX GOTO RT1 SAI_34 CLRF PCAUX ;ZERA PAGINA RETURN ;=================================================================================================== ; ENVIA UM BYTE PARA O LCD ;=================================================================================================== ENV_BYTE MOVWF R0 ;SALVA EM R0 SWAPF R0,W ;PEGA NIBLE HIGH ANDLW 0X0F ;LIMITA ADDLW 0X30 ;TRANSFORMA EM ASCII CALL ED ;ENVIA UM DADO (BYTE) MOVFW R0 ;PEGA NIBLE LOW ANDLW 0X0F ;LIMITA ADDLW 0X30 ;TRANSFORMA EM ASCII GOTO ED ;ENVIA UM DADO (BYTE) ; CALL ED ;ENVIA UM DADO (BYTE) ; RETURN ;RETORNA ;================================================================================================== ;APONTA PARA SEGUNDOS APONTA_SEG MOVLW SEG ;APONTA INICIO DOS REGISTRADORES ATUALIZADOS MOVWF FSR ;COLOCA NO PONTEIRO MOVLW .3 MOVWF CNT RETURN ;==================================================================================================== ;SOMA 3 AO FSR PARA APONTAR NO NOVO ENDEREÇO DA EEPROM FSR_MAIS3 MOVFW FSR_E1 ;ACERTA O ENDEREÇO DA EEPROM ADDLW .3 MOVWF FSR_E1 MOVWF FSR_E RETURN ;==================================================================================================== ;BUSCA VALOR PROGRAMADO NA EEPROM E COMPARA COM DADO ATUALIZADO BUSCA_EEPROM MOVFW FSR_E CALL EEREAD ;LE EEPROM XORWF INDF,W RETURN ;================================================================================================== ;================================================================================================== ;INCREMENTA BUFFER INC_BUFFER INCF BUFFER,F MOVFW BUFFER ANDLW 0X0F XORLW 0X0A RETURN INC_DEZ_BUFFER MOVFW BUFFER ADDLW 0X10 ANDLW 0XF0 MOVWF BUFFER RETURN PAGINA_1 MOVLW .1 MOVWF PCAUX RETURN POS_C4 MOVLW 0XC4 CALL EC ;POSICIONA CURSOR PARA VISUALIZAR RELOGIO NA 2º LINHA RETURN BUFFER_E60 MOVFW BUFFER XORLW 0X60 BTFSC STATUS,Z CLRF BUFFER RETURN BUFFER_E24 MOVFW BUFFER XORLW 0X24 BTFSC STATUS,Z CLRF BUFFER RETURN ;=================================================================================================== ; VETOR DE INTERRUPCAO ;=================================================================================================== INT_TMR1 MOVWF W_TEMP ;SALVA 'W' (MODO COMPILER) MOVF STATUS,W ;SALVA 'STATUS' MOVWF STATUS_TEMP BANK0 BCF PIR1,0 ;APAGA FLAG DO TMR1 BSF FLAG_1SEG ;SET FLAG DE 0,25 SEGUNDOS SAI_INT MOVF STATUS_TEMP,W ;RECUPERA 'STATUS' (MODO COMPILER) MOVWF STATUS SWAPF W_TEMP,F ;RECUPERA 'W' SWAPF W_TEMP,W RETFIE ORG 0X2100 DE .0,.1,.1,.0,.1,.1,.0,.1,.1,.0,.1,.1 DE .0,.1,.1,.0,.1,.1,.0,.1,.1,.0,.1,.1 DE .0,.1,.1,.0,.1,.1,.0,.1,.1,.0,.1,.1 END