;************************************************************************************************************* ; DISCADORA_628_V1.ASM ; ; PROJETO: DISCADORA PARA USO EM ALARMES (COM OPÇÃO P/ DECÁDICO/ DTMF) COM PIC 16F628A ; OBJETIVO: CONECTAR UM DISPOSITIVO (POR EX. ALARME) COM A REDE TELEFONICA, VISANDO ; TRANSMITIR UM SINAL SONORO, INDICANDO A SUA ATUAÇÃO. ; UTILIZA UM TECLADO COMUM DE TELEFONE PARA AQUISIÇÃO DE DADOS, LIGADOS A UM PIC 16F628A. ; USE CRISTAL DE 10 MHZ. ; CLAUDIO LÁRIOS 10-09-2012 TÉRMINO 19-09-2012 ; USO APENAS PARA FINS DIDÁTICOS. ;************************************************************************************************************ ; ********** COMANDOS ACEITOS NO TECLADO:******************************************************************* ; PROGRAMAR NÚMERO A SER DISCADO EM UMA DAS 6 MEMÓRIAS: ; DIGITE: (*)(1)(6)(*)(X)(NÚMERO DE TELEFONE ATÉ 20 DIG)(#) ; SENDO X = MEMÓRIA 1 A 6 (AO FINAL, 2 BIP CURTOS) ; APAGAR NÚMERO DE UMA DAS 6 MEMÓRIAS: ; DIGITE: (*)(1)(6)(*)(X)(#) ; SENDO X = MEMÓRIA 1 A 6 (AO FINAL, 2 BIP CURTOS) ; APAGAR NÚMERO DE TODAS AS 6 MEMÓRIAS DE UMA ÚNICA VEZ: ; DIGITE: (*)(1)(6)(*)(7)(*) (AO FINAL, UM BIP LONGO) ; TESTAR DISCAGEM DE NÚMERO DA MEMÓRIA: ; DIGITE: (*)(1)(6)(*)(8)(0) ; DISCARÁ TODOS OS NÚMEROS DAS MEMÓRIAS EM SEQUENCIA ; DIGITE: (*)(1)(6)(*)(8)(X) ; DISCARÁ SOMENTE A MEMÓRIA X ,SENDO X= 1 A 6 ; DEFINIR MODO DE DISCAGEM INTERROMPIDO(PARA DE DISCAR SE ENTRADA DE COMANDO FOR '0'(DISCA APENAS O 1º NÚMERO): ; DIGITE: (*)(1)(6)(*)(9) (AO FINAL, 2 BIP CURTOS) ; DEFINIR MODO DE DISCAGEM CONTINUO (DISCA EM SEQUENCIA TODOS OS NÚMEROS, MESMO SE ENTRADA DE COMANDO FOR '0': ; DIGITE: (*)(1)(6)(*)(0) (AO FINAL, 2 BIP CURTOS) ; RESETAR PROGRAMA, FINALIZANDO ANTECIPADAMENTE UMA DISCAGEM EM CURSO: ; DIGITE: (*)(1)(7)(6)(*) ;************************************************************************************************************* ERRORLEVEL -302 #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _HS_OSC & _LVP_OFF ; 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 C0,C1,C2,C3,TEMP,AUX,val,cont,VH,VL,W_SALVO,FREQH,FREQL,NUM,R1,R2,R3,S_TECLA,TIMER1 TIMER2, TIMER3, LIMITE, S_VAL,S_ADDRESS,AUX1,S_AD,FLAGS, ADDRESS,RDESL,DBC ENDC #DEFINE S0 PORTA,2 ;SAIDA DECÁDICA - RESISTOR DE 4K7 AO TRANSITOR DRIVE DO RELE PINO 1 #DEFINE S1 PORTA,3 ;DTMF- SAIDA FREQ ALTA - RESISTOR 470 OHMS PINO 2 #DEFINE S2 PORTA,4 ;DTMF- SAIDA FREQ BAIXA - RESISTOR 680 OHMS PINO 3 #DEFINE DISCAR PORTA,0 ;COMANDO PARA DISCAR (1) - PINO 17 #DEFINE MODO PORTA,1 ;ESCOLHE DTMF (0) OU DECÁDICO (1)- RESISTOR 220 OHMS PINO 18 #DEFINE BIP PORTA,1 ;SAIDA BIP INDICADOR DE TECLA APERTADA/ACEITAÇÃO DE COMAMDO PINO 18 ;TECLADO #DEFINE T2 EQU PORTB,0 #DEFINE T3 EQU PORTB,1 #DEFINE T5 EQU PORTB,2 #DEFINE T7 EQU PORTB,3 #DEFINE T1 EQU PORTB,4 #DEFINE T4 EQU PORTB,5 #DEFINE T6 EQU PORTB,6 ; DEFINIÇÕES DE FLAGS #DEFINE FLAG_J FLAGS,0 ;FLAG TESTE DE DISCAGEM ;VARIAVÉIS DE TEMPO T_ESTAB_LINHA EQU .20 ;TEMPO PARA ESTABILIZAÇÃO DA LINHA T_COMP_LIGAC EQU .30 ;TEMPO PARA COMPLETAR LIGAÇÃO T_OFF_ENTRE_DISC EQU .10 ;TEMPO DESCONECTADO (DESLIGA A LINHA ENTRE DISCAGENS DE NUMEROS DIFERENTES) T_PRE_DISPARO EQU .228 ;TEMPO MORTO PRÉ DISPARO (EVITA DISCAGENS DESNECESSÁRIAS ) .228= 10 SEG. T_SOLTURA EQU .5 ; DEBOUNCE 5 MSEG T_MAX_ESPERA_TECLA EQU .20 ;TEMPO DE ESPERA (AGUARDA TECLA SER DIGITADA ANTES DE SAIR PARA O 'INICIO') 20= 13 SEG T_ALARME_NO_FONE EQU .130 ;TEMPO QUE SINAL DE ALARME SERÁ OUVIDO PELO RECEPTOR DO NUMERO DISCADO (.130=40SEG) ;__________________________________________________________________________________________________________ ;TABELA DE FREQUENCIAS DO SISTEMA DTMF ;ALTA FREQUENCIA (COLUNA) XTAL 10MHZ ;1209hz 79 128 ;1336hz 87 140 ;1477hz 96 151 ;1633hz 107 161 ;BAIXA FREQUENCIA (LINHA)) ;697hz 46 33 ;770hz 50 54 ;852hz 56 74 ;941hz 61 91 ;__________________________________________________________________________________________________________ ;TONS DE DISCAGEM (DTMF) ; ; 1209 1336 1477 1633 ; ; 697 1 2 3 A ; ; 770 4 5 6 B ; ; 852 7 8 9 C ; ; 941 * 0 # D ;___________________________________________________________________________________________________________ ORG 0X00 GOTO RESET ORG 0X04 GOTO INT_TIMERS ;TABELAS TABH DT .140 ;0 DT .128 ;1 DT .140 ;2 DT .151 ;3 DT .128 ;4 DT .140 ;5 DT .151 ;6 DT .128 ;7 DT .140 ;8 DT .151 ;9 DT .161 ;A DT .161 ;B DT .161 ;C DT .161 ;D DT .128 ;* DT .151 ;# TABL DT .91 ;0 DT .33 ;1 DT .33 ;2 DT .33 ;3 DT .54 ;4 DT .54 ;5 DT .54 ;6 DT .74 ;7 DT .74 ;8 DT .74 ;9 DT .33 ;A DT .54 ;B DT .74 ;C DT .91 ;D DT .91 ;* DT .91 ;# TABD ADDWF PCL,F DT .10 ;* DT .1 ;1 DT .7 ;7 DT .6 ;6 DT .10 ;* ;******************************************************** ; ROTINA DE INTERRUPÇÕES (GERA DTMF NAS SAIDAS S1 E S2) ;--------------------------------------------------------- INT_TIMERS BTFSC PIR1,TMR1IF GOTO V3 BCF INTCON,T0IF MOVWF W_SALVO SWAPF FREQH,W MOVWF TMR0 MOVFW W_SALVO BTFSS S1 GOTO V2 BCF S1 RETFIE V2 BSF S1 RETFIE ;-------------------------------- V3 BCF PIR1,TMR1IF MOVWF W_SALVO SWAPF FREQL,W MOVWF TMR1L MOVLW 0XFF MOVWF TMR1H MOVFW W_SALVO BTFSS S2 GOTO V4 BCF S2 RETFIE V4 BSF S2 RETFIE ;**************************************************************** ; RESET DO PROGRAMA ;================================================================ RESET BANK1 MOVLW B'11100011' ; PB2..PB4 SAIDAS / RESTANTE ENTRADAS MOVWF TRISA MOVLW B'11110000' ;PB0..3 SAIDA / PB4...PB7 ENTRADAS MOVWF TRISB MOVLW B'00000010' MOVWF OPTION_REG MOVLW B'00000001' MOVWF PIE1 BANK0 MOVLW B'00110001' MOVWF T1CON MOVLW B'1100000' MOVWF INTCON MOVLW .0 MOVWF PORTA MOVWF PORTB MOVLW .7 MOVWF CMCON MOVLW 0XFF MOVWF TMR1H CLRF RDESL MOVLW .10 CALL DELAY ;******************************************************************************* ; INICIO DO PROGRAMA ;=============================================================================== INICIO BTFSS DISCAR ;TESTA ENTRADA DE COMANDO PARA 'DISCAR' GOTO GER_TECLADO ;NÃO ACIONADA,VAI ENTÃO VERIFICAR TECLADO MOVLW T_PRE_DISPARO ;DELAY PRÉ DISPARO CALL DELAY BTFSS DISCAR GOTO INICIO ;FALSO DISPARO CALL DISCAR_MEM ;DISCA NÚMEROS NA MEMÓRIA GOTO INICIO ;VOLTA AO LOOP PRINCIPAL ;=============================================================================== ;ROTINAS DE TECLADO GER_TECLADO CALL LE_TECLADO BTFSS STATUS,C GOTO INICIO ; C=0 - NENHUMA TECLA APERTADA MOVFW S_TECLA XORLW .10 ;TECLA * (ASTERISTICOS APERTADA) BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO DECFSZ TIMER1,F GOTO LDNTCL DECFSZ TIMER2,F GOTO LDNTCL DECFSZ TIMER3,F GOTO LDNTCL CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO MOVFW S_TECLA XORLW .1 ;TECLA 1 (DIG'1') BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL4 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO4 DECFSZ TIMER1,F GOTO LDNTCL4 DECFSZ TIMER2,F GOTO LDNTCL4 DECFSZ TIMER3,F GOTO LDNTCL4 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO4 MOVFW S_TECLA XORLW .6 ;COMPARA COM 6 BTFSS STATUS,Z GOTO INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL5 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO5 DECFSZ TIMER1,F GOTO LDNTCL5 DECFSZ TIMER2,F GOTO LDNTCL5 DECFSZ TIMER3,F GOTO LDNTCL5 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO5 MOVFW S_TECLA XORLW .10 ;COMPARA COM * BTFSS STATUS,Z GOTO INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL6 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO6 DECFSZ TIMER1,F GOTO LDNTCL6 DECFSZ TIMER2,F GOTO LDNTCL6 DECFSZ TIMER3,F GOTO LDNTCL6 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO6 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .1 BTFSC STATUS,Z GOTO EH1 MOVFW S_TECLA XORLW .2 BTFSC STATUS,Z GOTO EH2 MOVFW S_TECLA XORLW .3 BTFSC STATUS,Z GOTO EH3 MOVFW S_TECLA XORLW .4 BTFSC STATUS,Z GOTO EH4 MOVFW S_TECLA XORLW .5 BTFSC STATUS,Z GOTO EH5 MOVFW S_TECLA XORLW .6 BTFSC STATUS,Z GOTO EH6 MOVFW S_TECLA XORLW .7 BTFSC STATUS,Z GOTO APAGAR_TODOS_NUM MOVFW S_TECLA XORLW .8 BTFSC STATUS,Z GOTO TESTE_DISC ;DISCAR NUMEROS PARA TESTE MOVFW S_TECLA XORLW .9 BTFSC STATUS,Z GOTO MODO_INTERROMPIDO MOVFW S_TECLA XORLW .0 BTFSC STATUS,Z GOTO MODO_CONTINUO GOTO INICIO ;ERRO ;======================================================== ;GRAVAR MEMÓRIAS NAS POSIÇÕES 1 A 5 EH1 MOVLW .0 MOVWF ADDRESS MOVLW .20 MOVWF LIMITE GOTO SCOM EH2 MOVLW .20 MOVWF ADDRESS MOVLW .40 MOVWF LIMITE GOTO SCOM EH3 MOVLW .40 MOVWF ADDRESS MOVLW .60 MOVWF LIMITE GOTO SCOM EH4 MOVLW .60 MOVWF ADDRESS MOVLW .80 MOVWF LIMITE GOTO SCOM EH5 MOVLW .80 MOVWF ADDRESS MOVLW .100 MOVWF LIMITE GOTO SCOM EH6 MOVLW .100 MOVWF ADDRESS MOVLW .120 MOVWF LIMITE SCOM CALL GRAVANDO_DIGITOS CALL APITA GOTO INICIO ;==================================================== ;*16*7* (APAGAR TODAS AS 6 MEMÓRIAS DE NÚMEROS DE UMA VEZ ) APAGAR_TODOS_NUM MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL2 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO2 DECFSZ TIMER1,F GOTO LDNTCL2 DECFSZ TIMER2,F GOTO LDNTCL2 DECFSZ TIMER3,F GOTO LDNTCL2 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO2 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .10 ;* (ASTERISTICOS) BTFSS STATUS,Z GOTO INICIO MOVLW 0X78 MOVWF ADDRESS DENOVO3 MOVLW 0XFF CALL WPROM DECFSZ ADDRESS,F GOTO DENOVO3 MOVLW 0XFF CALL WPROM MOVLW .20 MOVWF TIMER1 AP12 CALL APITA ;APITO LONGO PARA INDICAR APAGAMENTO TOTAL DECFSZ TIMER1,F GOTO AP12 GOTO INICIO ;=============================================================================== ; DISCAR CONTEUDO DA MEMÓRIA ; *16*80 = TODOS OS NÚMEROS SÃO DISCADOS ; *16*8X = DISCA SOMENTE A MEMÓRIA X, SENDO X= 1...6 TESTE_DISC MOVLW .1 CALL DELAY ;ATRASA (120 uSEG) PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL7 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO7 DECFSZ TIMER1,F GOTO LDNTCL7 DECFSZ TIMER2,F GOTO LDNTCL7 DECFSZ TIMER3,F GOTO LDNTCL7 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO7 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .0 BTFSC STATUS,Z GOTO DISCA_TODAS MOVFW S_TECLA XORLW .1 BTFSC STATUS,Z GOTO DISCA_1 MOVFW S_TECLA XORLW .2 BTFSC STATUS,Z GOTO DISCA_2 MOVFW S_TECLA XORLW .3 BTFSC STATUS,Z GOTO DISCA_3 MOVFW S_TECLA XORLW .4 BTFSC STATUS,Z GOTO DISCA_4 MOVFW S_TECLA XORLW .5 BTFSC STATUS,Z GOTO DISCA_5 MOVFW S_TECLA XORLW .6 BTFSC STATUS,Z GOTO DISCA_6 GOTO INICIO DISCA_TODAS BSF FLAG_J CALL DISCAR_MEM ;DISCAR TODAS AS 6 MEMÓRIAS P/ TESTE BCF FLAG_J GOTO INICIO DISCA_1 ;DISCA A MEMÓRIA 1 APENAS CLRF ADDRESS MOVLW .20 MOVWF LIMITE GOTO V_DISC_UM DISCA_2 ;DISCA A MEMÓRIA 2 APENAS MOVLW .20 MOVWF ADDRESS MOVLW .40 MOVWF LIMITE GOTO V_DISC_UM DISCA_3 ;DISCA A MEMÓRIA 3 APENAS MOVLW .40 MOVWF ADDRESS MOVLW .60 MOVWF LIMITE GOTO V_DISC_UM DISCA_4 ;DISCA A MEMÓRIA 4 APENAS MOVLW .60 MOVWF ADDRESS MOVLW .80 MOVWF LIMITE GOTO V_DISC_UM DISCA_5 ;DISCA A MEMÓRIA 5 APENAS MOVLW .80 MOVWF ADDRESS MOVLW .100 MOVWF LIMITE GOTO V_DISC_UM DISCA_6 ;DISCA A MEMÓRIA 6 APENAS MOVLW .100 MOVWF ADDRESS MOVLW .120 MOVWF LIMITE V_DISC_UM BCF S0 ;DESCONECTA A LINHA TELEFONICA MOVLW T_OFF_ENTRE_DISC ;TEMPO LIGAÇÃO DESCONECTADA CALL DELAY BSF S0 ;CONECTA A LINHA TELEFONICA MOVLW T_ESTAB_LINHA ;TEMPO DE ESTABILIZAÇÃO DA LINHA 'PÓS GANCHO RETIRADO' CALL DELAY CALL DISCANDO BCF S0 GOTO INICIO MODO_INTERROMPIDO ;PROGRAMA MODO INTERROMPIDO MOVLW 0X7F MOVWF ADDRESS MOVLW .0 CALL WPROM MOVLW .2 CALL DELAY CALL APITA GOTO INICIO MODO_CONTINUO ;PROGRAMA MODO CONTINUO MOVLW 0X7F MOVWF ADDRESS MOVLW .1 CALL WPROM MOVLW .2 CALL DELAY CALL APITA GOTO INICIO ;======================================================= ;SUBROTINAS GERAIS ;======================================================= GRAVANDO_DIGITOS TECLANDO MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL1 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO1 DECFSZ TIMER1,F GOTO LDNTCL1 DECFSZ TIMER2,F GOTO LDNTCL1 DECFSZ TIMER3,F GOTO LDNTCL1 CALL APITA RETLW .0 ;SAI POR TEMPO FAPERTADO1 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA ;EXAMINA TECLA APERTADA XORLW .11 ;SE FOR # (SUSTENIDO) BTFSC STATUS,Z GOTO APAGA_RESTO_DIG ;ENCERRA PROGRAMAÇÃO POR # MOVFW S_TECLA CALL WPROM INCF ADDRESS,F MOVFW LIMITE XORWF ADDRESS,W BTFSC STATUS,Z RETLW .1 ;CHEGOU NO LIMITE E SAI DE 20 NÚMEROS GOTO TECLANDO ;VAI RECEBER NOVA DIGITAÇÃO APAGA_RESTO_DIG ;APAGA TODAS AS CASAS APÓS # DA MEMÓRIA ESCOLHIDA MOVLW 0XFF CALL WPROM INCF ADDRESS,F MOVFW LIMITE XORWF ADDRESS,W BTFSC STATUS,Z RETLW .1 GOTO APAGA_RESTO_DIG ;================================================================================== LE_TECLADO CALL VARREDURA_TECLADO MOVWF S_TECLA ;SALVA DIGITO RECEBIDO XORLW 0XFF BTFSC STATUS,Z GOTO S_NOTECLA ;NÃO HOUVE ACIONAMENTO DO TECLADO MOVLW .2 ;DEBOUNCE CALL DELAYS CALL VARREDURA_TECLADO MOVWF S_TECLA ;SALVA DIGITO RECEBIDO XORLW 0XFF BTFSC STATUS,Z GOTO S_NOTECLA ;NÃO HOUVE ACIONAMENTO DO TECLADO VFFF CALL VARREDURA_TECLADO ;AGUARDA SOLTAR TECLA XORLW 0XFF BTFSS STATUS,Z GOTO VFFF MOVLW .2 CALL DELAYS CALL VARREDURA_TECLADO ;AGUARDA SOLTAR TECLA XORLW 0XFF BTFSS STATUS,Z GOTO VFFF CALL APITA BSF STATUS,C ;SINALIZA COM OK RETURN S_NOTECLA BCF STATUS,C ;SINALIZA 'NENHUMA TECLA APERTADA' RETURN ;================================================================================== VARREDURA_TECLADO MOVLW .0 MOVWF PORTB MOVFW PORTB XORLW 0XF0 BTFSC STATUS,Z RETLW 0XFF ;NENHUMA TECLA APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XEE ;TESTA SE DIG '1'FOI APERTADO BTFSC STATUS,Z RETLW .1 ;TECLA '1' APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XDE ;TESTA SE DIG '2'FOI APERTADO BTFSC STATUS,Z RETLW .2 ;TECLA '2' APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XBE ;TESTA SE DIG '3'FOI APERTADO BTFSC STATUS,Z RETLW .3 ;TECLA '3' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XED ;TESTA SE DIG '4'FOI APERTADO BTFSC STATUS,Z RETLW .4 ;TECLA '4' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XDD ;TESTA SE DIG '5'FOI APERTADO BTFSC STATUS,Z RETLW .5 ;TECLA '5' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XBD ;TESTA SE DIG '6'FOI APERTADO BTFSC STATUS,Z RETLW .6 ;TECLA '6' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XEB ;TESTA SE DIG '7'FOI APERTADO BTFSC STATUS,Z RETLW .7 ;TECLA '7' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XDB ;TESTA SE DIG '8'FOI APERTADO BTFSC STATUS,Z RETLW .8 ;TECLA '8' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XBB ;TESTA SE DIG '9'FOI APERTADO BTFSC STATUS,Z RETLW .9 ;TECLA '9' APERTADA MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XE7 ;TESTA SE DIG '10'FOI APERTADO BTFSC STATUS,Z RETLW .10 ;TECLA '10' APERTADA * MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XD7 ;TESTA SE DIG '0'FOI APERTADO BTFSC STATUS,Z RETLW .0 ;TECLA '0' APERTADA MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XB7 ;TESTA SE DIG '11'FOI APERTADO BTFSC STATUS,Z RETLW .11 ;TECLA '11' APERTADA # RETLW 0XFF ;ERRO ;===================================================================== ;DISCA OS NÚMEROS GRAVADOS NA MEMÓRIA DISCAR_MEM BSF S0 ;LIGA RELE DA LINHA PINO 1 DO PIC MOVLW T_ESTAB_LINHA CALL DELAY ;TEMPO DE ESTABILIZAÇÃO E OBTENÇÃO DE SINAL DE LINHA MOVLW .0 MOVWF ADDRESS MOVWF S_ADDRESS MOVLW .20 MOVWF LIMITE VAI_DISC_OUTR_MEM CALL RPROM XORLW 0XFF BTFSS STATUS,Z CALL DISCANDO MOVLW .20 ADDWF LIMITE,F MOVFW S_ADDRESS ADDLW .20 MOVWF ADDRESS MOVWF S_ADDRESS XORLW .140 BTFSS STATUS,Z GOTO PROS343 BCF S0 ;DESCONECTA A LINHA TELEFONICA RETURN PROS343 BCF S0 ;DESCONECTA A LINHA TELEFONICA MOVLW T_OFF_ENTRE_DISC ;TEMPO PARA COMPLETAR A LIGAÇÃO CALL DELAY BSF S0 ;CONECTA A LINHA TELEFONICA MOVLW T_ESTAB_LINHA ;TEMPO DE ESTABILIZAÇÃO DA LINHA 'PÓS GANCHO RETIRADO' CALL DELAY BTFSC FLAG_J GOTO VAI_DISC_OUTR_MEM MOVFW ADDRESS MOVWF S_AD MOVLW 0X7F MOVWF ADDRESS CALL RPROM XORLW .1 ;SE =1 DISCARÁ TODOS OS NÚMEROS, INDEPENDENTE SE DISCAR=0 OU 1 BTFSC STATUS,Z GOTO AUX_J BTFSC DISCAR ;TESTA SE AINDA A COMANDO PARA DISCAR GOTO AUX_J ;SIM ,DISCA PRÓXIMO NÚMERO BCF S0 ;NÃO, DESCONECTA A LINHA TELEFONICA RETURN AUX_J MOVFW S_AD ;RETORNA VALOR SALVO MOVWF ADDRESS GOTO VAI_DISC_OUTR_MEM DISCANDO DISCAR_DE_NOV CALL RPROM MOVWF S_VAL XORLW 0XFF BTFSC STATUS,Z GOTO SOM ;FINALIZA COM NUMERO MENOR QUE 20 DIGITOS BTFSS MODO GOTO M_DTMF ;VAI DISCAR DTMF MOVFW S_VAL ;VAI DISCAR EM MODO PULSO XORLW .0 ;SE '0' BTFSS STATUS,Z GOTO P7RT MOVLW .10 ;CARREGA '10' MOVWF S_VAL P7RT CALL TESTA_DESLIGAR BCF S0 CALL PULSO_66MS ;MAKE PERIOD 66,6 MSEG ;LINHA TELEFONICA FICA COM 48V BSF S0 CALL PULSO_33MS ;BREAK PERIOD 33,3 MSEG ;LINHA FICA COM = +-8 VOLTS (CONECTADA) DECFSZ S_VAL,F GOTO P7RT MOVLW .8 MOVWF AUX JFI4 CALL TESTA_DESLIGAR CALL PULSO_66MS ;PAUSA ENTRE NÚMEROS DISCADOS (8 x (MAKE PERIOD + BREAK PERIODO)) CALL PULSO_33MS DECFSZ AUX,F GOTO JFI4 RTCOMUM CALL TESTA_DESLIGAR INCF ADDRESS MOVFW ADDRESS XORWF LIMITE,W BTFSC STATUS,Z GOTO SOM ;SAI POR CHEGAR A LIMITE MÁXIMO DE NUMEROS GOTO DISCAR_DE_NOV RET_VAZ BCF S0 ;DESCONECTA A LINHA TELEFONICA CALL L5_BIP ;GERA 5 BIPS GOTO INICIO ;FINALIZA PORQUE MEMÓRIA NÃO FOI GRAVADA SOM ; SOM A SER OUVIDO PELO ATENDENTE (SIRENE) ; TEMPO DE SOM = 33 SEGUNDOS MOVFW LIMITE ADDLW .236 ;SUBTRAI .20 XORWF ADDRESS,W BTFSC STATUS,Z GOTO RET_VAZ ;RETORNA, PORQUE PRIMEIRA POSIÇÃO DESTA MEMÓRIA ESTA VAZIA MOVLW T_COMP_LIGAC ; TEMPO PARA COMPLETAR LIGAÇÃO CALL DELAY MOVLW T_ALARME_NO_FONE ;TEMPO DO SINAL DE ALARME NO 'FONE' MOVWF TIMER3 GERAR_SOM MOVLW .130 MOVWF AUX1 SOM1 CALL TESTA_DESLIGAR BSF S1 BSF S2 MOVLW .230 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR BCF S1 BCF S2 MOVLW .230 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 DECFSZ AUX1,F GOTO SOM1 CALL TESTA_DESLIGAR MOVLW .180 MOVWF AUX1 SOM2 CALL TESTA_DESLIGAR BSF S1 BSF S2 MOVLW .140 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR BCF S1 BCF S2 MOVLW .140 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR DECFSZ AUX1,F GOTO SOM2 DECFSZ TIMER3,F GOTO GERAR_SOM RETURN M_DTMF MOVFW S_VAL CALL SEND_DTMF CALL TESTA_DESLIGAR CALL PULSO_33MS ;TEMPO ENTRE NUMEROS DISCADOS CALL TESTA_DESLIGAR CALL PULSO_66MS ;TEMPO ENTRE NUMEROS DISCADOS CALL TESTA_DESLIGAR GOTO RTCOMUM RETURN ;======================================================= ; ROTINAS DE TEMPO ;======================================================= WAIT MOVLW .8 CALL DELAY RETURN DELAY MOVWF C2 CG1 MOVLW 0XFF MOVWF C1 CG2 MOVLW 0X9D MOVWF C0 DECFSZ C0,f GOTO $-1 NOP DECFSZ C1,F GOTO CG2 NOP DECFSZ C2,F GOTO CG1 NOP RETURN DELAYS MOVWF C2 MOVLW .250 MOVWF C1 NOP NOP NOP NOP NOP NOP NOP DECFSZ C1,F GOTO $-.8 DECFSZ C2,F GOTO $-.12 RETURN ;======================================================================= ; PULSOS PADRÕES NO MODO DECÂDICO PULSO_33MS MOVLW .66 GOTO PCG1 PULSO_66MS MOVLW .132 PCG1 MOVWF C1 CALL T500US DECFSZ C1,F GOTO $-2 MOVLW .196 MOVWF C0 DECFSZ C0,F GOTO $-1 RETURN T500US MOVLW .250 MOVWF C0 FAP NOP NOP DECFSZ C0,F GOTO FAP RETURN ;=================================================== ; ENVIA NÚMERO A DISCAR PARA SAIDA DTMF S1,S2 ; EM FORMATO DE DUPLO TOM CORRESPONDENTE ;=================================================== SEND_DTMF ANDLW 0X0F MOVWF AUX MOVLW TABH ADDWF AUX,W CALL GET MOVWF FREQH SWAPF FREQH,F MOVLW TABL ADDWF AUX,W CALL GET MOVWF FREQL SWAPF FREQL,F BSF INTCON,GIE ;LIGA INTERRUPÇÃO MOVLW .3 call DELAY ;ENVIA POR 145 MSEG BCF S1 BCF S2 BCF INTCON,GIE ;DESLIGA INTERRUPÇÃO CALL TESTA_DESLIGAR MOVLW .2 ;TEMPO MORTO ENTRE ENVIOS 97 MSEG CALL DELAY RETURN GET MOVWF TEMP MOVLW .0 MOVWF PCLATH MOVFW TEMP MOVWF PCL ;==================================================== 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 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 ;================================================================= ;GERA SINAL SONORO (BIP) APITA BANK1 BCF TRISA,1 ;VIRA SAIDA BANK0 MOVLW .250 MOVWF AUX1 VFGF BSF BIP MOVLW .100 MOVWF AUX DECFSZ AUX,F GOTO $-1 BCF BIP MOVLW .100 MOVWF AUX DECFSZ AUX,F GOTO $-1 DECFSZ AUX1,F GOTO VFGF BANK1 BSF TRISA,1 ;VIRA ENTRADA BANK0 RETURN ;======================================================================= ; GERA BIPS L5_BIP MOVLW .5 ;GERA 5 BIP W_BIP MOVWF TIMER1 ;GERA PELO NUMERO EM 'W' FKW1 CALL APITA ;4 BIPS PARA INDICAR MEMÓRIA VAZIA MOVLW .5 CALL DELAY DECFSZ TIMER1,F GOTO FKW1 RETURN TESTA_DESLIGAR ; *176* PARA DESLIGAR CALL VARREDURA_TECLADO MOVWF W_SALVO MOVLW .0 MOVWF PCLATH MOVFW RDESL CALL TABD XORWF W_SALVO,W ;TECLA * (ASTERISTICOS APERTADA) BTFSS STATUS,Z GOTO RETURN1 ; VOLTA AS ROTINAS INCF RDESL,F ;INCREMENTA REGISTRADOR DE DESLIGAMENTO MOVFW RDESL XORLW .5 BTFSS STATUS,Z GOTO RETURN1 CLRF RDESL GOTO RESET ;RESETA E PARA DISCAGEM RETURN1 MOVFW W_SALVO ;TRAPS PARA OS OUTROS NÚMEROS XORLW .0 BTFSS STATUS,Z GOTO SUTY1 CLRF RDESL SUTY1 MOVFW W_SALVO XORLW .2 BTFSS STATUS,Z GOTO SUTY2 CLRF RDESL SUTY2 MOVFW W_SALVO XORLW .3 BTFSS STATUS,Z GOTO SUTY3 CLRF RDESL SUTY3 MOVFW W_SALVO XORLW .4 BTFSS STATUS,Z GOTO SUTY4 CLRF RDESL RETURN SUTY4 MOVFW W_SALVO XORLW .5 BTFSS STATUS,Z GOTO SUTY5 CLRF RDESL SUTY5 MOVFW W_SALVO XORLW .8 BTFSS STATUS,Z GOTO SUTY6 CLRF RDESL SUTY6 MOVFW W_SALVO XORLW .9 BTFSS STATUS,Z RETURN CLRF RDESL RETURN END ;************************************************************************************************************* ; DISCADORA_628_V1.ASM ; ; PROJETO: DISCADORA PARA USO EM ALARMES (COM OPÇÃO P/ DECÁDICO/ DTMF) COM PIC 16F628A ; OBJETIVO: CONECTAR UM DISPOSITIVO (POR EX. ALARME) COM A REDE TELEFONICA, VISANDO ; TRANSMITIR UM SINAL SONORO, INDICANDO A SUA ATUAÇÃO. ; UTILIZA UM TECLADO COMUM DE TELEFONE PARA AQUISIÇÃO DE DADOS, LIGADOS A UM PIC 16F628A. ; USE CRISTAL DE 10 MHZ. ; CLAUDIO LÁRIOS 10-09-2012 TÉRMINO 19-09-2012 ; USO APENAS PARA FINS DIDÁTICOS. ;************************************************************************************************************ ; ********** COMANDOS ACEITOS NO TECLADO:******************************************************************* ; PROGRAMAR NÚMERO A SER DISCADO EM UMA DAS 6 MEMÓRIAS: ; DIGITE: (*)(1)(6)(*)(X)(NÚMERO DE TELEFONE ATÉ 20 DIG)(#) ; SENDO X = MEMÓRIA 1 A 6 (AO FINAL, 2 BIP CURTOS) ; APAGAR NÚMERO DE UMA DAS 6 MEMÓRIAS: ; DIGITE: (*)(1)(6)(*)(X)(#) ; SENDO X = MEMÓRIA 1 A 6 (AO FINAL, 2 BIP CURTOS) ; APAGAR NÚMERO DE TODAS AS 6 MEMÓRIAS DE UMA ÚNICA VEZ: ; DIGITE: (*)(1)(6)(*)(7)(*) (AO FINAL, UM BIP LONGO) ; TESTAR DISCAGEM DE NÚMERO DA MEMÓRIA: ; DIGITE: (*)(1)(6)(*)(8)(0) ; DISCARÁ TODOS OS NÚMEROS DAS MEMÓRIAS EM SEQUENCIA ; DIGITE: (*)(1)(6)(*)(8)(X) ; DISCARÁ SOMENTE A MEMÓRIA X ,SENDO X= 1 A 6 ; DEFINIR MODO DE DISCAGEM INTERROMPIDO(PARA DE DISCAR SE ENTRADA DE COMANDO FOR '0'(DISCA APENAS O 1º NÚMERO): ; DIGITE: (*)(1)(6)(*)(9) (AO FINAL, 2 BIP CURTOS) ; DEFINIR MODO DE DISCAGEM CONTINUO (DISCA EM SEQUENCIA TODOS OS NÚMEROS, MESMO SE ENTRADA DE COMANDO FOR '0': ; DIGITE: (*)(1)(6)(*)(0) (AO FINAL, 2 BIP CURTOS) ; RESETAR PROGRAMA, FINALIZANDO ANTECIPADAMENTE UMA DISCAGEM EM CURSO: ; DIGITE: (*)(1)(7)(6)(*) ;************************************************************************************************************* ERRORLEVEL -302 #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _HS_OSC & _LVP_OFF ; 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 C0,C1,C2,C3,TEMP,AUX,val,cont,VH,VL,W_SALVO,FREQH,FREQL,NUM,R1,R2,R3,S_TECLA,TIMER1 TIMER2, TIMER3, LIMITE, S_VAL,S_ADDRESS,AUX1,S_AD,FLAGS, ADDRESS,RDESL,DBC ENDC #DEFINE S0 PORTA,2 ;SAIDA DECÁDICA - RESISTOR DE 4K7 AO TRANSITOR DRIVE DO RELE PINO 1 #DEFINE S1 PORTA,3 ;DTMF- SAIDA FREQ ALTA - RESISTOR 470 OHMS PINO 2 #DEFINE S2 PORTA,4 ;DTMF- SAIDA FREQ BAIXA - RESISTOR 680 OHMS PINO 3 #DEFINE DISCAR PORTA,0 ;COMANDO PARA DISCAR (1) - PINO 17 #DEFINE MODO PORTA,1 ;ESCOLHE DTMF (0) OU DECÁDICO (1)- RESISTOR 220 OHMS PINO 18 #DEFINE BIP PORTA,1 ;SAIDA BIP INDICADOR DE TECLA APERTADA/ACEITAÇÃO DE COMAMDO PINO 18 ;TECLADO #DEFINE T2 EQU PORTB,0 #DEFINE T3 EQU PORTB,1 #DEFINE T5 EQU PORTB,2 #DEFINE T7 EQU PORTB,3 #DEFINE T1 EQU PORTB,4 #DEFINE T4 EQU PORTB,5 #DEFINE T6 EQU PORTB,6 ; DEFINIÇÕES DE FLAGS #DEFINE FLAG_J FLAGS,0 ;FLAG TESTE DE DISCAGEM ;VARIAVÉIS DE TEMPO T_ESTAB_LINHA EQU .20 ;TEMPO PARA ESTABILIZAÇÃO DA LINHA T_COMP_LIGAC EQU .30 ;TEMPO PARA COMPLETAR LIGAÇÃO T_OFF_ENTRE_DISC EQU .10 ;TEMPO DESCONECTADO (DESLIGA A LINHA ENTRE DISCAGENS DE NUMEROS DIFERENTES) T_PRE_DISPARO EQU .228 ;TEMPO MORTO PRÉ DISPARO (EVITA DISCAGENS DESNECESSÁRIAS ) .228= 10 SEG. T_SOLTURA EQU .5 ; DEBOUNCE 5 MSEG T_MAX_ESPERA_TECLA EQU .20 ;TEMPO DE ESPERA (AGUARDA TECLA SER DIGITADA ANTES DE SAIR PARA O 'INICIO') 20= 13 SEG T_ALARME_NO_FONE EQU .130 ;TEMPO QUE SINAL DE ALARME SERÁ OUVIDO PELO RECEPTOR DO NUMERO DISCADO (.130=40SEG) ;__________________________________________________________________________________________________________ ;TABELA DE FREQUENCIAS DO SISTEMA DTMF ;ALTA FREQUENCIA (COLUNA) XTAL 10MHZ ;1209hz 79 128 ;1336hz 87 140 ;1477hz 96 151 ;1633hz 107 161 ;BAIXA FREQUENCIA (LINHA)) ;697hz 46 33 ;770hz 50 54 ;852hz 56 74 ;941hz 61 91 ;__________________________________________________________________________________________________________ ;TONS DE DISCAGEM (DTMF) ; ; 1209 1336 1477 1633 ; ; 697 1 2 3 A ; ; 770 4 5 6 B ; ; 852 7 8 9 C ; ; 941 * 0 # D ;___________________________________________________________________________________________________________ ORG 0X00 GOTO RESET ORG 0X04 GOTO INT_TIMERS ;TABELAS TABH DT .140 ;0 DT .128 ;1 DT .140 ;2 DT .151 ;3 DT .128 ;4 DT .140 ;5 DT .151 ;6 DT .128 ;7 DT .140 ;8 DT .151 ;9 DT .161 ;A DT .161 ;B DT .161 ;C DT .161 ;D DT .128 ;* DT .151 ;# TABL DT .91 ;0 DT .33 ;1 DT .33 ;2 DT .33 ;3 DT .54 ;4 DT .54 ;5 DT .54 ;6 DT .74 ;7 DT .74 ;8 DT .74 ;9 DT .33 ;A DT .54 ;B DT .74 ;C DT .91 ;D DT .91 ;* DT .91 ;# TABD ADDWF PCL,F DT .10 ;* DT .1 ;1 DT .7 ;7 DT .6 ;6 DT .10 ;* ;******************************************************** ; ROTINA DE INTERRUPÇÕES (GERA DTMF NAS SAIDAS S1 E S2) ;--------------------------------------------------------- INT_TIMERS BTFSC PIR1,TMR1IF GOTO V3 BCF INTCON,T0IF MOVWF W_SALVO SWAPF FREQH,W MOVWF TMR0 MOVFW W_SALVO BTFSS S1 GOTO V2 BCF S1 RETFIE V2 BSF S1 RETFIE ;-------------------------------- V3 BCF PIR1,TMR1IF MOVWF W_SALVO SWAPF FREQL,W MOVWF TMR1L MOVLW 0XFF MOVWF TMR1H MOVFW W_SALVO BTFSS S2 GOTO V4 BCF S2 RETFIE V4 BSF S2 RETFIE ;**************************************************************** ; RESET DO PROGRAMA ;================================================================ RESET BANK1 MOVLW B'11100011' ; PB2..PB4 SAIDAS / RESTANTE ENTRADAS MOVWF TRISA MOVLW B'11110000' ;PB0..3 SAIDA / PB4...PB7 ENTRADAS MOVWF TRISB MOVLW B'00000010' MOVWF OPTION_REG MOVLW B'00000001' MOVWF PIE1 BANK0 MOVLW B'00110001' MOVWF T1CON MOVLW B'1100000' MOVWF INTCON MOVLW .0 MOVWF PORTA MOVWF PORTB MOVLW .7 MOVWF CMCON MOVLW 0XFF MOVWF TMR1H CLRF RDESL MOVLW .10 CALL DELAY ;******************************************************************************* ; INICIO DO PROGRAMA ;=============================================================================== INICIO BTFSS DISCAR ;TESTA ENTRADA DE COMANDO PARA 'DISCAR' GOTO GER_TECLADO ;NÃO ACIONADA,VAI ENTÃO VERIFICAR TECLADO MOVLW T_PRE_DISPARO ;DELAY PRÉ DISPARO CALL DELAY BTFSS DISCAR GOTO INICIO ;FALSO DISPARO CALL DISCAR_MEM ;DISCA NÚMEROS NA MEMÓRIA GOTO INICIO ;VOLTA AO LOOP PRINCIPAL ;=============================================================================== ;ROTINAS DE TECLADO GER_TECLADO CALL LE_TECLADO BTFSS STATUS,C GOTO INICIO ; C=0 - NENHUMA TECLA APERTADA MOVFW S_TECLA XORLW .10 ;TECLA * (ASTERISTICOS APERTADA) BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO DECFSZ TIMER1,F GOTO LDNTCL DECFSZ TIMER2,F GOTO LDNTCL DECFSZ TIMER3,F GOTO LDNTCL CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO MOVFW S_TECLA XORLW .1 ;TECLA 1 (DIG'1') BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL4 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO4 DECFSZ TIMER1,F GOTO LDNTCL4 DECFSZ TIMER2,F GOTO LDNTCL4 DECFSZ TIMER3,F GOTO LDNTCL4 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO4 MOVFW S_TECLA XORLW .6 ;COMPARA COM 6 BTFSS STATUS,Z GOTO INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL5 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO5 DECFSZ TIMER1,F GOTO LDNTCL5 DECFSZ TIMER2,F GOTO LDNTCL5 DECFSZ TIMER3,F GOTO LDNTCL5 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO5 MOVFW S_TECLA XORLW .10 ;COMPARA COM * BTFSS STATUS,Z GOTO INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL6 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO6 DECFSZ TIMER1,F GOTO LDNTCL6 DECFSZ TIMER2,F GOTO LDNTCL6 DECFSZ TIMER3,F GOTO LDNTCL6 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO6 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .1 BTFSC STATUS,Z GOTO EH1 MOVFW S_TECLA XORLW .2 BTFSC STATUS,Z GOTO EH2 MOVFW S_TECLA XORLW .3 BTFSC STATUS,Z GOTO EH3 MOVFW S_TECLA XORLW .4 BTFSC STATUS,Z GOTO EH4 MOVFW S_TECLA XORLW .5 BTFSC STATUS,Z GOTO EH5 MOVFW S_TECLA XORLW .6 BTFSC STATUS,Z GOTO EH6 MOVFW S_TECLA XORLW .7 BTFSC STATUS,Z GOTO APAGAR_TODOS_NUM MOVFW S_TECLA XORLW .8 BTFSC STATUS,Z GOTO TESTE_DISC ;DISCAR NUMEROS PARA TESTE MOVFW S_TECLA XORLW .9 BTFSC STATUS,Z GOTO MODO_INTERROMPIDO MOVFW S_TECLA XORLW .0 BTFSC STATUS,Z GOTO MODO_CONTINUO GOTO INICIO ;ERRO ;======================================================== ;GRAVAR MEMÓRIAS NAS POSIÇÕES 1 A 5 EH1 MOVLW .0 MOVWF ADDRESS MOVLW .20 MOVWF LIMITE GOTO SCOM EH2 MOVLW .20 MOVWF ADDRESS MOVLW .40 MOVWF LIMITE GOTO SCOM EH3 MOVLW .40 MOVWF ADDRESS MOVLW .60 MOVWF LIMITE GOTO SCOM EH4 MOVLW .60 MOVWF ADDRESS MOVLW .80 MOVWF LIMITE GOTO SCOM EH5 MOVLW .80 MOVWF ADDRESS MOVLW .100 MOVWF LIMITE GOTO SCOM EH6 MOVLW .100 MOVWF ADDRESS MOVLW .120 MOVWF LIMITE SCOM CALL GRAVANDO_DIGITOS CALL APITA GOTO INICIO ;==================================================== ;*16*7* (APAGAR TODAS AS 6 MEMÓRIAS DE NÚMEROS DE UMA VEZ ) APAGAR_TODOS_NUM MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL2 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO2 DECFSZ TIMER1,F GOTO LDNTCL2 DECFSZ TIMER2,F GOTO LDNTCL2 DECFSZ TIMER3,F GOTO LDNTCL2 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO2 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .10 ;* (ASTERISTICOS) BTFSS STATUS,Z GOTO INICIO MOVLW 0X78 MOVWF ADDRESS DENOVO3 MOVLW 0XFF CALL WPROM DECFSZ ADDRESS,F GOTO DENOVO3 MOVLW 0XFF CALL WPROM MOVLW .20 MOVWF TIMER1 AP12 CALL APITA ;APITO LONGO PARA INDICAR APAGAMENTO TOTAL DECFSZ TIMER1,F GOTO AP12 GOTO INICIO ;=============================================================================== ; DISCAR CONTEUDO DA MEMÓRIA ; *16*80 = TODOS OS NÚMEROS SÃO DISCADOS ; *16*8X = DISCA SOMENTE A MEMÓRIA X, SENDO X= 1...6 TESTE_DISC MOVLW .1 CALL DELAY ;ATRASA (120 uSEG) PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL7 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO7 DECFSZ TIMER1,F GOTO LDNTCL7 DECFSZ TIMER2,F GOTO LDNTCL7 DECFSZ TIMER3,F GOTO LDNTCL7 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO7 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .0 BTFSC STATUS,Z GOTO DISCA_TODAS MOVFW S_TECLA XORLW .1 BTFSC STATUS,Z GOTO DISCA_1 MOVFW S_TECLA XORLW .2 BTFSC STATUS,Z GOTO DISCA_2 MOVFW S_TECLA XORLW .3 BTFSC STATUS,Z GOTO DISCA_3 MOVFW S_TECLA XORLW .4 BTFSC STATUS,Z GOTO DISCA_4 MOVFW S_TECLA XORLW .5 BTFSC STATUS,Z GOTO DISCA_5 MOVFW S_TECLA XORLW .6 BTFSC STATUS,Z GOTO DISCA_6 GOTO INICIO DISCA_TODAS BSF FLAG_J CALL DISCAR_MEM ;DISCAR TODAS AS 6 MEMÓRIAS P/ TESTE BCF FLAG_J GOTO INICIO DISCA_1 ;DISCA A MEMÓRIA 1 APENAS CLRF ADDRESS MOVLW .20 MOVWF LIMITE GOTO V_DISC_UM DISCA_2 ;DISCA A MEMÓRIA 2 APENAS MOVLW .20 MOVWF ADDRESS MOVLW .40 MOVWF LIMITE GOTO V_DISC_UM DISCA_3 ;DISCA A MEMÓRIA 3 APENAS MOVLW .40 MOVWF ADDRESS MOVLW .60 MOVWF LIMITE GOTO V_DISC_UM DISCA_4 ;DISCA A MEMÓRIA 4 APENAS MOVLW .60 MOVWF ADDRESS MOVLW .80 MOVWF LIMITE GOTO V_DISC_UM DISCA_5 ;DISCA A MEMÓRIA 5 APENAS MOVLW .80 MOVWF ADDRESS MOVLW .100 MOVWF LIMITE GOTO V_DISC_UM DISCA_6 ;DISCA A MEMÓRIA 6 APENAS MOVLW .100 MOVWF ADDRESS MOVLW .120 MOVWF LIMITE V_DISC_UM BCF S0 ;DESCONECTA A LINHA TELEFONICA MOVLW T_OFF_ENTRE_DISC ;TEMPO LIGAÇÃO DESCONECTADA CALL DELAY BSF S0 ;CONECTA A LINHA TELEFONICA MOVLW T_ESTAB_LINHA ;TEMPO DE ESTABILIZAÇÃO DA LINHA 'PÓS GANCHO RETIRADO' CALL DELAY CALL DISCANDO BCF S0 GOTO INICIO MODO_INTERROMPIDO ;PROGRAMA MODO INTERROMPIDO MOVLW 0X7F MOVWF ADDRESS MOVLW .0 CALL WPROM MOVLW .2 CALL DELAY CALL APITA GOTO INICIO MODO_CONTINUO ;PROGRAMA MODO CONTINUO MOVLW 0X7F MOVWF ADDRESS MOVLW .1 CALL WPROM MOVLW .2 CALL DELAY CALL APITA GOTO INICIO ;======================================================= ;SUBROTINAS GERAIS ;======================================================= GRAVANDO_DIGITOS TECLANDO MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL1 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO1 DECFSZ TIMER1,F GOTO LDNTCL1 DECFSZ TIMER2,F GOTO LDNTCL1 DECFSZ TIMER3,F GOTO LDNTCL1 CALL APITA RETLW .0 ;SAI POR TEMPO FAPERTADO1 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA ;EXAMINA TECLA APERTADA XORLW .11 ;SE FOR # (SUSTENIDO) BTFSC STATUS,Z GOTO APAGA_RESTO_DIG ;ENCERRA PROGRAMAÇÃO POR # MOVFW S_TECLA CALL WPROM INCF ADDRESS,F MOVFW LIMITE XORWF ADDRESS,W BTFSC STATUS,Z RETLW .1 ;CHEGOU NO LIMITE E SAI DE 20 NÚMEROS GOTO TECLANDO ;VAI RECEBER NOVA DIGITAÇÃO APAGA_RESTO_DIG ;APAGA TODAS AS CASAS APÓS # DA MEMÓRIA ESCOLHIDA MOVLW 0XFF CALL WPROM INCF ADDRESS,F MOVFW LIMITE XORWF ADDRESS,W BTFSC STATUS,Z RETLW .1 GOTO APAGA_RESTO_DIG ;================================================================================== LE_TECLADO CALL VARREDURA_TECLADO MOVWF S_TECLA ;SALVA DIGITO RECEBIDO XORLW 0XFF BTFSC STATUS,Z GOTO S_NOTECLA ;NÃO HOUVE ACIONAMENTO DO TECLADO MOVLW .2 ;DEBOUNCE CALL DELAYS CALL VARREDURA_TECLADO MOVWF S_TECLA ;SALVA DIGITO RECEBIDO XORLW 0XFF BTFSC STATUS,Z GOTO S_NOTECLA ;NÃO HOUVE ACIONAMENTO DO TECLADO VFFF CALL VARREDURA_TECLADO ;AGUARDA SOLTAR TECLA XORLW 0XFF BTFSS STATUS,Z GOTO VFFF MOVLW .2 CALL DELAYS CALL VARREDURA_TECLADO ;AGUARDA SOLTAR TECLA XORLW 0XFF BTFSS STATUS,Z GOTO VFFF CALL APITA BSF STATUS,C ;SINALIZA COM OK RETURN S_NOTECLA BCF STATUS,C ;SINALIZA 'NENHUMA TECLA APERTADA' RETURN ;================================================================================== VARREDURA_TECLADO MOVLW .0 MOVWF PORTB MOVFW PORTB XORLW 0XF0 BTFSC STATUS,Z RETLW 0XFF ;NENHUMA TECLA APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XEE ;TESTA SE DIG '1'FOI APERTADO BTFSC STATUS,Z RETLW .1 ;TECLA '1' APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XDE ;TESTA SE DIG '2'FOI APERTADO BTFSC STATUS,Z RETLW .2 ;TECLA '2' APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XBE ;TESTA SE DIG '3'FOI APERTADO BTFSC STATUS,Z RETLW .3 ;TECLA '3' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XED ;TESTA SE DIG '4'FOI APERTADO BTFSC STATUS,Z RETLW .4 ;TECLA '4' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XDD ;TESTA SE DIG '5'FOI APERTADO BTFSC STATUS,Z RETLW .5 ;TECLA '5' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XBD ;TESTA SE DIG '6'FOI APERTADO BTFSC STATUS,Z RETLW .6 ;TECLA '6' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XEB ;TESTA SE DIG '7'FOI APERTADO BTFSC STATUS,Z RETLW .7 ;TECLA '7' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XDB ;TESTA SE DIG '8'FOI APERTADO BTFSC STATUS,Z RETLW .8 ;TECLA '8' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XBB ;TESTA SE DIG '9'FOI APERTADO BTFSC STATUS,Z RETLW .9 ;TECLA '9' APERTADA MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XE7 ;TESTA SE DIG '10'FOI APERTADO BTFSC STATUS,Z RETLW .10 ;TECLA '10' APERTADA * MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XD7 ;TESTA SE DIG '0'FOI APERTADO BTFSC STATUS,Z RETLW .0 ;TECLA '0' APERTADA MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XB7 ;TESTA SE DIG '11'FOI APERTADO BTFSC STATUS,Z RETLW .11 ;TECLA '11' APERTADA # RETLW 0XFF ;ERRO ;===================================================================== ;DISCA OS NÚMEROS GRAVADOS NA MEMÓRIA DISCAR_MEM BSF S0 ;LIGA RELE DA LINHA PINO 1 DO PIC MOVLW T_ESTAB_LINHA CALL DELAY ;TEMPO DE ESTABILIZAÇÃO E OBTENÇÃO DE SINAL DE LINHA MOVLW .0 MOVWF ADDRESS MOVWF S_ADDRESS MOVLW .20 MOVWF LIMITE VAI_DISC_OUTR_MEM CALL RPROM XORLW 0XFF BTFSS STATUS,Z CALL DISCANDO MOVLW .20 ADDWF LIMITE,F MOVFW S_ADDRESS ADDLW .20 MOVWF ADDRESS MOVWF S_ADDRESS XORLW .140 BTFSS STATUS,Z GOTO PROS343 BCF S0 ;DESCONECTA A LINHA TELEFONICA RETURN PROS343 BCF S0 ;DESCONECTA A LINHA TELEFONICA MOVLW T_OFF_ENTRE_DISC ;TEMPO PARA COMPLETAR A LIGAÇÃO CALL DELAY BSF S0 ;CONECTA A LINHA TELEFONICA MOVLW T_ESTAB_LINHA ;TEMPO DE ESTABILIZAÇÃO DA LINHA 'PÓS GANCHO RETIRADO' CALL DELAY BTFSC FLAG_J GOTO VAI_DISC_OUTR_MEM MOVFW ADDRESS MOVWF S_AD MOVLW 0X7F MOVWF ADDRESS CALL RPROM XORLW .1 ;SE =1 DISCARÁ TODOS OS NÚMEROS, INDEPENDENTE SE DISCAR=0 OU 1 BTFSC STATUS,Z GOTO AUX_J BTFSC DISCAR ;TESTA SE AINDA A COMANDO PARA DISCAR GOTO AUX_J ;SIM ,DISCA PRÓXIMO NÚMERO BCF S0 ;NÃO, DESCONECTA A LINHA TELEFONICA RETURN AUX_J MOVFW S_AD ;RETORNA VALOR SALVO MOVWF ADDRESS GOTO VAI_DISC_OUTR_MEM DISCANDO DISCAR_DE_NOV CALL RPROM MOVWF S_VAL XORLW 0XFF BTFSC STATUS,Z GOTO SOM ;FINALIZA COM NUMERO MENOR QUE 20 DIGITOS BTFSS MODO GOTO M_DTMF ;VAI DISCAR DTMF MOVFW S_VAL ;VAI DISCAR EM MODO PULSO XORLW .0 ;SE '0' BTFSS STATUS,Z GOTO P7RT MOVLW .10 ;CARREGA '10' MOVWF S_VAL P7RT CALL TESTA_DESLIGAR BCF S0 CALL PULSO_66MS ;MAKE PERIOD 66,6 MSEG ;LINHA TELEFONICA FICA COM 48V BSF S0 CALL PULSO_33MS ;BREAK PERIOD 33,3 MSEG ;LINHA FICA COM = +-8 VOLTS (CONECTADA) DECFSZ S_VAL,F GOTO P7RT MOVLW .8 MOVWF AUX JFI4 CALL TESTA_DESLIGAR CALL PULSO_66MS ;PAUSA ENTRE NÚMEROS DISCADOS (8 x (MAKE PERIOD + BREAK PERIODO)) CALL PULSO_33MS DECFSZ AUX,F GOTO JFI4 RTCOMUM CALL TESTA_DESLIGAR INCF ADDRESS MOVFW ADDRESS XORWF LIMITE,W BTFSC STATUS,Z GOTO SOM ;SAI POR CHEGAR A LIMITE MÁXIMO DE NUMEROS GOTO DISCAR_DE_NOV RET_VAZ BCF S0 ;DESCONECTA A LINHA TELEFONICA CALL L5_BIP ;GERA 5 BIPS GOTO INICIO ;FINALIZA PORQUE MEMÓRIA NÃO FOI GRAVADA SOM ; SOM A SER OUVIDO PELO ATENDENTE (SIRENE) ; TEMPO DE SOM = 33 SEGUNDOS MOVFW LIMITE ADDLW .236 ;SUBTRAI .20 XORWF ADDRESS,W BTFSC STATUS,Z GOTO RET_VAZ ;RETORNA, PORQUE PRIMEIRA POSIÇÃO DESTA MEMÓRIA ESTA VAZIA MOVLW T_COMP_LIGAC ; TEMPO PARA COMPLETAR LIGAÇÃO CALL DELAY MOVLW T_ALARME_NO_FONE ;TEMPO DO SINAL DE ALARME NO 'FONE' MOVWF TIMER3 GERAR_SOM MOVLW .130 MOVWF AUX1 SOM1 CALL TESTA_DESLIGAR BSF S1 BSF S2 MOVLW .230 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR BCF S1 BCF S2 MOVLW .230 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 DECFSZ AUX1,F GOTO SOM1 CALL TESTA_DESLIGAR MOVLW .180 MOVWF AUX1 SOM2 CALL TESTA_DESLIGAR BSF S1 BSF S2 MOVLW .140 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR BCF S1 BCF S2 MOVLW .140 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR DECFSZ AUX1,F GOTO SOM2 DECFSZ TIMER3,F GOTO GERAR_SOM RETURN M_DTMF MOVFW S_VAL CALL SEND_DTMF CALL TESTA_DESLIGAR CALL PULSO_33MS ;TEMPO ENTRE NUMEROS DISCADOS CALL TESTA_DESLIGAR CALL PULSO_66MS ;TEMPO ENTRE NUMEROS DISCADOS CALL TESTA_DESLIGAR GOTO RTCOMUM RETURN ;======================================================= ; ROTINAS DE TEMPO ;======================================================= WAIT MOVLW .8 CALL DELAY RETURN DELAY MOVWF C2 CG1 MOVLW 0XFF MOVWF C1 CG2 MOVLW 0X9D MOVWF C0 DECFSZ C0,f GOTO $-1 NOP DECFSZ C1,F GOTO CG2 NOP DECFSZ C2,F GOTO CG1 NOP RETURN DELAYS MOVWF C2 MOVLW .250 MOVWF C1 NOP NOP NOP NOP NOP NOP NOP DECFSZ C1,F GOTO $-.8 DECFSZ C2,F GOTO $-.12 RETURN ;======================================================================= ; PULSOS PADRÕES NO MODO DECÂDICO PULSO_33MS MOVLW .66 GOTO PCG1 PULSO_66MS MOVLW .132 PCG1 MOVWF C1 CALL T500US DECFSZ C1,F GOTO $-2 MOVLW .196 MOVWF C0 DECFSZ C0,F GOTO $-1 RETURN T500US MOVLW .250 MOVWF C0 FAP NOP NOP DECFSZ C0,F GOTO FAP RETURN ;=================================================== ; ENVIA NÚMERO A DISCAR PARA SAIDA DTMF S1,S2 ; EM FORMATO DE DUPLO TOM CORRESPONDENTE ;=================================================== SEND_DTMF ANDLW 0X0F MOVWF AUX MOVLW TABH ADDWF AUX,W CALL GET MOVWF FREQH SWAPF FREQH,F MOVLW TABL ADDWF AUX,W CALL GET MOVWF FREQL SWAPF FREQL,F BSF INTCON,GIE ;LIGA INTERRUPÇÃO MOVLW .3 call DELAY ;ENVIA POR 145 MSEG BCF S1 BCF S2 BCF INTCON,GIE ;DESLIGA INTERRUPÇÃO CALL TESTA_DESLIGAR MOVLW .2 ;TEMPO MORTO ENTRE ENVIOS 97 MSEG CALL DELAY RETURN GET MOVWF TEMP MOVLW .0 MOVWF PCLATH MOVFW TEMP MOVWF PCL ;==================================================== 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 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 ;================================================================= ;GERA SINAL SONORO (BIP) APITA BANK1 BCF TRISA,1 ;VIRA SAIDA BANK0 MOVLW .250 MOVWF AUX1 VFGF BSF BIP MOVLW .100 MOVWF AUX DECFSZ AUX,F GOTO $-1 BCF BIP MOVLW .100 MOVWF AUX DECFSZ AUX,F GOTO $-1 DECFSZ AUX1,F GOTO VFGF BANK1 BSF TRISA,1 ;VIRA ENTRADA BANK0 RETURN ;======================================================================= ; GERA BIPS L5_BIP MOVLW .5 ;GERA 5 BIP W_BIP MOVWF TIMER1 ;GERA PELO NUMERO EM 'W' FKW1 CALL APITA ;4 BIPS PARA INDICAR MEMÓRIA VAZIA MOVLW .5 CALL DELAY DECFSZ TIMER1,F GOTO FKW1 RETURN TESTA_DESLIGAR ; *176* PARA DESLIGAR CALL VARREDURA_TECLADO MOVWF W_SALVO MOVLW .0 MOVWF PCLATH MOVFW RDESL CALL TABD XORWF W_SALVO,W ;TECLA * (ASTERISTICOS APERTADA) BTFSS STATUS,Z GOTO RETURN1 ; VOLTA AS ROTINAS INCF RDESL,F ;INCREMENTA REGISTRADOR DE DESLIGAMENTO MOVFW RDESL XORLW .5 BTFSS STATUS,Z GOTO RETURN1 CLRF RDESL GOTO RESET ;RESETA E PARA DISCAGEM RETURN1 MOVFW W_SALVO ;TRAPS PARA OS OUTROS NÚMEROS XORLW .0 BTFSS STATUS,Z GOTO SUTY1 CLRF RDESL SUTY1 MOVFW W_SALVO XORLW .2 BTFSS STATUS,Z GOTO SUTY2 CLRF RDESL SUTY2 MOVFW W_SALVO XORLW .3 BTFSS STATUS,Z GOTO SUTY3 CLRF RDESL SUTY3 MOVFW W_SALVO XORLW .4 BTFSS STATUS,Z GOTO SUTY4 CLRF RDESL RETURN SUTY4 MOVFW W_SALVO XORLW .5 BTFSS STATUS,Z GOTO SUTY5 CLRF RDESL SUTY5 MOVFW W_SALVO XORLW .8 BTFSS STATUS,Z GOTO SUTY6 CLRF RDESL SUTY6 MOVFW W_SALVO XORLW .9 BTFSS STATUS,Z RETURN CLRF RDESL RETURN END ;************************************************************************************************************* ; DISCADORA_628_V1.ASM ; ; PROJETO: DISCADORA PARA USO EM ALARMES (COM OPÇÃO P/ DECÁDICO/ DTMF) COM PIC 16F628A ; OBJETIVO: CONECTAR UM DISPOSITIVO (POR EX. ALARME) COM A REDE TELEFONICA, VISANDO ; TRANSMITIR UM SINAL SONORO, INDICANDO A SUA ATUAÇÃO. ; UTILIZA UM TECLADO COMUM DE TELEFONE PARA AQUISIÇÃO DE DADOS, LIGADOS A UM PIC 16F628A. ; USE CRISTAL DE 10 MHZ. ; CLAUDIO LÁRIOS 10-09-2012 TÉRMINO 19-09-2012 ; USO APENAS PARA FINS DIDÁTICOS. ;************************************************************************************************************ ; ********** COMANDOS ACEITOS NO TECLADO:******************************************************************* ; PROGRAMAR NÚMERO A SER DISCADO EM UMA DAS 6 MEMÓRIAS: ; DIGITE: (*)(1)(6)(*)(X)(NÚMERO DE TELEFONE ATÉ 20 DIG)(#) ; SENDO X = MEMÓRIA 1 A 6 (AO FINAL, 2 BIP CURTOS) ; APAGAR NÚMERO DE UMA DAS 6 MEMÓRIAS: ; DIGITE: (*)(1)(6)(*)(X)(#) ; SENDO X = MEMÓRIA 1 A 6 (AO FINAL, 2 BIP CURTOS) ; APAGAR NÚMERO DE TODAS AS 6 MEMÓRIAS DE UMA ÚNICA VEZ: ; DIGITE: (*)(1)(6)(*)(7)(*) (AO FINAL, UM BIP LONGO) ; TESTAR DISCAGEM DE NÚMERO DA MEMÓRIA: ; DIGITE: (*)(1)(6)(*)(8)(0) ; DISCARÁ TODOS OS NÚMEROS DAS MEMÓRIAS EM SEQUENCIA ; DIGITE: (*)(1)(6)(*)(8)(X) ; DISCARÁ SOMENTE A MEMÓRIA X ,SENDO X= 1 A 6 ; DEFINIR MODO DE DISCAGEM INTERROMPIDO(PARA DE DISCAR SE ENTRADA DE COMANDO FOR '0'(DISCA APENAS O 1º NÚMERO): ; DIGITE: (*)(1)(6)(*)(9) (AO FINAL, 2 BIP CURTOS) ; DEFINIR MODO DE DISCAGEM CONTINUO (DISCA EM SEQUENCIA TODOS OS NÚMEROS, MESMO SE ENTRADA DE COMANDO FOR '0': ; DIGITE: (*)(1)(6)(*)(0) (AO FINAL, 2 BIP CURTOS) ; RESETAR PROGRAMA, FINALIZANDO ANTECIPADAMENTE UMA DISCAGEM EM CURSO: ; DIGITE: (*)(1)(7)(6)(*) ;************************************************************************************************************* ERRORLEVEL -302 #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _HS_OSC & _LVP_OFF ; 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 C0,C1,C2,C3,TEMP,AUX,val,cont,VH,VL,W_SALVO,FREQH,FREQL,NUM,R1,R2,R3,S_TECLA,TIMER1 TIMER2, TIMER3, LIMITE, S_VAL,S_ADDRESS,AUX1,S_AD,FLAGS, ADDRESS,RDESL,DBC ENDC #DEFINE S0 PORTA,2 ;SAIDA DECÁDICA - RESISTOR DE 4K7 AO TRANSITOR DRIVE DO RELE PINO 1 #DEFINE S1 PORTA,3 ;DTMF- SAIDA FREQ ALTA - RESISTOR 470 OHMS PINO 2 #DEFINE S2 PORTA,4 ;DTMF- SAIDA FREQ BAIXA - RESISTOR 680 OHMS PINO 3 #DEFINE DISCAR PORTA,0 ;COMANDO PARA DISCAR (1) - PINO 17 #DEFINE MODO PORTA,1 ;ESCOLHE DTMF (0) OU DECÁDICO (1)- RESISTOR 220 OHMS PINO 18 #DEFINE BIP PORTA,1 ;SAIDA BIP INDICADOR DE TECLA APERTADA/ACEITAÇÃO DE COMAMDO PINO 18 ;TECLADO #DEFINE T2 EQU PORTB,0 #DEFINE T3 EQU PORTB,1 #DEFINE T5 EQU PORTB,2 #DEFINE T7 EQU PORTB,3 #DEFINE T1 EQU PORTB,4 #DEFINE T4 EQU PORTB,5 #DEFINE T6 EQU PORTB,6 ; DEFINIÇÕES DE FLAGS #DEFINE FLAG_J FLAGS,0 ;FLAG TESTE DE DISCAGEM ;VARIAVÉIS DE TEMPO T_ESTAB_LINHA EQU .20 ;TEMPO PARA ESTABILIZAÇÃO DA LINHA T_COMP_LIGAC EQU .30 ;TEMPO PARA COMPLETAR LIGAÇÃO T_OFF_ENTRE_DISC EQU .10 ;TEMPO DESCONECTADO (DESLIGA A LINHA ENTRE DISCAGENS DE NUMEROS DIFERENTES) T_PRE_DISPARO EQU .228 ;TEMPO MORTO PRÉ DISPARO (EVITA DISCAGENS DESNECESSÁRIAS ) .228= 10 SEG. T_SOLTURA EQU .5 ; DEBOUNCE 5 MSEG T_MAX_ESPERA_TECLA EQU .20 ;TEMPO DE ESPERA (AGUARDA TECLA SER DIGITADA ANTES DE SAIR PARA O 'INICIO') 20= 13 SEG T_ALARME_NO_FONE EQU .130 ;TEMPO QUE SINAL DE ALARME SERÁ OUVIDO PELO RECEPTOR DO NUMERO DISCADO (.130=40SEG) ;__________________________________________________________________________________________________________ ;TABELA DE FREQUENCIAS DO SISTEMA DTMF ;ALTA FREQUENCIA (COLUNA) XTAL 10MHZ ;1209hz 79 128 ;1336hz 87 140 ;1477hz 96 151 ;1633hz 107 161 ;BAIXA FREQUENCIA (LINHA)) ;697hz 46 33 ;770hz 50 54 ;852hz 56 74 ;941hz 61 91 ;__________________________________________________________________________________________________________ ;TONS DE DISCAGEM (DTMF) ; ; 1209 1336 1477 1633 ; ; 697 1 2 3 A ; ; 770 4 5 6 B ; ; 852 7 8 9 C ; ; 941 * 0 # D ;___________________________________________________________________________________________________________ ORG 0X00 GOTO RESET ORG 0X04 GOTO INT_TIMERS ;TABELAS TABH DT .140 ;0 DT .128 ;1 DT .140 ;2 DT .151 ;3 DT .128 ;4 DT .140 ;5 DT .151 ;6 DT .128 ;7 DT .140 ;8 DT .151 ;9 DT .161 ;A DT .161 ;B DT .161 ;C DT .161 ;D DT .128 ;* DT .151 ;# TABL DT .91 ;0 DT .33 ;1 DT .33 ;2 DT .33 ;3 DT .54 ;4 DT .54 ;5 DT .54 ;6 DT .74 ;7 DT .74 ;8 DT .74 ;9 DT .33 ;A DT .54 ;B DT .74 ;C DT .91 ;D DT .91 ;* DT .91 ;# TABD ADDWF PCL,F DT .10 ;* DT .1 ;1 DT .7 ;7 DT .6 ;6 DT .10 ;* ;******************************************************** ; ROTINA DE INTERRUPÇÕES (GERA DTMF NAS SAIDAS S1 E S2) ;--------------------------------------------------------- INT_TIMERS BTFSC PIR1,TMR1IF GOTO V3 BCF INTCON,T0IF MOVWF W_SALVO SWAPF FREQH,W MOVWF TMR0 MOVFW W_SALVO BTFSS S1 GOTO V2 BCF S1 RETFIE V2 BSF S1 RETFIE ;-------------------------------- V3 BCF PIR1,TMR1IF MOVWF W_SALVO SWAPF FREQL,W MOVWF TMR1L MOVLW 0XFF MOVWF TMR1H MOVFW W_SALVO BTFSS S2 GOTO V4 BCF S2 RETFIE V4 BSF S2 RETFIE ;**************************************************************** ; RESET DO PROGRAMA ;================================================================ RESET BANK1 MOVLW B'11100011' ; PB2..PB4 SAIDAS / RESTANTE ENTRADAS MOVWF TRISA MOVLW B'11110000' ;PB0..3 SAIDA / PB4...PB7 ENTRADAS MOVWF TRISB MOVLW B'00000010' MOVWF OPTION_REG MOVLW B'00000001' MOVWF PIE1 BANK0 MOVLW B'00110001' MOVWF T1CON MOVLW B'1100000' MOVWF INTCON MOVLW .0 MOVWF PORTA MOVWF PORTB MOVLW .7 MOVWF CMCON MOVLW 0XFF MOVWF TMR1H CLRF RDESL MOVLW .10 CALL DELAY ;******************************************************************************* ; INICIO DO PROGRAMA ;=============================================================================== INICIO BTFSS DISCAR ;TESTA ENTRADA DE COMANDO PARA 'DISCAR' GOTO GER_TECLADO ;NÃO ACIONADA,VAI ENTÃO VERIFICAR TECLADO MOVLW T_PRE_DISPARO ;DELAY PRÉ DISPARO CALL DELAY BTFSS DISCAR GOTO INICIO ;FALSO DISPARO CALL DISCAR_MEM ;DISCA NÚMEROS NA MEMÓRIA GOTO INICIO ;VOLTA AO LOOP PRINCIPAL ;=============================================================================== ;ROTINAS DE TECLADO GER_TECLADO CALL LE_TECLADO BTFSS STATUS,C GOTO INICIO ; C=0 - NENHUMA TECLA APERTADA MOVFW S_TECLA XORLW .10 ;TECLA * (ASTERISTICOS APERTADA) BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO DECFSZ TIMER1,F GOTO LDNTCL DECFSZ TIMER2,F GOTO LDNTCL DECFSZ TIMER3,F GOTO LDNTCL CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO MOVFW S_TECLA XORLW .1 ;TECLA 1 (DIG'1') BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL4 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO4 DECFSZ TIMER1,F GOTO LDNTCL4 DECFSZ TIMER2,F GOTO LDNTCL4 DECFSZ TIMER3,F GOTO LDNTCL4 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO4 MOVFW S_TECLA XORLW .6 ;COMPARA COM 6 BTFSS STATUS,Z GOTO INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL5 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO5 DECFSZ TIMER1,F GOTO LDNTCL5 DECFSZ TIMER2,F GOTO LDNTCL5 DECFSZ TIMER3,F GOTO LDNTCL5 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO5 MOVFW S_TECLA XORLW .10 ;COMPARA COM * BTFSS STATUS,Z GOTO INICIO MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL6 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO6 DECFSZ TIMER1,F GOTO LDNTCL6 DECFSZ TIMER2,F GOTO LDNTCL6 DECFSZ TIMER3,F GOTO LDNTCL6 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO6 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .1 BTFSC STATUS,Z GOTO EH1 MOVFW S_TECLA XORLW .2 BTFSC STATUS,Z GOTO EH2 MOVFW S_TECLA XORLW .3 BTFSC STATUS,Z GOTO EH3 MOVFW S_TECLA XORLW .4 BTFSC STATUS,Z GOTO EH4 MOVFW S_TECLA XORLW .5 BTFSC STATUS,Z GOTO EH5 MOVFW S_TECLA XORLW .6 BTFSC STATUS,Z GOTO EH6 MOVFW S_TECLA XORLW .7 BTFSC STATUS,Z GOTO APAGAR_TODOS_NUM MOVFW S_TECLA XORLW .8 BTFSC STATUS,Z GOTO TESTE_DISC ;DISCAR NUMEROS PARA TESTE MOVFW S_TECLA XORLW .9 BTFSC STATUS,Z GOTO MODO_INTERROMPIDO MOVFW S_TECLA XORLW .0 BTFSC STATUS,Z GOTO MODO_CONTINUO GOTO INICIO ;ERRO ;======================================================== ;GRAVAR MEMÓRIAS NAS POSIÇÕES 1 A 5 EH1 MOVLW .0 MOVWF ADDRESS MOVLW .20 MOVWF LIMITE GOTO SCOM EH2 MOVLW .20 MOVWF ADDRESS MOVLW .40 MOVWF LIMITE GOTO SCOM EH3 MOVLW .40 MOVWF ADDRESS MOVLW .60 MOVWF LIMITE GOTO SCOM EH4 MOVLW .60 MOVWF ADDRESS MOVLW .80 MOVWF LIMITE GOTO SCOM EH5 MOVLW .80 MOVWF ADDRESS MOVLW .100 MOVWF LIMITE GOTO SCOM EH6 MOVLW .100 MOVWF ADDRESS MOVLW .120 MOVWF LIMITE SCOM CALL GRAVANDO_DIGITOS CALL APITA GOTO INICIO ;==================================================== ;*16*7* (APAGAR TODAS AS 6 MEMÓRIAS DE NÚMEROS DE UMA VEZ ) APAGAR_TODOS_NUM MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL2 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO2 DECFSZ TIMER1,F GOTO LDNTCL2 DECFSZ TIMER2,F GOTO LDNTCL2 DECFSZ TIMER3,F GOTO LDNTCL2 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO2 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .10 ;* (ASTERISTICOS) BTFSS STATUS,Z GOTO INICIO MOVLW 0X78 MOVWF ADDRESS DENOVO3 MOVLW 0XFF CALL WPROM DECFSZ ADDRESS,F GOTO DENOVO3 MOVLW 0XFF CALL WPROM MOVLW .20 MOVWF TIMER1 AP12 CALL APITA ;APITO LONGO PARA INDICAR APAGAMENTO TOTAL DECFSZ TIMER1,F GOTO AP12 GOTO INICIO ;=============================================================================== ; DISCAR CONTEUDO DA MEMÓRIA ; *16*80 = TODOS OS NÚMEROS SÃO DISCADOS ; *16*8X = DISCA SOMENTE A MEMÓRIA X, SENDO X= 1...6 TESTE_DISC MOVLW .1 CALL DELAY ;ATRASA (120 uSEG) PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL7 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO7 DECFSZ TIMER1,F GOTO LDNTCL7 DECFSZ TIMER2,F GOTO LDNTCL7 DECFSZ TIMER3,F GOTO LDNTCL7 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO7 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA XORLW .0 BTFSC STATUS,Z GOTO DISCA_TODAS MOVFW S_TECLA XORLW .1 BTFSC STATUS,Z GOTO DISCA_1 MOVFW S_TECLA XORLW .2 BTFSC STATUS,Z GOTO DISCA_2 MOVFW S_TECLA XORLW .3 BTFSC STATUS,Z GOTO DISCA_3 MOVFW S_TECLA XORLW .4 BTFSC STATUS,Z GOTO DISCA_4 MOVFW S_TECLA XORLW .5 BTFSC STATUS,Z GOTO DISCA_5 MOVFW S_TECLA XORLW .6 BTFSC STATUS,Z GOTO DISCA_6 GOTO INICIO DISCA_TODAS BSF FLAG_J CALL DISCAR_MEM ;DISCAR TODAS AS 6 MEMÓRIAS P/ TESTE BCF FLAG_J GOTO INICIO DISCA_1 ;DISCA A MEMÓRIA 1 APENAS CLRF ADDRESS MOVLW .20 MOVWF LIMITE GOTO V_DISC_UM DISCA_2 ;DISCA A MEMÓRIA 2 APENAS MOVLW .20 MOVWF ADDRESS MOVLW .40 MOVWF LIMITE GOTO V_DISC_UM DISCA_3 ;DISCA A MEMÓRIA 3 APENAS MOVLW .40 MOVWF ADDRESS MOVLW .60 MOVWF LIMITE GOTO V_DISC_UM DISCA_4 ;DISCA A MEMÓRIA 4 APENAS MOVLW .60 MOVWF ADDRESS MOVLW .80 MOVWF LIMITE GOTO V_DISC_UM DISCA_5 ;DISCA A MEMÓRIA 5 APENAS MOVLW .80 MOVWF ADDRESS MOVLW .100 MOVWF LIMITE GOTO V_DISC_UM DISCA_6 ;DISCA A MEMÓRIA 6 APENAS MOVLW .100 MOVWF ADDRESS MOVLW .120 MOVWF LIMITE V_DISC_UM BCF S0 ;DESCONECTA A LINHA TELEFONICA MOVLW T_OFF_ENTRE_DISC ;TEMPO LIGAÇÃO DESCONECTADA CALL DELAY BSF S0 ;CONECTA A LINHA TELEFONICA MOVLW T_ESTAB_LINHA ;TEMPO DE ESTABILIZAÇÃO DA LINHA 'PÓS GANCHO RETIRADO' CALL DELAY CALL DISCANDO BCF S0 GOTO INICIO MODO_INTERROMPIDO ;PROGRAMA MODO INTERROMPIDO MOVLW 0X7F MOVWF ADDRESS MOVLW .0 CALL WPROM MOVLW .2 CALL DELAY CALL APITA GOTO INICIO MODO_CONTINUO ;PROGRAMA MODO CONTINUO MOVLW 0X7F MOVWF ADDRESS MOVLW .1 CALL WPROM MOVLW .2 CALL DELAY CALL APITA GOTO INICIO ;======================================================= ;SUBROTINAS GERAIS ;======================================================= GRAVANDO_DIGITOS TECLANDO MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' LDNTCL1 ;FICA LENDO O TECLADO POR UM TEMPO CALL LE_TECLADO BTFSC STATUS,C GOTO FAPERTADO1 DECFSZ TIMER1,F GOTO LDNTCL1 DECFSZ TIMER2,F GOTO LDNTCL1 DECFSZ TIMER3,F GOTO LDNTCL1 CALL APITA RETLW .0 ;SAI POR TEMPO FAPERTADO1 MOVLW T_SOLTURA CALL DELAYS ;ATRASA PARA NÃO HAVER REPETIÇÃO DE TECLAS MOVFW S_TECLA ;EXAMINA TECLA APERTADA XORLW .11 ;SE FOR # (SUSTENIDO) BTFSC STATUS,Z GOTO APAGA_RESTO_DIG ;ENCERRA PROGRAMAÇÃO POR # MOVFW S_TECLA CALL WPROM INCF ADDRESS,F MOVFW LIMITE XORWF ADDRESS,W BTFSC STATUS,Z RETLW .1 ;CHEGOU NO LIMITE E SAI DE 20 NÚMEROS GOTO TECLANDO ;VAI RECEBER NOVA DIGITAÇÃO APAGA_RESTO_DIG ;APAGA TODAS AS CASAS APÓS # DA MEMÓRIA ESCOLHIDA MOVLW 0XFF CALL WPROM INCF ADDRESS,F MOVFW LIMITE XORWF ADDRESS,W BTFSC STATUS,Z RETLW .1 GOTO APAGA_RESTO_DIG ;================================================================================== LE_TECLADO CALL VARREDURA_TECLADO MOVWF S_TECLA ;SALVA DIGITO RECEBIDO XORLW 0XFF BTFSC STATUS,Z GOTO S_NOTECLA ;NÃO HOUVE ACIONAMENTO DO TECLADO MOVLW .2 ;DEBOUNCE CALL DELAYS CALL VARREDURA_TECLADO MOVWF S_TECLA ;SALVA DIGITO RECEBIDO XORLW 0XFF BTFSC STATUS,Z GOTO S_NOTECLA ;NÃO HOUVE ACIONAMENTO DO TECLADO VFFF CALL VARREDURA_TECLADO ;AGUARDA SOLTAR TECLA XORLW 0XFF BTFSS STATUS,Z GOTO VFFF MOVLW .2 CALL DELAYS CALL VARREDURA_TECLADO ;AGUARDA SOLTAR TECLA XORLW 0XFF BTFSS STATUS,Z GOTO VFFF CALL APITA BSF STATUS,C ;SINALIZA COM OK RETURN S_NOTECLA BCF STATUS,C ;SINALIZA 'NENHUMA TECLA APERTADA' RETURN ;================================================================================== VARREDURA_TECLADO MOVLW .0 MOVWF PORTB MOVFW PORTB XORLW 0XF0 BTFSC STATUS,Z RETLW 0XFF ;NENHUMA TECLA APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XEE ;TESTA SE DIG '1'FOI APERTADO BTFSC STATUS,Z RETLW .1 ;TECLA '1' APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XDE ;TESTA SE DIG '2'FOI APERTADO BTFSC STATUS,Z RETLW .2 ;TECLA '2' APERTADA MOVLW 0X0E ;CLEAR PB0 MOVWF PORTB MOVFW PORTB XORLW 0XBE ;TESTA SE DIG '3'FOI APERTADO BTFSC STATUS,Z RETLW .3 ;TECLA '3' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XED ;TESTA SE DIG '4'FOI APERTADO BTFSC STATUS,Z RETLW .4 ;TECLA '4' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XDD ;TESTA SE DIG '5'FOI APERTADO BTFSC STATUS,Z RETLW .5 ;TECLA '5' APERTADA MOVLW 0X0D ;CLEAR PB1 MOVWF PORTB MOVFW PORTB XORLW 0XBD ;TESTA SE DIG '6'FOI APERTADO BTFSC STATUS,Z RETLW .6 ;TECLA '6' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XEB ;TESTA SE DIG '7'FOI APERTADO BTFSC STATUS,Z RETLW .7 ;TECLA '7' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XDB ;TESTA SE DIG '8'FOI APERTADO BTFSC STATUS,Z RETLW .8 ;TECLA '8' APERTADA MOVLW 0X0B ;CLEAR PB2 MOVWF PORTB MOVFW PORTB XORLW 0XBB ;TESTA SE DIG '9'FOI APERTADO BTFSC STATUS,Z RETLW .9 ;TECLA '9' APERTADA MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XE7 ;TESTA SE DIG '10'FOI APERTADO BTFSC STATUS,Z RETLW .10 ;TECLA '10' APERTADA * MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XD7 ;TESTA SE DIG '0'FOI APERTADO BTFSC STATUS,Z RETLW .0 ;TECLA '0' APERTADA MOVLW 0X07 ;CLEAR PB3 MOVWF PORTB MOVFW PORTB XORLW 0XB7 ;TESTA SE DIG '11'FOI APERTADO BTFSC STATUS,Z RETLW .11 ;TECLA '11' APERTADA # RETLW 0XFF ;ERRO ;===================================================================== ;DISCA OS NÚMEROS GRAVADOS NA MEMÓRIA DISCAR_MEM BSF S0 ;LIGA RELE DA LINHA PINO 1 DO PIC MOVLW T_ESTAB_LINHA CALL DELAY ;TEMPO DE ESTABILIZAÇÃO E OBTENÇÃO DE SINAL DE LINHA MOVLW .0 MOVWF ADDRESS MOVWF S_ADDRESS MOVLW .20 MOVWF LIMITE VAI_DISC_OUTR_MEM CALL RPROM XORLW 0XFF BTFSS STATUS,Z CALL DISCANDO MOVLW .20 ADDWF LIMITE,F MOVFW S_ADDRESS ADDLW .20 MOVWF ADDRESS MOVWF S_ADDRESS XORLW .140 BTFSS STATUS,Z GOTO PROS343 BCF S0 ;DESCONECTA A LINHA TELEFONICA RETURN PROS343 BCF S0 ;DESCONECTA A LINHA TELEFONICA MOVLW T_OFF_ENTRE_DISC ;TEMPO PARA COMPLETAR A LIGAÇÃO CALL DELAY BSF S0 ;CONECTA A LINHA TELEFONICA MOVLW T_ESTAB_LINHA ;TEMPO DE ESTABILIZAÇÃO DA LINHA 'PÓS GANCHO RETIRADO' CALL DELAY BTFSC FLAG_J GOTO VAI_DISC_OUTR_MEM MOVFW ADDRESS MOVWF S_AD MOVLW 0X7F MOVWF ADDRESS CALL RPROM XORLW .1 ;SE =1 DISCARÁ TODOS OS NÚMEROS, INDEPENDENTE SE DISCAR=0 OU 1 BTFSC STATUS,Z GOTO AUX_J BTFSC DISCAR ;TESTA SE AINDA A COMANDO PARA DISCAR GOTO AUX_J ;SIM ,DISCA PRÓXIMO NÚMERO BCF S0 ;NÃO, DESCONECTA A LINHA TELEFONICA RETURN AUX_J MOVFW S_AD ;RETORNA VALOR SALVO MOVWF ADDRESS GOTO VAI_DISC_OUTR_MEM DISCANDO DISCAR_DE_NOV CALL RPROM MOVWF S_VAL XORLW 0XFF BTFSC STATUS,Z GOTO SOM ;FINALIZA COM NUMERO MENOR QUE 20 DIGITOS BTFSS MODO GOTO M_DTMF ;VAI DISCAR DTMF MOVFW S_VAL ;VAI DISCAR EM MODO PULSO XORLW .0 ;SE '0' BTFSS STATUS,Z GOTO P7RT MOVLW .10 ;CARREGA '10' MOVWF S_VAL P7RT CALL TESTA_DESLIGAR BCF S0 CALL PULSO_66MS ;MAKE PERIOD 66,6 MSEG ;LINHA TELEFONICA FICA COM 48V BSF S0 CALL PULSO_33MS ;BREAK PERIOD 33,3 MSEG ;LINHA FICA COM = +-8 VOLTS (CONECTADA) DECFSZ S_VAL,F GOTO P7RT MOVLW .8 MOVWF AUX JFI4 CALL TESTA_DESLIGAR CALL PULSO_66MS ;PAUSA ENTRE NÚMEROS DISCADOS (8 x (MAKE PERIOD + BREAK PERIODO)) CALL PULSO_33MS DECFSZ AUX,F GOTO JFI4 RTCOMUM CALL TESTA_DESLIGAR INCF ADDRESS MOVFW ADDRESS XORWF LIMITE,W BTFSC STATUS,Z GOTO SOM ;SAI POR CHEGAR A LIMITE MÁXIMO DE NUMEROS GOTO DISCAR_DE_NOV RET_VAZ BCF S0 ;DESCONECTA A LINHA TELEFONICA CALL L5_BIP ;GERA 5 BIPS GOTO INICIO ;FINALIZA PORQUE MEMÓRIA NÃO FOI GRAVADA SOM ; SOM A SER OUVIDO PELO ATENDENTE (SIRENE) ; TEMPO DE SOM = 33 SEGUNDOS MOVFW LIMITE ADDLW .236 ;SUBTRAI .20 XORWF ADDRESS,W BTFSC STATUS,Z GOTO RET_VAZ ;RETORNA, PORQUE PRIMEIRA POSIÇÃO DESTA MEMÓRIA ESTA VAZIA MOVLW T_COMP_LIGAC ; TEMPO PARA COMPLETAR LIGAÇÃO CALL DELAY MOVLW T_ALARME_NO_FONE ;TEMPO DO SINAL DE ALARME NO 'FONE' MOVWF TIMER3 GERAR_SOM MOVLW .130 MOVWF AUX1 SOM1 CALL TESTA_DESLIGAR BSF S1 BSF S2 MOVLW .230 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR BCF S1 BCF S2 MOVLW .230 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 DECFSZ AUX1,F GOTO SOM1 CALL TESTA_DESLIGAR MOVLW .180 MOVWF AUX1 SOM2 CALL TESTA_DESLIGAR BSF S1 BSF S2 MOVLW .140 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR BCF S1 BCF S2 MOVLW .140 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 CALL TESTA_DESLIGAR DECFSZ AUX1,F GOTO SOM2 DECFSZ TIMER3,F GOTO GERAR_SOM RETURN M_DTMF MOVFW S_VAL CALL SEND_DTMF CALL TESTA_DESLIGAR CALL PULSO_33MS ;TEMPO ENTRE NUMEROS DISCADOS CALL TESTA_DESLIGAR CALL PULSO_66MS ;TEMPO ENTRE NUMEROS DISCADOS CALL TESTA_DESLIGAR GOTO RTCOMUM RETURN ;======================================================= ; ROTINAS DE TEMPO ;======================================================= WAIT MOVLW .8 CALL DELAY RETURN DELAY MOVWF C2 CG1 MOVLW 0XFF MOVWF C1 CG2 MOVLW 0X9D MOVWF C0 DECFSZ C0,f GOTO $-1 NOP DECFSZ C1,F GOTO CG2 NOP DECFSZ C2,F GOTO CG1 NOP RETURN DELAYS MOVWF C2 MOVLW .250 MOVWF C1 NOP NOP NOP NOP NOP NOP NOP DECFSZ C1,F GOTO $-.8 DECFSZ C2,F GOTO $-.12 RETURN ;======================================================================= ; PULSOS PADRÕES NO MODO DECÂDICO PULSO_33MS MOVLW .66 GOTO PCG1 PULSO_66MS MOVLW .132 PCG1 MOVWF C1 CALL T500US DECFSZ C1,F GOTO $-2 MOVLW .196 MOVWF C0 DECFSZ C0,F GOTO $-1 RETURN T500US MOVLW .250 MOVWF C0 FAP NOP NOP DECFSZ C0,F GOTO FAP RETURN ;=================================================== ; ENVIA NÚMERO A DISCAR PARA SAIDA DTMF S1,S2 ; EM FORMATO DE DUPLO TOM CORRESPONDENTE ;=================================================== SEND_DTMF ANDLW 0X0F MOVWF AUX MOVLW TABH ADDWF AUX,W CALL GET MOVWF FREQH SWAPF FREQH,F MOVLW TABL ADDWF AUX,W CALL GET MOVWF FREQL SWAPF FREQL,F BSF INTCON,GIE ;LIGA INTERRUPÇÃO MOVLW .3 call DELAY ;ENVIA POR 145 MSEG BCF S1 BCF S2 BCF INTCON,GIE ;DESLIGA INTERRUPÇÃO CALL TESTA_DESLIGAR MOVLW .2 ;TEMPO MORTO ENTRE ENVIOS 97 MSEG CALL DELAY RETURN GET MOVWF TEMP MOVLW .0 MOVWF PCLATH MOVFW TEMP MOVWF PCL ;==================================================== 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 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 ;================================================================= ;GERA SINAL SONORO (BIP) APITA BANK1 BCF TRISA,1 ;VIRA SAIDA BANK0 MOVLW .250 MOVWF AUX1 VFGF BSF BIP MOVLW .100 MOVWF AUX DECFSZ AUX,F GOTO $-1 BCF BIP MOVLW .100 MOVWF AUX DECFSZ AUX,F GOTO $-1 DECFSZ AUX1,F GOTO VFGF BANK1 BSF TRISA,1 ;VIRA ENTRADA BANK0 RETURN ;======================================================================= ; GERA BIPS L5_BIP MOVLW .5 ;GERA 5 BIP W_BIP MOVWF TIMER1 ;GERA PELO NUMERO EM 'W' FKW1 CALL APITA ;4 BIPS PARA INDICAR MEMÓRIA VAZIA MOVLW .5 CALL DELAY DECFSZ TIMER1,F GOTO FKW1 RETURN TESTA_DESLIGAR ; *176* PARA DESLIGAR CALL VARREDURA_TECLADO MOVWF W_SALVO MOVLW .0 MOVWF PCLATH MOVFW RDESL CALL TABD XORWF W_SALVO,W ;TECLA * (ASTERISTICOS APERTADA) BTFSS STATUS,Z GOTO RETURN1 ; VOLTA AS ROTINAS INCF RDESL,F ;INCREMENTA REGISTRADOR DE DESLIGAMENTO MOVFW RDESL XORLW .5 BTFSS STATUS,Z GOTO RETURN1 CLRF RDESL GOTO RESET ;RESETA E PARA DISCAGEM RETURN1 MOVFW W_SALVO ;TRAPS PARA OS OUTROS NÚMEROS XORLW .0 BTFSS STATUS,Z GOTO SUTY1 CLRF RDESL SUTY1 MOVFW W_SALVO XORLW .2 BTFSS STATUS,Z GOTO SUTY2 CLRF RDESL SUTY2 MOVFW W_SALVO XORLW .3 BTFSS STATUS,Z GOTO SUTY3 CLRF RDESL SUTY3 MOVFW W_SALVO XORLW .4 BTFSS STATUS,Z GOTO SUTY4 CLRF RDESL RETURN SUTY4 MOVFW W_SALVO XORLW .5 BTFSS STATUS,Z GOTO SUTY5 CLRF RDESL SUTY5 MOVFW W_SALVO XORLW .8 BTFSS STATUS,Z GOTO SUTY6 CLRF RDESL SUTY6 MOVFW W_SALVO XORLW .9 BTFSS STATUS,Z RETURN CLRF RDESL RETURN END