;****************************************************************************************************** ; PROJETO SENHA ELETRONICA COM TECLADO E DISPLAY LCD (DIRETA) ; MICROCONTROLADOR: PIC12F675 ; INICIO : 02/07/2012 TERM.: 04/07/2012 ; ; REVISADO EM:05/08/13 ; CORRIGIO FALHA DA ROTINA DE TECLADA E CARGA DE OSCCAL ; ; AUTOR: CLÁUDIO LÁRIOS ; BLOG 'LARIOS.TECNOLOGIA.WS' ; PROCESSADOR: PIC 12F675 ; (OBS. HEX PODE SER GRAVADO TANTO NO 12F675 COMO NO 12F629) ;****************************************************************************************************** ; #INCLUDE ; ARQUIVO PADRAO __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,ADDRESS,tmp,RER,GER tmpLcdRegister,tmpLcdRegister1,RTEC,RTEC1 CONTAP,CONT,CONT1,CONT2,CONT3,LC,LC1,FLAGS 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 ;SAIDA PARA ATIVAÇÃO #DEFINE SOM GPIO,5 ; SAIDA DO BIP PINO 2 #DEFINE RELE GPIO,2 ; RELE PINO 5 ;LCD Control lines #DEFINE FLCD_RS FLAGS,0 ; FLAG RS comando/dado #DEFINE LCD_E GPIO,4 ;PINO 3 Enable + RESISTOR COM CAPACITOR AO 'RS' ;LCD data line bus #DEFINE LCD_DB4 GPIO,5 ;LCD data line DB4 P2 #DEFINE LCD_DB5 GPIO,0 ;LCD data line DB5 P7 #DEFINE LCD_DB6 GPIO,1 ;LCD data line DB5 P6 #DEFINE LCD_DB7 GPIO,2 ;LCD data line DB5 P2 ;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 SLCD EQU B'001000' ;TUDO SAIDA (EXCETO RST) SREBIP EQU B'001011' ;SAIDA PARA BIP E RELE TEMPO_ABERTURA EQU 0X32 ;TEMPO QUE RELE FICA LIGADO APOS LIBERAÇÃO (OX32= 10SEG) NUMERO_DE_ERROS EQU 0X03 ;QUANTIDADE DE VEZES QUE SE PODE DIGITAR SENHA ERRADA TEMPO_SEM_TECLAR EQU 0X0A ;TEMPO SEM TECLAR MAXIMO,E APAGAR LCD EM SEGUIDA.(0X0A= 30SEG) DESC_CAP EQU 0X10 ;TEMPO DE DESCARGA DO CAPACITOR EM RS/E ;================================================================================== 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 ;------------------------------------------------------------------------------------------------ ;TABELAS COM MENSAGENS MENS1 ADDWF PCL,F DT "DIGITE A SENHA: ",0 MENS2 ADDWF PCL,F DT "SENHA INCORRETA! ",0 MENS3 ADDWF PCL,F DT "ACESSO LIBERADO! ",0 MENS4 ADDWF PCL,F DT "- BLOQUEADO - ! ",0 MENS5 ADDWF PCL,F DT "AGUARDE 3 MIN.! ",0 MENS6 ADDWF PCL,F DT "TROCAR SENHA! ",0 MENS7 ADDWF PCL,F DT "DIG.SENHA ATUAL! ",0 MENS8 ADDWF PCL,F DT "DIG.SENHA NOVA! ",0 MENS9 ADDWF PCL,F DT "CONFIRME SENHA ! ",0 MENS10 ADDWF PCL,F DT "OK - SENHA NOVA! ",0 MENS11 ADDWF PCL,F DT " - CANCELADO - ! ",0 ;=========================================================================== ; INICIO DO PROGRAMA INICIO MOVLW .7 ;DESLIGA COMPARADORES MOVWF CMCON BANK1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW 0X00 MOVWF OPTION_REG ;DESLIGA PULL-UPS MOVWF WPU BANK0 MOVLW NUMERO_DE_ERROS ;CARREGA CONTADOR DE MAX. DE SENHAS ERRADAS MOVWF RER ST1 CLRF RTEC1 ;ZERA REGISTRADORES CLRF CONTAP CLRF ADDRESS CLRF GER MOVLW SLCD ;INICIA COM LCD CALL TRISIOX ;ACERTA SENTIDO DAS PORTAS MOVLW .1 CALL LcdDelay1 ;DELAY DE TEMPO 200MS CALL LcdInit ;INICIALIZA O LCD CALL MENSAGEM1 ;MENSAGEM INICIAL DE 'DIGITE A SENHA' MOVLW 0XC0 ;LINHA 2 CALL EC 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 GOTO INICIO ;TEMPO MAXIMO ATINGIDO SEM DIGITAR ,VAI PARA O INICIO E APAGA DISPLAY 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 CANCELA_OPERAÇÃO ;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 DECF CONTAP,F MOVLW 0XC0 ADDWF CONTAP,W CALL EC MOVLW ' ' CALL ED ;APAGA ASTERISTICOS MOVLW ' ' CALL ED ;APAGA ASTERISTICOS MOVLW 0XC0 ADDWF CONTAP,W ;COLOCA PONTEIRO NA POSIÇÃO PARA RECEBER O DIGITO CERTO CALL EC CLRF RTEC1 ;APAGA REGISTRADOR DE TECLADO GOTO MAIN CANCELA_OPERAÇÃO MOVLW 0X01 ;APAGA DISPLAY CALL EC MOVLW 0X80 ;LINHA1 CALL EC CALL MENSAGEM11 MOVLW 0X04 CALL DELAYW GOTO ST1 PN3 MOVLW S0 ;PEGA ENDEREÇO DO REGISTRADO 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 MOVLW DESC_CAP ;TEMPO DE DESCARGA DO CAPACITOR DE 'RS' CALL DELAY ; 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 ;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 0X01 ;LIMPA DISPLAY CALL EC MOVLW 0X80 ;LINHA 1 CALL EC CALL MENSAGEM10 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 MOVLW .30 CALL DELAYW ;TEMPO DE APRESENTAÇÃO GOTO RETG GOTO ST1 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 MOVLW 0X01 CALL EC ;APAGAR LCD MOVLW 0X80 CALL EC CALL MENSAGEM9 ; 'CONFIRME A SENHA' 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 MOVLW 0X01 ;LIMPA DISPLAY CALL EC MOVLW 0X80 ;LINHA 1 CALL EC CALL MENSAGEM8 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 MOVLW DESC_CAP ;TEMPO DE DESCARGA DO CAPACITOR DE 'RS' CALL DELAY ; MOVLW 0X01 ;LIMPA DISPLAY ; CALL EC MOVLW 0XC0 ;LINHA 2 CALL EC MOVFW GER XORLW .1 BTFSC STATUS,Z GOTO VAI_ENTRAR_NOVA_SENHA CALL MENSAGEM3 ;'ACESSO LIBERADO' BSF RELE MOVLW TEMPO_ABERTURA CALL DELAYW CLRF GPIO RETG MOVLW .4 CALL DELAYW CLRF GPIO MOVLW DESC_CAP ;TEMPO DE DESCARGA DO CAPACITOR DE 'RS' CALL DELAY MOVLW 0X01 ;LIMPA DISPLAY CALL EC MOVLW 0X80 ;LINHA 1 CALL EC CALL MENSAGEM1 ;DIGITE A SENHA RETG1 MOVLW 0XC0 ;LINHA 2 CALL EC CLRF ADDRESS CLRF CONTAP CLRF RTEC1 GOTO MAIN VAI_ENTRAR_NOVA_SENHA CALL MENSAGEM8 ; 'DIGITE SENHA NOVA' INCF GER,F GOTO RETG1 ; CONFERE SE NÃO É COMANDO P/ TROCAR SENHA '*74123' 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 MOVLW 0X01 CALL EC ;APAGAR LCD MOVLW 0X80 CALL EC CALL MENSAGEM6 ;TROCAR SENHA MOVLW 0X03 ;TEMPO DE APRESENTAÇÃO CALL DELAYW MOVLW 0X01 CALL EC ;APAGAR LCD MOVLW 0X80 CALL EC CALL MENSAGEM7 ;DIG. SENHA ATUAL MOVLW 0XC0 ;LINA 2 CALL EC MOVLW .1 ;ACERTA PARA PASSO 1 MOVWF GER CLRF CONTAP CLRF RTEC1 GOTO MAIN ;VAI PARA ROTINA PRINCIPAL ;SENHA ERRADA ERRO CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY MOVLW 0X01 ;LIMPA DISPLAY CALL EC MOVLW 0X80 ;LINHA 1 CALL EC CLRF GER ;APAGA GERENCIADOR DECFSZ RER,F ;TESTA SE HOUVE 3 ERROS GOTO SJK GOTO BLOQ SJK CALL MENSAGEM2 ;' SENHA INCORRETA' GOTO RETG BLOQ CALL MENSAGEM4 ; MOVLW 0XC0 CALL EC CALL MENSAGEM5 MOVLW 0X04 MOVWF TEMP1 RLJ MOVLW 0XFF CALL DELAYW DECFSZ TEMP1,F GOTO RLJ MOVLW NUMERO_DE_ERROS MOVWF RER MOVLW 0X01 ;LIMPA DISPLAY CALL EC GOTO RETG ;ROTINA JÁ ACERTADA LE_TECLADO CALL TESTTK MOVFW RTEC XORLW 0XFF ;SE FOR 0XFF NENHUMA TECLA FOI PRESSIONADA BTFSC STATUS,Z RETURN ;USA O VALOR NO PROGRAMA, AQUI ESTÁ ENVIANDO PARA O LCD MOVFW RTEC MOVWF RTEC1 MOVLW '*' ;ESCONDE A TECLA APERTADA COM ASTERISTICOS ; CALL CONVASCII ;CONVERTE ASCII CALL ED ;MOSTRA NO DISPLAY 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 (JÁ ACERTADA) CLRF GPIO MOVLW S2X CALL TRISIOX BSF P2 ;SETA PINO 7 GOTO $+1 GOTO $+1 GOTO $+1 MOVLW 0XFF MOVWF RTEC BTFSC P5 MOVLW '1' ;1 BTFSC P6 MOVLW '5' ;5 BTFSC P7 MOVLW '9' ;9 MOVWF RTEC CLRF GPIO MOVLW S5X CALL TRISIOX BSF P5 ;SETA PINO 5 MOVFW 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 RETURN MENSAGEM1 CLRW CLRF CONT VFG CLRF PCLATH CALL MENS1 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG RETURN MENSAGEM2 CLRW CLRF CONT VFG1 CLRF PCLATH CALL MENS2 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG1 RETURN MENSAGEM3 CLRW CLRF CONT VFG2 CLRF PCLATH CALL MENS3 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG2 RETURN MENSAGEM4 CLRW CLRF CONT VFG3 CLRF PCLATH CALL MENS4 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG3 RETURN MENSAGEM5 CLRW CLRF CONT VFG4 CLRF PCLATH CALL MENS5 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG4 RETURN MENSAGEM6 CLRW CLRF CONT VFG5 CLRF PCLATH CALL MENS6 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG5 RETURN MENSAGEM7 CLRW CLRF CONT VFG6 CLRF PCLATH CALL MENS7 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG6 RETURN MENSAGEM8 CLRW CLRF CONT VFG7 CLRF PCLATH CALL MENS8 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG7 RETURN MENSAGEM9 CLRW CLRF CONT VFG8 CLRF PCLATH CALL MENS9 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG8 RETURN MENSAGEM10 CLRW CLRF CONT VFG9 CLRF PCLATH CALL MENS10 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG9 RETURN MENSAGEM11 CLRW CLRF CONT VFG10 CLRF PCLATH CALL MENS11 MOVWF TEMP1 MOVF TEMP1,F ;TESTA BTFSC STATUS,Z RETURN CALL ED INCF CONT,F MOVFW CONT GOTO VFG10 RETURN WPROM ;ESCREVE NA E2PROM DADO=W /ENDEREÇO=ADDRESS BANK1 MOVWF EEDATA ;CARREGA DADO DE 'W' MOVFW ADDRESS 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 BANK1 MOVFW ADDRESS 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 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 NOP decfsz LC, F goto WAIT_uS_A return ;================================================================================= ;Rotinas de controle do LCD ;================================================================================= LcdInit movlw .30 ;Wait 30 ms call LcdDelay CLRF GPIO bcf FLCD_RS ;Set LCD command mode bsf LCD_DB4 ;0011->48 bsf LCD_DB5 call LcdPulse_E ;sequência de reset call LcdPulse_E call LcdPulse_E CLRF GPIO 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 movlw 01H ;clear display call EC movlw .2 ;Wait 2 ms call LcdDelay return ED bsf FLCD_RS ;ENVIA DADOS GOTO XENV LINE2 MOVLW 0XC0 EC bcf FLCD_RS ;ENVIA COMANDO XENV call EB return ;---------------------------------------------------------------------- ; ENVIA BYTES PARA LCD EB movwf tmp ;Send a byte to LCD by 4 bit data bus movlw SLCD call TRISIOX CLRF GPIO ;APAGA SAIDAS DB7 A DB4 btfsc tmp,4 bsf LCD_DB4 btfsc tmp,5 bsf LCD_DB5 btfsc tmp,6 bsf LCD_DB6 btfsc tmp,7 bsf LCD_DB7 call LcdPulse_E CLRF GPIO ;APAGA SAIDAS DB7 A DB4 btfsc tmp,0 bsf LCD_DB4 btfsc tmp,1 bsf LCD_DB5 btfsc tmp,2 bsf LCD_DB6 btfsc tmp,3 bsf LCD_DB7 call LcdPulse_E return ;PULSA 'E' PARA ENVIO DOS COMANDOS/DADOS LcdPulse_E MOVLW .250 ;min=.150 (achado por tentativa e erro) bsf LCD_E ;Enables LCD BTFSC FLCD_RS ;flag rs CALL WAIT_uS GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 bcf LCD_E ;Disabled LCD movlw .3 ;.1 ;Wait 1ms call LcdDelay return ; muda direção dos pinos conforme recebido em 'w' TRISIOX BANK1 ;TROCA DE BANCO MOVWF TRISIO ;ENTRADA OU SAIDA BANK0 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 END