;*********************************************************************************************** ; SENHA_628.ASM ; ; FECHADURA ELETRONICA COM SENHA , USANDO PIC16F628A E LCD, ; PARA USO GERAL, OPERANDO COM SENHAS DE 8 DIGITOS. ; BLOQUEIA POR UM TEMPO DEFINIDO NO ASM, SE HOUVER VÁRIAS TENTATIVAS ERRADAS ; OPÇÃO DE SAIDA PULSADA OU CONTINUA TEMPORIZADA (PELO ASM) ; SAIDA PARA ILUMINAÇÃO DO LCD COM DESLIGAMENTO AUTOMÁTICO. ; COMO TECLADO PODERÁ SER USADO CHAVES DACTILARES OU UM TECLADO DE TELEFONE ; CONVENCIONAL. ; ; PROGRAMAR NOVA SENHA: ; 1) APERTE UMA TECLA QUALQUER PARA ACORDAR O SISTEMA ; 2) DIGITE A SENHA #246759#. ; 3) DIGITE A SENHA PADRÃO INICIAL 12345678 ; 4) DIGITE A NOVA SENHA DE 8 DIGITOS ; 5) DIGITE A CONFIRMAÇÃO DA NOVA SENHA ; UTILIZE UM DISCO PIEZO ELETRÍCO PARA GERAR OS BIPS NA DIGITAÇÃO ; ; AUTOR:CLAUDIO LÁRIOS INICIO: 17-10-2013 TERMINO:17-10-2013 ; USO DIDÁTICO APENAS. ; ;********************************************************************************************** ;DEFINIÇÃO DO USUÁRIO #DEFINE SAIDA_PULSADA ;DESCOMENTE PARA SAIDA PULSADA (PROTEÇÃO DO ENROLAMENTO DA FECHADURA) ;OBS: COMENTE SE DESEJAR QUE FIQUE SEM PULSAR. ;============================================================================================== ;ESCOLHA ABAIXO A QUANTIDADE MÁXIMA DE ERROS DE DIGITAÇÃO ANTES DE BLOQUEAR C_TEMPO_MAX EQU .20 ;TEMPO MAXIMO (EM SEGUNDOS) SEM APERTAR UMA TECLA ANTES DO 'SLEEP' Q_ERRO EQU .3 ;MÁXIMO DE SENHAS DIGITADAS ERRADAS (ANTES DO BLOQUEIO) ;=============================================================================================== ;MODELO DO MICROCONTROLADOR LIST P=16f628A , R=DEC INCLUDE "P16F628A.INC" ;-------------------------- ERRORLEVEL -302, -202 ;ELIMINA MENSAGEM DE ERRO AO COMPILAR __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _LVP_OFF ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 #DEFINE FLAG_W FLAGS,0 ;FLAG #DEFINE FLAG_ON FLAGS,1 ;FLAG ON #DEFINE PAG1 FLAGS,2 ;INDICADOR DE PAGINA 1 #DEFINE FLAG_NO_AST FLAGS,3 ;ELIMINA ASTERISTICOS #DEFINE FLAG_TECLA FLAGS,4 ;FLAG DE TECLA RECEBIDA ;================================================================================================ ;CONSTANTS DEFINITIONS ;================================================================================================ ;LCD Control lines #DEFINE LCD_DB7 PORTA,3 ;PINO 2 - DISPLAYS #DEFINE LCD_DB6 PORTA,2 ;PINO 1 - DISPLAY #DEFINE LCD_DB5 PORTA,1 ;PINO 18 - DISPLAYS #DEFINE LCD_DB4 PORTA,0 ;PINO 17 - DISPLAY #DEFINE LCD_RS PORTA,6 ;PINO 15 - DISPLAY #DEFINE LCD_E PORTA,7 ;PINO 16 - DISPLAY #DEFINE BACKLIGHT PORTA,4 ;PINO 3 - ILUMINAÇÃO LCD #DEFINE SOM PORTA,4 ;PINO 3 - SOM #DEFINE RELE PORTB,0 ;PINO 13 - RELE DA FECHADURA ;RAM CBLOCK 0X20 TR,LC,LC1,TEMP,AUX,N_T,DIG0,DIG1,DIG2,DIG3,DIG4,DIG5,DIG6,DIG7,TECLA,TEMP2,XTEMP2,XLC EDIG0,EDIG1,EDIG2,EDIG3,EDIG4,EDIG5,EDIG6,EDIG7,FLAGS,CNT ADDRESS,TMP,R7,C_ERRO,AUXG,PCAUX,TIMER1,TIMER ENDC CBLOCK 0X70 WTEMP,STATUSTEMP ENDC ;================================================================================ ; RESET ;================================================================================ ORG 0X00 GOTO START ;================================================================================ ; INTERRUPÇÕES ;================================================================================ ORG 0X04 GOTO INT_MUDANÇA_DE_PINO ;================================================================================ ; PÁGINA ZERO ;================================================================================ ;;MENSAGENS PEGA_M MOVWF TEMP MOVFW PCAUX MOVWF PCLATH MOVFW TEMP MOVWF PCL MSG1: DT "***SENHA__628***",0 MSG2: DT "LARIOS.TECNOL.WS",0 MSG3: DT "APERTE UMA TECLA",0 MSG4: DT "DIGITE UMA SENHA",0 MSG5: DT " ",0 ;APAGAR LINHA INTEIRA MSG7: DT "DIG. SENHA ATUAL",0 MSG8: DT "DIG.A NOVA SENHA",0 MSG9: DT "CONFIRME A SENHA",0 MSG10: DT "SENHA INCORRETA!",0 MSG11: DT "---BLOQUEADO!---",0 MSG12: DT "AGUARDE 1 MIN...",0 MSG13: DT "ACESSO LIBERADO!",0 ;================================================================================ ; PÁGINA 1 ;================================================================================ ORG 0X100 MSG15: DT "***BEM-VINDO!***",0 MSG16: DT "*ABORTAR TROCA!*",0 MSG17: DT "SENHA ALTERADA! ",0 CONV_H1 MOVLW HIGH($) MOVWF PCLATH MOVFW DIG0 ANDLW 0X03 ADDWF PCL,F RETLW 0X00 RETLW 0X64 RETLW 0XC8 CONV_H2 MOVLW HIGH($) MOVWF PCLATH MOVFW DIG1 ANDLW 0X0F ADDWF PCL,F RETLW 0X00 RETLW 0X0A RETLW 0X14 RETLW 0X1E RETLW 0X28 RETLW 0X32 RETLW 0X3C RETLW 0X46 RETLW 0X50 RETLW 0X5A ;================================================================================ ; ROTINA DE ENVIO DE FRASES PARA O LCD ;================================================================================ ENV_LCD MOVWF AUX RT1 CALL PEGA_M ADDLW .0 BTFSC STATUS,Z GOTO SAI_34 CALL ED INCF AUX,F MOVFW AUX GOTO RT1 SAI_34 CLRF PCAUX ;ZERA PAGINA RETURN ;================================================================================ ; CONFIGURAÇÕES INICIAIS DE PORTAS E REGISTRADORES ;================================================================================ RESET: START: MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF PORTA ; ACERTA PORTB MOVLW B'00001110' ;PREPARA PORTB PARA MUDANÇA DE ESTADO MOVWF PORTB ; ACERTA PORTB BANK1 MOVLW B'11110000' ; SETUP PORTB MOVWF TRISB MOVLW B'00100000' ; SETUP PORTA MOVWF TRISA MOVLW B'10001111' MOVWF OPTION_REG BANK0 MOVLW B'11000000' MOVWF INTCON ;LIGA GERAL E PERIFÉRICO CLRF FLAGS ;ZERA FLAGS CLRF N_T ;NÚMERO DE DIGITOS ACIONADOS MOVLW Q_ERRO ;CARGA DE NÚMERO DE ERROS MOVWF C_ERRO CLRF PCAUX ;PONTEIRO DE PAGINA MOVLW 0XFF CALL LcdDelay CALL LcdInit ;INICIA LCD MOVLW 0XFF CALL LcdDelay CALL LcdClear MOVLW MSG1 ;MENSAGEM:"***SENHA--628***" CALL ENV_LCD CALL LINHA_2 MOVLW MSG2 CALL ENV_LCD MOVLW 0X06 ;TEMPO DA APRESENTAÇÃO CALL DELAYW CALL LINHA_2 MOVLW MSG3 ;MENSAGEM:'APERTE UMA TECLA' CALL ENV_LCD ;================================================================================ ; ROTINA PRINCIPAL ;================================================================================ MAIN1: BCF BACKLIGHT MOVFW PORTB BCF INTCON,RBIF ;APAGA FLAG DE MUDANÇA BSF INTCON,RBIE ;LIGA INTERRUPÇÃO POR MUDANÇA DE ESTADO NOP SLEEP ;MODO 'BAIXO CONSUMO' NOP BSF FLAG_NO_AST MAIN BCF INTCON,RBIE ;DESLIGA INTERRUPÇÃO POR MUDANÇA BTFSC FLAG_ON GOTO SEGH1 BSF FLAG_ON ; CALL CLEAR_LCD MOVLW 0X01 CALL DELAYW MOVLW MSG4 ;MENSAGEM:"DIGITE UMA SENHA" CALL ENV_LCD MAIN2 CLRF N_T ;ZERA CONTADOR DE TECLAS PRESSIONADAS SEGH1 MOVFW PORTB BCF INTCON,RBIF ;APAGA FLAG DE MUDANÇA CALL RECEBE_8DIG ;AGUARDA RECEBER 8 DIGITOS ADDLW .1 BTFSC STATUS,Z GOTO RESET ;TEMPO MÁXIMO SEM DIGITAR ALCANÇADO ; ;================================================================================ ; SENHA COMANDO PARA MUDANÇA DE SENHA PELO USUÁRIO '#246759#' ;================================================================================ MUDAR_SENHA CALL COMPARA_SENHA_DE_TROCA ;COMPARA SE É COMANDO PARA MUDANÇA DE SENHA ADDLW .0 BTFSS STATUS,Z GOTO TESTA_SENHA_DE_ENTRADA ;NÃO É, ENTÃO IRÁ TESTAR SENHA DE USUÁRIO CALL CLEAR_LCD ;É SENHA DE TROCA MOVLW MSG7 ;MENSAGEM: 'DIG. SENHA ATUAL' CALL ENV_LCD CALL APITO_MUDANÇA_SENHA CALL RECEBE_8DIG ;AGUARDA RECEBER 8 DIGITOS - SENHA ATUAL ADDLW .1 BTFSC STATUS,Z GOTO RESET CALL CONFERE_SENHA_IND ;CONFERE SENHA ATUAL DO USUÁRIO ADDLW .0 BTFSS STATUS,Z GOTO SENHA_INCORRETA ;SENHA INCORRETA ;================================================================================ ; DIGITAR NOVA SENHA - MODO DE TROCA ;================================================================================ CALL RECEBE_8DIG ;AGUARDA RECEBER 8 DIGITOS - NOVA SENHA ADDLW .1 BTFSC STATUS,Z GOTO RESET ;TEMPO MÁXIMO SEM DIGITAR ALCANÇADO CALL SALVA_SENHA_EM_EDIG ;SALVA DIGITAÇÃO CALL CLEAR_LCD CLRF PCAUX MOVLW MSG9 ;MENSAGEM:'CONFIRME A SENHA' CALL ENV_LCD CALL APITO_MUDANÇA_SENHA ;================================================================================ ; CONFIRMAR NOVA SENHA - MODO DE TROCA ;================================================================================ CALL RECEBE_8DIG ;AGUARDA RECEBER 8 DIGITOS - CONFIRMAÇÃO DA NOVA SENHA ADDLW .1 BTFSC STATUS,Z GOTO RESET ;TEMPO MÁXIMO SEM DIGITAR ALCANÇADO CALL CLEAR_LCD CALL COMPARA_CONFIRMAÇÃO ADDLW .0 BTFSS STATUS,Z GOTO FALHA_AO_DIGITAR CALL GRAVAR_SENHA_NOVA MOVLW .1 MOVWF PCAUX ;MUDA PAGINA MOVLW MSG17 ;MENSAGEM:' SENHA ALTERADA' CALL ENV_LCD CALL APITO_MUDANÇA_SENHA CALL T_APRES ;TEMPO DE APRESENTAÇÃO GOTO M_SAIDA FALHA_AO_DIGITAR CLRF PCAUX MOVLW MSG10 ;MENSAGEM:' SENHA INCORRETA' CALL ENV_LCD CALL APITO_SENHA_INCORRETA CALL T_APRES ;TEMPO DE APRESENTAÇÃO GOTO M_SAIDA ;================================================================================ ; TESTA SENHA PARA LIBERAÇÃO DE ACESSO POR USUÁRIO ;================================================================================ TESTA_SENHA_DE_ENTRADA CALL COMPARA_SENHA ;COMPARA SENHA DE USUÁRIO ADDLW .0 BTFSS STATUS,Z GOTO SENHA_INCORRETA ;================================================================================ ; SENHA CORRETA - LIBERAÇÃO DA FECHADURA ;================================================================================ SENHA_CORRETA CALL LINHA_1 ;LINHA 1 MOVLW MSG13 ;MENSAGEM DE 'ACESSO LIBERADO!' CALL ENV_LCD CALL LINHA_2 MOVLW .1 ;PAGINA 1 MOVWF PCAUX MOVLW MSG15 ;MENSAGEM:'BEM-VINDO' CALL ENV_LCD BSF BACKLIGHT ;LIGA ILUMINAÇÃO DO LCD CALL APITO_SENHA_CORRETA ;================================================================================ ; ACIONAMENTO MODO PULSADO E TEMPORIZADO ;================================================================================ IFDEF SAIDA_PULSADA BCF INTCON,GIE MOVLW 0X20 ;DURAÇÃO DO TEMPO TOTAL QUE SERÁ ACIONADO A SAIDA (.20 = 8 SEG.) MOVWF TEMP LOOP6J BSF RELE ;ACIONA RELE DE SAIDA AOS PULSOS MOVLW 0X7F ;DURAÇÃO DO TEMPO LIGADO (0X7F = 130 MILISEGUNDOS) CALL DELAY BCF RELE MOVLW 0X7F ;DURAÇÃO DO TEMPO DESLIGADO CALL DELAY DECFSZ TEMP,F GOTO LOOP6J ELSE ;================================================================================ ; ACIONAMENTO CONTINUO E TEMPORIZADO ;================================================================================ BSF RELE ;ACIONA RELE DE SAIDA MOVLW 0X18 ;5 SEGUNDOS (ALTERE SE DESEJAR OUTRO TEMPO PARA FECHADURA LIGADA) CALL DELAYW BCF RELE ENDIF ;=============================================================================== MOVLW Q_ERRO ;RECARGA DO CONTADOR DE TENTATIVAS ERRADAS MOVWF C_ERRO M_SAIDA BSF INTCON,GIE NOP CALL CLEAR_LCD CALL LINHA_1 MOVLW MSG4 ;MENSAGEM: 'DIGITE UMA SENHA' CALL ENV_LCD ;GOTO RESET GOTO MAIN2 ;================================================================================ ; SENHA INCORRETA - MENSAGEM DE ERRO ;================================================================================ SENHA_INCORRETA CALL CLEAR_LCD MOVLW MSG10 ;MENSAGEM: 'SENHA INCORRETA!' CALL ENV_LCD CALL APITO_SENHA_INCORRETA MOVLW 0X06 ;TEMPO DA APRESENTAÇÃO CALL DELAYW CALL CLEAR_LCD MOVLW MSG4 ;MENSAGEM: 'DIGITE UMA SENHA' CALL ENV_LCD DECFSZ C_ERRO,F GOTO MAIN2 ; GOTO RESET MOVLW Q_ERRO ;RECARGA DO VALOR PARA ERRO MOVWF C_ERRO CALL LINHA_1 ;LINHA 1 MOVLW MSG11 ;MENSAGEM : '---BLOQUEIO!---' CALL ENV_LCD CALL LINHA_2 MOVLW MSG12 ;MENSAGEM : 'AGUARDE 1 MIN...' CALL ENV_LCD MOVLW 0XFF ;TEMPO DE BLOQUEIO CALL DELAYW CALL LINHA_1 MOVLW MSG4 ;MENSAGEM : 'DIGITE UMA SENHA' CALL ENV_LCD CALL LINHA_2 MOVLW MSG5 ;MENSAGEM : ' ' CALL ENV_LCD ; GOTO RESET GOTO MAIN2 ;================================================================================ ; GRAVAR NOVA SENHA ;================================================================================ GRAVAR_SENHA_NOVA ;================================================================================ ; GRAVA SENHA SALVA NOS DIG0...7 NA EEPROM ;================================================================================ GRAVA_DIG CLRF ADDRESS MOVFW DIG0 MOVWF TMP MOVFW ADDRESS CALL EEWRITE INCF ADDRESS,F MOVFW DIG1 MOVWF TMP MOVFW ADDRESS CALL EEWRITE INCF ADDRESS,F MOVFW DIG2 MOVWF TMP MOVFW ADDRESS CALL EEWRITE INCF ADDRESS,F MOVFW DIG3 MOVWF TMP MOVFW ADDRESS CALL EEWRITE INCF ADDRESS,F MOVFW DIG4 MOVWF TMP MOVFW ADDRESS CALL EEWRITE INCF ADDRESS,F MOVFW DIG5 MOVWF TMP MOVFW ADDRESS CALL EEWRITE INCF ADDRESS,F MOVFW DIG6 MOVWF TMP MOVFW ADDRESS CALL EEWRITE INCF ADDRESS,F MOVFW DIG7 MOVWF TMP MOVFW ADDRESS CALL EEWRITE RETURN ;================================================================================ ; CONFIRMAÇÃO DE SENHA ;================================================================================ COMPARA_CONFIRMAÇÃO MOVFW DIG0 XORWF EDIG0,W BTFSS STATUS,Z GOTO DIFERENTE1 MOVFW DIG1 XORWF EDIG1,W BTFSS STATUS,Z GOTO DIFERENTE1 MOVFW DIG2 XORWF EDIG2,W BTFSS STATUS,Z GOTO DIFERENTE1 MOVFW DIG3 XORWF EDIG3,W BTFSS STATUS,Z GOTO DIFERENTE1 MOVFW DIG4 XORWF EDIG4,W BTFSS STATUS,Z GOTO DIFERENTE1 MOVFW DIG5 XORWF EDIG5,W BTFSS STATUS,Z GOTO DIFERENTE1 MOVFW DIG6 XORWF EDIG6,W BTFSS STATUS,Z GOTO DIFERENTE1 MOVFW DIG7 XORWF EDIG7,W BTFSS STATUS,Z GOTO DIFERENTE1 RETLW .0 DIFERENTE1 RETLW .1 ;================================================================================ ; SALVA SENHA DIGITADA EM DIG0...7 ;================================================================================ SALVA_SENHA_EM_EDIG MOVFW DIG0 MOVWF EDIG0 MOVFW DIG1 MOVWF EDIG1 MOVFW DIG2 MOVWF EDIG2 MOVFW DIG3 MOVWF EDIG3 MOVFW DIG4 MOVWF EDIG4 MOVFW DIG5 MOVWF EDIG5 MOVFW DIG6 MOVWF EDIG6 MOVFW DIG7 MOVWF EDIG7 RETURN ;================================================================================ ; CONFERE SENHA DIGITADA PELO USUÁRIO ;================================================================================ CONFERE_SENHA_IND CLRF ADDRESS MOVLW .8 MOVWF CNT MOVLW EDIG0 MOVWF FSR VV3 MOVFW ADDRESS CALL EEREAD ;LE EEPROM NO ENDEREÇO + 8 BYTES (COLOCA EM EDIG0..7) MOVWF INDF INCF FSR,F INCF ADDRESS,F DECFSZ CNT,F GOTO VV3 ;================================================================================ ; COMPARA VALORES EM DIG0...7 COM EDIG0...7 ;================================================================================ COMPARA8_DIG_EDIG ;COMPARA EDIG0..2 COM DIG0..2 MOVFW DIG0 XORWF EDIG0,W BTFSS STATUS,Z GOTO DIFERENTE MOVFW DIG1 XORWF EDIG1,W BTFSS STATUS,Z GOTO DIFERENTE MOVFW DIG2 XORWF EDIG2,W BTFSS STATUS,Z GOTO DIFERENTE MOVFW DIG3 XORWF EDIG3,W BTFSS STATUS,Z GOTO DIFERENTE MOVFW DIG4 XORWF EDIG4,W BTFSS STATUS,Z GOTO DIFERENTE MOVFW DIG5 XORWF EDIG5,W BTFSS STATUS,Z GOTO DIFERENTE MOVFW DIG6 XORWF EDIG6,W BTFSS STATUS,Z GOTO DIFERENTE MOVFW DIG7 XORWF EDIG7,W BTFSS STATUS,Z GOTO DIFERENTE CALL CLEAR_LCD MOVLW MSG8 ;MENSAGEM:'DIGITE A NOVA SENHA' CALL ENV_LCD CALL APITO_MUDANÇA_SENHA CALL T_APRES ;TEMPO DE APRESENTAÇÃO DA MENSAGEM RETLW .0 ;SENHA CORRETA PARA O APTO DIFERENTE CALL CLEAR_LCD MOVLW MSG10 ;MENSAGEM:'SENHA INCORRETA' CALL ENV_LCD BH1 CALL LINHA_2 INCF PCAUX,F ;PAGINA 1 MOVLW MSG16 ;MENSAGEM:'ABORTAR TROCA' CALL ENV_LCD CALL T_APRES ;TEMPO DE APRESENTAÇÃO DA MENSAGEM RETLW .1 ;DIGITADO É DIFERENTE DA SENHA ; ;================================================================================= ; COMPARA SENHA COMANDO (PARA TROCA DE SENHA PELO PRÓPRIO USUÁRIO) ;================================================================================= ; ESTA SENHA PODERÁ SER MANTIDA, POR SER PUBLICA COMPARA_SENHA_DE_TROCA MOVFW DIG0 ;'#246759#' XORLW 0X0B ;# BTFSS STATUS,Z GOTO SAI_ERRO1 MOVFW DIG1 XORLW 0X02 BTFSS STATUS,Z GOTO SAI_ERRO1 MOVFW DIG2 XORLW 0X04 BTFSS STATUS,Z GOTO SAI_ERRO1 MOVFW DIG3 XORLW 0X06 BTFSS STATUS,Z GOTO SAI_ERRO1 MOVFW DIG4 XORLW 0X07 ;7 BTFSS STATUS,Z GOTO SAI_ERRO1 MOVFW DIG5 XORLW 0X05 ;5 BTFSS STATUS,Z GOTO SAI_ERRO1 MOVFW DIG6 XORLW 0X09 ;9 BTFSS STATUS,Z GOTO SAI_ERRO1 MOVFW DIG7 XORLW 0X0B ;# BTFSS STATUS,Z GOTO SAI_ERRO1 CLRF N_T RETLW .0 ;IGUAL SAI_ERRO1 RETLW .1 ;DIFERENTE ;*********************************************************************** ; COMPARANDO A SENHA DIGITADA PELO USUÁRIO COM A DA EEPROM ;*********************************************************************** COMPARA_SENHA MOVLW DIG0 MOVWF FSR ;APONTA FSR MOVLW .8 MOVWF AUXG CLRF ADDRESS VP1 MOVFW ADDRESS CALL EEREAD XORWF INDF,W BTFSS STATUS,Z RETLW .1 ;NÃO ENCONTRADA SENHA DO USUARIO INCF ADDRESS,F INCF FSR,F DECFSZ AUXG,F GOTO VP1 RETLW .0 ;SENHA ENCONTRADA ;================================================================================= ; ROTINAS DE DELAY ;================================================================================= DELAYW BSF BACKLIGHT MOVWF TEMP VJ1 CALL DELAY1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay MOVWF LC1 Lp CLRWDT DECFSZ LC,F GOTO Lp DECFSZ LC1,F GOTO Lp RETURN ; ;================================================================================= ; ROTINAS DE CONTROLE DO LCD ;================================================================================= LcdInit movlw .60 ;Wait 60 ms call LcdDelay bcf LCD_RS ;Set LCD command mode bsf LCD_DB4 ;0011->48 bsf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 call LcdPulse_E ;sequência de reset call LcdPulse_E call LcdPulse_E bcf LCD_DB4 bcf LCD_DB6 bcf LCD_DB7 bsf LCD_DB5 call LcdPulse_E movlw 28H ;Set 4 bit data bus length call EC movlw 06H ;Entry mode set, increment, no shift call EC ; movlw 0DH ;Display ON, Cursor ON, Blink ON ; movlw 0FH ;Display ON, Cursor ALTERADO ON, Blink ON ; movlw 0EH ;Display ON, Cursor ON, Blink OFF movlw 0CH ;Display ON, Cursor OFF, Blink OFF call EC LcdClear CLEAR_LCD movlw 01H ;clear display call EC movlw .5 ;Wait 2 ms call LcdDelay return BIN_ASC_ED ;ROTINA DE BINARIO PARA HEX 0-F COM ENVIO PARA LCD ANDLW 0X0F ;LIMITA 0-F ADDLW 0XF6 ;SOMA 0XF6 BTFSC STATUS,C ;TESTA CARRY ADDLW 0X07 ;C=1 ,ENTÃO SOMA + 7 ADDLW 0X3A ;SOMA 0X3A ;ENVIA PARA O LCD E RETORNA PARA O PONTO DE CHAMADA ED LcdSendData bsf LCD_RS GOTO XENV LINE1 MOVLW 0X80 GOTO EC LINE2 MOVLW 0XC0 EC LcdSendCommand bcf LCD_RS XENV LcdSendByte movwf TR ;Send a byte to LCD by 4 bit data bus bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 btfsc TR,4 bsf LCD_DB4 btfsc TR,5 bsf LCD_DB5 btfsc TR,6 bsf LCD_DB6 btfsc TR,7 bsf LCD_DB7 call LcdPulse_E bcf LCD_DB4 bcf LCD_DB5 bcf LCD_DB6 bcf LCD_DB7 btfsc TR,0 bsf LCD_DB4 btfsc TR,1 bsf LCD_DB5 btfsc TR,2 bsf LCD_DB6 btfsc TR,3 bsf LCD_DB7 call LcdPulse_E return LcdPulse_E bsf LCD_E ;Enables LCD movlw .248 addlw .1 btfss STATUS,Z goto $-2 bcf LCD_E ;Disabled LCD return ;================================================================================= ; APAGAR LINHA 2 ;================================================================================= ;APAGAR LINHA 2 CLEAR_L2 MOVLW 0XC0 CALL EC MOVLW MSG5 ;APAGAR LINHA 2 CALL ENV_LCD MOVLW 0XC0 CALL EC RETURN ;================================================================================= ; MUDANÇA DE LINHA NO LCD ;================================================================================= ;TROCA DE LINHAS DO LCD LINHA1 LINHA_1 MOVLW 0X80 GOTO X9 LINHA_2 LINHA2 MOVLW 0XC0 X9 CALL EC RETURN ;================================================================================================ ; ROTINAS DE ESCRITA NA EEPROM ;================================================================================================ ;endereço esta em 'W' ;DADOS A ESCREVER ESTA EM TMP(MSB) EEWRITE BANK1 movwf EEADR BANK0 MOVFW TMP ;PEGA PRIMEIRO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; HABILITA ESCRITA movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A btfsc EECON1, WR ; ESCRITA OK? goto WRITE_SN_A bcf EECON1, WREN ; DESABILITA ESCRITA BANK0 RETURN ;================================================================================================ ; ROTINAS DE LEITURA DA EEPROM ;================================================================================================ EEREAD ;endereço esta em 'W' ;DADOS LIDOS SERÃO ESCRITOS EM TMP0 BANK1 movwf EEADR bsf EECON1, RD btfsc EECON1, RD goto $-1 movf EEDATA,W BANK0 MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM RETURN ;================================================================================================== AGUARDE: ;ROTINA DE ATRASO DELAY_STOP: MOVLW .15 ;AJUSTAR 10 MSEG CALL DELAY RETURN T_APRES BCF INTCON,GIE MOVLW 0X08 CALL DELAYW BSF INTCON,GIE RETURN ;==================================================================================================== ; RECEBE 8 DIGITOS DO TECLADO ;==================================================================================================== RECEBE_8DIG BSF INTCON,RBIE CALL CLEAR_L2 CLRF N_T MOVLW C_TEMPO_MAX/2 MOVWF TIMER1 MOVLW 0XFF MOVWF TIMER XX3 BSF BACKLIGHT ;LIGA ILUMINAÇÃO DO LCD MOVLW 0X08 CALL DELAY DECFSZ TIMER,F GOTO SEGQ11 DECFSZ TIMER1,F GOTO SEGQ11 BCF INTCON,RBIE BSF FLAG_NO_AST BCF BACKLIGHT ;DESLIGA ILUMINAÇÃO DO LCD CALL APITO_DESLIGA RETLW 0XFF SEGQ11 MOVFW TECLA XORLW 0X0A BTFSS STATUS,Z GOTO SEGQ22 CLRF N_T MOVLW 0XFF MOVWF TECLA CALL CLEAR_L2 BSF FLAG_NO_AST GOTO XX3 SEGQ22 BTFSS FLAG_TECLA GOTO XX3 MOVLW C_TEMPO_MAX/2 MOVWF TIMER1 MOVLW 0XFF MOVWF TIMER BCF FLAG_TECLA BTFSC FLAG_NO_AST GOTO PULA13A MOVLW DIG0 - 1 ADDWF N_T,W MOVWF FSR MOVFW TECLA MOVWF INDF MOVFW N_T ADDLW 0XC3 CALL EC ;ENDEREÇA O ASTERISTICO MOVLW '*' CALL ED PULA13 BCF FLAG_NO_AST MOVFW N_T ;AGUARDA DIGITAR 8 NÚMEROS XORLW .8 BTFSS STATUS,Z GOTO XX3 CLRF N_T BCF INTCON,RBIE RETLW .0 PULA13A CLRF N_T GOTO PULA13 ;================================================================================= ; GERA BIP AUDÍVEL NA DIGITAÇÃO ;================================================================================= ;GERA BIP BIP MOVLW .200 MOVWF XTEMP2 CONT6 BCF SOM MOVLW 0X30 CALL WAIT_US BSF SOM MOVLW 0X30 CALL WAIT_US DECFSZ XTEMP2,F GOTO CONT6 RETURN WAIT_US MOVWF XLC DECFSZ XLC, F GOTO $-1 RETURN ;================================================================================= ; APITO AO DESLIGAR POR TEMPO ;================================================================================= APITO_DESLIGA BCF INTCON,GIE MOVLW .5 MOVWF TEMP2 CALL BIP DECFSZ TEMP2,F GOTO $-2 BSF INTCON,GIE RETURN ;================================================================================= ; APITO QUANDO ENCONTRA SENHA INCORRETA ;================================================================================= APITO_SENHA_INCORRETA BCF INTCON,GIE MOVLW .5 MOVWF TEMP2 CALL BIP MOVLW 0XFF CALL DELAY DECFSZ TEMP2,F GOTO $-4 BSF INTCON,GIE RETURN ;================================================================================= ; APITO QUANDO ENCONTRA SENHA CORRETA ;================================================================================= APITO_SENHA_CORRETA BCF INTCON,GIE MOVLW .10 MOVWF TEMP2 CALL BIP DECFSZ TEMP2,F GOTO $-2 BSF INTCON,GIE RETURN ;================================================================================= ; APITO ENTRE ETAPAS DE DIGITAÇÃO ( 2 BIPS) ;================================================================================= APITO_MUDANÇA_SENHA BCF INTCON,GIE CALL BIP MOVLW 0X30 CALL DELAY CALL BIP BSF INTCON,GIE RETURN ;================================================================================ ; ROTINA DE INTERRUPÇÃO ;================================================================================ INT_MUDANÇA_DE_PINO MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BANK0 MOVLW .0 ;DELAY DE DEBOUNCE 2 Mseg ADDLW .1 GOTO $+1 GOTO $+1 BTFSS STATUS,Z GOTO $-4 MOVFW N_T ;VERIFICA VALOR MÁXIMO DE N_T XORLW 0X09 BTFSC STATUS,Z CLRF N_T MOVLW 0XFF BSF PORTB,1 ;COLUNA '741*' BCF PORTB,2 BCF PORTB,3 BTFSC PORTB,4 ;TESTA TECLA '1' MOVLW .1 BTFSC PORTB,5 ;TESTA TECLA '4' MOVLW .4 BTFSC PORTB,6 ;TESTA TECLA '7' MOVLW .7 BTFSC PORTB,7 ;TESTA TECLA '*' MOVLW .10 BCF PORTB,1 ;COLUNA '2580' BSF PORTB,2 BCF PORTB,3 BTFSC PORTB,4 ;TESTA TECLA '2' MOVLW .2 BTFSC PORTB,5 ;TESTA TECLA '5' MOVLW .5 BTFSC PORTB,6 ;TESTA TECLA '8' MOVLW .8 BTFSC PORTB,7 ;TESTA TECLA '0' MOVLW .0 BCF PORTB,1 ;COLUNA '369#' BCF PORTB,2 BSF PORTB,3 BTFSC PORTB,4 ;TESTA TECLA '3' MOVLW .3 BTFSC PORTB,5 ;TESTA TECLA '6' MOVLW .6 BTFSC PORTB,6 ;TESTA TECLA '9' MOVLW .9 BTFSC PORTB,7 ;TESTA TECLA '#' MOVLW .11 MOVWF TECLA SAI_INT BSF FLAG_TECLA ;INDICA RECEPÇÃO DE TECLA BSF BACKLIGHT ;LIGA LUZ DE FUNDO DO DISPLAY BSF PORTB,1 ;PREPARA PARA DISPARO POR MUDANÇA DE ESTADO BSF PORTB,2 BSF PORTB,3 RET_SOLTAR ;VERIFICA SE TEM TECLA AINDA APERTADA MOVLW .0 ;DELAY DE DEBOUNCE 2 Mseg ADDLW .1 GOTO $+1 GOTO $+1 BTFSS STATUS,Z GOTO $-4 BTFSC PORTB,4 GOTO RET_SOLTAR BTFSC PORTB,5 GOTO RET_SOLTAR BTFSC PORTB,6 GOTO RET_SOLTAR BTFSC PORTB,7 GOTO RET_SOLTAR MOVLW C_TEMPO_MAX/2 ;CARGA PARA EVITAR DESLIGAMENTO POR TEMPO MOVWF TIMER1 MOVFW TECLA SUBLW 0X0B BTFSS STATUS,C ;DIGITOS ERRADOS NÃO INCREMENTA GOTO C45 INCF N_T,F ;NÃO INCREMENTA CALL BIP GOTO C44 C45 BCF FLAG_TECLA ;NÃO SINALIZA RECEBIMENTO C44 MOVFW PORTB ;OBRIGATÓRIO BCF INTCON,RBIF ;APAGA FLAG DE MUDANÇA DE ESTADO SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS SWAPF WTEMP,F SWAPF WTEMP,W ;RECUPERA 'W' RETFIE ORG H'2100' DE .1,.2,.3,.4,.5,.6,.7,.8 end