;*************************************************************************************************** ; ; PROJETO : RELOGIO_DS1302_RS232 ; ; VISUALIZAR HORAS,MINUTOS,SEGUNDOS,DATA E DIA DA SEMANA ; VIA RS232 EM UM PC. ; INICIO : 20/02/13 TERM.:22/02/13 ; AUTOR: CLÁUDIO CARMONA LÁRIOS ; PROCESSADOR: PIC 16F676 ; PROJETO DIDÁTICO APENAS. ; PINAGEM: ; PINO 1 = VCC ; PINO 2 = RS232 (ENVIA) P/ PINO 2 DA DB9 ; PINO 3 = NC ; PINO 4 = RS232 (RECEBE) P/ PINO 3 DA DB9 ; PINO 5 = NC ; PINO 6 = NC ; PINO 7 = RST P/ DS1302 ; PINO 8 = NC ; PINO 9 = NC ; PINO 10 = NC ; PINO 11 = NC ; PINO 12 = NC ; PINO 13 = NC ; PINO 14 = GND ;___________________________________________________________________________________________________ ; LIST P=16f676 , R=DEC INCLUDE "P16F676.INC" ;ARQUIVO PADRAO ERRORLEVEL -302 ;ELIMINA MENSAGEM DE ERRO ;PALAVRA DE CONFGURAÇÃO: __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN & _MCLRE_OFF ;PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS DA RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA CONT0 ;CONTADOR AUXILIAR PARA RESULTADO PARTE BAIXA DA CONVERSÃO CONT1 ;CONTADOR AUXILIAR PARA RESULTADO PARTE ALTA DA CONVERSÃO CONT0A ;CONTADOR AUXILIAR PARA RESULTADO PARTE BAIXA DA CONVERSÃO CONT1A ;CONTADOR AUXILIAR PARA RESULTADO PARTE ALTA DA CONVERSÃO TEMP ;TEMPORÁRIO TEMP1 TEMP2 AUX ;IDEM AUX1 ;IDEM LC ;DELAY LC1 ;IDEM TR ;BUFFER PARA ENVIO DO LCD C0 ;REGISTRADOR PARA CONVERSÃO C1 ;IDEM BR0 ;RESULTADO DE CONVERSÃO BR1 ;IDEM BR2 ;IDEM R0 ;AUXILIAR USADO NA CONVERSÃO HEXA PARA ASCII R1 ;IDEM PAG ;AUX DE SALTO GOTO FLAGS ;FLAGS CONT_SENSOR ;CONTADOR DO SENSOR SELECIONADO BUFFER ;REGISTRADOR PARA A SERIAL CNT CNT1 ENDC ;*********************************************************************************************** ; CONSTANTES #DEFINE RST PORTC,3 ;PINO 7 #DEFINE SDA PORTC,4 ;PINO 6 #DEFINE TRIS_SDA TRISC,4 ;PINO 6 (IN/OUT) #DEFINE SCL PORTC,5 ;PINO 5 #DEFINE R_232 PORTA,3 ;PINO 4 RECEBE DA RS232 (3 DA DB9) #DEFINE T_232 PORTA,5 ;PINO 2 TRANSMITE P/ RS232 (2 DA DB9) ;#DEFINE FLAG_ZESQ FLAGS,0 ;FLAG INDICADOR DE ZEROS A ESQUERDA #DEFINE FLAG_NC FLAGS,1 ;FLAG DE NOVA CONVERSÃO #DEFINE FLAG_NCA FLAGS,2 ;FLAG DE REPETE NOVA CONVERSÃO #DEFINE FLAG_ZESQ FLAGS,3 ;FLAG DE ZERO A ESQUERDA T_APRES EQU .20 ;TEMPO DE APRESENTAÇÃO DA ULTIMA COMVERSÃO VLINHA1 EQU 80H ;ENDEREÇO DA LINHA 1 VLINHA2 EQU 0C0H ;ENDEREÇO DA LINHA 2 ;+++++================================================================================ ;EQUATES P/ COMANDO DS1302 C_SEC EQU 0X80 C_MIN EQU 0X82 C_HORA EQU 0X84 C_DATA EQU 0X86 C_MES EQU 0X88 C_DIA EQU 0X8A C_ANO EQU 0X8C C_CONTROL EQU 0X8E C_TRICK_CH EQU 0X90 C_CLOCK_B EQU 0XBE C_RAM_B EQU 0XFD XON EQU 0X11 XOFF EQU 0X13 ;========================================================================================= ; VETOR DE RESET ORG 0X00 GOTO INICIO ;========================================================================================= ; VETOR DE INTERRUPCAO ORG 0X04 RETFIE ;========================================================================================= ;PAGINA ZERO ;ROTINA PARA ENVIO DE FRASES PARA A SERIAL ENV_SERIAL MOVWF AUX MOVFW PAG MOVWF PCLATH MOVFW AUX RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z RETURN CALL SEND INCF AUX,F MOVFW AUX GOTO RT1 PEGA_M MOVWF PCL FRASE1: dt 0x0a,0x0d,0x0a,0x0d,"***RELOGIO DIDATICO COM DS1302***", 0x0a,0x0d,0x0a,0x0d,0 FRASE2: dt "BLOG 'LARIOS.TECNOLOGIA.WS'",0x0a,0x0d,0x0a,0x0d,0 FRASE3: dt " TEMP = ",0 FRASE4: dt "HORAS: ",0 FRASE5: dt " DATA:",0 FRASE_SEG1: dt " SEGUNDA_FEIRA",0 FRASE_TER2: dt " TERCA_FEIRA ",0 FRASE_QUA3: dt " QUARTA_FEIRA ",0 FRASE_QUI4: dt " QUINTA_FEIRA ",0 FRASE_SEX5: dt " SEXTA_FEIRA ",0 FRASE_SAB6: dt " SABADO ",0 FRASE_DOM7: dt " DOMINGO ",0 PEGA_FEIRA MOVWF AUX MOVFW PAG MOVWF PCLATH MOVFW AUX ANDLW 0X07 ADDWF PCL,F GOTO SEGUNDA GOTO TERCA GOTO QUARTA GOTO QUINTA GOTO SEXTA GOTO SABADO GOTO DOMINGO SEGUNDA CLRF PAG MOVLW FRASE_SEG1 ; FRASE 'SEGUNDA ' CALL ENV_SERIAL GOTO VOLTAR_SEQUENCIA TERCA CLRF PAG MOVLW FRASE_TER2 ; FRASE 'TERCA ' CALL ENV_SERIAL GOTO VOLTAR_SEQUENCIA QUARTA CLRF PAG MOVLW FRASE_QUA3 ; FRASE 'QUARTA ' CALL ENV_SERIAL GOTO VOLTAR_SEQUENCIA QUINTA CLRF PAG MOVLW FRASE_QUI4 ; FRASE 'QUINTA ' CALL ENV_SERIAL GOTO VOLTAR_SEQUENCIA SEXTA CLRF PAG MOVLW FRASE_SEX5 ; FRASE 'SEXTA ' CALL ENV_SERIAL GOTO VOLTAR_SEQUENCIA SABADO CLRF PAG MOVLW FRASE_SAB6 ; FRASE 'SABADO ' CALL ENV_SERIAL GOTO VOLTAR_SEQUENCIA DOMINGO CLRF PAG MOVLW FRASE_DOM7 ; FRASE 'DOMINGO ' CALL ENV_SERIAL GOTO VOLTAR_SEQUENCIA ;================================================================================== ; INICIO DO PROGRAMA ;================================================================================== ;CONFIGURAÇÕES INICIAIS DOS REGISTRADORES E PORTAS INICIO BANK1 ;BANCO 1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW .0 MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES MOVLW b'11011111' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISA ; MOVLW b'11000111' MOVWF TRISC MOVLW B'10000000' ;DESAHABILITA PULL-UP DA PIO MOVWF OPTION_REG ;IDEM CLRF ANSEL CLRF VRCON ;DESLIGA TENSÃO DE REFERENCIA BANK0 MOVLW .7 ;DESLIGA COMPARADORES ANALÓGICOS MOVWF CMCON CLRF PORTA ;LIMPA PORTA E C CLRF PORTC BSF T_232 ;TX SERIAL NIVEL ALTO CLRF FLAGS ;IDEM FLAGS MOVLW 0X00 ; LIBERA ESCRITA NO DS1302 MOVWF BUFFER MOVLW C_CONTROL CALL W_SPI MOVLW 0X00 ; LIGA RELOGIO MOVWF BUFFER MOVLW C_SEC CALL W_SPI CLRF PAG MOVLW FRASE1 CALL ENV_SERIAL CLRF PAG MOVLW FRASE2 CALL ENV_SERIAL MOVLW .3 MOVWF PAG MOVLW FRASE_AJUDA ; FRASE COM FUNÇÕES DO TECLADO PARA ACERTO CALL ENV_SERIAL ;============================================================================================ ; LOOP PRINCIPAL ;============================================================================================ MAIN ;============================================================================================ VTR MOVLW XOFF CALL SEND MOVLW 0X0D CALL SEND BANK1 CLRF ANSEL BANK0 CLRF PAG MOVLW FRASE4 ; FRASE 'HORAS: ' CALL ENV_SERIAL MOVLW C_HORA CALL R_SPI ;LE HORAS CALL ENVIAR_W_PARA_SERIAL MOVLW ':' CALL SEND MOVLW C_MIN CALL R_SPI ;LE MINUTOS CALL ENVIAR_W_PARA_SERIAL MOVLW ':' CALL SEND MOVLW C_SEC CALL R_SPI ;LE SEGUNDOS CALL ENVIAR_W_PARA_SERIAL MOVLW ' ' CALL SEND CLRF PAG MOVLW FRASE5 ;ENVIA FRASE NA SERIAL: ' DATA: ' CALL ENV_SERIAL MOVLW C_DATA CALL R_SPI ;LE DATA CALL ENVIAR_W_PARA_SERIAL MOVLW '/' CALL SEND MOVLW C_MES CALL R_SPI ;LE MES CALL ENVIAR_W_PARA_SERIAL MOVLW '/' CALL SEND MOVLW C_ANO CALL R_SPI ;LE ANO CALL ENVIAR_W_PARA_SERIAL CLRF PAG MOVLW C_DIA CALL R_SPI ;LE MES GOTO PEGA_FEIRA VOLTAR_SEQUENCIA MOVLW 0X02 MOVWF TEMP2 CLRF TEMP1 CLRF TEMP MOVLW XON CALL SEND VMM BTFSS R_232 ;TESTA SE TEM ALGUMA RECEPÇÃO DE COMANDO GOTO TEM_REC DECFSZ TEMP,F GOTO VMM DECFSZ TEMP1,F GOTO VMM DECFSZ TEMP2,F GOTO VMM ; GOTO MAIN GOTO VTR ;TESTE TEM_REC CALL RECEIVE MOVWF TEMP XORLW 'H' BTFSC STATUS,Z GOTO ACERTAR_HORAS MOVFW TEMP XORLW 'M' BTFSC STATUS,Z GOTO ACERTAR_MIN MOVFW TEMP XORLW 'S' BTFSC STATUS,Z GOTO ACERTAR_SEG MOVFW TEMP XORLW 'D' BTFSC STATUS,Z GOTO ACERTAR_DATA MOVFW TEMP XORLW 'E' BTFSC STATUS,Z GOTO ACERTAR_MES MOVFW TEMP XORLW 'A' BTFSC STATUS,Z GOTO ACERTAR_ANO MOVFW TEMP XORLW 'F' BTFSC STATUS,Z GOTO ACERTAR_DIA_DA_SEMANA GOTO VTR ;TESTE ACERTAR_HORAS MOVLW C_HORA CALL R_SPI ;LE HORAS ADDLW .1 ;SOMA 1 MOVWF TEMP ;SALVA EM TEMP A LEITURA XORLW 0X0A ;COMPARA COM 'A' BTFSS STATUS,Z GOTO N_0X0A MOVLW 0X10 ;FAZ AJUSTE DECIMAL MOVWF TEMP GOTO M_BUF N_0X0A MOVFW TEMP XORLW 0X1A BTFSS STATUS,Z GOTO N_0X1A MOVLW 0X20 MOVWF TEMP GOTO M_BUF N_0X1A MOVFW TEMP XORLW 0X24 BTFSS STATUS,Z GOTO N_0X24 CLRF TEMP GOTO M_BUF M_BUF N_0X24 MOVFW TEMP MOVWF BUFFER MOVLW C_HORA CALL W_SPI ; GOTO MAIN GOTO VTR ;TESTE ACERTAR_MIN MOVLW C_MIN CALL R_SPI ;LE HORAS ADDLW .1 MOVWF TEMP ;SALVA XORLW 0X0A BTFSC STATUS,Z MOVLW 0X10 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X1A BTFSC STATUS,Z MOVLW 0X20 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X2A BTFSC STATUS,Z MOVLW 0X30 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X3A BTFSC STATUS,Z MOVLW 0X40 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X4A BTFSC STATUS,Z MOVLW 0X50 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X5A BTFSC STATUS,Z MOVLW 0X00 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP MOVWF BUFFER MOVLW C_MIN CALL W_SPI ; GOTO MAIN GOTO VTR ;TESTE ACERTAR_SEG MOVLW C_SEC CALL R_SPI ;LE HORAS ADDLW .1 MOVWF TEMP ;SALVA XORLW 0X0A BTFSC STATUS,Z MOVLW 0X10 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X1A BTFSC STATUS,Z MOVLW 0X20 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X2A BTFSC STATUS,Z MOVLW 0X30 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X3A BTFSC STATUS,Z MOVLW 0X40 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X4A BTFSC STATUS,Z MOVLW 0X50 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X5A BTFSC STATUS,Z MOVLW 0X00 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP MOVWF BUFFER MOVLW C_SEC CALL W_SPI ; GOTO MAIN GOTO VTR ;TESTE ACERTAR_DATA MOVLW C_DATA CALL R_SPI ;LE HORAS ADDLW .1 MOVWF TEMP ;SALVA XORLW 0X0A BTFSC STATUS,Z MOVLW 0X10 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X1A BTFSC STATUS,Z MOVLW 0X20 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X2A BTFSC STATUS,Z MOVLW 0X30 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X32 ;31 DIAS MAXIMO BTFSC STATUS,Z MOVLW 0X01 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP MOVWF BUFFER MOVLW C_DATA CALL W_SPI ; GOTO MAIN GOTO VTR ;TESTE ACERTAR_MES MOVLW C_MES CALL R_SPI ;LE HORAS ADDLW .1 MOVWF TEMP ;SALVA XORLW 0X0A BTFSC STATUS,Z MOVLW 0X10 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP ;SALVA XORLW 0X13 BTFSC STATUS,Z MOVLW 0X01 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP MOVWF BUFFER MOVLW C_MES CALL W_SPI ; GOTO MAIN GOTO VTR ;TESTE ACERTAR_ANO MOVLW C_ANO CALL R_SPI ;LE HORAS ADDLW .1 MOVWF TEMP ;SALVA XORLW 0X0A BTFSC STATUS,Z MOVLW 0X10 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X1A BTFSC STATUS,Z MOVLW 0X20 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X2A BTFSC STATUS,Z MOVLW 0X30 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X3A BTFSC STATUS,Z MOVLW 0X40 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X4A BTFSC STATUS,Z MOVLW 0X50 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X5A BTFSC STATUS,Z MOVLW 0X60 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X6A BTFSC STATUS,Z MOVLW 0X70 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X7A BTFSC STATUS,Z MOVLW 0X80 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X8A BTFSC STATUS,Z MOVLW 0X90 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP XORLW 0X9A BTFSC STATUS,Z MOVLW 0X00 ;ZERA ANO BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP MOVWF BUFFER MOVLW C_ANO CALL W_SPI ; GOTO MAIN GOTO VTR ;TESTE ACERTAR_DIA_DA_SEMANA MOVLW C_DIA CALL R_SPI ;LE HORAS ADDLW .1 MOVWF TEMP ;SALVA XORLW 0X08 BTFSC STATUS,Z MOVLW 0X01 BTFSC STATUS,Z MOVWF TEMP MOVFW TEMP MOVWF BUFFER MOVLW C_DIA CALL W_SPI ; GOTO MAIN GOTO VTR ;TESTE ;======================================================================= ; SUB-ROTINAS ;======================================================================== MOSTRA_TEMP CLRF PAG MOVLW FRASE3 CALL ENV_SERIAL MOVFW BR1 CALL conv_asc2 ;CONVERTE PARA ASCII MOVWF AUX XORLW 0X30 ;TESTA SE É ZERO A ESQUERDA BTFSS STATUS,Z GOTO SEGUI2 BSF FLAG_ZESQ MOVLW ' ' ;APAGA ZERO A ESQUERDA GOTO SEGUI4 SEGUI2 MOVFW AUX SEGUI4 CALL SEND ;ULTIMO ZERO MOVFW R1 BTFSS FLAG_ZESQ GOTO SEGUI3 XORLW 0X30 ;VERIFICA SE É ZERO MOVLW ' ' ;SE ZERO ENVIA ESPAÇO BTFSS STATUS,Z MOVFW R1 SEGUI3 CALL SEND ;ENVIA CENTENA MOVFW BR0 CALL conv_asc2 ;ENVIA DEZENA CALL SEND MOVLW '.' ;ENVIA PONTO CALL SEND MOVFW R1 ;ENVIA UNIDADE CALL SEND MOVLW ' ' CALL SEND ;ENVIA 'C' (CENTIGRADOS) MOVLW 'C' CALL SEND MOVLW ' ' ;ENVIA ESPAÇO CALL SEND RETURN CONV_DEC ;************************************************************************** ; ROTINA PARA CONVERSÃO DE 16 BITS PARA 5 BCD (3BYTES) ; ; ; EX: C0=FF ; C1=FF ; SERÁ APÓS CONVERSÃO : ; BR2=06 , BR1=55 ,BR0=35 (OBS. VALOR MÁXIMO 65535) ;*************************************************************************** ; RESERVAR ESTES REGISTRADORES NA MEMÓRIA ( SRAM) ; LC data 20H ;LOOPCOUNTER ; BR0 data 21H ;RESULTADOS DA CONVERSÃO ; BR1 data 22H ; BR2 data 23H ; C1 data 24H ;VALOR DE ENTRADA ALTO ; C0 data 25H ;BAIXO HEX_DEC: MOVLW .16 MOVWF LC ;CARREGA 16 CLRF BR0 ;ZERA RESULTADOS CLRF BR1 CLRF BR2 VOLTA: BCF STATUS,C RLF C0,F ;DESLOCA PARA ESQUERDA C0,C1,BR0,1,2 RLF C1,F RLF BR0,F RLF BR1,F RLF BR2,F DECFSZ LC,F ;VERIFICA SE CHEGOU AO FIM DA CONVERSÃO GOTO SEG9 RETURN ;FI DA CONVERSÃO SEG9: MOVLW .3 ADDWF BR2,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3 ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR2,F ; É=1 ENTAO SOMA 3 NSOMA3: MOVLW 0X30 ADDWF BR2,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3A ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR2,F NSOMA3A: MOVLW .3 ADDWF BR1,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3B ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR1,F ; É=1 ENTAO SOMA 3 NSOMA3B: MOVLW 0X30 ADDWF BR1,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3C ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR1,F NSOMA3C: MOVLW .3 ADDWF BR0,W ;SOMA 3 EM RES2 ANDLW .8 ; 2ELEV 3=8 XORLW .8 BTFSS STATUS,Z GOTO NSOMA3D ;É=0 ,ENTÃO NÃO SOMA 3 (SE ZERO RETORNA VALOR ORIGINAL) MOVLW .3 ADDWF BR0,F ; É=1 ENTAO SOMA 3 NSOMA3D: MOVLW 0X30 ADDWF BR0,W ANDLW 0X80 XORLW 0X80 BTFSS STATUS,Z GOTO NSOMA3E ;É=0 ,ENTÃO NÃO SOMA 30h MOVLW 0X30 ; É=1 ENTAO SOMA 30h ADDWF BR0,F NSOMA3E: GOTO VOLTA ;================================================================================ CONV_ASC2: conv_asc2: ; converte 2 nibles hex em 2 nibles asc2 lsb=r1 msb=a MOVWF R0 ANDLW 0X0F ADDLW 0XF6 BTFSC STATUS,C GOTO LETRAS ADDLW 0X3A GOTO SAIQ LETRAS: ADDLW 0X41 SAIQ: MOVWF R1 SWAPF R0,F MOVFW R0 ANDLW 0X0F ADDLW 0XF6 BTFSC STATUS,C GOTO LETRAS1 ADDLW 0X3A GOTO SAIQ1 LETRAS1: ADDLW 0X41 SAIQ1: RETURN ;================================================================================ ;ROTINAS DE DELAY DELAY2 MOVLW .20 DELAYW DELAYM MOVWF TEMP VJ1 call LcdDelay1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC+1 ;duas variáveis em uma LcdDelayLoop decfsz LC+0,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC+1,F ;dec. o seg. cont. goto LcdDelayLoop return WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== ;DELAY MICROSEGUNDOS WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;======================================================================== ;ROTINA DE ENVIO DE FRASE INICIAL FRASEINIT CLRF PAG MOVLW FRASE1 CALL ENV_SERIAL MOVLW FRASE2 CALL ENV_SERIAL RETURN ;======================================================================== ;ROTINA DE RECEPÇAÕ DA SERIAL (38400 BAUDS) 'W' RETORNA O BYTE RECEBIDO RECEIVE MOVLW .8 MOVWF CNT MOVLW .7 CALL T_BAUD POBIT BCF STATUS,C BTFSC R_232 BSF STATUS,C RRF BUFFER,F NOP MOVLW .4 CALL T_BAUD DECFSZ CNT,F GOTO POBIT NOP MOVLW .4 CALL T_BAUD MOVFW BUFFER ;RETORNA VALOR RECEBIDO EM 'W' RETURN ;======================================================================== ;ROTINA DE ENVIO DA SERIAL (38400 BAUDS) 'W' ESTÁ COM O BIT A TRANSMITIR SEND MOVWF BUFFER MOVLW .8 MOVWF CNT BCF T_232 ;ENVIA START BIT MOVLW .7 CALL T_BAUD VTP1 RRF BUFFER,F BTFSS STATUS,C BCF T_232 BTFSC STATUS,C BSF T_232 NOP MOVLW .4 CALL T_BAUD DECFSZ CNT,F GOTO VTP1 BSF T_232 ;STOP BIT MOVLW .7 CALL T_BAUD RETURN ;TEMPO DE 26 uSEG (INCLUINDO RETORNO) T_BAUD MOVWF CNT1 DECFSZ CNT1,F GOTO $-1 RETURN ;========================================================================== ;************** ROTINA PARA O DS1302 ********************************* ;========================================================================== ;LER DADO - COLOQUE O COMANDO EM 'W' E NO RETORNO DA FUNÇÃO, LEIA O DADO EM 'W' R_SPI BCF SCL BCF SDA MOVWF BUFFER ;CARREGA COMANDO EM 'W' PARA O BUFFER BSF BUFFER,0 ;SETA BIT0 PARA INDICAR LEITURA BSF RST ;SETA RST PARA INICIAR A TRANSMISSÃO DE COMANDO CALL ENV_SPI ;ENVIA COMANDO NO BUFFER CALL LE_SPI ;RETORNA EM 'W' O DADO LIDO BCF RST ;FINALIZA A TRANSMISSÃO RETURN ;======================================================================== ;ESCREVER DADO - COLOQUE DADO NO 'BUFFER' E O COMANDO EM 'W' W_SPI BCF SCL BCF SDA MOVWF CNT ;SALVA COMANDO MOVFW BUFFER MOVWF CNT1 ;SALVA DADO A PROGRAMAR MOVFW CNT MOVWF BUFFER ;COPIA O COMANDO A ENVIAR BCF BUFFER,0 ;ZERA BIT 0 PARA INDICAR COMANDO BSF RST ;SETA RST PARA INICIAR A TRANSMISSÃO DE COMANDO CALL ENV_SPI MOVFW CNT1 ;RECUPERA 'DADO A ESCREVER' MOVWF BUFFER CALL ENV_SPI BCF RST ;ZERA RST RETURN ;============================================================================== ;PULSA O CLOCK PCLOCK BSF SCL GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 MOVLW .255 MOVWF TEMP1 DECFSZ TEMP1,F GOTO $-1 BCF SCL RETURN ;============================================================================== ; ENVIA CONTEUDO DO BUFFER ENV_SPI BCF SCL BCF SDA MOVLW .8 ;CARREGA CONTADOR PARA 8 BITS MOVWF CNT RET7 BCF STATUS,C RRF BUFFER,F BCF SDA BTFSC STATUS,C BSF SDA CALL PCLOCK DECFSZ CNT,F GOTO RET7 BCF SDA RETURN ;================================================================================= ; RECEBE DADO E COLOCA NO BUFFER LE_SPI MOVLW .8 ;CARREGA CONTADOR PARA 8 BITS MOVWF CNT BCF SCL BCF SDA BANK1 BSF TRIS_SDA ;SDA COMO ENTRADA BANK0 RET8 BCF STATUS,C BTFSC SDA ;TESTA ENTRADA SDA BSF STATUS,C RRF BUFFER,F ;RODA BUFFER DECFSZ CNT,F ;DECREMENTA GOTO VAI_CLOCK MOVFW BUFFER ;RETORNA EM 'W' O VALOR LIDO NO BUFFER BANK1 BCF TRIS_SDA ;SDA COMO SAIDA BANK0 RETURN VAI_CLOCK CALL PCLOCK GOTO RET8 ;===================================================================================== ENVIAR_W_PARA_SERIAL MOVWF TEMP SWAPF TEMP,W ANDLW 0X0F ADDLW 0X30 CALL SEND MOVFW TEMP ANDLW 0X0F ADDLW 0X30 CALL SEND RETURN ;=================================================================================== ;OBS. COLOCADO AQUI PARA APROVEITAR AS 'ULTIMAS LINHAS' DA FLASH FRASE_AJUDA: dt "Digite: H=horas, M=min, S=seg, D=dia, E= mes, A=ano e F=dia da semana",0x0a,0x0d,0x0a,0x0d,0 END