;****************************************************************************************************** ; SENHA_2_BOTÕES ; OBJETIVO: ACIONAR FECHADURA ELÉTRICA APÓS DIGITAR SENHA DE 8 DIGITOS EM 2 BOTÕES ('1' E '0') ; SENHA INICIAL= 11101000 ; PERMITE TROCAR A SENHA POR OUTRA. PARA ISTO: ; 1)DIGITE A SENHA DE TROCA (10001000),GERANDO UM APITO ; 2)DIGITE A SENHA ATUAL (11101000),GERANDO 2 APITOS. ; 3)DIGITE A NOVA SENHA (XXXXXXXX),GERANDO 3 APITOS. ; 4)CONFIRME DIGITANDO A NOVA SENHA (XXXXXXXX),GERANDO APITO LONGO. ; APÓS 3 ERROS, TRAVA A DIGITAÇÃO POR 3 MINUTOS, EMITINDO UM APITO CADENCIADO. ; APERTE TECLA '0' POR MAIS DE 3 SEGUNDOS PARA APAGAR ERROS DE DIGITAÇÃO. ; APÓS INICIAR DIGITAÇÃO E PARAR, APÓS 25 SEGUNDOS IRÁ PARA O MODO INICIAL. ; MICROCONTROLADOR: PIC12F629/629 ; INICIO : 23/06/2013 TERM.: 24/06/2013 ; AUTOR: CLÁUDIO LÁRIOS ; BLOG 'LARIOS.TECNOLOGIA.WS' ; USO DIDÁTICO APENAS. ;===================================================================================================== ;ESCOLHA AQUI O MODELO DO MICROCONTROLADOR (COMENTE O NÃO USADO) ;#DEFINE PIC12F629 #DEFINE PIC675 ;===================================================================================================== ;===================================================================================================== ; EQUATES NUMERO_DE_ERROS EQU 0X03 ;QUANTIDADE DE VEZES QUE SE PODE DIGITAR SENHA ERRADA SENHA_INIT EQU B'11101000' ;SENHA INICIAL PRÉ-FIXADA SENHA_TROCA EQU B'10001000' ;SENHA COMANDO PARA TROCA DE SENHA T_APERTADO EQU 0X30 ;TEMPO SEM TECLAR MAXIMO (0X0A= 30SEG). TEMPO_S_TEC EQU 0XFF ;TEMPO SEM TECLAR NADA T_P EQU .2 ;TEMPO DO PULSO ON TEMPO_PULSANDO EQU .60 ;TEMPO PULSANDO A SAIDA T_TRAVADO EQU .180 ;TEMPO TRAVADO APOS 3 ERROS (180= 3 MINUTOS) ;===================================================================================================== IFDEF PIC629 #INCLUDE ; ARQUIVO PADRAO LIST P=12f629 , R=DEC ENDIF IFDEF PIC675 #INCLUDE ; ARQUIVO PADRAO LIST P=12f675 , R=DEC 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 #DEFINE SOM GPIO,2 ;PINO 5 - SOM #DEFINE RELE GPIO,4 ;PINO 3 - RELE DA FECHADURA -DIRETO #DEFINE RELE_P GPIO,5 ;PINO 2 - RELE DA FECHADURA -PULSANTE #DEFINE FLAG_DIGITOU FLAGS,0 ;FLAG DE CONTROLE DEBOUNCE EQU 0XFF ;RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA TEMP,TEMP1,TEMP2,FLAGS,AUX,AUX1,AUX2,CNT,CNT1,CNT2,RER,TMP,R0,R1,R2,XLC STATUSTEMP,WTWMP,BITSENHA,TIMER1,Z1,Z0 ENDC ;============================================================================================ ; RESET ;============================================================================================ ORG 0X00 GOTO INICIO ;============================================================================================ ; INTERRUPÇÕES ;============================================================================================ ORG 0X04 RETFIE ;============================================================================================ ; INICIO DO PROGRAMA ;============================================================================================ INICIO MOVLW .7 ;DESLIGA COMPARADORES MOVWF CMCON BANK1 MOVLW 0X00 MOVWF OPTION_REG ;LIGA PULL-UPS MOVLW 0XFF MOVWF WPU IFDEF PIC675 MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD ENDIF MOVLW B'001011' MOVWF TRISIO MOVLW B'000011' BANK0 MOVLW NUMERO_DE_ERROS ;CARREGA CONTADOR DE MAX. DE SENHAS ERRADAS MOVWF RER CLRF FLAGS CLRF GPIO ;============================================================================================ ; ROTINA PRINCIPAL ;============================================================================================ MAIN MOVLW TEMPO_S_TEC ;CARGA DE TEMPO (SAI SE NÃO HOUVER DIGITAÇÃO) MOVWF Z1 CLRF Z0 MOVLW .8 MOVWF CNT1 LOOP4 CALL TECLANDO MOVWF TEMP XORLW .4 ;TODOS OS BIT OBTIDOS BTFSC STATUS,Z GOTO COMPARA MOVFW TEMP XORLW .2 ;TODOS OS BIT OBTIDOS BTFSS STATUS,Z GOTO MAIN BTFSS GPIO,1 GOTO $-1 MOVLW .5 CALL DELAYM GOTO MAIN COMPARA MOVLW SENHA_TROCA ;TESTA SE É SENHA COMANDO XORWF BITSENHA,W BTFSC STATUS,Z GOTO TROCANDO_SENHA MOVLW .0 ;TESTA SE ACERTOU A SENHA GRAVADA CALL EEREAD XORWF BITSENHA,W BTFSS STATUS,Z GOTO ERRO ;================================================================== ; SENHA CORRETA ;================================================================== CALL APITO_C BSF RELE ;LIGA SAÍDA DIRETA MOVLW TEMPO_PULSANDO MOVWF TEMP1 LOOP5 BSF RELE_P ;ACIONA A SAÍDA PULSADA MOVLW T_P MOVWF TEMP CALL AGUARDE DECFSZ TEMP,F GOTO $-2 BCF RELE_P MOVLW T_P MOVWF TEMP CALL AGUARDE DECFSZ TEMP,F GOTO $-2 DECFSZ TEMP1,F GOTO LOOP5 BCF RELE MOVLW NUMERO_DE_ERROS ;CARREGA CONTADOR DE MAX. DE SENHAS ERRADAS MOVWF RER BCF FLAG_DIGITOU ;APAGA FLAG GOTO MAIN ;============================================================================ ; SENHA INCORRETA ;============================================================================ ERRO BCF FLAG_DIGITOU MOVLW .5 MOVWF CNT LOOP2 CALL BIP CALL BIP CALL BIP CALL BIP CALL BIP MOVLW .2 CALL DELAYM DECFSZ CNT,F GOTO LOOP2 DECFSZ RER,F GOTO MAIN MOVLW NUMERO_DE_ERROS ;CARREGA CONTADOR DE MAX. DE SENHAS ERRADAS MOVWF RER MOVLW T_TRAVADO MOVWF CNT LOOP3 CALL BIP MOVLW .1 CALL DELAYM CALL BIP MOVLW .1 CALL DELAYM CALL BIP MOVLW .15 CALL DELAYM DECFSZ CNT,F GOTO LOOP3 GOTO MAIN ;============================================================================ ; TROCANDO SENHA DO USUÁRIO ;============================================================================ TROCANDO_SENHA CALL APITO_C MOVLW .8 MOVWF CNT1 CALL TECLANDO XORLW .2 ;TODOS OS BIT OBTIDOS BTFSS STATUS,Z GOTO TT0 SAI_T BTFSS GPIO,1 GOTO $-1 MOVLW .5 CALL DELAYM CALL BIP BCF FLAG_DIGITOU GOTO MAIN TT0 MOVLW .0 CALL EEREAD ;PEGA SENHA NA EPROM XORWF BITSENHA,W BTFSS STATUS,Z GOTO ERRO CALL APITO_C ;2 APITOS CURTOS MOVLW .3 CALL DELAYM CALL APITO_C ;========================================================================== ; DIGITANDO A NOVA SENHA ;========================================================================== MOVLW .8 MOVWF CNT1 CALL TECLANDO ;OBTÉM A NOVA SENHA XORLW .2 ;TODOS OS BIT OBTIDOS BTFSS STATUS,Z GOTO TT1 GOTO SAI_T TT1 MOVFW BITSENHA MOVWF TEMP2 ;SALVA SENHA NOVA PARA COMPARAÇÃO CALL APITO_C ;3 APITOS CURTOS MOVLW .3 CALL DELAYM CALL APITO_C MOVLW .3 CALL DELAYM CALL APITO_C ;========================================================================== ; CONFIRMANDO A NOVA SENHA ;========================================================================== MOVLW .8 MOVWF CNT1 CALL TECLANDO ;OBTEM CONFIRMAÇÃO DA SENHA NOVA XORLW .2 ;TODOS OS BIT OBTIDOS BTFSS STATUS,Z GOTO TT2 GOTO SAI_T TT2 MOVFW TEMP2 XORWF BITSENHA,W ;COMPARA SENHA NOVA COM A CONFIRMAÇÃO DELA BTFSC STATUS,Z GOTO ERRO MOVFW BITSENHA ;ESCREVE NOVA SENHA NA EEPROM MOVWF TMP MOVLW .0 CALL EEWRITE CALL APITO_L GOTO MAIN ;========================================================================== ; ROTINA DE OBTENÇÃO DA SENHA ;========================================================================== TECLANDO MOVLW TEMPO_S_TEC ;CARGA DO CONTADOR Z1/Z0 MOVWF Z1 CLRF Z0 L_TECLANDO TX3 ZER_CONT MOVLW DEBOUNCE ;CARGA PARA DEBOUNCE DE INTERRUPTORES MOVWF CNT BTFSC GPIO,0 GOTO OUTRO_BOT RET_DEB GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 BTFSC GPIO,0 GOTO ZER_CONT DECFSZ CNT,F GOTO RET_DEB MOVLW DEBOUNCE MOVWF CNT RET_DEBS GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 BTFSS GPIO,0 GOTO $-1 DECFSZ CNT,F GOTO RET_DEBS BSF STATUS,C GOTO PEGA OUTRO_BOT ZER_CONT1 MOVLW T_APERTADO MOVWF TIMER1 MOVLW DEBOUNCE MOVWF CNT BTFSC GPIO,1 GOTO TEMPO_SEM_APERTAR RET_DEB1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 BTFSC GPIO,1 GOTO ZER_CONT1 DECFSZ CNT,F GOTO RET_DEB1 MOVLW DEBOUNCE MOVWF CNT RET_DEBS1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 BTFSS GPIO,1 GOTO LOOP1A_INC DECFSZ CNT,F GOTO RET_DEBS1 BCF STATUS,C GOTO PEGA LOOP1A_INC CALL AGUARDE DECFSZ TIMER1,F GOTO RET_DEBS1 CALL BIP BCF FLAG_DIGITOU RETLW .2 PEGA BSF FLAG_DIGITOU RLF BITSENHA,F DECFSZ CNT1,F GOTO BIPAR RETLW .4 ;SENHA COMPLETA BIPAR CALL BIP GOTO TECLANDO TEMPO_SEM_APERTAR BTFSS FLAG_DIGITOU RETLW 0XFF MOVLW .146 ADDLW .1 BTFSS STATUS,Z GOTO $-2 DECFSZ Z0,F GOTO L_TECLANDO DECFSZ Z1,F GOTO L_TECLANDO BCF FLAG_DIGITOU MOVLW TEMPO_S_TEC MOVWF Z1 CALL APITO_C CLRF BITSENHA RETLW .2 ;================================================================================= ; GERA BIP AUDÍVEL NA DIGITAÇÃO ;================================================================================= ;GERA BIP BIP MOVLW .200 MOVWF TEMP2 CONT6 BCF SOM MOVLW 0X30 CALL WAIT_US BSF SOM MOVLW 0X30 CALL WAIT_US DECFSZ TEMP2,F GOTO CONT6 RETURN WAIT_US MOVWF XLC DECFSZ XLC, F GOTO $-1 RETURN ;============================================================================================ ; APITOS ;============================================================================================ APITO_L MOVLW 0X30 ;LONGO GOTO AP1 APITO_C MOVLW 0X10 ;BREVE AP1 MOVWF CNT CALL BIP DECFSZ CNT,F GOTO $-2 RETURN ;================================================================== ; ROTINAS DE EEPROM ;================================================================== DELAYM ; DELAY= 50 milisegundos X 'W' MOVWF R0 XC CALL AGUARDE DECFSZ R0,F GOTO XC RETURN AGUARDE ; ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM (50 MSEG) MOVLW .50 MOVWF R2 CALL DELAY_1MS ;ROTINA DE 1 MILISEGUNDOS DECFSZ R2,F GOTO $-2 RETURN DELAY_1MS MOVLW .199 MOVWF R1 CLRWDT NOP DECFSZ R1,F GOTO $-3 RETURN ;============================================================================================ ; ESCREVER NA EEPROM ;============================================================================================ EEWRITE ;ENDEREÇO EM 'W' ;DADOS A ESCREVER ESTA EM TMP BANK1 movwf EEADR BANK0 MOVFW TMP ;PEGA PRIMEIRO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; enable Write\par movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A clrwdt btfsc EECON1, WR ; Write complete ?\par goto WRITE_SN_A bcf EECON1, WREN ; disable Write\par BANK0 clrwdt ESPERA1 ;DELAY ENTRE APAGAMENTOS CALL AGUARDE RETURN ;============================================================================================ ; LER A EEPROM ;============================================================================================ EEREAD ;endereço esta em ADDRESS ;DADOS LIDOS SERÃO ESCRITOS EM TMP0 clrwdt ; MOVFW ADDRESS BANK1 movwf EEADR bsf EECON1, RD ; do a read\par clrwdt btfsc EECON1, RD ; Read done ?\par goto $-1 movf EEDATA,W BANK0 MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM clrwdt RETURN ;============================================================================================ ; PRÉ-GRAVAÇÃO DA EEPROM ;============================================================================================ ORG 0X2100 DE SENHA_INIT ;SENHA INICIAL END