;********************************************************************************************** ; CAMPAINHA_MUSICAL.ASM ; ; RECEBE SINAIS DE UM CHAVEIRINHO TRANSMISSOR DE CONTROLE REMOTO ; COM CI INTERNO DO TIPO HT6P20B, GERANDO SONS MUSICAIS ESCOLHIDOS ; NO PROGRAMA. ; ; ; CLAUDIO LÁRIOS INICIO: 23-08-13 TERMINO:24-08-13 ;*********************************************************************************************** ; ; 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. ;*********************************************************************************************** ;ESCOLHA AQUI O MODELO DO MICROCONTROLADOR (COMENTE O NÃO USADO) #DEFINE F675 ;DESCOMENTE PARA 12F675 ;#DEFINE F629 ; DESCOMENTE PARA 12F629 ;=============================================================================================== IFDEF F629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ENDIF IFDEF F675 LIST P=12f675 , R=DEC ;opcionalmente para 12f675 INCLUDE "P12F675.INC" ENDIF ;================================================================================================ ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _MCLRE_OFF ;EQUATES COM CARGA DO TIMER 1 PARA AS RESPECTIVAS NOTAS MUSICAIS C_H EQU HIGH (0X10000 -(.500000/.262)) ;C=262 Hz / DO C_L EQU LOW (0X10000 -(.500000/.262)) DB_H EQU HIGH(0X10000 -(.500000/.277)) ;Db=277 Hz / RE bemol DB_L EQU LOW (0X10000 -(.500000/.277)) D_H EQU HIGH(0X10000 -(.500000/.294)) ;D=294 Hz/ RE D_L EQU LOW (0X10000 -(.500000/.294)) EB_H EQU HIGH(0X10000 -(.500000/.311)) ;Eb=311 Hz / MI bemol EB_L EQU LOW (0X10000 -(.500000/.311)) E_H EQU HIGH(0X10000 -(.500000/.330)) ;E=330 / MI E_L EQU LOW (0X10000 -(.500000/.330)) F_H EQU HIGH(0X10000 -(.500000/.349)) ;F=349 / FA F_L EQU LOW (0X10000 -(.500000/.349)) GB_H EQU HIGH(0X10000 -(.500000/.370)) ;Gb=370 / SOL bemol GB_L EQU LOW (0X10000 -(.500000/.370)) G_H EQU HIGH(0X10000 -(.500000/.392)) ;G=392 / SOL G_L EQU LOW (0X10000 -(.500000/.392)) AB_H EQU HIGH(0X10000 -(.500000/.415)) ;Ab=415 / LA bemol AB_L EQU LOW (0X10000 -(.500000/.415)) A_H EQU HIGH(0X10000 -(.500000/.440)) ;A=440 / LA A_L EQU LOW (0X10000 -(.500000/.440)) BB_H EQU HIGH(0X10000 -(.500000/.466)) ;Bb=466 / SI bemol BB_L EQU LOW (0X10000 -(.500000/.466)) B_H EQU HIGH(0X10000 -(.500000/.494)) ;B=494 / SI B_L EQU LOW (0X10000 -(.500000/.494)) ;============================================================= ; OITAVA SUPERIOR (OITAVADO) C1_H EQU HIGH (0X10000 -(.500000/.523)) ;C=523 Hz / DO C1_L EQU LOW (0X10000 -(.500000/.523)) DB1_H EQU HIGH(0X10000 -(.500000/.554)) ;Db=554 Hz / RE bemol DB1_L EQU LOW (0X10000 -(.500000/.554)) D1_H EQU HIGH(0X10000 -(.500000/.587)) ;D=587 Hz/ RE D1_L EQU LOW (0X10000 -(.500000/.587)) EB1_H EQU HIGH(0X10000 -(.500000/.622)) ;Eb=622 / MI bemol EB1_L EQU LOW (0X10000 -(.500000/.622)) E1_H EQU HIGH(0X10000 -(.500000/.659)) ;E=659 / MI E1_L EQU LOW (0X10000 -(.500000/.659)) F1_H EQU HIGH(0X10000 -(.500000/.698)) ;F=698 / FA F1_L EQU LOW (0X10000 -(.500000/.698)) GB1_H EQU HIGH(0X10000 -(.500000/.740)) ;Gb=740 / SOL bemol GB1_L EQU LOW (0X10000 -(.500000/.740)) G1_H EQU HIGH(0X10000 -(.500000/.784)) ;G=784 / SOL G1_L EQU LOW (0X10000 -(.500000/.784)) AB1_H EQU HIGH(0X10000 -(.500000/.831)) ;Ab=831 / LA bemol AB1_L EQU LOW (0X10000 -(.500000/.831)) A1_H EQU HIGH(0X10000 -(.500000/.880)) ;A=880 / LA A1_L EQU LOW (0X10000 -(.500000/.880)) BB1_H EQU HIGH(0X10000 -(.500000/.933)) ;Bb=932 / SI bemol BB1_L EQU LOW (0X10000 -(.500000/.933)) B1_H EQU HIGH(0X10000 -(.500000/.988)) ;B=988 / SI B1_L EQU LOW (0X10000 -(.500000/.988)) #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 SIN GPIO,0 ;PINO 7 IN RF #DEFINE LRN GPIO,3 ;PINO 4 IN LEARN BOTTON #DEFINE LED GPIO,5 ;PINO 2 OUT LED #DEFINE SOM GPIO,1 ;PINO 6- SAIDA DO LED1 #DEFINE JUMPER GPIO,4 ;PINO 3- IN JUMPER DE ESCOLHA DA MUSICA CBLOCK 0X20 RES3,RES2,RES1,RES0,AUX,WS,TEMP,BITCOUNTER,FLAGS,Z2,Z1 LC,CONT,RES3A,RES2A,RES1A,RES0A,R0,R1,R2,TMP1,ADDRESS,TMP,HC TEMP1, TEMP2,TEMPO, TMRH_AUX,TMRL_AUX W_TEMP,STATUS_TEMP ENDC WRCFG EQU B'00000000' ; PORTB: EEPROM WRITE TRI-STATE VALUE YTRISA EQU B'011101' ; PORTA: TRI-STATE VALUE GP5 LED 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 .255 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO ORG H'2100' ;vetor de eeprom ORG 0X00 GOTO START ORG 0X04 GOTO INT_MUSICA START: MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF GPIO ; RESET PORT MOVLW YTRISA ; SETUP PORTA TRIS GPIO BANK1 MOVLW B'00000100' ; TMR0/16 MOVWF OPTION_REG ; BSF PIE1,0 ;LIGA INTERRUPÇÃO DO TIMER1 BSF WPU,4 ;LIGA PULLUP PINO 3 IFDEF F675 MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD ENDIF BANK0 MOVLW 0X01 ;PRESCALLER /1 NO TMR1 MOVWF T1CON ;LIGA TIMER 1 MOVLW B'01100000' ;LIGA INTERRUPÇÃO PERIFÉRICOS E TMR0 MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES CLRF FLAGS MOVLW TGR MOVWF Z2 CLRF Z1 INICIO: CLRF RES3 CLRF RES2 CLRF RES1 CLRF RES0 MOVLW QBYTE MOVWF BITCOUNTER L0 BCF FLAG CLRF HC CLRF LC L1 ;--------------------------------- BTFSS LRN GOTO TAPAGAMENTO L1H GOTO SS5 TAPAGAMENTO DECFSZ Z1,F GOTO L1H DECFSZ Z2,F GOTO L1H CALL APAGAEEPROM MOVLW TGR MOVWF Z2 CLRF Z1 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 BTFSS LRN ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO $-1 GOTO INICIO 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 .11 ;.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 BSF LED ;LIGA LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BCF LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM ACIONAR BTFSS JUMPER ;TESTA JUMPER CALL SWEET_CHILD_O_MINE ;EXECUTA (INICIO DA MÚSICA APENAS) BTFSC JUMPER CALL SUPER_MARIO_BROS_THEME GOTO INICIO ;-------------------------------------------------------------- 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 ;============================================================================================== ; ROTINA COM MUSICA N.1 ;============================================================================================== SUPER_MARIO_BROS_THEME MOVLW .40 ;PRIMEIRA ESTROFE CALL N_E1 MOVLW .10 ;PAUSA CALL DELAY_W MOVLW .30 CALL N_E1 MOVLW .30 CALL N_E1 MOVLW .30 ;PAUSA CALL DELAY_W MOVLW .30 CALL N_C1 MOVLW .30 CALL N_E1 MOVLW .60 CALL N_G1 RETURN ;================================================================================================= ; ROTINA DE MUSICA N.2 ;================================================================================================= SWEET_CHILD_O_MINE MOVLW .30 ;PRIMEIRA ESTROFE CALL N_D MOVLW .30 CALL N_D1 MOVLW .30 CALL N_A MOVLW .30 CALL N_G MOVLW .30 CALL N_G1 MOVLW .30 CALL N_A MOVLW .30 CALL N_GB1 MOVLW .30 CALL N_A MOVLW .30 CALL N_D MOVLW .30 CALL N_D1 MOVLW .30 CALL N_A MOVLW .30 CALL N_G MOVLW .30 CALL N_G1 MOVLW .30 CALL N_A MOVLW .30 CALL N_GB1 MOVLW .30 CALL N_A MOVLW .30 ;PAUSA CALL DELAY_W MOVLW .30 ;SEGUNDA ESTROFE CALL N_E MOVLW .30 CALL N_D1 MOVLW .30 CALL N_A MOVLW .30 CALL N_G MOVLW .30 CALL N_G1 MOVLW .30 CALL N_A MOVLW .30 CALL N_GB1 MOVLW .30 CALL N_A MOVLW .30 CALL N_A MOVLW .30 CALL N_D1 MOVLW .30 CALL N_A MOVLW .30 CALL N_G MOVLW .30 CALL N_G1 MOVLW .30 CALL N_A MOVLW .30 CALL N_GB1 MOVLW .30 CALL N_A MOVLW .30 ;PAUSA CALL DELAY_W MOVLW .30 ;TERCEIRA ESTROFE CALL N_G MOVLW .30 CALL N_D1 MOVLW .30 CALL N_A MOVLW .30 CALL N_G MOVLW .30 CALL N_G1 MOVLW .30 CALL N_A MOVLW .30 CALL N_GB1 MOVLW .30 CALL N_A MOVLW .30 ;PAUSA CALL DELAY_W MOVLW .30 CALL N_G MOVLW .30 CALL N_D1 MOVLW .30 CALL N_A MOVLW .30 CALL N_G MOVLW .30 CALL N_G1 MOVLW .30 CALL N_A MOVLW .30 CALL N_GB1 MOVLW .30 CALL N_A MOVLW .30 ;PAUSA CALL DELAY_W MOVLW .30 ;ESTROFE FINAL DA INTRODUÇÃO CALL N_E1 MOVLW .30 CALL N_A1 MOVLW .30 CALL N_D1 MOVLW .30 CALL N_A1 MOVLW .30 CALL N_E1 MOVLW .30 CALL N_A1 MOVLW .30 CALL N_GB1 MOVLW .30 CALL N_A1 MOVLW .30 CALL N_G1 MOVLW .30 CALL N_A1 MOVLW .30 CALL N_GB1 MOVLW .30 CALL N_A1 MOVLW .30 CALL N_E1 MOVLW .30 CALL N_A1 MOVLW .30 CALL N_D1 RETURN ;================================================================================================ ;================================================================================================= ; ROTINAS PARA GERAÇÃO DE NOTAS MUSICAIS ;================================================================================================= N_C ;DÓ MOVWF TEMPO MOVLW C_H MOVWF TMRH_AUX MOVLW C_L MOVWF TMRL_AUX GOTO INIT_MUS N_C1 ;DÓ OITAVADO MOVWF TEMPO MOVLW C1_H MOVWF TMRH_AUX MOVLW C1_L MOVWF TMRL_AUX GOTO INIT_MUS N_DB ;RÉ BEMOL MOVWF TEMPO MOVLW DB_H MOVWF TMRH_AUX MOVLW DB_L MOVWF TMRL_AUX GOTO INIT_MUS N_DB1 ;RÉ BEMOL OITAVADO MOVWF TEMPO MOVLW DB1_H MOVWF TMRH_AUX MOVLW DB1_L MOVWF TMRL_AUX GOTO INIT_MUS N_D ;RÉ MOVWF TEMPO MOVLW D_H MOVWF TMRH_AUX MOVLW D_L MOVWF TMRL_AUX GOTO INIT_MUS N_D1 ;RÉ OITAVADO MOVWF TEMPO MOVLW D1_H MOVWF TMRH_AUX MOVLW D1_L MOVWF TMRL_AUX GOTO INIT_MUS N_EB ;MÍ BEMOL MOVWF TEMPO MOVLW EB_H MOVWF TMRH_AUX MOVLW EB_L MOVWF TMRL_AUX GOTO INIT_MUS N_EB1 ;MÍ BEMOL OITAVADO MOVWF TEMPO MOVLW EB1_H MOVWF TMRH_AUX MOVLW EB1_L MOVWF TMRL_AUX GOTO INIT_MUS N_E ;MÍ MOVWF TEMPO MOVLW E_H MOVWF TMRH_AUX MOVLW E_L MOVWF TMRL_AUX GOTO INIT_MUS N_E1 ;MÍ OITAVADO MOVWF TEMPO MOVLW E1_H MOVWF TMRH_AUX MOVLW E1_L MOVWF TMRL_AUX GOTO INIT_MUS N_F ;FÁ MOVWF TEMPO MOVLW F_H MOVWF TMRH_AUX MOVLW F_L MOVWF TMRL_AUX GOTO INIT_MUS N_F1 ;FÁ OITAVADO MOVWF TEMPO MOVLW F1_H MOVWF TMRH_AUX MOVLW F1_L MOVWF TMRL_AUX GOTO INIT_MUS N_GB ;SOL BEMOL MOVWF TEMPO MOVLW GB_H MOVWF TMRH_AUX MOVLW GB_L MOVWF TMRL_AUX GOTO INIT_MUS N_GB1 ; SOL BEMOL OITAVADO MOVWF TEMPO MOVLW GB1_H MOVWF TMRH_AUX MOVLW GB1_L MOVWF TMRL_AUX GOTO INIT_MUS N_G ;SOL MOVWF TEMPO MOVLW G_H MOVWF TMRH_AUX MOVLW G_L MOVWF TMRL_AUX GOTO INIT_MUS N_G1 ;SOL OITAVADO MOVWF TEMPO MOVLW G1_H MOVWF TMRH_AUX MOVLW G1_L MOVWF TMRL_AUX GOTO INIT_MUS N_AB ; LÁ BEMOL MOVWF TEMPO MOVLW AB_H MOVWF TMRH_AUX MOVLW AB_L MOVWF TMRL_AUX GOTO INIT_MUS N_AB1 ;LÁ BEMOL OITAVADO MOVWF TEMPO MOVLW AB1_H MOVWF TMRH_AUX MOVLW AB1_L MOVWF TMRL_AUX GOTO INIT_MUS N_A ; LÁ MOVWF TEMPO MOVLW A_H MOVWF TMRH_AUX MOVLW A_L MOVWF TMRL_AUX GOTO INIT_MUS N_A1 ;LÁ OITAVADO MOVWF TEMPO MOVLW A1_H MOVWF TMRH_AUX MOVLW A1_L MOVWF TMRL_AUX GOTO INIT_MUS N_BB ; SÍ BEMOL MOVWF TEMPO MOVLW BB_H MOVWF TMRH_AUX MOVLW BB_L MOVWF TMRL_AUX GOTO INIT_MUS N_BB1 ;SÍ BEMOL OITAVADO MOVWF TEMPO MOVLW BB1_H MOVWF TMRH_AUX MOVLW BB1_L MOVWF TMRL_AUX GOTO INIT_MUS N_B ;SÍ MOVWF TEMPO MOVLW B_H MOVWF TMRH_AUX MOVLW B_L MOVWF TMRL_AUX GOTO INIT_MUS N_B1 ;SÍ OITAVADO MOVWF TEMPO MOVLW B1_H MOVWF TMRH_AUX MOVLW B1_L MOVWF TMRL_AUX GOTO INIT_MUS ; ROTINA COMPLEMENTAR INIT_MUS BSF INTCON,GIE MOVF TEMPO,F BTFSS STATUS,Z GOTO $-2 BCF SOM BCF INTCON,GIE MOVLW .0 ;PAUSA NO FINAL DA NOTA T_ESP1 ADDLW .1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 BTFSS STATUS,Z GOTO T_ESP1 RETURN ; DELAY DE PAUSAS DELAY_G MOVFW TEMP V_TY1 MOVLW .10 CALL DELAY_W DECFSZ TEMP,F GOTO V_TY1 RETURN DELAY_W MOVWF TEMP2 V_DF1 MOVLW .250 MOVWF TEMP1 DECFSZ TEMP1,F GOTO $-1 DECFSZ TEMP2,F GOTO V_DF1 RETURN ;================================================================== ; ROTINA DE INTERRUPÇÃO ;================================================================== INT_MUSICA MOVWF W_TEMP ;SALVA 'W' (MODO COMPILER) MOVF STATUS,W ;SALVA 'STATUS' MOVWF STATUS_TEMP BANK0 BTFSS PIR1,0 GOTO INT_TMR0 BCF PIR1,0 ;APAGA FLAG DO TMR1 MOVFW TMRH_AUX MOVWF TMR1H MOVFW TMRL_AUX MOVWF TMR1L BTFSS SOM GOTO L_SOM BCF SOM GOTO SAI_INT L_SOM BSF SOM GOTO SAI_INT INT_TMR0 BTFSS INTCON,T0IF GOTO SAI_INT DECF TEMPO,F BCF INTCON,T0IF SAI_INT MOVF STATUS_TEMP,W ;RECUPERA 'STATUS' (MODO COMPILER) MOVWF STATUS SWAPF W_TEMP,F ;RECUPERA 'W' SWAPF W_TEMP,W RETFIE ORG H'2100' DE .0 end