; PROJETO TERMOSTATO ELETRÔNICO COM VISOR DE TEMPERATURA EM 3 DISPLAY DE 7 SEGUIMENTOS ; (CATODO COMUM). ; UTILIZA COMO SENSOR DE TEMPERATURA O CI LM35 ; INICIO : 25/01/13 TERM.:02/02/13 ; 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 ; 3 DISPLAY DE 7 SEGUIMENTOS ;___________________________________________________________________________________________________ ; #INCLUDE ; ARQUIVO PADRAO ; USE RC INTERNO NO_CLOCKOUT,WATCH DOG OFF, BROWN DETECT ON,POWER ON RESET ON __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _BODEN & _MCLRE_ON ERRORLEVEL -302 ;ELIMINA MENSAGEM DE ERRO ; PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA DIG0 ;ACUMULADOR DOS DIGITOS DO DISPLAY ZERO (0) DIG1 ;ACUMULADOR DOS DIGITOS DO DISPLAY UM(1) DIG2 ;ACUMULADOR DOS DIGITOS DO DISPLAY DOIS (2) DIG3A ;AUXILIARES DIG0A ;ACUMULADOR DOS DIGITOS DO DISPLAY ZERO (0) DIG1A ;ACUMULADOR DOS DIGITOS DO DISPLAY UM(1) DIG2A ;ACUMULADOR DOS DIGITOS DO DISPLAY DOIS (2) DEL1 ;DELAY DEL2 ;IDEM DEL3 ;IDEM DEL4 ;DELAY PARA TRANSMISSAO E AMOSTRAGEM DOS DISPLAYS DEL5 ;IDEM CONT0 CONT1 ;CONTADOR AUXILIAR PARA RESULTADO PARTE BAIXA DA CONVERSÃO CONT2 ;CONTADOR AUXILIAR PARA RESULTADO PARTE ALTA DA CONVERSÃO CNT CNT1 PONTK ;PONTEIRO PARA KATODOS DOS SEGUIMENTOS WAUX ;W AUXILIAR FLAGS ;FLAGS FLAGS1 C1 C0 C1A C0A BR0 BR1 BR2 LC LC1 MAX_H MAX_L MIN_H MIN_L TEMP TMP R0 R1 R2 R3 R4 W_TEMP STATUS_TEMP TEMP_INT ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== #DEFINE LIGAC ADCON0,1 ;DEFINE PALAVRA PARA LIGAR/DESLIGAR CONVERSÃO #DEFINE BIT4 VALCOM,4 ;BITE N.4 DO REGISTRO DE VALOR A SER COMPARADO #DEFINE BIT5 VALCOM,5 #DEFINE BIT6 VALCOM,6 #DEFINE BIT7 VALCOM,7 #DEFINE K0 PORTC,2 ;PINO 8 #DEFINE K1 PORTC,3 ;PINO 7 #DEFINE K2 PORTC,4 ;PINO 6 #DEFINE UP PORTA,4 ;PINO 3 ( UP E 'SEGUIMENTO d) #DEFINE MIN PORTA,2 ;PINO 11 ( UP E 'SEGUIMENTO g) #DEFINE DOWN PORTA,1 ;PINO 12 ( DOWN E 'SEGUIMENTO f) #DEFINE MAX PORTA,5 ;PINO 2 ( FUNC E 'SEGUIMENTO c) #DEFINE FUD PORTC,4 ;PINO 6 ( FUD E 'CATODO K2 - AO GND PARA TESTAR CHAVES) #DEFINE RELE PORTC,0 ;PINO 10 ( RELE E 'SEGUIMENTO a) #DEFINE TRIS_UP TRISA,4 ;PINO 3 ( UP E 'SEGUIMENTO d) #DEFINE TRIS_DOWN TRISA,1 ;PINO 12 ( DOWN E 'SEGUIMENTO f) #DEFINE TRIS_MAX TRISA,5 ;PINO 2 ( FUNC E 'SEGUIMENTO c) #DEFINE TRIS_MIN TRISA,2 ;PINO 11 ( UP E 'SEGUIMENTO g) #DEFINE FLAG_ON_OFF FLAGS,0 ;FLAG DE ON/OFF DO RELE DE SAIDA #DEFINE FLAG_LIM_MAX FLAGS,1 #DEFINE FLAG_LIM_MIN FLAGS,2 #DEFINE FLAG_MAX FLAGS1,0 ;FLAG DA CHAVE 'MAX' ACIONADA #DEFINE FLAG_MIN FLAGS1,1 ;FLAG DO CHAVE 'MIN' ACIONADA #DEFINE F1 FLAGS1,2 #DEFINE FLAG_UP FLAGS,3 ;FLAG DA CHAVE 'UP' ACIONADA #DEFINE FLAG_DOWN FLAGS,4 ;FLAG DA CHAVE 'DOWN' ACIONADA #DEFINE FLAG_NCA FLAGS,6 ;FLAG DA AJUSTE DE 'MAX/MIN' OCORRENDO #DEFINE FLAG_NC FLAGS,7 ;FLAG ;*********************************************************************************************** ; CONSTANTES VDEL1 EQU .250; 250 VALOR INICIAIS PARA DELAY VDEL2 EQU .5; 250 IDEM VDEL3 EQU .1 ; 1 IDEM VDEL4 EQU .125 ; FREQUENCIA DE APRESENTAÇÃO MULTIPLEXADA (ALTERA O ABAIXO) VDEL5 EQU .1 T_APRES EQU .250 ;TEMPO DE APRESENTAÇÃO DA ULTIMA COMVERSÃO ;................................................................................................. ; VETOR DE RESET ORG 0X00 GOTO INICIO ;................................................................................................ ; VETOR DE INTERRUPCAO ORG 0X04 GOTO INT_TIMER0 ;................................................................................................ ; ;TABELAS DE SALTO GOTO SEG7 CLRF PCLATH ANDLW 0X0F ADDWF PCL,F ;TABELA DE CONVERSÃO "CALCULO GOTO" RETORNA 7 SEGUIMENTOS RETLW B'11111100' ;RETORNA NUMERO 0 (ABCDEFGP) F C RETLW B'01100000' ;RETORNA 1 60 RETLW B'11011010' ;RETORNA 2 DA RETLW B'11110010' ;RETORNA 3 F2 RETLW B'01100110' ;RETORNA 4 66 RETLW B'10110110' ;RETORNA 5 B6 RETLW B'10111110' ;RETORNA 6 BE RETLW B'11100000' ;RETORNA 7 E0 RETLW B'11111110' ;RETORNA 8 RETLW B'11110110' ;RETORNA 9 RETLW B'00000000' ;RETORNA APAGADO RETLW B'00000000' ;RETORNA RETLW B'00000000' ;RETORNA RETLW B'00000000' ;RETORNA RETLW B'00000000' ;RETORNA RETLW B'00000000' ;RETORNA RETLW B'00000000' ;RETORNA ;*********************************************************************************************** ; INT_TIMER 0 ;=============================================================================================== ;INTERRUPÇÃO DO TIMER 0 PARA MULTIPLEXAÇÃO DE 7 SEGUIMENTOS INT_TIMER0 MOVWF W_TEMP ;SALVA VALOR DE 'W' SWAPF STATUS,W ;SALVA VALOR DE 'STATUS' MOVWF STATUS_TEMP BANK0 ;CERTIFICA DE SER O BANCO '0'(POIS PODERÁ, NA ROTINA 'MAIN', ESTAR EM OUTRO BANCO NA HORA DA INTERRUPÇÃO) BCF INTCON,T0IF ;APAGA FLAG DO TIMER 0 CLRF PCLATH MOVFW PONTK ANDLW B'00000011' ADDWF PCL,F GOTO M0 GOTO M1 GOTO M2 ;========================================================================================== ;TESTA FLAG DE RELE LIGADO TESTAR_SAIDA_CHAVES BCF RELE BCF K0 BCF K1 BCF K2 BTFSC FLAG_ON_OFF ;TESTA SE DEVE ACIONAR SAIDA DO RELE BSF RELE ;ACIONA RELE NOP ;========================================================================================== ;TESTA CHAVES PARA REGULAGEM DE TEMPERATURA BANK1 BSF TRIS_UP ;VIRAM ENTRADAS BSF TRIS_DOWN BSF TRIS_MAX BSF TRIS_MIN BANK0 BCF FLAG_UP BTFSS UP BSF FLAG_UP BCF FLAG_DOWN BTFSS DOWN BSF FLAG_DOWN BCF FLAG_MAX BTFSS MAX ;FUNC BSF FLAG_MAX BCF FLAG_MIN BTFSS MIN ;FUNC BSF FLAG_MIN SAI_CH BANK1 NOP BCF TRIS_UP ;VIRAM SAIDAS BCF TRIS_DOWN BCF TRIS_MAX BCF TRIS_MIN BANK0 SAI_INT INCF PONTK,F SWAPF STATUS_TEMP,W ;RECUPERA STATUS E 'W' MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE ;------------------------------------------------------------------------------------ M0 MOVFW DIG0 CALL COPYD BSF PORTC,2 ;SETA RC2 K0 GOTO SAI_INT M1 MOVFW DIG1 CALL COPYD BSF PORTC,3 ;SETA RC3 K1 GOTO SAI_INT M2 MOVFW DIG2 ;TESTA SE DIG2 É ZERO XORLW 0XFC BTFSC STATUS,Z GOTO NAOMZ ;SE FOR, APAGA ZERO A ESQUERDA MOVFW DIG2 CALL COPYD BSF PORTC,4 ;SETA RC2 K2 GOTO SAI_INT NAOMZ BCF PORTC,4 ;APAGA RC2 K2 , SE FOR ZERO (DIG2) GOTO SAI_INT ;------------------------------------------------------------------------- ;ENVIA VALOR DOS SEGUIMENTOS DE 'WAUX' PARA PORTA E PORTC COPYD MOVWF WAUX ;CARREGA CONTADOR AUXILIAR CLRF PORTA CLRF PORTC BTFSC WAUX,1 BSF PORTA,2 ;SETA RA2 G BTFSC WAUX,2 BSF PORTA,1 ;SETA RA1 F BTFSC WAUX,3 BSF PORTC,5 ;SETA RC5 E BTFSC WAUX,4 BSF PORTA,4 ;SETA RA4 D BTFSC WAUX,5 BSF PORTA,5 ;SETA RA5 C BTFSC WAUX,6 BSF PORTC,1 ;SETA RC1 B BTFSC WAUX,7 BSF PORTC,0 ;SETA RC0 A RETURN ;================================================================================= ; INICIALIZAÇÃO DO PROGRAMA - RESET ;================================================================================= ; INICIO CLRF TMR0 BANK1 ;BANCO 1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR BANK0 CLRF PORTA ;LIMPA PORTA CLRF PORTC CLRF CONT1 CLRF CONT2 CLRF DEL1 CLRF DEL2 CLRF DEL3 CLRF PONTK CLRF FLAGS CLRF FLAGS1 ;RECUPERA INFORMAÇÃO DA EEPROM SOBRE OS AJUSTES ANTERIOR DE MIN E MAX 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 ;CONFIGURA ENTRADAS E SAIDAS, COMPARADOR ANALÓGICO,ETC BANK1 MOVLW b'00000001' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISA ; MOVLW .0 MOVWF TRISC MOVLW B'00000011' ;HABILITA PULL-UP DA PORTA E TIMER 0 /16 MOVWF OPTION_REG ;IDEM MOVLW B'01010000' ; SELEÇÃO DE FREQUENCIA DE CONVERSÃO ( OSC/16=01010000) MOVWF ADCON1 ; MOVLW B'00000001' ;SELECIONA RA0 COMO ANALOGICA. - 00000001 MOVWF ANSEL MOVLW .0 MOVWF VRCON MOVLW 0XFF MOVWF WPUA ;LIGA PULL-UPS DA PORTA BANK0 MOVLW .7 MOVWF CMCON MOVLW B'10000001' ;LIGA CONVERSOR AN/DIG B6=1 VREF E 0 VDD PARA COMPARAR 10000001 MOVWF ADCON0 ; * ESCOLHE CANAL 0/REF AO VCC/MODO DE SAIDA PARA DIREITA MOVLW b'10100001' MOVWF INTCON ;LIGA INTERRUPCÃO DO TIMER 0 ;PROGRAMA PRINCIPAL MAIN ;COMEÇA A OBTENÇÃO DO VALOR DA TEMPERATURA DO SENSOR LM35 ;USA 128 CONVERÇÕES ,CUJA MÉDIA É APRESENTADA. MOVLW .128 ;NUMERO DE AMOSTRAGENS MOVWF CNT CLRF C1 CLRF C0 NOVA_CV 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 R3 ;SALVA BANK1 MOVFW ADRESL ;OBTEM A PARTE BAIXA DA CONVERSÃO BANK0 MOVWF R4 ;SALVA VSK1 MOVFW R4 ADDWF C0,F ;SOMA RESULTADO BAIXO COM C0 BTFSC STATUS,C INCF C1,F DECFSZ CNT,F GOTO NOVA_CV MOVLW 0X04 ;NÚMERO DE DESLOCAMENTOS PARA DIREITA MOVWF CNT DIV_16 BCF STATUS,C ;DIVIDE POR 16 RRF C1,F RRF C0,F DECFSZ CNT,F GOTO DIV_16 ;============================================================= ;TESTA A TEMPERATURA E COMPARA COM OS LIMITES DE MAX E MIN ; ATUANDO SOBRE A SAIDA DO RELE DE CARGA, SE NECESSÁRIO. MOVFW C1 SUBWF MAX_H,W BTFSC STATUS,C GOTO PARTE_B BCF FLAG_ON_OFF ;DESLIGA SAÍDA DO RELE 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 FLAG_ON_OFF ;DESLIGA SAÍDA DO RELE GOTO VAI_MOSTRAR TESTA_MIN MOVFW MIN_H SUBWF C1,W BTFSC STATUS,C GOTO PARTE_C BSF FLAG_ON_OFF ;LIGA SAÍDA SAIDA DO RELE GOTO VAI_MOSTRAR PARTE_C MOVFW C1 XORWF MIN_H,W BTFSS STATUS,Z GOTO VAI_MOSTRAR MOVFW MIN_L SUBWF C0,W BTFSS STATUS,C BSF FLAG_ON_OFF ;LIGA SAÍDA DO RELE VAI_MOSTRAR ;ROTINA PARA MOSTRA EM 3 DIGITOS DE 7 SEGUIMENTOS A TEMPERATURA DO SENSOR LM35 ;PRIMEIRO TESTA SE A CONVERSÃO NÃO FOI SUPERIOR A 99.9 GRAUS E SE FOR MOSTRA 'ERR' MOVFW C1 SUBLW .3 BTFSS STATUS,C GOTO PULA44 MOVFW C1 SUBLW .2 BTFSC STATUS,C GOTO CONT_APR1 MOVFW C0 SUBLW 0XE7 BTFSC STATUS,C GOTO CONT_APR1 PULA44 ;ULTRAPASSOU 99.9, VAI MOSTRAR 'ERR' MOVLW B'10011110' ;LETRA 'E' MOVWF DIG2 MOVLW B'10001100' ;LETRA 'R' MOVWF DIG1 MOVLW B'10001100' ;LETRA 'R' MOVWF DIG0 GOTO PULA45 CONT_APR1 CALL CONVDEC ;CONVERTE PARA DECIMAL OS RESULTADOS H E L CALL CONVDIGS_7SEG ;CONVERTE OS RESULTADOS DOS DIGS EM 7 SEGUIMENTOS ;LEMBRANDO QUE NAS INTERRUPÇÕES DO TIMER 0 É QUE EFETIVAMENTE SERÁ A VISIBILIDADE DO RESULTADO DOS DISPLAYS PULA45 MOVLW T_APRES ;DELAY DE APRESENTAÇÃO DO RESULTADO CALL DELAY ;=============================================================================================== TESTA_CHAVES ; TESTA AS CHAVES UP/DOWN/MAX/MIN PELOS SEUS 'FLAGS ESPELHOS' BTFSC FLAG_MAX ; GOTO TST_UP_DOWN_MAX BTFSC FLAG_MIN GOTO TST_UP_DOWN_MIN GOTO SG2 ;============================================================================== TST_UP_DOWN_MAX BTFSS FLAG_UP GOTO SG1 ;TESTA LIMITE ANTES DE INCREMENTAR CONTADOR DE MAXIMO MOVLW 0X03 ;SE CHEGOU AO LIMITE MAX DE 100 ºC XORWF MAX_H,W BTFSS STATUS,Z GOTO SINC3 MOVLW 0XE7 XORWF MAX_L,W BTFSC STATUS,Z GOTO SDV1 ;INCREMENTA MAX (D) SINC3 BSF FLAG_LIM_MAX INCFSZ MAX_L,F GOTO SDV1_MAX INCF MAX_H,F GOTO SDV1_MAX ;TESTA LIMITE ANTES DE INCREMENTA MIN (L) ;INC_MINIMO TST_UP_DOWN_MIN BTFSS FLAG_UP GOTO DEC_MINIMO MOVLW 0X03 ;SE CHEGOU AO LIMITE MAX DE 100 ºC XORWF MIN_H,W BTFSS STATUS,Z GOTO SINC4 MOVLW 0XE7 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_LIM_MIN INCFSZ MIN_L,F GOTO SDV1_MIN INCF MIN_H,F GOTO SDV1_MIN ;=================================================== ;DOWN SG1 BTFSS FLAG_DOWN GOTO SG2 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_LIM_MAX DECFSZ MAX_L,F GOTO XSDV1 DECF MAX_H,F XSDV1 DECF MAX_L,F GOTO SDV1_MAX SDV1_MAX CALL MOSTRA_MAX GOTO SDV1 SDV1_MIN CALL MOSTRA_MIN SDV1 MOVLW .100 ;VELOCIDADE DO INCREMENTO/DECREMENTO CALL DELAY GOTO TESTA_CHAVES ; VOLTA REPETIR LEITURAS DAS CHAVES ;DECREMENTA MIN (L) DEC_MINIMO BTFSS FLAG_DOWN GOTO SG2 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_LIM_MIN DECFSZ MIN_L,F GOTO XDV2 DECF MIN_H,F XDV2 DECF MIN_L,F GOTO SDV1_MIN SG2 BTFSC FLAG_LIM_MAX CALL SALVA_MAX BTFSC FLAG_LIM_MIN CALL SALVA_MIN BTFSC FLAG_MAX GOTO SDV1_MAX BTFSC FLAG_MIN GOTO SDV1_MIN MOVLW T_APRES ;DELAY DE APRESENTAÇÃO DO RESULTADO CALL DELAY GOTO MAIN ;VOLTA AO LOOP PRINCIPAL PARA REPETIR LEITURAS ;======================================================================================= ; SUBROTINA DE APRESENTAÇÃO DE MIN E MAX NO 7 SEGUIMENTOS MOSTRA_MAX MOVFW MAX_H MOVWF C1 MOVFW MAX_L MOVWF C0 GOTO CONV_APRES MOSTRA_MIN MOVFW MIN_H MOVWF C1 MOVFW MIN_L MOVWF C0 CONV_APRES ;MOSTRA NO DISPLAYS DE 7 SEGUIMENTOS O VALOR DE MAX OU MIN CALL CONVDEC CALL CONVDIGS_7SEG RETURN ;__________________________________________________________________________________ ;----------------------------------------------------------------------------------------- ;CONVERTE DIGS DE HEXA PARA 7 SEGUIMENTOS CONVDIGS_7SEG BCF INTCON,GIE ;DESLIGA INTERRUPÇÃO NOP MOVFW DIG0A ;CONVERTE PRIMEIRO DIGITO PARA 7 SEGMENTOS CALL SEG7 MOVWF DIG0 MOVFW DIG1A ;CONVERTE SEGUNDO DIGITO PARA 7 SEGUIMENTOS CALL SEG7 MOVWF DIG1 MOVFW DIG2A ;CONVERTE TERCEIRO DIGITO PARA 7 SEGUIMENTOS CALL SEG7 MOVWF DIG2 BSF INTCON,GIE ;RELIGA INTERRUPÇÃO RETURN ;-------------------------------------------------------------------------------------- ; ROTINA DE CONVERSÃO BINÁRIA PARA BCD CONVDEC CLRF DIG0A ;LIMPA OU ZERA ACUMULADORES BCD CLRF DIG1A CLRF DIG2A CLRF DIG3A BTFSC C1,1 ;CONT2,1 ;TESTA 10 BIT DO RESULTADO DA CONVERSÃO CALL B10 ;ROTINA DE SOMATÓRIA P/ 10B BTFSC C1,0 ;CONT2,0 ;TESTA 9 BIT CALL B9 BTFSC C0,7 ;CONT1,7 ;TESTA 8 BIT DO RESULTADO DA CONVERSÃO CALL B8 BTFSC C0,6 ;CONT1,6 ;TESTA 7 BIT CALL B7 BTFSC C0,5 ;CONT1,5 ;TESTA 6 BIT DO RESULTADO DA CONVERSÃO CALL B6 BTFSC C0,4 ;CONT1,4 ;TESTA 5 BIT CALL B5 BTFSC C0,3 ;CONT1,3 ;TESTA 4 BIT DO RESULTADO DA CONVERSÃO CALL B4 BTFSC C0,2 ;CONT1,2 ;TESTA 3 BIT CALL B3 BTFSC C0,1 ;CONT1,1 ;TESTA 2 BIT DO RESULTADO DA CONVERSÃO CALL B2 BTFSC C0,0 ;CONT1,0 ;TESTA 1 BIT CALL B1 CALL ACERTO CLRF C0 CLRF C1 RETURN ;------------------------------------------------------------------------------------- B10 MOVLW .5 ;SUB-ROTINA DE SOMA RELATIVA AO EXPOENTE BINÁRIO 2 ELEVADO A BX ADDWF DIG2A,F MOVLW .1 ADDWF DIG1A,F MOVLW .2 ADDWF DIG0A,F RETURN B9 MOVLW .2 ADDWF DIG2A,F MOVLW .5 ADDWF DIG1A,F MOVLW .6 ADDWF DIG0A,F RETURN B8 MOVLW .1 ADDWF DIG2A,F MOVLW .2 ADDWF DIG1A,F MOVLW .8 ADDWF DIG0A,F RETURN B7 MOVLW .6 ADDWF DIG1A,F MOVLW .4 ADDWF DIG0A,F RETURN B6 MOVLW .3 ADDWF DIG1A,F MOVLW .2 ADDWF DIG0A,F RETURN B5 MOVLW .1 ADDWF DIG1A,F MOVLW .6 ADDWF DIG0A,F RETURN B4 MOVLW .8 ADDWF DIG0A,F RETURN B3 MOVLW .4 ADDWF DIG0A,F RETURN B2 MOVLW .2 ADDWF DIG0A,F RETURN B1 MOVLW .1 ADDWF DIG0A,F RETURN ;-------------------------------------------------------------------------------- ;ROTINA DE REDUÇAO PARA MAXIMO 9 EM CADA DIGITO APOS SOMATORIA POR PESO. ACERTO MOVLW .10 SUBWF DIG0A,W BTFSC STATUS,C ;SE CARRY É ZERO NUMERO NEGATIVO CALL REDUZ0 ;/PULA E MANTEM VALOR ORIGINAL DO MOVLW .10 ;/ DIG0 SUBWF DIG1A,W BTFSC STATUS,C CALL REDUZ1 MOVLW .10 SUBWF DIG2A,W BTFSC STATUS,C CALL REDUZ2 RETURN ;------------------------------------------------------------------------------ REDUZ0 INCF DIG1A,F MOVWF DIG0A MOVLW .10 SUBWF DIG0A,W BTFSS STATUS,C RETURN INCF DIG1A,F MOVWF DIG0A GOTO $-6 REDUZ1 INCF DIG2A,F MOVWF DIG1A MOVLW .10 SUBWF DIG1A,W BTFSS STATUS,C RETURN INCF DIG2A,F MOVWF DIG1A GOTO $-6 REDUZ2 INCF DIG3A,F MOVWF DIG2A MOVLW .10 SUBWF DIG2A,W BTFSS STATUS,C RETURN INCF DIG3A,F MOVWF DIG2A GOTO $-6 ;============================================================================= ;SALVA VALORES AJUSTADOS NA EEPROM APÓS SOLTAR OS BOTÕES. SALVA_MAX MOVLW .2 ;VELOCIDADE DO INCREMENTO/DECREMENTO CALL DELAYW MOVFW MAX_H MOVWF TMP MOVLW .0 CALL EEWRITE MOVFW MAX_L MOVWF TMP MOVLW .1 CALL EEWRITE BCF FLAG_LIM_MAX RETURN SALVA_MIN MOVLW .2 ;VELOCIDADE DO INCREMENTO/DECREMENTO CALL DELAYW MOVFW MIN_H MOVWF TMP MOVLW .2 CALL EEWRITE MOVFW MIN_L MOVWF TMP MOVLW .3 CALL EEWRITE BCF FLAG_LIM_MIN 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 BCF INTCON,GIE ;DESLIGA INTERRUPÇÕES 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 BSF INTCON,GIE ;LIGA INTERRUPÇÕES 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 ATRASO ; ;================================================================== DELAYW DELAYM MOVWF TEMP CALL LcdDelay1 DECFSZ TEMP,F GOTO $-2 RETURN ;------------------------------------------------------------------- DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay clrf LC movwf LC1 ;duas variáveis em uma LcdDelayLoop decfsz LC,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC1,F ;dec. o seg. cont. goto LcdDelayLoop return ;------------------------------------------------------------------------- ;============================================================================================= ;AQUI PODEMOS PRÉ-ESTABELECER VALOR INICIAL POS COMPILAÇÃO PARA MAX E MIN ;SENDO QUE DEPOIS SERÁ ALTERADO PELO USUARIO AO ACIONAR OS BOTÕES. ORG 0X2100 DE 0X00, 0XC8,0X00,0X96 ;15 A 20 END