;************************************************************************** TITLE CONTROL_VOL.ASM ; ; ; CONTROLE DE VOLUME USANDO RECEPTOR DE RF 433MHZ E CHAVEIRINHO ; DE CONTROLE REMOTO COM CI HT6P20B. ; O PIC GERARÁ UM TENSÃO DE 0 A 5 VOLTS CORRESPONDENTE A ATUAÇÃO DOS ; BOTÕES DO C. REMOTO (CHAVEIRINHO). ESTA SERÁ LIGADA AO TERMINAL DE ; CONTROLE DO POTENCIOMETRO DIGITAL TDA8199. ; ESTE CI TEM CAPACIDADE PARA CONTROLAR O VOLUME DE 2 CANAIS DE SOM. ; USO: APERTANDO BOTÃO ESQUERDO IRÁ DIMINUIR O VOLUME. ; APERTANDO O BOTÃO DIREITO IRÁ AUMENTAR O VOLUME. ; E APERTANDO AMBOS OS BOTÕES (OU O 3º BOTÃO,SE TIVER) IRÁ ENTRAR EM ; FUNCIONAMENTO O 'MUTE' (DEIXA MUDO AS SAIDAS DE SOM). ; PARA DECODIFICAR UTILIZA UM PIC 16F628A.USE OSCILADOR INTERNO. ; USE MPLAB-IDE PARA EFETUAR MUDANÇAS OU REFAZER A COMPILAÇÃO. ; OPÇÃO PARA DISPLAY DE ANODO COMUM OU CATODO COMUM (OBS: TESTADO ; COM CATODO COMUM APENAS). ; ESCALA NO DISPLAY: 0 A 255 E "---" PARA FUNÇÃO 'MUTE'. ; MONTAGEM DIDÁTICA APENAS, COMO BASE PARA OUTROS PROJETOS. ; AUTOR :CLAUDIO LÁRIOS INICIO: 26-11-2012 TERMINO:28-11-2012 ;************************************************************************** ; ; GRAVAR CONTROLE: APERTE UM BOTÃO DO CONTROLE E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN' NA PLACA (PINO 2 DO PIC 12F629 A MASSA)E ; SOLTE-O EM MENOS DE 2 SEGUNDOS. O LED VERMELHO PISCARÁ 1 ; VEZ, PARA INDICAR ISTO. REPITA ISTO COM TODOS OS CONTROLES REMOTOS QUE ; FOR UTILIZAR, UM POR VEZ. ; APAGAR TODOS OS CONTROLES DA MEMÓRIA: APERTAR BOTÃO 'LEARN' NA PLACA E ; MANTENHA PRESSIONADO POR MAIS DE 10 SEGUNDOS. O LED VERMELHO PISCARÁ ; 3 VEZES , INDICANDO O PLENO APAGAMENTO DE TODOS OS SENSORES DA MEMÓRIA. ; APÓS ISTO, CADA CONTROLE DEVERÁ SER 'REAPRENDIDO' NOVAMENTE PARA OPERAR. ;*************************************************************************** ; PINAGENS DO PIC 16F628A: ; PINO 1 - ANODO/CATODO 3 ; PINO 2 - ANODO/CATODO 2 ; PINO 3 - RF IN ; PINO 4 - RESET (RESISTOR DE 10K AO +VCC) ; PINO 5 - GND ; PINO 6 - SEGUIMENTO 'a' DO DISPLAY ; PINO 7 - SEGUIMENTO 'b' DO DISPLAY ; PINO 8 - SEGUIMENTO 'c' DO DISPLAY ; PINO 9 - SAIDA DE TENSÃO 'PWM' DE 0 - 5 VOLTS VIA RESISTOR DE 1K SEGUIDO DE CAPACITOR 100/16 A MASSA ; PINO 10 - SEGUIMENTO 'e' DO DISPLAY ; PINO 11 - SEGUIMENTO 'f' DO DISPLAY ; PINO 12 - SEGUIMENTO 'g' DO DISPLAY ; PINO 13 - ANODO/CATODO 1 ; PINO 14 - +VCC ; PINO 15 - BOTÃO 'DOWN' (RESISTOR DE 470 OHMS AO BOTÃO E AO GND) + RESISTOR DE 10K DE PULL UP ; PINO 16 - LED/INTERRUPTOR 'LEARN' ; PINO 17 - SEGUIMENTO 'd' DO DISPLAY ; PINO 18 - BOTÃO 'UP' (RESISTOR DE 470 OHMS AO BOTÃO E AO GND) + RESISTOR DE 10K DE PULL UP ;**************************************************************************** ;ESCOLHA O TIPO DE DISPLAY A SER USADO, DESCOMENTANDO O DESEJADO E COMENTANDO O OUTRO #DEFINE CATODO_COMUM ;#DEFINE ANODO_COMUM INCLUDE "P16F628a.INC" ;-------------------------- ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _LVP_OFF #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 #DEFINE FLAG FLAGS,0 ;FLAG DE SITUAÇÃO #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA #DEFINE FLAGGR FLAGS,2 ;FLAG DE 'LEARN' APRENDER #DEFINE AJ_RAP FLAGS,3 ;FLAG DE AJUSTE RÁPIDO #DEFINE F_MUTE FLAGS,4 ;FLAG DE MUTE #DEFINE F_MUTE1 FLAGS,5 ;FLAG AUXILIAR DE MUTE #DEFINE F_A1 FLAGS,6 ;FLAG TRAVA 1 #DEFINE F_A2 FLAGS,7 ;FLAG TRAVA 2 #DEFINE F_M_ON FLAGSX,0 ;FLAG MUTE ON PARA COLOCAR '---' NO DISPLAY #DEFINE SIN PORTA,4 ;PINO 3 IN RF #DEFINE RFIN PORTA,4 ;PINO 3 IN RF (IDEM) #DEFINE LRN PORTA,7 ;PINO 16 IN LEARN BOTTON #DEFINE LED PORTA,7 ;PINO 16 OUT LED (MESMO PINO DO ACIMA) #DEFINE UP PORTA,1 ;PINO 18 IN BOTÃO UP #DEFINE DOWN PORTA,6 ;PINO 15 IN BOTÃO DOWN #DEFINE A_C3 PORTA,2 ;PINO 1 OUT ANODO/CATODO 3 #DEFINE A_C2 PORTA,3 ;PINO 2 OUT ANODO/CATODO 2 #DEFINE A_C1 PORTB,7 ;PINO 13 OUT ANODO/CATODO 1 CBLOCK 0X20 RES3,RES2,RES1,RES0,AUX,WS,TEMP,BITCOUNTER,FLAGS,Z2,Z1,Z3,Z4,DEL0,DEL1,DEL2,CONTL,C2,C1,C0,RES3X,RES2X,RES1X,RES0X LC,CONT,RES3A,RES2A,RES1A,RES0A,R0,R1,R2,TMP1,ADDRESS,TMP,HC,CONTH,TEMP1,MPX,TEMP0,S_MUTE,FLAGSX,X0,X1,Y0,Y1 ENDC ;========================================================================================================= ;VARIAVÉIS DA RECEPÇÃO DE SINAL HT6P20B TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .28 ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO+ 4 ANTICODE) TGR EQU 0XFF ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO ;========================================================================================================= ;VARIAVÉIS DOS TEMPORIZADORES DE AJUSTE RÁPIDO E DO MUTE VTEMP_AJ_RAP EQU 0X20 ;TEMPO ANTES DO AJUSTE RÁPIDO ATUAR (APÓS APERTAR O BOTÃO) TOFF EQU 0X04 ;VALOR DE TEMPO MAXIMO PARA DESLIGAR AJUSTE RÁPIDO (não alterar) V_INCR_RAP EQU 0X05 ;VALOR DE INCREMENTO RAPIDO (5 EM 5) V_D_MUTE EQU 0X20 ;VALOR DE TEMPO COM OPERAÇÃO DO MUTE ;============================================================================================ ORG H'2100' ;VETOR DE EEPROM ORG 0X00 GOTO INICIALIZAÇÃO ;VAI PARA O INICIO ORG 0X04 RETFIE ;TABELA PARA CONVERSÃO DE NÚMEROS NO DISPLAY TAB_N ANDLW 0X0F ADDWF PCL,F RETLW B'11000000' ;N0 RETLW B'11111001' ;N1 RETLW B'10100100' ;N2 RETLW B'10110000' ;N3 RETLW B'10011001' ;N4 RETLW B'10010010' ;N5 RETLW B'10000010' ;N6 RETLW B'11111000' ;N7 RETLW B'10000000' ;N8 RETLW B'10010000' ;N9 RETLW B'10001001' ;NH RETLW B'10001001' ;NH RETLW B'11000000' ;N0 RETLW B'11000000' ;N0 RETLW B'11000000' ;N0 RETLW B'11000000' ;N0 ;============================================================================================================================ ;INICIALIZAÇÃO DO PROGRAMA ;============================================================================================================================ INICIALIZAÇÃO: MOVLW .7 MOVWF CMCON ;DESLIGA COMPARADORES MOVLW B'00001100' MOVWF CCP1CON ;ACERTA PARA FUNÇÃO 'PWM' (RB3 SAIDA) MOVLW B'00000111' ;B2=ON/OFF TMR2 B1/B0=PRESCALER MOVWF T2CON BANK1 MOVLW .0 MOVWF VRCON ;VOLTAGEM DE REFERENCIA LIGADA COM '0'V INICIALMENTE MOVLW B'00000000' ; ACERTA PORTB COMO SAÍDAS P/DISPLAY E PWM( RB3 - PINO 9) MOVWF TRISB MOVLW B'11110010' ;B0= OUT "d"; B1=IN UP; B2=OUT A/K3; B3=OUT A/K2; B4=IN RFIN; B5= IN RESET; B6=IN DOWN; B7=OUT A/K1 MOVWF TRISA MOVLW 0XFF ;ACERTA FREQUENCIA DE TRABALHO MOVWF PR2 CLRF OPTION_REG ;LIMPA OPTION_REG BANK0 ;======================================= ;CARGA DE '000' ZEROS INICIAIS NO DISPLAY CLRF C2 CLRF C1 CLRF C0 CALL BCD_TO_DEC CALL CARGA_MPX ;======================================== ;CONDIÇÃO INICIAL E CARGAS DE CONTADORES MOVLW .0 MOVWF CONTL MOVWF CONTH MOVWF CCPR1L ;INICIA ZERADO O PWM BCF CCP1CON,4 BCF CCP1CON,5 CLRF FLAGS CLRF FLAGSX CLRF MPX MOVLW VTEMP_AJ_RAP MOVWF Z3 CLRF S_MUTE MOVLW V_D_MUTE MOVWF Y1 CLRF Y0 ;================================================================================= ; INICIO DO PROGRAMA PRINCIPAL ;====================================================================================== INICIO: MOVLW TGR ;CARGA DE TEMPO PARA FUNÇÃO: APAGAMENTO EEPROM MOVWF Z2 CLRF Z1 ;================================================================================== CLRF X0 ;CARGA DE TEMPO PARA FUNÇÃO: AJUSTE RÁPIDO MOVLW TOFF MOVWF X1 ;================================================================================== CLRF RES3 ;LIMPA REGISTADORES DE RECEPÇÃO DO HT6P20B CLRF RES2 CLRF RES1 CLRF RES0 MOVLW QBYTE ;CARGA DE QUANTIDADE DE BITS RECEBIDOS MOVWF BITCOUNTER ;================================================================================== L0 BCF FLAG ;APAGA FLAG DE SITUAÇÃO DA ENTRADA RFIN CLRF HC ;APAGA REGISTRADORES DE HUM'S E ZEROS CLRF LC L1 ;======================================================================================= DECFSZ Y0,F ;ROTINA PARA DETERMINAR SE BOTÃO MUTE FOI SOLTO NO CONTROLE REMOTO GOTO SG86 DECFSZ Y1,F GOTO SG86 MOVLW V_D_MUTE ;CARGA PARA TEMPO PARA ACIONAMENTO DO MUTE (ENTRE APERTOS) MOVWF Y1 CLRF Y0 BCF F_MUTE1 ;APAGA FLAG DE MUTE1 BCF F_A1 ;APAGA AS 'TRAVAS DE SALVAMENTO E RECUPERAÇÃO' DO VALOR ANTES DO MUTE BCF F_A2 SG86 ;============================================================================================= CALL MULTIPLEXA ;ROTINA QUE MOSTRA NO DISPLAY O VALOR DE CONTH (MULTIPLEXADO) BTFSC UP ;TESTA AMBOS BOTÕES LIGADOS (MUTE) GOTO SN3 ;VAI PARA TESTE INDIVIDUAL VDOWNTESTE BTFSC DOWN GOTO SN3 ;VAI PARA TESTE INDIVIDUAL BTFSS F_MUTE1 ;BLOQUEIA SE MUTE1 = 1 GOTO TMUTE ;AMBOS LIGADOS, VAI PARA TMUTE GOTO INICIO ;NENHUM BOTÃO LIGADO, VAI PARA O INICIO SN3 BTFSS UP ;TESTA 'UP' GOTO TUP1 ;VAI PARA FUNÇÃO: AUMENTAR VOLUME BTFSS DOWN ;TESTA 'DOWN' GOTO TDOWN1 ;VAI PARA FUNÇÃO: DIMINUIR VOLUME BTFSS AJ_RAP ;TESTA FLAG DE AJUSTE RÁPIDO ,LIGADO? GOTO SG87 ;NÃO, VAI PARA ROTINA NORMAL DECFSZ X0,F ;SIM, COMEÇA A DECREMENTAR CONTANDO TEMPO PARA DESLIGAR AJUSTE RÁPIDO GOTO SG87 DECFSZ X1,F GOTO SG87 BCF AJ_RAP ;ALCANÇOU TEMPO PARA DESLIGAR AJUSTE RÁPIDO MOVLW TOFF ;RECARGA DO REGISTRADOR DE TEMPO MOVWF X1 CLRF X0 SG87 BTFSS LRN ;TESTA SE BOTÃO 'LEARN' ESTÁ APERTADO GOTO TAPAGAMENTO ;ESTÁ APERTADO, VAI CONTAR TEMPO PARA O APAGAMENTO L1H GOTO SS5 ;NÃO ESTÁ, VAI PARA ROTINA DE RECEPÇÃO HT6P20B TUP1 MOVLW .10 ;DELAY COM MULTIPLEXAÇÃO EMBUTIDA CALL DELAY_W BSF F_A1 ;APAGA AS 'TRAVAS DE SALVAMENTO E RECUPERAÇÃO' DO VALOR ANTES DO MUTE BSF F_A2 GOTO TUP ;VAI PARA A FUNÇÃO: AUMENTAR VOLUME TDOWN1 MOVLW .10 ;DELAY COM MULTIPLEXAÇÃO EMBUTIDA CALL DELAY_W BSF F_A1 ;APAGA AS 'TRAVAS DE SALVAMENTO E RECUPERAÇÃO' DO VALOR ANTES DO MUTE BSF F_A2 GOTO TDOWN ;VAI PARA FUNÇÃO:DIMINUIR VOLUME ;======================================================================== ; CONTA TEMPO PARA APAGAMENTO DA EEPROM SE BOTÃO 'LEARN' FICAR PRESSIONADO TAPAGAMENTO DECFSZ Z1,F GOTO L1H DECFSZ Z2,F GOTO L1H CALL APAGAEEPROM ;VAI APAGAR EEPROM BANK1 BCF PORTA,7 ;VIRA SAIDA BANK0 BSF LED ;APAGA LED (UMA PISCADA) MOVLW .10 CALL DELAYM BCF LED ;ACENDE LED MOVLW .10 CALL DELAYM BSF LED ;APAGA LED (UMA PISCADA) MOVLW .10 CALL DELAYM BCF LED ;ACENDE LED MOVLW .10 CALL DELAYM BSF LED ;APAGA LED (UMA PISCADA) MOVLW .10 CALL DELAYM BCF LED ;ACENDE LED MOVLW .10 CALL DELAYM BANK1 BSF PORTA,7 ;VIRA ENTRADA BANK0 BTFSS LRN ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO $-1 GOTO INICIO ;BOTÃO SOLTO, VAI PARA O INICIO ;============================================================================================ ;COMEÇA ROTINA DE RECEPÇÃO HT6P20B SS5: ;A BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO GOTO L2 ;FLAG=0 ;-------------------------------------------------------------------------------------------- ;B BTFSS SIN ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF GOTO M0 ; SIN=0 ;-------------------------------------------------------------------------------------------- L2 ;C BTFSS SIN ;SIN ? GOTO LA1 ;SIN=0 ;--------------------------------------------------------------------------------------------- ;E BSF FLAG ;SIN=1 INCF HC,F BTFSC STATUS,Z DECF HC,F GOTO LA2 ;VAI CONTAR TEMPO DE 50 MICRO SEGUNDOS ;---------------------------------------------------------------------------------------------- LA1 ;D INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF BTFSC STATUS,Z DECF LC,F LA2 MOVLW .6 ;.12 = 50 MICROSEG (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF) MOVWF CONT DECFSZ CONT,F GOTO $-1 GOTO L1 M0 ;---------------------------------------------------------------------------------------------- ;F MOVFW LC ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF SUBLW TMAX BTFSS STATUS,C GOTO INICIO ;C=0 (-) - LC>TMAX (REJEITAR DADO - PAUSA INICIAL) ;---------------------------------------------------------------------------------------------- ;G MOVFW HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) SUBWF LC,W RRF RES3,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF RES2,F RRF RES1,F RRF RES0,F ;--------------------------------------------------------------------------------------------- ;H DECFSZ BITCOUNTER,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 ;LE PROXIMO BIT MOVLW .4 ;DESPREZA OS BITS DE 'ANTICODE' 1010 MOVWF BITCOUNTER ACERTA BCF STATUS,C RRF RES3,F RRF RES2,F RRF RES1,F RRF RES0,F ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3 DECFSZ BITCOUNTER,F GOTO ACERTA BTFSC FLAG1 ;TESTA SE É A PRIMEIRA OU A SEGUNDA RECEPÇÃO GOTO PULA1 MOVFW RES2 ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOVWF RES2A MOVFW RES1 MOVWF RES1A MOVFW RES0 MOVWF RES0A BSF FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO GOTO INICIO PULA1 BCF FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA MOVFW RES2 XORWF RES2A,W BTFSS STATUS,Z GOTO RESETAC MOVFW RES1 XORWF RES1A,W BTFSS STATUS,Z GOTO RESETAC MOVFW RES0 XORWF RES0A,W BTFSS STATUS,Z GOTO RESETAC ;ERRO DE RECEPÇÁO GOTO AÇÃO ;OK - BOA RECEPÇÃO RESETAC CLRF RES3A ; APAGA RESULTADOS DE COMPARAÇÃO CLRF RES2A CLRF RES1A CLRF RES0A GOTO INICIO ;------------------------------------- AÇÃO ;I BTFSS LRN ;BOTÃO ESTÁ APERTADO? BSF FLAGGR CALL PPT SUBLW .0 BTFSC STATUS,Z ; É '0'? GOTO APRENDER ;NENHUM CONTROLE FOI GRAVADO MADDRESS MOVFW TMP MOVWF ADDRESS CALL EEREAD MOVFW RES2 MOVWF TMP1 BCF TMP1,7 ;APAGA DADOS BCF TMP1,6 MOVFW TMP1 XORWF TMP,W ;COMPARA COM RES2 ; XORWF RES2,W ;COMPARA COM RES2 BTFSS STATUS,Z GOTO PROXIMO DECF ADDRESS,F MOVFW ADDRESS CALL EEREAD XORWF RES1,W ;COMPARA COM RES1 BTFSS STATUS,Z GOTO PROXIMO DECF ADDRESS,F MOVFW ADDRESS CALL EEREAD XORWF RES0,W ;COMPARA COM RES0 BTFSC STATUS,Z GOTO ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA PROXIMO MOVFW ADDRESS MOVWF TMP MOVLW .3 SUBWF TMP,F ;ACERTA DE 3 EM 3 A POSIÇÃO DE BUSCA NA MEMÓRIA BTFSS STATUS,Z GOTO MADDRESS APRENDER BTFSS FLAGGR ;TESTA SE BOTÃO 'LEARN' ESTÁ PRESSIONADO GOTO INICIO ;NÃO ESTÁ. CALL PPT ;ESTÁ, PEGA PONTEIRO MOVWF ADDRESS ;PEGA O ENDEREÇO APONTADO SUBLW 0X7E ;LIMITE MAXIMO DA EEPROM (128-1 /3= 42 aparelhos) BTFSS STATUS,C CLRF ADDRESS ;INICIA SOBREGRAVAÇÃO INCF ADDRESS,F ;SOMA 1 MOVFW RES0 MOVWF TMP ;COLOCA EM 'TMP' MOVFW ADDRESS ;DA O POSIÇÃO DE MEMORIA A SER GRAVADO CALL EEWRITE ;ROTINA DE ESCRITA NA EEPROM INCF ADDRESS,F ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM MOVFW RES1 MOVWF TMP MOVFW ADDRESS CALL EEWRITE INCF ADDRESS,F MOVFW RES2 MOVWF TMP BCF TMP,7 ; APAGA OS DADOS PARA USAR UMA UNICA POSIÇÃO DE MEMÓRIA PARA 1CONTROLE DE 2 BOTÕES BCF TMP,6 MOVFW ADDRESS CALL EEWRITE MOVFW ADDRESS MOVWF TMP MOVLW .0 CALL EEWRITE ;GRAVA NOVO ENDEREÇO DE PONTEIRO BCF FLAGGR BTFSS LRN GOTO $-1 MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BANK1 BCF PORTA,7 ;VIRA SAIDA BANK0 BCF LED ;LIGA LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BANK1 BSF PORTA,7 ;VIRA ENTRADA BANK0 ;===================================================== ACIONAR BTFSS RES2,7 ;TESTA QUAIS BOTÕES DO C.REMOTO FOI ACIONADO GOTO SJK2 BTFSS RES2,6 GOTO SJK2 GOTO TMUTE_CR ;AMBOS OS BOTÕES (OU 3º BOTÃO), VAI PARA 'MUTE' SJK2 BTFSC RES2,7 GOTO TUPCR ;VAI PARA FUNÇÃO: AUMENTAR VOLUME VIA C.REMOTO BTFSC RES2,6 GOTO TDOWNCR ;VAI PARA FUNÇÃO: DIMINUIR VOLUME VIA C.REMOTO GOTO INICIO TUPCR BSF F_A2 BSF F_A1 ;TRAVA SALVAMENTO/RECUPERAÇÃO DE MUTE MOVLW TOFF MOVWF X1 CLRF X0 GOTO TUP TDOWNCR BSF F_A2 BSF F_A1 ;TRAVA SALVAMENTO/RECUPERAÇÃO DE MUTE MOVLW TOFF MOVWF X1 CLRF X0 GOTO TDOWN TMUTE_CR MOVLW V_D_MUTE MOVWF Y1 CLRF Y0 TMUTE BTFSC F_MUTE1 GOTO SKU12 BTFSC F_MUTE GOTO SKU10 BSF F_MUTE SKU11 BSF F_MUTE1 SKU12 ;========================== VSSL ;LOOP SE 2 CHAVES ON BTFSC UP GOTO SAI BTFSC DOWN GOTO SAI ;BOTÃO 'MUTE' FOI SOLTO CALL MULTIPLEXA GOTO VSSL ;=========================== SKU10 BCF F_MUTE GOTO SKU11 TUP BTFSC F_MUTE GOTO INICIO INCF CONTL,F MOVLW .4 SUBWF CONTL,W BTFSS STATUS,C GOTO SAI_UP CLRF CONTL INCFSZ CONTH,F GOTO SAI_UP DECF CONTH,F GOTO SAI_UP SAI_UP MOVLW .0 BTFSC AJ_RAP MOVLW V_INCR_RAP ADDWF CONTH,F BTFSS STATUS,C GOTO SAI MOVLW 0XFF MOVWF CONTH GOTO SAI TDOWN BTFSC F_MUTE GOTO INICIO MOVF CONTL,W BTFSS STATUS,Z GOTO SR9 MOVLW .3 MOVWF CONTL SR9 DECFSZ CONTL,F GOTO SAI_DOWN MOVLW .3 MOVWF CONTL SR7 MOVF CONTH,F ;TESTA CONTH BTFSC STATUS,Z GOTO SAI_DOWN DECF CONTH,F GOTO SAI_DOWN SAI_DOWN MOVLW .0 BTFSC AJ_RAP MOVLW V_INCR_RAP SUBWF CONTH,F BTFSC STATUS,C GOTO SAI MOVLW 0X00 MOVWF CONTH GOTO SAI SALVA_VOLUME_MUTA BTFSS F_MUTE RETURN MOVFW CONTH ;SALVA VOLUME EM S_MUTE MOVWF S_MUTE CLRF CONTH ;ZERA O SOM BSF F_M_ON ;LIGA TRAÇOS NO DISPLAY RETURN RECUPERA_VOLUME MOVFW S_MUTE ;RECUPERA O VOLUME MOVWF CONTH BCF F_M_ON ;DESLIGA TRAÇOS NO DISPLAY RETURN SAI BTFSS F_MUTE GOTO XH7 BTFSC F_A1 GOTO XH8 CALL SALVA_VOLUME_MUTA ;VOLUME MINIMO SE MUTE ACIONADO BSF F_A1 GOTO XH8 XH7 BTFSC F_A2 GOTO XH8 CALL RECUPERA_VOLUME ;RECUPERA VOLUME ANTERIOR AO MUTE BSF F_A2 XH8 BTFSS CONTL,0 ;ACERTA DUTY CICLE BCF CCP1CON,4 BTFSC CONTL,0 BSF CCP1CON,4 BTFSS CONTL,1 BCF CCP1CON,5 BTFSC CONTL,1 BSF CCP1CON,5 MOVFW CONTH MOVWF CCPR1L BTFSS F_M_ON ;TESTA SE DEVE COLOCAR '---' GOTO SDL1 MOVLW B'10111111' ;'-' TRAÇOS IFDEF CATODO_COMUM XORLW 0XFF ENDIF MOVWF C2 MOVWF C1 MOVWF C0 GOTO SDL2 SDL1 CLRF C2 CLRF C1 MOVFW CONTH MOVWF C0 CALL BCD_TO_DEC ;CONVERTE CONTH EM DECIMAL CALL CARGA_MPX BTFSC AJ_RAP GOTO INICIO DECFSZ Z3,F GOTO INICIO BSF AJ_RAP ;FLAG DE ACIONAMENTO RÁPIDO MOVLW VTEMP_AJ_RAP MOVWF Z3 SDL2 CALL MULTIPLEXA GOTO INICIO CARGA_MPX MOVFW RES1X ANDLW 0X0F CALL TAB_N ;BUSCA DIGITO NA TABELA IFDEF CATODO_COMUM XORLW 0XFF ENDIF MOVWF C2 SWAPF RES0X,W ANDLW 0X0F CALL TAB_N ;BUSCA DIGITO NA TABELA IFDEF CATODO_COMUM XORLW 0XFF ENDIF MOVWF C1 MOVFW RES0X ANDLW 0X0F CALL TAB_N ;BUSCA DIGITO NA TABELA IFDEF CATODO_COMUM XORLW 0XFF ENDIF MOVWF C0 RETURN ;=============================================================== MULTIPLEXA DECFSZ Z4,F RETURN MOVLW .100 MOVWF Z4 BCF A_C1 BCF A_C2 BCF A_C3 ;PREAPAGA MOVFW PORTB ANDLW B'10001000' ;APAGA TODOS BITS , MENOS O 3ºBIT MOVWF PORTB BCF PORTA,0 AF0 INCF MPX,F MOVFW MPX SUBLW .1 BTFSS STATUS,Z GOTO AF1 BSF A_C1 MOVFW C0 MOVWF TEMP1 GOTO SK6 AF1 MOVFW MPX SUBLW .2 BTFSS STATUS,Z GOTO AF2 BSF A_C2 MOVFW C1 MOVWF TEMP1 GOTO SK6 AF2 MOVFW MPX SUBLW .3 BTFSS STATUS,Z GOTO AF3 BSF A_C3 MOVFW C2 MOVWF TEMP1 CLRF MPX GOTO SK6 AF3 CLRF MPX GOTO AF0 SK6 BTFSS TEMP1,3 ;ACERTA BIT EM OUTRA PORTA PARA SEG. 'd' BCF PORTA,0 BTFSC TEMP1,3 BSF PORTA,0 BCF TEMP1,3 ;APAGA 3º BIT BCF TEMP1,7 ;APAGA 7º BIT MOVFW PORTB ANDLW B'10001000' ;APAGA TODOS BITS , MENOS O 3ºBIT IORWF TEMP1,W MOVWF PORTB RETURN ;============================================================== ;ROTINAS DELAY_W MOVWF DEL2 MOVLW .4 MOVWF DEL1 MOVLW .250 MOVWF DEL0 CALL MULTIPLEXA DECFSZ DEL0,F GOTO $-2 DECFSZ DEL1,F GOTO $ - 6 DECFSZ DEL2,F GOTO $ - .10 RETURN ;================================================================== BCD_TO_DEC B2BCD MOVLW .24 ; PARA 24 BIT DE RESULTADO MOVWF TEMP0 ; CONTADOR TEMPORÁRIO CLRF RES0X ; APAGA RESULTADOS CLRF RES1X CLRF RES2X CLRF RES3X VRP1X MOVLW RES3X ; APONTA PARA INICIO DOS REGISTRADORES MOVWF FSR MOVLW .4 MOVWF TEMP1 ; Mike's routine: VRP2X MOVLW 0x33 ADDWF INDF,f ; SOMA BTFSC INDF,3 ; TESTA SE RESULTADO > 7 ANDLW 0xf0 ; RESULTADO LOW >7 SOMA 3 BTFSC INDF,7 ; TESTA SE RESULTADO É > 7 ANDLW 0x0f ; MAIOR QUE 7 ENTÃO OK SUBWF INDF,f ; RESULTADO <= 7 RETORNA RETORNA VALOR ANTERIOR INCF FSR,f ; APONTA PARA O PRÓXIMO ;DECF FSR,F DECFSZ TEMP1,f GOTO VRP2X BCF STATUS,C RLF C0,f ; DESLOCA RLF C1,f RLF C2,f RLF RES0X,f ; RESULTADOS RLF RES1X,f RLF RES2X,f RLF RES3X,f DECFSZ TEMP0,F ; CONVERSÃO CHEGOU AO FIM? GOTO VRP1X ; RETORNA PARA CONVERÇÃO RETURN ; RETORNA COM EXITO ;-------------------------------------------------------------- DELAYM MOVWF R0 XC CALL AGUARDE DECFSZ R0,F GOTO XC RETURN ;**************************************************** ;PEGA PONTEIRO NA EEPROM - ULTIMO ENDEREÇO PPT MOVLW .0 CALL EEREAD ;LE PONTEIRO DA EEPROM RETURN AGUARDE ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM MOVLW .64 MOVWF R1 CG2 CLRWDT MOVLW .255 MOVWF R2 DECFSZ R2,F GOTO $-1 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 ;------------------------------------------------------------------------------ APAGAEEPROM ;OK TESTADA E APROVADA ; ROTINA PARA APAGAR TODAS AS POSIÇOES DA EEPROM DO 16F628 MOVLW 0X80 ;TOTAL DE 128 + 1 BYTES DE EEPROM MOVWF AUX RET6 CLRWDT MOVFW AUX MOVLW .1 ;ACERTA ENDEREÇO TIRANDO 1 SUBWF AUX,W BANK1 movwf EEADR MOVLW 0XFF movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; enable Write\par movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_C clrwdt btfsc EECON1, WR ; Write complete ?\par goto WRITE_SN_C bcf EECON1, WREN ; disable Write\par BANK0 DECFSZ AUX,F GOTO ESPERA clrwdt RETLW 0H ESPERA ;DELAY ENTRE APAGAMENTOS MOVLW .8 MOVWF R1 CG1 MOVLW .255 MOVWF R2 DECFSZ R2,F GOTO $-1 DECFSZ R1,F GOTO CG1 GOTO RET6 ORG H'2100' DE .0 end