;****************************************************************************************************** ; PROJETO SENHA ELETRONICA COM TECLADO SEM FIO (SEM LCD E PADRÃO HT6P20B) ; MICROCONTROLADOR: PIC12F629 ; INICIO : 02/07/2012 TERM.: 15/09/2012 ; AUTOR: CLÁUDIO LÁRIOS ; BLOG 'LARIOS.TECNOLOGIA.WS' ; PROCESSADOR: PIC 12F629 ; OBJETIVO: PODERÁ SER USADO PARA LIBERAR O ACIONAMENTO DE UM PORTÃO AUTOMÁTICO DIGITANDO UMA SENHA ; (VANTAGEM DE NÃO PRECISAR LEVAR 'CHAVES/CHAVEIRINHO DE CONTROLE REMOTO' QUE SEMPRE TENDEM A SE EXTRAVIAR). ; COMO OPÇÃO DE USO, PODERÁ TRANSMITIR SINAL SIMILAR A UM CONTROLE REMOTO (CHAVEIRINHO) PARA UMA ; CENTRAL DE ALARMES, VISANDO LIGAR/DESLIGAR O ALARME. ; IGUALMENTE A UM CONTROLE REMOTO, TERÁ QUE SER 'APRENDIDO' PELA PLACA DO PORTÃO OU DO ALARME, APERTANDO ; O BOTÃO 'LEARN' E DEPOIS DIGITANDO A SENHA CORRETA PARA TRANSMITIR O SINAL A SER APRENDIDO. ; OBRIGATÓRIAMENTE, AS PLACAS DE CONTROLE DE PORTÃO OU ALARME TEM QUE SER COMPATIVÉIS COM O PADRÃO DO ; CI HT6P20B PARA FUNCIONAR. ; PODERÁ SER ALIMENTADO COM 4 PILHA AA E UM DIODO 1N4148 EM SÉRIE OU MESMO UMA FONTE EXTERNA/TRAFO. ;****************************************************************************************************** ; COM RESPEITO AO USO DESTE EQUIPAMENTO, DEVE-SE ENTRAR COM UMA SENHA DE 6 DÍGITOS PARA A LIBERAÇÃO, ; (POR EX. DE PORTÃO). A SENHA INICIAL É '012345', DEVENDO SER TROCADA POR UMA PESSOAL. EVITE AS ; JÁ CONHECIDAS DATAS DE NASCIMENTO, CASAMENTO,ETC. PARA TROCAR A SENHA DIGITE '*74123' QUE ENTRARÁ EM ; MODO DE 'TROCA DE SENHA'. 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! ;--------------------------------------------------------------------------------------------------- ;DEFINIÇÕES DO USUÁRIO: ;--------------------------------------------------------------------------------------------------- ;ESCOLHA AQUI O MODELO DO MICROCONTROLADOR A SER USADO: #DEFINE PIC629 ;#DEFINE PIC675 ;---------------------------------------------------------------------------------------------------- ;ESCOLHA AQUI O NÚMERO DO 'SERIAL NUMBER' A SER TRANSMITIDO: SER0 EQU 0XA3 SER1 EQU 0XB5 SER2 EQU 0X37 ;OBS. (OS BITS 6 E 7 DE SER2 CORRESPONDEM AOS BOTÕES ) ;---------------------------------------------------------------------------------------------------- ;ESCOLHA AQUI O PERIDO DO PULSO BASE (LAMBDA) T_PULSO EQU .158 ;158D PARA 330 MICROSEG. ;---------------------------------------------------------------------------------------------------- ; ESCOLHA AQUI QUAIS BOTÕES SERÃO TRANSMITIDOS (BOTÃO ESQ/DIREITO/AMBOS) ; DESCOMENTE A SUA OPÇÃO E COMENTE AS OUTRAS: #DEFINE LIGA_2BOTÕES ;#DEFINE LIGA_BOTÃO_ESQUERDO ;#DEFINE LIGA_BOTÃO_DIREITO ;===================================================================================================== ; NÚMERO DE VEZES QUE A TRANSMISSÃO SERÁ REPETIDA AO ACERTAR A SENHA: N_ENVIOS EQU .10 ;10 VEZES ;===================================================================================================== ; 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 0X0A ;TEMPO SEM TECLAR MAXIMO (0X0A= 30SEG). ;===================================================================================================== IFDEF PIC629 #INCLUDE ; ARQUIVO PADRAO ENDIF IFDEF PIC675 #INCLUDE ; ARQUIVO PADRAO ENDIF __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT 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,tmp,RER,GER CONTAP,CONT,CONT1,CONT2,CONT3,LC,LC1,FLAGS RTEC,RTEC1, V1,V2,V3,R5,R6,R7 ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== ; TECLADO #DEFINE P2 GPIO,5 ; teclado t7 PINO 2 #DEFINE P6 GPIO,1 ; teclado t3 PINO 6 #DEFINE P5 GPIO,2 ; teclado t2 PINO 5 #DEFINE P7 GPIO,0 ; teclado t5 PINO 7 #DEFINE SAIDA GPIO,4 ; SAIDA TX PINO 3 ;variavéis S5X EQU B'101011' ;GP2=SAIDA 1 NO PINO 5 S6X EQU B'101101' ;GP1=SAIDA 1 NO PINO 6 S7X EQU B'101110' ;GP0=SAIDA 1 NO PINO 7 S2X EQU B'001111' ;GP5=SAIDA 1 NO PINO 2 S_OUT EQU B'001000' ;TUDO SAIDA (EXCETO RST) SREBIP EQU B'001011' ;SAIDA PARA BIP E RELE ORG 0X2100 DE '0','1','2','3','4','5' ; SENHA INICIAL PRÉ-FIXADA (012345) DE '*','7','4','1','2','3' ; COMANDO DE TROCA DE SENHA (*74123) ;................................................................................................. ; VETOR DE RESET ORG 0X00 GOTO INICIO ;................................................................................................ ; ORG 0X04 RETFIE ;------------------------------------------------------------------------------------------------ ;=========================================================================== ; INICIO DO PROGRAMA INICIO MOVLW .7 ;DESLIGA COMPARADORES MOVWF CMCON BANK1 MOVLW 0X00 MOVWF OPTION_REG ;DESLIGA PULL-UPS MOVWF WPU IFDEF PIC675 MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD ENDIF BANK0 MOVLW NUMERO_DE_ERROS ;CARREGA CONTADOR DE MAX. DE SENHAS ERRADAS MOVWF RER ST1 CLRF GPIO CLRF RTEC1 ;ZERA REGISTRADORES CLRF CONTAP CLRF ADDRESS CLRF GER MOVLW S_OUT ;INICIA COM TUDO SAIDA CALL TRISIOX ;ACERTA SENTIDO DAS PORTAS 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 INICIO ;TEMPO MAXIMO ATINGIDO SEM DIGITAR ,VAI PARA O INICIO PROSS MOVLW .20 CALL DELAY ;DELAY CALL LE_TECLADO ;TESTA TECLADO 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 '#' ;COMPARA COM '#' BTFSC STATUS,Z GOTO ST1 ;CANCELA DIGITAÇÃO MOVFW RTEC1 XORLW '*' 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 CLRF RTEC1 ;APAGA REGISTRADOR DE TECLADO GOTO MAIN CANCELA_OPERAÇÃO GOTO ST1 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 CLRF GPIO ; GERENCIAMENTO DE PROCESSO 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 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 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 COMPARA_SENHA_EEP_NA_TROCA MOVLW .2 ;ACERTA PARA PASSO 2 MOVWF GER COMPARAR_SENHA_EEPROM ; COMPARAR 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 INCF FSR,F INCF ADDRESS,F INCF CONTAP,F MOVFW CONTAP XORLW .6 BTFSS STATUS,Z GOTO RTH1 MOVFW GER ;COMPARAÇÃO OK ,VERIFICA PASSO XORLW 0X02 BTFSS STATUS,Z GOTO SEG92 ;MODO NORMAL - LIBERAR SAIDA DO RELE ;ACRESCENTAR BIPS PARA DAR OK MOVLW .10 CALL W_BIP_LONGO GOTO RETG1 ;MODO TROCA DE SENHA-COMPARAÇÃO DE SENHA ANTIGA OK ,SEGUE ; 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 CLRF GPIO MOVFW GER XORLW .1 BTFSC STATUS,Z GOTO VAI_ENTRAR_NOVA_SENHA ; SENHA CORRETA - LIBERAÇÃO OK - GERA WORD PARA TX CALL TX_ON CLRF GER RETG RETG1 CLRF ADDRESS CLRF CONTAP CLRF RTEC1 GOTO MAIN 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 ; CONFERE SE NÃO É COMANDO P/ TROCAR 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' 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 LE_TECLADO CALL TESTTK MOVFW RTEC XORLW 0XFF ;SE FOR 0XFF NENHUMA TECLA FOI PRESSIONADA BTFSC STATUS,Z 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 CLRF GPIO MOVLW S5X CALL TRISIOX BSF P5 ;SETA PINO 5 MOVLW 0XFF MOVWF RTEC GOTO $+1 GOTO $+1 GOTO $+1 BTFSC P6 MOVLW '4' ;4 BTFSC P7 MOVLW '7' ;7 BTFSC P2 MOVLW '*' ;ASTERISTICO '*' MOVWF RTEC CLRF GPIO MOVLW S6X CALL TRISIOX BSF P6 ;SETA PINO 6 MOVFW RTEC GOTO $+1 GOTO $+1 GOTO $+1 BTFSC P5 MOVLW '2' ;2 BTFSC P7 MOVLW '8' ;8 BTFSC P2 MOVLW '0' ;0 MOVWF RTEC CLRF GPIO MOVLW S7X CALL TRISIOX BSF P7 ;SETA PINO 7 MOVFW RTEC GOTO $+1 GOTO $+1 GOTO $+1 BTFSC P5 MOVLW '3' ;3 BTFSC P6 MOVLW '6' ;6 BTFSC P2 MOVLW '#' ;# MOVWF RTEC CLRF GPIO XORLW 0XFF BTFSS STATUS,Z ;SE 0XFF TESTA TECLAS 1,5,9 RETURN MOVLW S2X CALL TRISIOX BSF P2 ;SETA PINO 7 GOTO $+1 GOTO $+1 GOTO $+1 MOVFW RTEC BTFSC P5 MOVLW '1' ;1 BTFSC P6 MOVLW '5' ;5 BTFSC P7 MOVLW '9' ;9 CLRF GPIO MOVWF RTEC RETURN 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 ;================================================================================= ;Rotina de retardo, onde w=tempo em ms - clock=20MHz ;================================================================================= 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 ; muda direção dos pinos conforme recebido em 'w' TRISIOX BANK1 ;TROCA DE BANCO MOVWF TRISIO ;ENTRADA OU SAIDA BANK0 RETURN ;======================================================= ; GERA QUANTIDADE DE BIPS DADA POR 'W' W_BIP MOVWF TEMP3 VBIP1 CALL BIP MOVLW .1 CALL DELAYM DECFSZ TEMP3,F GOTO VBIP1 RETURN ;====================================================== ; 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 MOVLW S5X ;AJUSTA P5 COMO SAIDA CALL TRISIOX MOVLW .200 MOVWF TEMP2 CLRF GPIO CONT6 BSF P5 MOVLW 0X30 CALL WAIT_uS BCF P5 MOVLW 0X30 CALL WAIT_uS DECFSZ TEMP2,F GOTO CONT6 RETURN ;========================================================= ; ROTINA GERADORA DE CÓDIGO HT6P20B TX_ON MOVLW S_OUT ;ACERTA SAIDA P/ TX CALL TRISIOX ;ACERTA SENTIDO DAS PORTAS MOVLW N_ENVIOS ;NÚMERO DE TRANSMISSÕES SUCESSIVAS MOVWF TEMP3 ET67 MOVLW SER2 ;CARGA DA WORD A SER TRANSMITIDA MOVWF V3 MOVLW SER1 MOVWF V2 MOVLW SER0 MOVWF V1 IFDEF LIGA_2BOTÕES BSF V3,7 BSF V3,6 ENDIF IFDEF LIGA_BOTÃO_ESQUERDO BCF V3,7 BSF V3,6 ENDIF IFDEF LIGA_BOTÃO_DIREITO BSF V3,7 BCF V3,6 ENDIF CALL ENVIAR DECFSZ TEMP3,F GOTO ET67 RETURN ENVIAR: CALL STARTBIT MOVLW .24 ;QUANTIDADE DE BITS A TRANSMITIR MOVWF R5 VOLT10: BCF STATUS,C RRF V3,F RRF V2,F RRF V1,F BTFSC STATUS,C GOTO EB1 CALL BIT0 VV13: DECFSZ R5,F GOTO VOLT10 ;------------------------------------------------- ANTICODE: CALL BIT0 ;GERA O 'ANTICODE' CALL BIT1 CALL BIT0 CALL BIT1 ;----------------------------------------------------- PAUSA: MOVLW .23 ;23 CLOCKS DE PAUSA FINAL MOVWF R6 RTY: CALL DELAY1CK DECFSZ R6,F GOTO RTY RETURN ;------------------------------------------------- EB1: CALL BIT1 GOTO VV13 ;================================================= ;ROTINAS DELAY1CK: MOVLW T_PULSO ;GERA ATRASO DE TEMPO MOVWF R7 DECFSZ R7,F GOTO $-1 MOVLW .55 ;.110 GERA ATRASO DE TEMPO ADICIONAL (SOMENTE XTAL 10MHZ) MOVWF R7 DECFSZ R7,F GOTO $-1 RETURN BIT0: BCF SAIDA ;GERA BIT '0' NA SAÍDA CALL DELAY1CK BSF SAIDA CALL DELAY1CK CALL DELAY1CK BCF SAIDA RETURN BIT1: BCF SAIDA ;GERA BIT '1' NA SAÍDA CALL DELAY1CK CALL DELAY1CK BSF SAIDA CALL DELAY1CK BCF SAIDA RETURN STARTBIT: BSF SAIDA ;GERA STARTBIT '1' NA SAÍDA CALL DELAY1CK BCF SAIDA RETURN RETURN ;======================================================== END