;********************************************************************************************************** ; CR_FONE_EEPROM.ASM ; PROJETO CONTROLE REMOTO VIA LINHA TELEFONICA 9 CANAIS (DTMF) ; VERSÃO COM USO DA EEPROM PARA GUARDAR DO ESTADO DOS CANAIS ; E RECUPERA-LOS EM CASO DE QUEDA DE ENERGIA ELÉTRICA, NO RESET ; MICROCONTROLADOR: PIC12F675 ; INICIO : 04/09/2013 TERM.: 04/09/2013 ; ; AUTOR: CLÁUDIO LÁRIOS ; BLOG 'LARIOS.TECNOLOGIA.WS' ; PROCESSADOR: PIC 16F628A E CIRCUITO INTEGRADO DTMF MT8870DE ; OBJETIVO: CONTROLAR EQUIPAMENTOS A DISTANCIA VIA LINHA TELEFONICA. ; OBS. MONTAGEM APENAS DIDÁTICA ;********************************************************************************************************** ; COMO USAR: ; LIGUE PARA O NÚMERO DA LINHA TELEFONICA E AGUARDE O ATENDIMENTO APÓS UM NÚMERO PROGRAMADO DE TOQUES. ; QUANDO ATENDER, SERÁ OUVIDO UM BIP DE 2 TONS (TI-TU...TI-TU). ; DIGITE A SENHA DE ACESSO OU O COMANDO PARA TROCA DE SENHA. ; A SENHA INICIAL É '012345', DEVENDO SER TROCADA POR UMA PESSOAL. ; APÓS ENTRAR EM MODO DE USO, DIGITE DE 1 A 9 PARA ACIONAR/DESACIONAR SAÍDAS CORRESPONDENTE ; (A TECLA '0' FINALIZA A CONEXÃO TELEFONICA E LIBERA A LINHA TELEFONICA). ; UM BIP SIMPLES (1 TOM) SIGNIFICA 'DESLIGADO' E UM BIP COMPOSTO( 2 TONS) , 'LIGADO'. ; ; TROCAR A SENHA: ; PARA TROCAR A SENHA DIGITE '*74123', LOGO APÓS O ATENDIMENTO AUTOMÁTICO. UM BIP LONGO SERÁ OUVIDO. ; DIGITE A SENHA ANTIGA. APÓS DIGITA-LA, OCORRERÁ OUTRO BIP LONGO. DIGITE A SENHA NOVA (6 DIGITOS). ; MAIS UM BIP LONGO OCORRERÁ. DIGITE NOVAMENTE A NOVA SENHA, PARA CONFIRMAR. SE TUDO OCORREU NA SEQUENCIA, ; SERÁ OUVIDO 3 BIPS LONGOS EM SEQUENCIA. ; PRONTO!!! SENHA NOVA! APERTE '0' PARA SAIR, OU DIGITE NOVAMENTE A SENHA PARA COMANDAR OS CANAIS OU ; ALTERAR O NÚMERO DE TOQUES PARA ATENDIMENTO AUTOMÁTICO. PARA ISTO, APÓS DIGITAR A SENHA (JÁ EM MODO DE USO), ; DIGITE A TECLA '#' E UMA TECLA ENTRE '1 A 7'. APÓS ISTO, A CHAMADA SERÁ FINALIZADA E GRAVADO O NOVO NÚMERO ; DE TOQUES. ;---------------------------------------------------------------------------------------------------------- ;DEFINIÇÕES DO USUÁRIO: ;---------------------------------------------------------------------------------------------------------- ;========================================================================================================== ; ERRO NA SENHA NUMERO_DE_ERROS EQU 0X03 ;QUANTIDADE DE VEZES QUE SE PODE DIGITAR SENHA ERRADA ;========================================================================================================== ; TECLADO - TEMPO SEM DIGITAÇÃO TEMPO_SEM_TECLAR EQU 0X90 ; TEMPO MÁX. SEM TECLAR (1 MINUTO, DEPOIS DESLIGA A CONEXÃO E LIBERA A LINHA) ;TEMPO SEM TOQUES DE CHAMADA TEMPO_SEM_TOQUE EQU 0X10 ; TEMPO DE 10 SEGUNDOS SEM RECEBER TOQUE ;========================================================================================================== LIST P=16f628a , R=DEC #INCLUDE ; ARQUIVO PADRAO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF & _LVP_OFF ERRORLEVEL -302 ;ELIMINA MENSAGENS DE BANCO ERRADO ; 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 S0,S1,S2,S3,S4,S5,S0A,S1A,S2A,S3A,S4A,S5A TEMP,TEMP1,TEMP2,TEMP3,ADDRESS,RER,GER CONTAP,CONT,CONT1,CONT2,CONT3,LC,LC1,FLAGS RTEC,RTEC1,REG_T,DADO ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== ; PORTS #DEFINE Q4 PORTA,4 ; PINO 3 #DEFINE Q1 PORTB,0 ; PINO 6 #DEFINE Q2 PORTB,1 ; PINO 7 #DEFINE Q3 PORTB,2 ; PINO 8 #DEFINE STD PORTA,3 ; PINO 2 #DEFINE LINHA PORTA,2 ; SAIDA RELE DA LINHA TELEFONICA PINO 1 #DEFINE SOM PORTA,2 ; IDEM #DEFINE TOQUE PORTA,5 ; FOTOACOPLADOR INDICADOR DE TOQUES PINO 4 #DEFINE XS1 PORTB,3 ; CANAL 1 PINO 9 #DEFINE XS2 PORTB,4 ; CANAL 2 PINO 10 #DEFINE XS3 PORTB,5 ; CANAL 3 PINO 11 #DEFINE XS4 PORTB,6 ; CANAL 4 PINO 12 #DEFINE XS5 PORTB,7 ; CANAL 5 PINO 13 #DEFINE XS6 PORTA,6 ; CANAL 6 PINO 15 #DEFINE XS7 PORTA,7 ; CANAL 7 PINO 16 #DEFINE XS8 PORTA,0 ; CANAL 8 PINO 17 #DEFINE XS9 PORTA,1 ; CANAL 9 PINO 18 ;SENHA INICIAL ORG 0X2100 DE .10,.1,.2,.3,.4,.5 ; SENHA INICIAL PRÉ-FIXADA (012345) DE .11,.7,.4,.1,.2,.3 ; COMANDO DE TROCA DE SENHA (*74123) DE .5 ;NÚMERO INICIAL DE TOQUES PARA ATENDIMENTO DE .0,.0,.0,.0,.0,.0 ;SITUAÇÃO INICIAL DOS CANAIS DE .0,.0,.0 ;================================================================================================= ; VETOR DE RESET ;================================================================================================= ORG 0X00 GOTO INICIO ;================================================================================================= ; VETOR DE INTERRUPÇÕES ;================================================================================================= ORG 0X04 RETFIE ;================================================================================================= ; INICIALIZAÇÃO DE VARIAVÉIS E PORTAS ;================================================================================================= INICIO MOVLW .7 ;DESLIGA COMPARADORES MOVWF CMCON BANK1 MOVLW 0X00 MOVWF OPTION_REG ;DESLIGA PULL-UPS MOVLW B'00111000' ; RA6,7,2,1 E 0 SAÍDAS MOVWF TRISA MOVLW B'00000111' ; RB0,1 E 2 SÃO ENTRADAS MOVWF TRISB BANK0 MOVLW NUMERO_DE_ERROS ;CARREGA CONTADOR DE MAX. DE SENHAS ERRADAS MOVWF RER ST1 BCF LINHA ;DESCONECTA LINHA TELEFONICA CLRF RTEC1 ;ZERA REGISTRADORES CLRF CONTAP CLRF ADDRESS CLRF GER CLRF PORTA CLRF PORTB ;================================================================================================ ; RECUPERA ESTADO DAS SAIDAS DOS CANAIS DA EEPROM ;================================================================================================ MOVLW 0X0D MOVWF ADDRESS CALL RPROM BTFSS STATUS,Z BSF PORTB,3 ;LIGA CANAL S1 INCF ADDRESS,F CALL RPROM BTFSS STATUS,Z BSF PORTB,4 ;LIGA CANAL S2 INCF ADDRESS,F CALL RPROM BTFSS STATUS,Z BSF PORTB,5 ;LIGA CANAL S3 INCF ADDRESS,F CALL RPROM BTFSS STATUS,Z BSF PORTB,6 ;LIGA CANAL S4 INCF ADDRESS,F CALL RPROM BTFSS STATUS,Z BSF PORTB,7 ;LIGA CANAL S5 INCF ADDRESS,F CALL RPROM BTFSS STATUS,Z BSF PORTA,6 ;LIGA CANAL S6 INCF ADDRESS,F CALL RPROM BTFSS STATUS,Z BSF PORTA,7 ;LIGA CANAL S7 INCF ADDRESS,F CALL RPROM BTFSS STATUS,Z BSF PORTA,0 ;LIGA CANAL S8 INCF ADDRESS,F CALL RPROM BTFSS STATUS,Z BSF PORTA,1 ;LIGA CANAL S9 ;================================================================================================= ; PROGRAMA PRINCIPAL ;================================================================================================= T_LOAD MOVLW 0X0C MOVWF ADDRESS CALL RPROM MOVWF REG_T MOVLW TEMPO_SEM_TOQUE MOVWF CONT2 ;================================================================================================= ; AGUARDA NÚMERO DE TOQUES DE CHAMADAS ;================================================================================================= MAINX MOVLW .3 CALL DELAY DECFSZ CONT1,F ;CONTADORES TESTAM O TEMPO MAXIMO SEM DIGITAR GOTO PROS_CHA DECFSZ CONT2,F GOTO PROS_CHA GOTO T_LOAD PROS_CHA BTFSC TOQUE GOTO MAINX MOVLW TEMPO_SEM_TOQUE MOVWF CONT2 MAINZ MOVLW .3 CALL DELAY DECFSZ CONT1,F ;CONTADORES TESTAM O TEMPO MAXIMO SEM DIGITAR GOTO PROS_CHB DECFSZ CONT2,F GOTO PROS_CHB GOTO T_LOAD PROS_CHB BTFSS TOQUE GOTO MAINZ MOVLW TEMPO_SEM_TOQUE MOVWF CONT2 DECFSZ REG_T,F ;DECREMENTA O NÚMERO DE TOQUES PROGRAMADO GOTO MAINX MOVLW 0X0C CALL RPROM MOVWF REG_T BSF LINHA MOVLW .10 CALL DELAYW ;TEMPO PARA ESTABILIZAÇÃO DA CONEXÃO CALL SOM_CONEXÃO ;SOM DE ATENDIMENTO (TU-TO...TU-TO) ;============================================================================ ; RECEBE NÚMEROS TECLADOS DE FORMA REMOTA PARA SENHA OU COMANDO ;============================================================================ MAIN MOVLW TEMPO_SEM_TECLAR MOVWF CONT2 MAIN1 DECFSZ CONT1,F ;CONTADORES TESTAM O TEMPO MAXIMO SEM DIGITAR GOTO PROSS DECFSZ CONT2,F GOTO PROSS MOVLW .10 CALL W_BIP_LONGO ;AVISA SAIDA POR TEMPO COM BIP LONGO GOTO ST1 ;TEMPO MAXIMO ATINGIDO SEM DIGITAR ,VAI PARA O INICIO PROSS MOVLW .2 CALL DELAY ;DELAY CALL LE_8870 ;TESTA TECLA PRESSIONADA REMOTAMENTE MOVFW RTEC1 XORLW 0X00 BTFSC STATUS,Z GOTO MAIN1 ;NENHUMA TECLADA APERTADA MOVLW TEMPO_SEM_TECLAR ;RESETA CONTADOR DE FALTA DE DIGITAÇÃO MOVWF CONT2 MOVFW RTEC1 ;TECLA APERTADA XORLW .12 ;COMPARA COM '#' BTFSC STATUS,Z GOTO ST1 ;CANCELA DIGITAÇÃO E FINALIZA LIGAÇÃO MOVFW RTEC1 XORLW .11 ;* BTFSS STATUS,Z GOTO PN3 MOVFW CONTAP XORLW .0 ;SE NÃO FOR O PRIMEIRO DIGITO,APAGA BTFSC STATUS,Z GOTO PN3 ;APAGAR ULTIMO NUMERO DIGITADO (CORRIGIR) CLRF RTEC1 ;APAGA REGISTRADOR DE TECLADO GOTO MAIN PN3 MOVLW S0 ;PEGA ENDEREÇO DO REGISTRADOR 'S0' ADDWF CONTAP,W ;SOMO COM POSIÇÃO DA TECLA RECEBIDA MOVWF FSR MOVFW RTEC1 CLRF RTEC1 MOVWF INDF ;SALVA A TECLA RECEBIDA INCF CONTAP,F MOVFW CONTAP XORLW .6 BTFSS STATUS,Z GOTO MAIN CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY CALL BIP ;================================================================================================= ; GERENCIAMENTO DE PROCESSOS ;================================================================================================= MOVFW GER XORLW .0 BTFSC STATUS,Z GOTO COMPARAR_SENHA_EEPROM ;MODO NORMAL,COMPARA A SENHA DIGITADA MOVFW GER XORLW .1 BTFSC STATUS,Z GOTO COMPARA_SENHA_EEP_NA_TROCA ;MODO TROCA DE SENHA ,PEDE A SENHA ATUAL MOVFW GER XORLW .2 BTFSC STATUS,Z GOTO DIGITADO_SENHA_NOVA ; MODO TROCA DE SENHA,SALVARÁ SENHA NOVA EM S0A..S5A MOVFW GER XORLW .3 BTFSC STATUS,Z GOTO COMPARA_SENHA_NOVA ;MODO DE TROCA DE SENHA, COMPARA SENHA DIGITADA COM SALVA EM S0A...S5A , E SALVA SE IGUAL GOTO ST1 ;INICIO ;================================================================================================= ; COMPARAR SENHA NOVA ;================================================================================================= COMPARA_SENHA_NOVA MOVFW S0 XORWF S0A,W BTFSS STATUS,Z GOTO ERRO MOVFW S1 XORWF S1A,W BTFSS STATUS,Z GOTO ERRO MOVFW S2 XORWF S2A,W BTFSS STATUS,Z GOTO ERRO MOVFW S3 XORWF S3A,W BTFSS STATUS,Z GOTO ERRO MOVFW S4 XORWF S4A,W BTFSS STATUS,Z GOTO ERRO MOVFW S5 XORWF S5A,W BTFSS STATUS,Z GOTO ERRO MOVLW .2 CALL DELAYM MOVLW .10 CALL W_BIP_LONGO MOVLW .2 CALL DELAYM MOVLW .10 CALL W_BIP_LONGO MOVLW .2 CALL DELAYM MOVLW .10 CALL W_BIP_LONGO MOVLW .2 CALL DELAYM ;================================================================================================= ; GRAVAR NA EEPROM A NOVA SENHA ;================================================================================================= CLRF ADDRESS CLRF CONTAP MOVLW S0 ;PEGA ENDEREÇO DE S0 ADDWF CONTAP,W MOVWF FSR RTH3 MOVFW INDF CALL WPROM INCF FSR,F INCF ADDRESS,F INCF CONTAP,F MOVFW CONTAP XORLW .6 BTFSS STATUS,Z GOTO RTH3 MOVLW 0XFF MOVWF S0A ;APAGA CONFIRMAÇÃO DE SENHA MOVWF S1A MOVWF S2A MOVWF S3A MOVWF S4A MOVWF S5A CLRF GER ;LIMPA GERENCIADOR DE PASSOS GOTO RETG ;================================================================================================= ; SALVAR SENHA DIGITADA PARA FUTURA COMPARAÇÃO ;================================================================================================= DIGITADO_SENHA_NOVA MOVFW S0 ;SALVA SENHA NOVA PARA COMPARAÇÃO MOVWF S0A MOVFW S1 MOVWF S1A MOVFW S2 MOVWF S2A MOVFW S3 MOVWF S3A MOVFW S4 MOVWF S4A MOVFW S5 MOVWF S5A ;ACRESCENTAR BIPS PARA CONFIRMAR SENHA MOVLW .10 CALL W_BIP_LONGO INCF GER,F GOTO RETG1 ;================================================================================================= ; COMPARANDO SENHA NO MODO DE TROCA ;================================================================================================= COMPARA_SENHA_EEP_NA_TROCA MOVLW .2 ;ACERTA PARA PASSO 2 MOVWF GER ;================================================================================================= ; COMPARA SENHA NA EEPROM ;================================================================================================= COMPARAR_SENHA_EEPROM CLRF ADDRESS CLRF CONTAP MOVLW S0 ;PEGA ENDEREÇO DE S0 ADDWF CONTAP,W MOVWF FSR RTH1 CALL RPROM XORWF INDF,W BTFSS STATUS,Z GOTO TCOMANDOS ;SENHA INCORRETA FOI DIGITADA, VAI TESTAR POR COMANDO DE TROCA DE SENHA INCF FSR,F INCF ADDRESS,F INCF CONTAP,F MOVFW CONTAP XORLW .6 ;COMPAROU 6 BYTES DA SENHA? BTFSS STATUS,Z GOTO RTH1 ;NÃO, ENTÃO CONTINUA A COMPARAÇÃO MOVFW GER ;COMPARADO 6 BYTES E ACHOU A SENHA, ENTÃO VAI TESTAR QUE PASSO ESTÁ XORLW 0X02 BTFSS STATUS,Z GOTO SEG92 ;MODO NORMAL - PERMITE ACIONAMENTOS NAS SAIDAS S1 A S9 ;ACRESCENTAR BIPS PARA DAR OK MOVLW .10 CALL W_BIP_LONGO ;MODO TROCA DE SENHA-COMPARAÇÃO DE SENHA ANTIGA OK ,SEGUE RETG RETG1 CLRF ADDRESS CLRF CONTAP CLRF RTEC1 GOTO MAIN ; MODO NORMAL -SENHA CORRETA SEG92 MOVLW NUMERO_DE_ERROS ;ZERA CONTADOR DE ERROS MOVWF RER CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVFW GER XORLW .1 BTFSC STATUS,Z GOTO VAI_ENTRAR_NOVA_SENHA ;================================================================================================= ; SENHA CORRETA - LIBERAR PARA RECEBER COMANDOS A DISTANCIA ;================================================================================================= CALL RECEBE_COMANDOS CLRF GER CLRF ADDRESS CLRF CONTAP CLRF RTEC1 GOTO T_LOAD ;================================================================================================= ; RECEBENDO NOVA SENHA EM MODO DE TROCA ;================================================================================================= VAI_ENTRAR_NOVA_SENHA ;BIPS PARA PEDIR NOVA SENHA MOVLW .10 CALL W_BIP_LONGO MOVLW .2 CALL W_BIP INCF GER,F GOTO RETG1 ;================================================================================================= ; DETERMINA SE O DIGITADO É SENHA OU COMANDO DE TROCA DE SENHA ;================================================================================================= TCOMANDOS MOVFW GER XORLW .2 ;PASSO 2 NÃO VE COMANDO BTFSC STATUS,Z GOTO ERRO MOVLW .6 MOVWF ADDRESS CLRF CONTAP MOVLW S0 ;PEGA ENDEREÇO DE S0 ADDWF CONTAP,W MOVWF FSR RTH2 CALL RPROM XORWF INDF,W BTFSS STATUS,Z GOTO ERRO INCF FSR,F INCF ADDRESS,F INCF CONTAP,F MOVFW CONTAP XORLW .6 BTFSS STATUS,Z GOTO RTH2 ;TROCAR SENHA ;DIGITE A SENHA ATUAL ;COLOCA BIPS INDICANDO PARA DIGITAR SENHA ATUAL MOVLW .3 CALL W_BIP_LONGO MOVLW .1 ;ACERTA PARA PASSO 1 MOVWF GER CLRF CONTAP CLRF RTEC1 GOTO MAIN ;VAI PARA ROTINA PRINCIPAL ;================================================================================================= ; SENHA ERRADA ;================================================================================================= ERRO MOVLW .6 ;SEIS BIP DE ERRO CALL W_BIP CLRF GER ;APAGA GERENCIADOR DECFSZ RER,F ;TESTA SE HOUVE 3 ERROS GOTO RETG ;' SENHA INCORRETA' ;================================================================================================= ; BLOQUEIO APÓS 'N' NUMEROS DE TENTATIVAS ERRADAS ;================================================================================================= BLOQ ; GERA BIP PARA 'BLOQUEADO' MOVLW .10 CALL W_BIP ;NÚMERO DE BIPS MOVLW .100 CALL W_BIP_LONGO ;BIP LONGO MOVLW 0X04 MOVWF TEMP1 RLJ MOVLW 0XFF CALL DELAYW DECFSZ TEMP1,F GOTO RLJ MOVLW NUMERO_DE_ERROS MOVWF RER ;GERA BIP PARA 'DESBLOQUEADO' MOVLW .100 CALL W_BIP_LONGO ;BIP LONGO MOVLW .10 CALL W_BIP ;NÚMERO DE BIPS GOTO RETG ;================================================================================================= ; TESTA POR TECLAS DIGITADAS REMOTAMENTE PELO USUÁRIO ;================================================================================================= LE_8870 CALL TESTTK MOVFW RTEC XORLW 0XFF ;SE FOR 0XFF NENHUMA TECLA FOI PRESSIONADA BTFSC STATUS,Z RETURN ; GOTO VV1 MOVFW RTEC MOVWF RTEC1 CALL BIP VV1 MOVLW .1 CALL DELAY CALL TESTTK MOVFW RTEC XORLW 0XFF BTFSC STATUS,Z RETURN GOTO VV1 ;AGUARDA SOLTAR TECLA TESTTK ;RETORNA EM 'RTEC' A TECLA PRESSIONADA (NENHUMA PRESSIONADA RETORNA 0XFF) BTFSC STD ;TESTA PINO 2 POR UM OK DO MT8870 GOTO RECEBEU_TECLA MOVLW 0XFF MOVWF RTEC RETURN RECEBEU_TECLA MOVLW .10 CALL DELAY CLRF RTEC BTFSC Q1 BSF RTEC,0 BTFSC Q2 BSF RTEC,1 BTFSC Q3 BSF RTEC,2 BTFSC Q4 BSF RTEC,3 BTFSC STD GOTO $-1 ;AGUARDA SINAL VOLTAR A '0' MOVLW .200 CALL DELAY BTFSC STD GOTO $-3 RETURN ;================================================================================================= ; ESCREVER NA EEPROM ;================================================================================================= WPROM ;ESCREVE NA E2PROM DADO=W /ENDEREÇO=ADDRESS BANK1 MOVWF EEDATA ;CARREGA DADO DE 'W' BANK0 MOVFW ADDRESS BANK1 MOVWF EEADR ;APONTA ENDEREÇO DE 'ADDRESS' BCF INTCON,GIE BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR BCF EECON1,WREN BTFSC EECON1,WR GOTO $ - 1 BANK0 RETURN ;================================================================================================= ; LER NA EEPROM ;================================================================================================= RPROM ;SUB-ROTINA DE LEITURA DE E2PROM W=DADO /ADDRESS=ENDEREÇO MOVFW ADDRESS BANK1 MOVWF EEADR ;APONTA ENDEREÇO DE 'ADDRESS' BSF EECON1,RD ; MOVF EEDATA,W ; BANK0 ; 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 BIPS ;================================================================================================= DOIS_BIPS CALL BIP MOVLW .100 CALL DELAY CALL BIP_L RETURN ;================================================================================= ; GERA BIPS CONFORME QUANTIDADE EM 'W' ;================================================================================= W_BIP MOVWF TEMP3 VBIP1 CALL BIP MOVLW .1 CALL DELAYM DECFSZ TEMP3,F GOTO VBIP1 RETURN ;================================================================================================= ; BIP LONGO ;================================================================================================= ; GERA UM BIP LONGO DE DURAÇÃO = BIP X 'W' W_BIP_LONGO MOVWF TEMP3 R38 CALL BIP DECFSZ TEMP3,F GOTO R38 RETURN ;================================================================================= ; BIP NORMAL ;================================================================================= BIP MOVLW .150 MOVWF TEMP2 CONT6 BSF SOM MOVLW 0X30 CALL WAIT_uS BCF SOM MOVLW 0X30 CALL WAIT_uS DECFSZ TEMP2,F GOTO CONT6 BSF SOM ;DEIXA LIGADO RELE DE CONEXÃO A REDE TELEFONICA RETURN ;================================================================================= ; BIP COM FREQUENCIA MAIS BAIXA ;================================================================================= BIP_L MOVLW .200 MOVWF TEMP2 CONT9 BSF SOM MOVLW 0X40 CALL WAIT_uS BCF SOM MOVLW 0X40 CALL WAIT_uS DECFSZ TEMP2,F GOTO CONT9 BSF SOM ;DEIXA LIGADO RELE DE CONEXÃO A REDE TELEFONICA RETURN ;================================================================================================= SOM_CONEXÃO ;(TÍ-TU...TÍ-TU) MOVLW .1 CALL DELAYW CALL BIP MOVLW .100 CALL DELAY CALL BIP_L MOVLW .250 CALL DELAY CALL BIP MOVLW .100 CALL DELAY CALL BIP_L RETURN ;================================================================================================= ; RECEBE COMANDOS PARA LIGAR/DESLIGAR CANAIS 1 A 9 ;================================================================================================= ; RECEBE_COMANDOS MOVLW TEMPO_SEM_TECLAR MOVWF CONT2 LOOPRC1 DECFSZ CONT1,F ;CONTADORES TESTAM O TEMPO MAXIMO SEM RECEBER COMANDOS A DISTANCIA GOTO PROS5 DECFSZ CONT2,F GOTO PROS5 FIM_CHAMADA MOVLW .10 CALL W_BIP_LONGO ;AVISA SAIDA POR TEMPO COM BIP LONGO BCF LINHA ;DESCONECTA DA LINHA TELEFONICA RETURN ;TEMPO MAXIMO ATINGIDO SEM DIGITAR ,VAI PARA O INICIO PROS5 MOVLW .1 CALL DELAY ;DELAY CALL LE_8870 ;TESTA TECLA PRESSIONADA REMOTAMENTE MOVFW RTEC1 XORLW 0X00 BTFSC STATUS,Z GOTO LOOPRC1 ;NENHUMA TECLADA APERTADA MOVLW TEMPO_SEM_TECLAR ; RECARGA DO TEMPO SEM TECLAR AO RECEBER TECLA MOVWF CONT2 ; (MAIS UM MINUTO) ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 1 ;================================================================================= MOVFW RTEC1 XORLW .1 BTFSS STATUS,Z GOTO SEGP2 MOVLW 0X0D MOVWF ADDRESS BTFSS XS1 GOTO LS1 BCF XS1 CALL BIP MOVLW .0 GOTO SAI_ACAO LS1 BSF XS1 CALL DOIS_BIPS MOVLW .1 SAI_ACAO CALL WPROM CLRF RTEC1 MOVLW .100 CALL DELAY GOTO LOOPRC1 ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 2 ;================================================================================= SEGP2 MOVFW RTEC1 XORLW .2 BTFSS STATUS,Z GOTO SEGP3 MOVLW 0X0E MOVWF ADDRESS BTFSS XS2 GOTO LS2 BCF XS2 CALL BIP MOVLW .0 GOTO SAI_ACAO LS2 BSF XS2 CALL DOIS_BIPS MOVLW .1 GOTO SAI_ACAO ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 3 ;================================================================================= SEGP3 MOVFW RTEC1 XORLW .3 BTFSS STATUS,Z GOTO SEGP4 MOVLW 0X0F MOVWF ADDRESS BTFSS XS3 GOTO LS3 BCF XS3 CALL BIP MOVLW .0 GOTO SAI_ACAO LS3 BSF XS3 CALL DOIS_BIPS MOVLW .1 GOTO SAI_ACAO ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 4 ;================================================================================= SEGP4 MOVFW RTEC1 XORLW .4 BTFSS STATUS,Z GOTO SEGP5 MOVLW 0X10 MOVWF ADDRESS BTFSS XS4 GOTO LS4 BCF XS4 CALL BIP MOVLW .0 GOTO SAI_ACAO LS4 BSF XS4 CALL DOIS_BIPS MOVLW .1 GOTO SAI_ACAO ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 5 ;================================================================================= SEGP5 MOVFW RTEC1 XORLW .5 BTFSS STATUS,Z GOTO SEGP6 MOVLW 0X11 MOVWF ADDRESS BTFSS XS5 GOTO LS5 BCF XS5 CALL BIP MOVLW .0 GOTO SAI_ACAO LS5 BSF XS5 CALL DOIS_BIPS MOVLW .1 GOTO SAI_ACAO ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 6 ;================================================================================= SEGP6 MOVFW RTEC1 XORLW .6 BTFSS STATUS,Z GOTO SEGP7 MOVLW 0X12 MOVWF ADDRESS BTFSS XS6 GOTO LS6 BCF XS6 CALL BIP MOVLW .0 GOTO SAI_ACAO LS6 BSF XS6 CALL DOIS_BIPS MOVLW .1 GOTO SAI_ACAO ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 7 ;================================================================================= SEGP7 MOVFW RTEC1 XORLW .7 BTFSS STATUS,Z GOTO SEGP8 MOVLW 0X13 MOVWF ADDRESS BTFSS XS7 GOTO LS7 BCF XS7 CALL BIP MOVLW .0 GOTO SAI_ACAO LS7 BSF XS7 CALL DOIS_BIPS MOVLW .1 GOTO SAI_ACAO ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 8 ;================================================================================= SEGP8 MOVFW RTEC1 XORLW .8 BTFSS STATUS,Z GOTO SEGP9 MOVLW 0X14 MOVWF ADDRESS BTFSS XS8 GOTO LS8 BCF XS8 CALL BIP MOVLW .0 GOTO SAI_ACAO LS8 BSF XS8 CALL DOIS_BIPS MOVLW .1 GOTO SAI_ACAO ;================================================================================= ; TESTA SE FOI ACIONADO O CANAL 9 ;================================================================================= SEGP9 MOVFW RTEC1 XORLW .9 BTFSS STATUS,Z GOTO SEGP10 MOVLW 0X15 MOVWF ADDRESS BTFSS XS9 GOTO LS9 BCF XS9 CALL BIP MOVLW .0 GOTO SAI_ACAO LS9 BSF XS9 CALL DOIS_BIPS MOVLW .1 GOTO SAI_ACAO ;================================================================================= ; TESTA SE FOI ACIONADO A TECLA '#' PARA ALTERAR QUANTIDADES DE TOQUES ; PARA ATENDER AUTOMATICAMENTE. ;================================================================================= SEGP10 MOVFW RTEC1 XORLW .12 ;# BTFSS STATUS,Z GOTO SEGP11 GOTO GRAVA_NUM_DE_TOQUES ;================================================================================= ; TESTA SE FOI ACIONADO A TECLA '0' PARA FINALIZAR A CHAMADA E LIBERAR ; LINHA TELEFONICA ;================================================================================= SEGP11 MOVFW RTEC1 XORLW .10 ;'0' BTFSC STATUS,Z GOTO FIM_CHAMADA GOTO LOOPRC1 RETURN ;================================================================================= ; GRAVAR NÚMEROS DE TOQUES PARA ATENDIMENTO ;================================================================================= ; APÓS TER ENTRADO EM MODO DE COMANDO, DIGITE # E O NÚMERO DESEJADO DE TOQUES (1 A 7) GRAVA_NUM_DE_TOQUES CALL BIP_L MOVLW .50 CALL DELAY CALL BIP MOVLW TEMPO_SEM_TECLAR MOVWF CONT2 LOOPRC3 DECFSZ CONT1,F ;CONTADORES TESTAM O TEMPO MAXIMO SEM RECEBER COMANDOS A DISTANCIA GOTO PROS12 DECFSZ CONT2,F GOTO PROS12 GOTO FIM_CHAMADA PROS12 MOVLW .1 CALL DELAY ;DELAY CLRF RTEC1 CALL LE_8870 ;TESTA TECLA PRESSIONADA REMOTAMENTE MOVFW RTEC1 XORLW 0X00 BTFSC STATUS,Z GOTO LOOPRC3 ;NENHUMA TECLADA APERTADA MOVLW TEMPO_SEM_TECLAR ; RECARGA DO TEMPO SEM TECLAR AO RECEBER TECLA MOVWF CONT2 ; (MAIS UM MINUTO) MOVFW RTEC1 ANDLW 0X0F ;LIMITA MOVWF TEMP ADDLW 0XF8 BTFSC STATUS,C GOTO PL0 MOVFW TEMP GOTO PL1 PL0 MOVLW .7 PL1 MOVWF REG_T MOVLW 0X0C ;PEGA ENDEREÇO A GRAVAR MOVWF ADDRESS MOVFW REG_T CALL WPROM ;ESCREVE NÚMERO DE TOQUES MOVLW .100 CALL DELAY CALL RPROM CALL W_BIP ;EMITE NUMERO DE BITS CORRESPONDENTES AOS TOQUES MOVLW .5 CALL DELAYW GOTO FIM_CHAMADA ;================================================================================================= ; FIM DO PROGRAMA ;================================================================================================= END