;************************************************************************************************ ; ; PROJETO TERMOSTATO ELETRÔNICO COM VISOR DE TEMPERATURA EM LCD (VERSÃO 2) ; ; UTILIZA COMO SENSOR DE TEMPERATURA O CI LM35 ; INICIO : 15/01/13 TERM.:17/01/13 REVISADO EM 08/02/2014 ; ACRESCENTADO: ; 1) VELOCIDADE DE INCREMENTO NO AJUSTE EM 3 NIVEIS: ; LENTO,MÉDIO E RÁPIDO, POR MANTER PRESSIONADO O BOTÃO DESEJADO. ; 2) SUBSTITUIDO MODO DE APRESENTAÇÃO DA FRASE'OFF' POR 'DES' E 'ON' POR 'LIG'. ; AUTOR: CLÁUDIO CARMONA LÁRIOS ; PROCESSADOR: PIC 16F676 ; PROJETO DIDÁTICO APENAS. ; OBJETIVO: CONTROLAR CARGA USANDO A TEMPERATURA COMO CONTROLE, MOSTRANDO A TEMPERATURA EM UM LCD ; PINAGEM: ; PINO 1 = VCC ; PINO 2 = UP ; PINO 3 = DOWN ; PINO 4 = BOTÃO DE MAX/MIN ; PINO 5 = E (LCD) ; PINO 6 = RS (LCD) ; PINO 7 = DB4 (LCD) ; PINO 8 = DB5 (LCD) ; PINO 9 = DB6 (LCD) ; PINO 10 = DB7 (LCD) ; PINO 11 = SAIDA PARA RELE DE CARGA ; PINO 12 = V REF (AJUSTE DE CALIBRAÇÃO = 2,048 VOLTS) ; PINO 13 = SENSOR LM35 ; 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 TMP ;IDEM 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 R2 ;IDEM PAG ;AUX DE SALTO GOTO FLAGS ;FLAGS FLAGS1 ;FLAGS MAX_H ;REGISTRADOR DE MAXIMA TEMPERATURA MAX_L ;REGISTRADOR DE MAXIMA TEMPERATURA MIN_H ;REGISTRADOR DE MINIMA TEMPERATURA MIN_L ;REGISTRADOR DE MINIMA TEMPERATURA CONT_VI ;VELOCIDADE DE INCREMENTOS CONT_VI2 ;VELOCIDADE DE INCREMENTOS ENDC ;*********************************************************************************************** ; CONSTANTES #DEFINE LIGAC ADCON0,1;DEFINE PALAVRA PARA LIGAR/DESLIGAR CONVERSÃO #DEFINE LCD_DB7 PORTC,0 ;PINO 10 #DEFINE LCD_DB6 PORTC,1 ;PINO 9 #DEFINE LCD_DB5 PORTC,2 ;PINO 8 #DEFINE LCD_DB4 PORTC,3 ;PINO 7 #DEFINE LCD_RS PORTC,4 ;PINO 6 #DEFINE LCD_E PORTC,5 ;PINO 5 #DEFINE UP PORTA,5 ;PINO 2 #DEFINE DOWN PORTA,4 ;PINO 3 #DEFINE MAX_MIN PORTA,3 ;PINO 4 #DEFINE OUT PORTA,2 ;PINO 11 #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_MAX FLAGS,3 ;FLAG DE MAX #DEFINE FLAG_MIN FLAGS,4 ;FLAG DE MIN #DEFINE FLAG_ZESQ1 FLAGS,5 ;FLAG INDICADOR DE ZEROS A ESQUERDA #DEFINE FLAG_ZESQ2 FLAGS,6 ;FLAG INDICADOR DE ZEROS A ESQUERDA #DEFINE FLAG_VI FLAGS,7 ;FLAG DE VELOCIDADE DE INCREMENTOS MÉDIO #DEFINE FLAG_VI2 FLAGS1,0 ;FLAG DE VELOCIDADE DE INCREMENTOS MÁXIMO T_APRES EQU .10 ;TEMPO DE APRESENTAÇÃO DA ULTIMA COMVERSÃO VLINHA1 EQU 80H ;ENDEREÇO DA LINHA 1 VLINHA2 EQU 0C0H ;ENDEREÇO DA LINHA 2 NUM_INC EQU .5 ;NUMERO DE INCREMENTOS LENTOS ANTES DO MÉDIO NUM_INC2 EQU .50 ;NUMERO DE INCREMENTOS MÉDIOS ANTES DO RÁPIDO ;===================================================================================== ;MACROS LIMPA MACRO ;LIMPA TELA DO LCD CALL LcdClear MOVLW .7 ;AJUSTAR 5 MSEG CALL DELAY ENDM LINHA1 MACRO ;TROCA PARA LINHA 1 DO LCD CALL LINE1 MOVLW .7 ;AJUSTAR 5 MSEG CALL DELAY ENDM LINHA2 MACRO ;TROCA PARA LINHA 2 DO LCD CALL LINE2 MOVLW .7 ;AJUSTAR 5 MSEG CALL DELAY ENDM ;========================================================================================= ; VETOR DE RESET ORG 0X00 GOTO INICIO ;========================================================================================= ; VETOR DE INTERRUPCAO ORG 0X04 RETFIE ;========================================================================================= ;PAGINA ZERO ;ROTINA PARA ENVIO DE FRASES PARA O LCD ENV_LCD MOVWF AUX MOVFW PAG MOVWF PCLATH MOVFW AUX RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z RETURN CALL ED INCF AUX,F MOVFW AUX GOTO RT1 PEGA_M MOVWF PCL FRASE1: dt " PIC_TERMOSTATO ",0 FRASE2: dt "LARIOS.TECNOL.WS",0 FRASE3: dt "TEMP= ",0 FRASE4: dt "L= D= ",0 ;================================================================================== ; 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'00111011' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISA ; CLRF TRISC MOVLW B'10000000' ;DESAHABILITA PULL-UP DA PIO MOVWF OPTION_REG ;IDEM MOVLW B'00100000' ;SELEÇÃO DE FREQUENCIA DE CONVERSÃO ( OSC/32) MOVWF ADCON1 ; CLRF ANSEL ;DEIXA SAIDAS TODAS PARA DIGITAL CLRF VRCON ;DESLIGA TENSÃO DE REFERENCIA BANK0 MOVLW .7 ;DESLIGA COMPARADORES ANALÓGICOS MOVWF CMCON MOVLW B'11000001';LIGA CONVERSOR AN/DIG (USA TENSÃO EM PORTA1 COMO REFERÊNCIA) MOVWF ADCON0 ;ESCOLHE CANAL 0/REF AO VCC/MODO DE SAIDA PARA DIREITA CLRF PORTA ;LIMPA PORTA E C CLRF PORTC CLRF FLAGS ;IDEM FLAGS MOVLW NUM_INC MOVWF CONT_VI MOVLW NUM_INC2 MOVWF CONT_VI2 BCF FLAG_VI2 CALL LcdInit ;INICIALIZA LCD CALL FRASEINIT ;ENVIA FRASE COM O NOME DO APARELHO MOVLW T_APRES ;DELAY DE APRESENTAÇÃO CALL DELAYW MOVLW .0 CALL EEREAD MOVWF MAX_H MOVLW .1 CALL EEREAD MOVWF MAX_L MOVLW .2 CALL EEREAD MOVWF MIN_H MOVLW .3 CALL EEREAD MOVWF MIN_L ;============================================================================================ ; LOOP PRINCIPAL ;============================================================================================ MAIN NOP BANK1 MOVLW B'00000001' ;SELECIONA RA0 COMO ANALOGICA (ADC) MOVWF ANSEL BANK0 ;============================================================================================ ; SEGUE UMA SEQUENCIA DE 4 LEITURAS COM TEMPO DE 8,3 mSeg ENTRE ELAS. BCF FLAG_ZESQ ;FLAG DE ZERO A ESQUERDA BSF LIGAC ;INICIA CONVERSÃO BTFSC LIGAC ;TESTA SE CHEGOU AO FIM DA CONVERSÃO GOTO $-1 ;SE NÃO LOOP ATÉ TERMINO DA CONVERSÃO MOVFW ADRESH MOVWF C1 ;CARREGA CONTADOR AUXILIAR COM RESULTADO ALTO BANK1 MOVFW ADRESL ;OBTEM A PARTE BAIXA DA CONVERSÃO CLRF ANSEL BANK0 MOVWF C0 ;CARREGA CONTADOR AUXILIAR 1 COM RESULTADO BAIXO BTFSC FLAG_NC GOTO FEITA_2_LEIT BSF FLAG_NC MOVFW C0 MOVWF CONT0 MOVFW C1 MOVWF CONT1 MOVLW .11 CALL WAIT_WMSEC ;DELAY DE 8,33 mSEG GOTO MAIN ;VAI FAZER NOVA LEITURA FEITA_2_LEIT CLRF TEMP BCF FLAG_NC MOVFW CONT0 ADDWF C0,F RLF TEMP,F ;SALVA CARRY MOVFW CONT1 ADDWF TEMP,W ADDWF C1,F BCF STATUS,C RRF C1,F ;DIVIDE POR 2 PARA OBTER PRIMEIRA MÉDIA RRF C0,F BTFSC FLAG_NCA ;TESTA SE FOI FEITA AS 2 LEITURAS FINAIS GOTO FEITA_MAIS_2_LEIT MOVFW C0 ;SALVA C0 MOVWF CONT0A MOVFW C1 ;SALVA C1 MOVWF CONT1A BSF FLAG_NCA MOVLW .11 CALL WAIT_WMSEC ;DELAY DE 8,33 mSEG GOTO MAIN FEITA_MAIS_2_LEIT BCF FLAG_NCA MOVFW CONT0A MOVWF CONT0 MOVFW CONT1A MOVWF CONT1 CLRF TEMP BCF FLAG_NC MOVFW CONT0 ADDWF C0,F RLF TEMP,F ;SALVA CARRY MOVFW CONT1 ADDWF TEMP,W ADDWF C1,F ;SOMA OS RESULTADOS ;============================================================= MOVFW C1 SUBWF MAX_H,W BTFSC STATUS,C GOTO PARTE_B BCF OUT ;DESLIGA SAÍDA GOTO VAI_MOSTRAR PARTE_B MOVFW C1 XORWF MAX_H,W BTFSS STATUS,Z GOTO TESTA_MIN MOVFW C0 SUBWF MAX_L,W BTFSC STATUS,C GOTO TESTA_MIN BCF OUT ;DESLIGA SAÍDA GOTO VAI_MOSTRAR ;=============================================================== TESTA_MIN MOVFW MIN_H SUBWF C1,W BTFSC STATUS,C GOTO PARTE_C BSF OUT ;LIGA SAÍDA GOTO VAI_MOSTRAR PARTE_C MOVFW C1 XORWF MIN_H,W BTFSS STATUS,Z GOTO VAI_MOSTRAR MOVFW MIN_L SUBWF C0,W BTFSC STATUS,C GOTO VAI_MOSTRAR BSF OUT ;LIGA SAÍDA GOTO VAI_MOSTRAR VAI_MOSTRAR ;============================================================================= ; APRESENTA A MÉDIA DE 4 LEITURAS CALL CONVDEC ;CONVERTE PARA DECIMAL OS RESULTADOS H E L CALL MOSTRA_TEMP ;MOSTRA RESULTADO NO LCD ;=============================================================================== TESTA_CHAVES ; TESTA AS CHAVES UP/DOWN/MAX_MIN ;UP BTFSC UP GOTO SG1 BTFSC MAX_MIN GOTO INC_MINIMO MOVLW 0X05 ;SE CHEGOU AO LIMITE MAX DE 150 ºC XORWF MAX_H,W BTFSS STATUS,Z GOTO SINC3 MOVLW 0XDC XORWF MAX_L,W BTFSC STATUS,Z GOTO SDV1 ;INCREMENTA MAX (D) SINC3 BSF FLAG_MAX INCFSZ MAX_L,F GOTO SDV1 INCF MAX_H,F GOTO SDV1 ;INCREMENTA MIN (L) INC_MINIMO MOVLW 0X05 ;SE CHEGOU AO LIMITE MAX DE 150 ºC XORWF MIN_H,W BTFSS STATUS,Z GOTO SINC4 MOVLW 0XDC XORWF MIN_L,W BTFSC STATUS,Z GOTO SDV1 ;------------------------------------------------------- SINC4 ;TESTA SE MAX>MIN MOVFW MAX_L SUBWF MIN_L,W CLRF TEMP RLF TEMP,W XORLW .1 ADDWF MAX_H,W SUBWF MIN_H,W BTFSC STATUS,C GOTO SDV1 ;--------------------------------------------------------- BSF FLAG_MIN INCFSZ MIN_L,F GOTO SDV1 INCF MIN_H,F GOTO SDV1 ;=================================================== ;DOWN SG1 BTFSC DOWN GOTO SG2 BTFSC MAX_MIN GOTO DEC_MINIMO MOVLW .0 ;SE CHEGOU A ZERO NÃO DECREMENTA XORWF MAX_H,W BTFSS STATUS,Z GOTO SINC2 MOVLW .0 XORWF MAX_L,W BTFSC STATUS,Z GOTO SDV1 ;DECREMENTA MAX (D) SINC2 ;TESTA SE MAX>MIN MOVFW MAX_L SUBWF MIN_L,W CLRF TEMP RLF TEMP,W XORLW .1 ADDWF MAX_H,W SUBWF MIN_H,W BTFSC STATUS,C GOTO SDV1 INCF MAX_L,F BSF FLAG_MAX DECFSZ MAX_L,F GOTO XSDV1 DECF MAX_H,F XSDV1 DECF MAX_L,F GOTO SDV1 SDV1 CALL MOSTRA_MAX_MIN ;/TESTE BTFSC FLAG_VI GOTO RAPIDO1 MOVLW .1 ;VELOCIDADE DE MUDANÇA CALL DELAYW DECFSZ CONT_VI GOTO RAPIDO1 MOVLW NUM_INC MOVWF CONT_VI BSF FLAG_VI RAPIDO1 BTFSC FLAG_VI2 GOTO RAPIDO2 MOVLW .100 ;VELOCIDADE DE MUDANÇA CALL DELAY DECFSZ CONT_VI2 GOTO RAPIDO2 MOVLW NUM_INC2 MOVWF CONT_VI2 BSF FLAG_VI2 RAPIDO2 ;/TESTE GOTO TESTA_CHAVES ;VOLTA AO LOOP PRINCIPAL PARA REPETIR LEITURAS ;DECREMENTA MIN (L) DEC_MINIMO MOVLW .0 ;SE CHEGOU A ZERO NA DECREMENTA XORWF MIN_H,W BTFSS STATUS,Z GOTO SINC1 MOVLW .0 XORWF MIN_L,W BTFSC STATUS,Z GOTO SDV1 SINC1 INCF MIN_L,F BSF FLAG_MIN DECFSZ MIN_L,F GOTO XDV2 DECF MIN_H,F XDV2 DECF MIN_L,F GOTO SDV1 SG2 BTFSC FLAG_MAX CALL SALVA_MAX BTFSC FLAG_MIN CALL SALVA_MIN MOVLW T_APRES ;DELAY DE APRESENTAÇÃO DO RESULTADO CALL DELAYW GOTO MAIN ;VOLTA AO LOOP PRINCIPAL PARA REPETIR LEITURAS ;====================================================================================================== ; SUB-ROTINAS SALVA_MAX BCF FLAG_VI MOVLW NUM_INC MOVWF CONT_VI MOVLW NUM_INC2 MOVWF CONT_VI2 BCF FLAG_VI2 MOVFW MAX_H MOVWF TMP MOVLW .0 CALL EEWRITE MOVFW MAX_L MOVWF TMP MOVLW .1 CALL EEWRITE BCF FLAG_MAX RETURN SALVA_MIN BCF FLAG_VI MOVLW NUM_INC MOVWF CONT_VI MOVLW NUM_INC2 MOVWF CONT_VI2 BCF FLAG_VI2 MOVFW MIN_H MOVWF TMP MOVLW .2 CALL EEWRITE MOVFW MIN_L MOVWF TMP MOVLW .3 CALL EEWRITE BCF FLAG_MIN RETURN MOSTRA_TEMP LIMPA LINHA1 CLRF PAG MOVLW FRASE3 CALL ENV_LCD MOVLW 0X85 ;POSIÇÃO NA LINHA ONDE SERÁ ESCRITO O VALOR DA TEMPERATURA CALL EC 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 ED ;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 ED ;ENVIA CENTENA MOVFW BR0 CALL conv_asc2 ;ENVIA DEZENA CALL ED MOVLW '.' ;ENVIA PONTO CALL ED MOVFW R1 ;ENVIA UNIDADE CALL ED MOVLW 'C' CALL ED ;ENVIA 'C' (CENTIGRADOS) MOVLW 0XDF ;ENVIA '°' CALL ED MOVLW ' ' ;ENVIA ESPAÇO CALL ED BTFSS OUT GOTO ENV_OFF ; ENVIA 'ON ' PARA DISPLAY ; MOVLW ' ' ;ENVIA ESPAÇO ; CALL ED ; MOVLW '0' ;ENVIA 'O' ; CALL ED ; MOVLW 'N' ;ENVIA 'N' ; CALL ED ; MOVLW ' ' ;ENVIA ' ' ; CALL ED MOVLW 'L' ;ENVIA 'L' CALL ED MOVLW 'I' ;ENVIA 'I' CALL ED MOVLW 'G' ;ENVIA 'G' CALL ED GOTO MOSTRA_MAX_MIN ENV_OFF ; ENVIA 'OFF' PARA DISPLAY ; MOVLW '0' ;ENVIA 'O' ; CALL ED ; MOVLW 'F' ;ENVIA 'F' ; CALL ED ; MOVLW 'F' ;ENVIA 'F' ; CALL ED MOVLW 'D' ;ENVIA 'O' CALL ED MOVLW 'E' ;ENVIA 'F' CALL ED MOVLW 'S' ;ENVIA 'F' CALL ED MOSTRA_MAX_MIN LINHA2 CLRF PAG MOVLW FRASE4 CALL ENV_LCD MOVLW 0XCB ;POSIÇÃO NA LINHA ONDE SERÁ ESCRITO O VALOR DA TEMP MAX (D) CALL EC MOVFW MAX_H MOVWF C1 MOVFW MAX_L MOVWF C0 CALL CONVDEC ;CONVERTE PARA DECIMAL MAX_H_L MOVFW BR1 CALL conv_asc2 ;CONVERTE PARA ASCII MOVWF AUX XORLW 0X30 ;TESTA SE É ZERO A ESQUERDA BTFSS STATUS,Z GOTO SEGUI21 BSF FLAG_ZESQ1 MOVLW ' ' ;APAGA ZERO A ESQUERDA GOTO SEGUI41 SEGUI21 MOVFW AUX SEGUI41 CALL ED ;ULTIMO ZERO MOVFW R1 BTFSS FLAG_ZESQ1 GOTO SEGUI31 XORLW 0X30 ;VERIFICA SE É ZERO MOVLW ' ' ;SE ZERO ENVIA ESPAÇO BTFSS STATUS,Z MOVFW R1 SEGUI31 CALL ED ;ENVIA CENTENA MOVFW BR0 CALL conv_asc2 ;ENVIA DEZENA CALL ED MOVLW '.' ;ENVIA PONTO CALL ED MOVFW R1 ;ENVIA UNIDADE CALL ED ; MOVLW ' ' ; CALL ED ;ENVIA 'C' (CENTIGRADOS) ; MOVLW 'C' ; CALL ED BCF FLAG_ZESQ1 ;AQUI CODIGO PARA VER MIN_H_L MOVLW 0XC2 ;POSIÇÃO NA LINHA ONDE SERÁ ESCRITO O VALOR DA TEMP MIN (L) CALL EC MOVFW MIN_H MOVWF C1 MOVFW MIN_L MOVWF C0 CALL CONVDEC ;CONVERTE PARA DECIMAL MAX_H_L MOVFW BR1 CALL conv_asc2 ;CONVERTE PARA ASCII MOVWF AUX XORLW 0X30 ;TESTA SE É ZERO A ESQUERDA BTFSS STATUS,Z GOTO SEGUI23 BSF FLAG_ZESQ2 MOVLW ' ' ;APAGA ZERO A ESQUERDA GOTO SEGUI43 SEGUI23 MOVFW AUX SEGUI43 CALL ED ;ULTIMO ZERO MOVFW R1 BTFSS FLAG_ZESQ2 GOTO SEGUI33 XORLW 0X30 ;VERIFICA SE É ZERO MOVLW ' ' ;SE ZERO ENVIA ESPAÇO BTFSS STATUS,Z MOVFW R1 SEGUI33 CALL ED ;ENVIA CENTENA MOVFW BR0 CALL conv_asc2 ;ENVIA DEZENA CALL ED MOVLW '.' ;ENVIA PONTO CALL ED MOVFW R1 ;ENVIA UNIDADE CALL ED ; MOVLW ' ' ; CALL ED ;ENVIA 'C' (CENTIGRADOS) ; MOVLW 'C' ; CALL ED BCF FLAG_ZESQ2 ; MOVLW .1 ; MOVLW .20 ; CALL DELAY RETURN CONVDEC ;************************************************************************** ; 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 DEBOUNCE WAIT_16MSEC movlw .16 WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;================================================================================= ;Rotinas de controle do LCD ;================================================================================= LcdInit movlw .40 ;Wait 30 ms call LcdDelay 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 movlw 01H ;clear display call EC movlw .3 ;Wait 2 ms call LcdDelay 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 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 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 goto $+1 ; goto $+1 ; goto $+1 bcf LCD_E ;Disabled LCD return ;LcdPulse_E bsf LCD_E ;Enables LCD ; movlw 1 ;Wait 1ms ; call LcdDelay movlw .200 call WAIT_uS bcf LCD_E ;Disabled LCD ; movlw 1 ;Wait 1ms ; call LcdDelay return ;======================================================================== ;rotinas para EEprom AGUARDE ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM MOVLW .44 MOVWF R1 CG2 MOVLW .255 MOVWF R2 clrwdt DECFSZ R2,F GOTO $-2 DECFSZ R1,F GOTO CG2 RETURN EEWRITE ; ******* EEPROM WRITE ENABLE ****************** ;endereço esta em ADDRESS ;DADOS A ESCREVER ESTA EM TMP(MSB) BANK1 movwf EEADR BANK0 MOVFW TMP ;PEGA PRIMEIRO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; enable Write\par movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A clrwdt btfsc EECON1, WR ; Write complete ?\par goto WRITE_SN_A bcf EECON1, WREN ; disable Write\par BANK0 clrwdt ESPERA1 ;DELAY ENTRE APAGAMENTOS CALL AGUARDE RETURN EEREAD ;endereço esta em ADDRESS ;DADOS LIDOS SERÃO ESCRITOS EM TMP0 clrwdt ; MOVFW ADDRESS BANK1 movwf EEADR bsf EECON1, RD ; do a read\par clrwdt btfsc EECON1, RD ; Read done ?\par goto $-2 movf EEDATA,W BANK0 MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM clrwdt RETURN ;======================================================================== ;ROTINA DE ENVIO DE FRASE INICIAL FRASEINIT CLRF PAG MOVLW FRASE1 CALL ENV_LCD CALL LINE2 MOVLW FRASE2 CALL ENV_LCD RETURN ;================================================================= ; PRE-ESCRITA DA EEPROM ORG 0X2100 DE 0X01,0X90,0X01,0X2C END