;******************************************************************************************************************* ; PROJETO: PAINEL ORIENTADOR DE FILAS RAPIDAS PARA MERCADOS,ETC, COM LED'S VERSÃO1.1 ; INICIO : 20/08/12 TERM.: 21/08/2012 ; ; AUTOR: CLÁUDIO LÁRIOS ; BLOG 'LARIOS.TECNOLOGIA.WS' ; PROCESSADOR: PIC 16F628A ; REVISADO 04-01-2013 ; (ELIMINADO BUG DE FALSA RECEPÇÃO COM CÓDIGO 'FFFFFF'C/ INTERFERÊNCIAS ; ELIMINADO BUG DE MAU FUNCIONAMENTO COM CÓDIGOS DE CONTROLES SEQUENCIAIS) ; OBJETIVO: VISUALIÇÃO EM PAINEL DE LEDS, O NÚMERO DO CAIXA DISPONIVEL PARA O CLIENTE ; EM UMA FILA 'RÁPIDA'. O ACIONAMENTO DESTE PAINEL, SERÁ POR CONTROLE REMOTO (CHAVEIRINHO) ; COMERCIAL (USADOS EM CONTROLE REMOTO DE PORTÕES,POR EX.)QUE USE CI HT6P20B. ; CADA CONTROLE (CHAVEIRINHO) TEM QUE SER 'APRENDIDO' INICIALMENTE ANTES DO USO. ; USO: 1) APRENDER CONTROLE: ; APERTE QUALQUER BOTÃO DO CONTROLE REMOTO PRÓXIMO DO PAINEL, E EM SEGUIDA APERTE O BOTÃO ; 'LEARN' POR 1 SEGUNDO E SOLTE. o LED 'LEARN' PISCARÁ, INDICANDO APRENDIZADO E SERÁ MOSTRADO ; O NÚMERO DO 'CAIXA' QUE USARÁ ESTE CONTROLE. ; OS CONTROLES APRENDIDOS RECEBERÃO UM NUMERO SEQUENCIAL (1,2,3...) E CADA CONTROLE CORRESPONDENTE ; FICARÁ COM O OPERADOR DO CAIXA DE MESMO NUMERO. ; AO APERTAR QUALQUER TECLA DO CONTROLE REMOTO (CHAVEIRINHO) APARECERÁ NO PAINEL O NÚMERO DO 'CAIXA ; LIVRE' OU SEJA, AQUELE QUE FOI APERTADO. ; SERÁ EMITIDO UM SINAL SONORO PARA CHAMAR ATENÇÃO A MUDANÇA NO PAINEL. ; DEPOIS DE ALGUNS SEGUNDOS, APAGA O NÚMERO OU SE OUTRO CONTROLE FOR ACIONADO, SE SOBREPORÁ AO ANTERIOR. ; MOSTRADOR COM 2 DIGITOS (CAIXA 1 A 99). ; UTILIZE DISPLAY GRANDE COMERCIAL OU CONFECCIONE COM LED'S DE AUTO BRILHO. ;___________________________________________________________________________________________________ ; PINAGEM DO PIC16F628A: ; PINO 1 - DISPLAY 7 SEG - SEGUIMENTO 'C' DA UNIDADE ; PINO 2 - DISPLAY 7 SEG - SEGUIMENTO 'D' DA UNIDADE ; PINO 3 - DISPLAY 7 SEG - SEGUIMENTO 'E' DA UNIDADE (PRECISA DE PULL-UP DE 470 OHMS - COLECTOR OPEN) ; PINO 4 - ENTRADA DE SINAL RF - RESISTOR DE 470 OHMS A SAIDA DO RECEPTOR DE RF ; PINO 5 - GND ; PINO 6 - DISPLAY 7 SEG - SEGUIMENTO 'A' DA DEZENA ; PINO 7 - DISPLAY 7 SEG - SEGUIMENTO 'B' DA DEZENA ; PINO 8 - DISPLAY 7 SEG - SEGUIMENTO 'C' DA DEZENA ; PINO 9 - DISPLAY 7 SEG - SEGUIMENTO 'D' DA DEZENA ; PINO 10 - DISPLAY 7 SEG - SEGUIMENTO 'E' DA DEZENA ; PINO 11 - ENTRADA DE BOTÃO 'LEAN'/SAIDA DE SOM/SAIDA LED 'LEARN' (VIDE ESQUEMA) ; PINO 12 - DISPLAY 7 SEG - SEGUIMENTO 'F' DA DEZENA ; PINO 13 - DISPLAY 7 SEG - SEGUIMENTO 'G' DA DEZENA ; PINO 14 - VCC +5V ; PINO 15 - DISPLAY 7 SEG - SEGUIMENTO 'F' DA UNIDADE ; PINO 16 - DISPLAY 7 SEG - SEGUIMENTO 'G' DA UNIDADE ; PINO 17 - DISPLAY 7 SEG - SEGUIMENTO 'A' DA UNIDADE ; PINO 18 - DISPLAY 7 SEG - SEGUIMENTO 'B' DA UNIDADE ; OSCILADOR INTERNO DE 4MHZ #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;suppress bank selection messages ;===================================================================================================== ;OBS. ESCOLHA SUA OPÇÃO #DEFINE CATODO_COMUM ;ESTA É A OPÇÃO PARA O ESQUEMA DO ORGANIZADOR DE FILAS,VISTO ESTARMOS INVERTENDO SAIDA COM TRANSISTOR. ;#DEFINE ANODO_COMUM ;===================================================================================================== ; PAGINACAO DE MEMORIA; #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 FLAGTA FLAGS,3 ;FLAG DE TEMPO MAXIMO DE APRESENTAÇÃO #DEFINE SIN PORTA,5 ;PINO 4 IN RF #DEFINE SOM PORTB,5 ;PINO 11 SAIDA DE SOM #DEFINE LRN PORTB,5 ;PINO 11 IN LEARN BOTTON #DEFINE LED PORTB,5 ;PINO 11 SAIDA LED 'LEARN' CBLOCK 0X20 RES3,RES2,RES1,RES0,AUX,C3,C2,C1,C0,TEMP,BITCOUNTER,FLAGS,TL0,TL1,TL2,Z2,Z1 AUX2 ,LC,HC ,CONT,RES3A,RES2A,RES1A,RES0A,X,R0,R1,R2,TMP1,TMP2,TMP3,ADDRESS,ADDRESS_S,TMP,TMP_SALVO T3,T2,T1,RAU,AUX1,AUX4,AUX5,DEL5 ENDC 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 C_T3 EQU .6 C_T2 EQU .255 C_T1 EQU .255 MAX_N_CONTROLES EQU .99 ;NÚMERO MÁXIMO DE CONTROLES ORG 0X00 GOTO START ORG 0X04 RETFIE TAB_NUM ; GF-EDCBA ADDWF PCL,F RETLW B'01011111' ; N. 0 RETLW B'00000110' ; N. 1 RETLW B'10011011' ; N. 2 RETLW B'10001111' ; N. 3 RETLW B'11000110' ; N. 4 RETLW B'11001101' ; N. 5 RETLW B'11011101' ; N. 6 RETLW B'00000111' ; N. 7 RETLW B'11011111' ; N. 8 RETLW B'11001111' ; N. 9 START: MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES IFDEF ANODO_COMUM MOVLW 0XFF MOVWF PORTA MOVWF PORTB ENDIF IFDEF CATODO_COMUM CLRF PORTB ; RESET PORT CLRF PORTA ENDIF BANK1 MOVLW .0 MOVWF TRISA MOVLW B'00100000' ;TUDO SAÍDA EXCETO RB5 COMO ENTRADA 'LRN' MOVWF TRISB BANK0 CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS MOVLW TGR MOVWF Z2 CLRF Z1 ;LIMPA REGISTRADORES INICIO: CLRF RES3 CLRF RES2 CLRF RES1 CLRF RES0 MOVLW QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF BITCOUNTER L0 BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC CLRF LC L1 ;--------------------------------- BTFSS LRN ;TESTA BOTÃO 'LEARN' APERTADO GOTO TAPAGAMENTO ;APERTADO, COMEÇA A CONTAR TEMPO MAX. DE APAGAMENTO MOVLW TGR MOVWF Z2 ;RECARGA DO TEMPO DE APAGAMENTO CLRF Z1 ;LIMPA REGISTRADORES L1H GOTO SS5 TAPAGAMENTO ;APAGAR TODOS OS CONTROLES DA MEMÓRIA DECFSZ Z1,F GOTO L1H DECFSZ Z2,F GOTO L1H CALL APAGAEEPROM ;ATINGIU TEMPO MAXIMO: APAGAR MEMÓRIA BANK1 BCF TRISB,5 ;VIRA SAIDA PARA O LED 'LEARN' BANK0 BSF LED ;ACENDE LED (UMA PISCADA) MOVLW .10 CALL DELAYM BCF LED ;APAGA LED MOVLW .10 CALL DELAYM BSF LED ;ACENDE LED (UMA PISCADA) MOVLW .10 CALL DELAYM BCF LED ;APAGA LED MOVLW .10 CALL DELAYM BSF LED ;ACENDE LED (UMA PISCADA) MOVLW .10 CALL DELAYM BCF LED ;APAGA LED MOVLW .10 CALL DELAYM BANK1 BSF TRISB,5 ;VIRA ENTRADA PARA TESTAR BOTÃO 'LEARN' BANK0 BTFSS LRN ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO $-1 GOTO INICIO SS5: BTFSS FLAGTA GOTO SEG88 DECFSZ T1,F GOTO SEG88 DECFSZ T2,F GOTO SEG88 DECFSZ T3,F GOTO SEG88 ;APAGA NUMEROS NO DISPLAY IFDEF CATODO_COMUM CLRF PORTA CLRF PORTB ENDIF IFDEF ANODO_COMUM MOVLW 0XFF MOVWF PORTA MOVWF PORTB ENDIF BCF FLAGTA SEG88 ;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 ;.11 = 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) ;F' ;----------------------------------- ;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 ;=========================================================== ;ROTINA PARA ELIMINAR RECEPÇÃO 'FFFFFF' (MEMÓRIA VIRGEM) MOVFW RES2 XORLW 0XFF BTFSS STATUS,Z GOTO R_CONT MOVFW RES1 XORLW 0XFF BTFSS STATUS,Z GOTO R_CONT MOVFW RES0 XORLW 0XFF BTFSS STATUS,Z GOTO R_CONT GOTO RESETAC ;RECEBEU 'FFFFFF' = ERRO R_CONT ;======================================================== MOVLW 0X0F ANDWF RES2,F ;APAGA BOTÕES ;I BTFSS LRN ;BOTÃO ESTÁ APERTADO? BSF FLAGGR CALL PPT MOVWF TMP_SALVO SUBLW .0 BTFSC STATUS,Z ; É '0'? GOTO APRENDER ;NENHUM CONTROLE FOI GRAVADO MADDRESS MOVFW TMP_SALVO MOVWF ADDRESS CALL EEREAD 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 ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA PROCURAR.... MOVLW .3 SUBWF TMP_SALVO,F ;ACERTA DE 3 EM 3 A POSIÇÃO DE BUSCA NA MEMÓRIA BTFSS STATUS,C GOTO APRENDER BTFSS STATUS,Z GOTO MADDRESS ;VOLTA A BUSCA 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 MAX_N_CONTROLES ;LIMITE MAXIMO DA EEPROM (99 CONTROLES) 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 MOVWF ADDRESS_S 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 MOVFW ADDRESS CALL EEWRITE MOVFW ADDRESS MOVWF TMP MOVLW .0 CALL EEWRITE ;GRAVA NOVO ENDEREÇO DE PONTEIRO BCF FLAGGR BANK1 BCF PORTB,5 ;VIRA SAIDA BANK0 BSF LED ;LIGA LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BCF LED ;LIGA LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BSF LED ;LIGA LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BANK1 BSF PORTB,5 ;VIRA ENTRADA BANK0 BTFSS LRN GOTO $-1 MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM MOVFW ADDRESS_S ;RETORNA VALOR DE ADDRESS MOVWF ADDRESS ACIONAR ;MOSTRA O NUMERO DA CAIXA (NÚMERO DO CONTROLE) MOVFW ADDRESS ;ESTA COM O NÚMERO DO CONTROLE ADDLW .2 MOVWF AUX CLRF C0 CFG MOVLW 0X03 SUBWF AUX,F BTFSC STATUS,Z GOTO SGL INCF C0,F GOTO CFG SGL INCF C0,F CALL MOSTRA ; GERA SOM PARA AVISAR DA MUDANÇA DO DISPLAY BCF SOM BANK1 BCF TRISB,5 ;VIRA SAIDA PARA O SOM BANK0 CALL GERAR_SOM BANK1 BSF TRISB,5 ;VIRA ENTRADA PARA TESTE DE BOTÃO 'LEARN' BANK0 ; CARREGA O TEMPO MÁXIMO DA APRESENTAÇÃO BSF FLAGTA MOVLW C_T3 MOVWF T3 MOVLW C_T2 MOVWF T2 MOVLW C_T1 MOVWF T1 GOTO INICIO MOSTRA CALL BCD_TO_DEC ;CONVERTE PARA DECIMAL (EM RES0) MOVFW RES0 ANDLW 0X0F CALL TAB_NUM IFDEF CATODO_COMUM MOVWF PORTA ENDIF IFDEF ANODO_COMUM SUBLW 0XFF MOVWF PORTA ENDIF SWAPF RES0,W ANDLW 0X0F CALL TAB_NUM IFDEF CATODO_COMUM MOVWF PORTB ENDIF IFDEF ANODO_COMUM SUBLW 0XFF MOVWF PORTB ENDIF RETURN ;-------------------------------------------------------------- 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 BANK1 movwf EEADR bsf EECON1, RD ; do a read\par clrwdt btfsc EECON1, RD ; Read done ?\par goto $-1 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 DE CONVERSÃO HEXA PARA DECIMAL HEXA EM C0 E DECIMAL EM RES1,RES0 BCD_TO_DEC: MOVLW 8H MOVWF LC CLRF RES0 ;ZERA RESULTADOS CLRF RES1 VOLTA: BCF STATUS,C RLF C0,F ;DESLOCA PARA ESQUERDA C0,C1,RES0,1,2 RLF RES0,F RLF RES1,F DECFSZ LC,F GOTO S45 RETURN S45: CLRWDT MOVLW 03H ADDWF RES1,W MOVWF RAU BTFSS RAU,3 GOTO S1B MOVWF RES1 S1B: MOVLW 30H ADDWF RES1,W MOVWF RAU BTFSS RAU,7 GOTO S2B MOVWF RES1 S2B: MOVLW 03H ADDWF RES0,W MOVWF RAU BTFSS RAU,3 GOTO S1A MOVWF RES0 S1A: MOVLW 30H ADDWF RES0,W MOVWF RAU BTFSS RAU,7 GOTO S2A MOVWF RES0 S2A: GOTO VOLTA GERAR_SOM ;GERA SOM DE CAMPAINHA COM 3 NOTAS DIFERENTES SEGUIDAS MOVLW .63 ;FREQUENCIA DA 1ºNOTA MOVWF AUX1 MOVLW 0XFF ;DURAÇÃO MOVWF AUX4 CALL G_FREQ MOVLW .77 ;FREQUENCIA DA 2ºNOTA MOVWF AUX1 MOVLW 0XFF ;DURAÇÃO MOVWF AUX4 CALL G_FREQ MOVLW .91 ;FREQUENCIA DA 3ºNOTA MOVWF AUX1 MOVLW 0XFF ;DURAÇÃO MOVWF AUX4 CALL G_FREQ RETURN G_FREQ MOVFW AUX1 MOVWF AUX5 RECNOTA MOVFW AUX5 MOVWF AUX1 BSF SOM C3F NOP NOP NOP NOP NOP DECFSZ AUX1,F GOTO C3F BCF SOM MOVFW AUX5 MOVWF AUX1 C3A NOP NOP NOP NOP NOP DECFSZ AUX1,F GOTO C3A DECFSZ AUX4,F GOTO RECNOTA RETURN ORG H'2100' DE .0 end