Olhei ontem a noite os meus backups, não consegui encontrar a ultima versão da lógica que estava fazendo, peguei uma mais antiga, retirei algumas coisas da lógica para ficar mais facil de corrigir, posso ter esquecido de retirar algumas coisas. Só preciso inicializar o LCD corretamente e escrever um caractere, o resto eu me viro e corrijo com calma. Uma outra dúvida, como posso fazer para o Pic realizar toda lógica mas em paralelo ele fazer leitura de um encoder? obrigado, abraço.
;*************************************************************************************************************
;Alarme residencial
;*************************************************************************************************************
#include <P16F877A.inc> ;modelo do PIC
;*************************************************************************************************************
TEMP1 equ 22h ;Variavel temporaria
TEMP2 equ 23h ;Variavel temporaria
TEMP3 equ 24h ;Variavel temporaria
TempLCD equ 25h ;Tempo do LCD
senha1 equ 26h ;digito 1 da senha
senha2 equ 27h ;digito 2 da senha
senha3 equ 28h ;digito 3 da senha
senha4 equ 29h ;digito 4 da senha
senha equ 30h
caractere equ .4 ;digitos da senha
senhaala equ .2010 ;senha do alarme
Tempsenha equ 30h
digito equ 31h
flag equ 32h
ende equ 33h ;endereço
dado equ 34h ;dados
#define BANK0 BCF STATUS, RP0 ;Seta o banco 0 de memória
#define BANK1 BSF STATUS, RP0 ;Seta o banco 1 de memória
#define E PORTE,2
#define RS PORTC,1
#define D4 PORTA,3
#define D5 PORTA,2
#define D6 PORTA,1
#define D7 PORTA,0
;*************************************************************************************************************
org 00h ;vetor de reset
goto inicio ;vai para o inicio do programa
;*************************************************************************************************************
;Rotina de inicio do programa
;*************************************************************************************************************
inicio
bsf STATUS,RP0 ;muda para banco 1
movlw 06h
movwf ADCON1 ;Usar as portas A e E como I/O e nao como A/D
movlw B'00000000'
clrf TRISA
clrf TRISB
clrf TRISC
clrf TRISD
clrf TRISE
movwf TRISA
movlw B'00000000'
movwf TRISC
movlw B'11110000'
movwf TRISD
movlw B'00000000'
movwf TRISE
movlw .31
movwf TRISB
clrf OPTION_REG
bcf STATUS,RP0 ;muda para banco 0
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
call reseta_valores
call Inicia_lcd ;chama rotina de configuracao do Display
call Tela_inicial
;*************************************************************************************************************
;Rotina principal
;*************************************************************************************************************
principal
bcf C3
call Delay_1s
call Delay_1s
bsf C1
goto principal
;*************************************************************************************************************
;Sub-rotina de escrita da mensagem de tela inicial no lcd
;*************************************************************************************************************
Tela_inicial
call linha1
movlw ' '
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw 'A'
call wr_dado
call Delay_3us
movlw 'l'
call wr_dado
call Delay_3us
movlw 'a'
call wr_dado
call Delay_3us
movlw 'r'
call wr_dado
call Delay_3us
movlw 'm'
call wr_dado
call Delay_3us
movlw 'e'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw 'D'
call wr_dado
call Delay_3us
movlw 'e'
call wr_dado
call Delay_3us
movlw 's'
call wr_dado
call Delay_3us
movlw 'l'
call wr_dado
call Delay_3us
movlw 'i'
call wr_dado
call Delay_3us
movlw 'g'
call wr_dado
call Delay_3us
movlw 'a'
call wr_dado
call Delay_3us
movlw 'd'
call wr_dado
call Delay_3us
movlw 'o'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
call linha2
movlw ' '
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw '*'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw '>'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw 'L'
call wr_dado
call Delay_3us
movlw 'i'
call wr_dado
call Delay_3us
movlw 'g'
call wr_dado
call Delay_3us
movlw 'a'
call wr_dado
call Delay_3us
movlw 'r'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
call Delay_1s
call linha2
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
return
;*************************************************************************************************************
;Sub-rotina de escrita da mensagem de alarme ligado no lcd
;*************************************************************************************************************
Tela_ligado
call linha1
call Delay_1s
movlw ' '
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw 'A'
call wr_dado
call Delay_3us
movlw 'l'
call wr_dado
call Delay_3us
movlw 'a'
call wr_dado
call Delay_3us
movlw 'r'
call wr_dado
call Delay_3us
movlw 'm'
call wr_dado
call Delay_3us
movlw 'e'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw 'l'
call wr_dado
call Delay_3us
movlw 'i'
call wr_dado
call Delay_3us
movlw 'g'
call wr_dado
call Delay_3us
movlw 'a'
call wr_dado
call Delay_3us
movlw 'd'
call wr_dado
call Delay_3us
movlw 'o'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
call linha2
movlw ' '
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw '#'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw '>'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
movlw 'D'
call wr_dado
call Delay_3us
movlw 'e'
call wr_dado
call Delay_3us
movlw 's'
call wr_dado
call Delay_3us
movlw 'l'
call wr_dado
call Delay_3us
movlw 'i'
call wr_dado
call Delay_3us
movlw 'g'
call wr_dado
call Delay_3us
movlw 'a'
call wr_dado
call Delay_3us
movlw 'r'
call wr_dado
call Delay_3us
movlw ' '
call wr_dado
call Delay_3us
call Delay_1s
call linha2
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
return
;*************************************************************************************************************
; Sub-rotina para iniciar configuracao do display
;*************************************************************************************************************
Inicia_lcd
bsf E
nop
nop
nop
bcf RS
nop
nop
nop
movlw 03h
movwf PORTA
bcf E
call Delay_15ms
bsf E
nop
nop
nop
bcf RS
nop
nop
nop
movlw 03h
movwf PORTA
bcf E
call Delay_15ms
bsf E
nop
nop
nop
bcf RS
nop
nop
nop
movlw 03h
movwf PORTA
bcf E
call Delay_15ms
bsf RS
nop
nop
nop
movlw 02h
movwf PORTA
bcf E
call Delay_15ms
bsf E
nop
nop
nop
bcf RS
nop
nop
nop
movlw 02h
movwf PORTA
bcf E
call Delay_15ms
movlw 28h ;00101000 ==> Modo de comunicação de 4 bits
call wr_inst ;duas linhas e matriz 8x5 ou 7x5
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
movlw 08h
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
movlw 01h
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
movlw 01h
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
movlw 06h ;Escreve deslocando o cursor para a direita
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
movlw 0Eh ;Display aceso com cursor fixo
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
movlw 01h ;Limpa o display e retorna o cursor para o inicio (home)
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
return
;*************************************************************************************************************
;Sub-rotina para posicionar o curso na linha 1
;*************************************************************************************************************
linha1
movlw 0x80 ;poe cursor na linha 1 na posição 0
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
return
;*************************************************************************************************************
;Sub-rotina para posicionar o curso na linha 2
;*************************************************************************************************************
linha2
movlw 0xC0 ;poe cursor na linha 1 na posição 0
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
return
;*************************************************************************************************************
;Sub-rotina para habilitar o display lcd para dados
;*************************************************************************************************************
wr_inst
movwf TempLCD ;coloca valor no registrador temporario
bsf E
call Delay_3us
bcf RS ;habilita para comandos
call Delay_3us
swapf TempLCD,W
andlw B'00001111'
movwf PORTA
bcf E
call Delay_3us
movf TempLCD,W
andlw B'00001111'
bsf E
call Delay_3us
bcf RS ;habilita para dados
call Delay_3us
movwf PORTA
bcf E
return
;*************************************************************************************************************
;Sub-rotina para escrever dado no display lcd
;*************************************************************************************************************
wr_dado
movwf TempLCD ;Armazena o dado em TempLCD
bsf E ;Habilita LCD
call Delay_3us
bsf RS ;Seta LCD para modo dados
call Delay_3us
swapf TempLCD,W
andlw B'00001111'
movwf PORTA
bcf E ;Finaliza operação, desabilitando o LCD
movf TempLCD,w
andlw B'00001111'
bsf E ;Habilita LCD
call Delay_3us
bsf RS ;Seta LCD para modo dados
call Delay_3us
movwf PORTA
bcf E ;Finaliza operação, desabilitando o LCD
return
;*************************************************************************************************************
;Sub-rotina para resetar valores
;*************************************************************************************************************
reseta_valores
movlw .11
movwf senha1 ;inicializa senha1 com o valor de "*"
movlw .11
movwf senha2 ;inicializa senha1 com o valor de "*"
movlw .11
movwf senha3 ;inicializa senha1 com o valor de "*"
movlw .11
movwf senha4 ;inicializa senha1 com o valor de "*"
movlw .4
movwf digito ;inicializa digito com o valor 4
movlw .11
movwf Tempsenha ;inicializa Tempsenha com o valor de "*"
return
;*************************************************************************************************************
; Subrotina de atraso de aproximadamente 15 ms
;*************************************************************************************************************
Delay_15ms
movlw 50 ;move 50 para o acumulador
movwf TEMP1 ;move o valor do acumulador para TEMP1
Loop1
movlw 10 ;move 10 para o acumulador
movwf TEMP2 ;move o valor do acumulador para TEMP2
Loop2
decfsz TEMP2,F ;decrementa TEMP2, skip se zero
goto Loop2 ;vai para o endereço Loop2
decfsz TEMP1,F ;decrementa TEMP1, skip se zero
goto Loop1 ;vai para o endereço Loop1
return
;*************************************************************************************************************
; Subrotina de atraso de aproximadamente 750 ms
;*************************************************************************************************************
Delay_750ms
movlw 50 ;move 50 para o acumulador
movwf TEMP3 ;move o valor do acumulador para TEMP3
decrementa
call Delay_15ms
decfsz TEMP3,F ;decrementa TEMP3, skip se zero
goto decrementa ;vai para o endereço LABEL3
return
;*************************************************************************************************************
; Subrotina de atraso de aproximadamente 15 ms
;*************************************************************************************************************
Delay_3us
nop
return
;*************************************************************************************************************
; Subrotina de atraso de aproximadamente 1 segundo
;*************************************************************************************************************
Delay_1s
movlw 10 ;move 10 para o acumulador
movwf TEMP1 ;move o valor do acumulador para TEMP1
LABEL1
movlw 50 ;move 50 para o acumulador
movwf TEMP2 ;move o valor do acumulador para TEMP2
LABEL2
movlw 50 ;move 50 para o acumulador
movwf TEMP3 ;move o valor do acumulador para TEMP3
LABEL3
decfsz TEMP3,F ;decrementa TEMP3, skip se zero
goto LABEL3 ;vai para o endereço LABEL3
decfsz TEMP2,F ;decrementa TEMP2, skip se zero
goto LABEL2 ;vai para o endereço LABEL2
decfsz TEMP1,F ;decrementa TEMP1, skip se zero
goto LABEL1 ;vai para o endereço LABEL1
return
end ;diretiva de fim do programa