Ainda não consegui escrever nada no display, o esquema da placa é esse:
O cristal que estou usando é de 20MHz, o display eu liguei em modo de 4 bits, no conector na parte de baixo da figura eu deixei conectado assim:
Display D4 > Port A pino 3
Display D5 > Port A pino 2
Display D6 > Port A pino 1
Display D7 > Port A pino 0
O código que usei, tem algumas subrotinas para ler um teclado matricial e escrever e ler eeprom mas não sei se estão funcionando, no momento quero testar só as subs para o LCD:
- Código: Selecionar todos
;*************************************************************************************************************
;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
btfsc L1
goto principal
goto monitoramento
;*************************************************************************************************************
;Sub-rotina de monitoramento
;*************************************************************************************************************
monitoramento
call Tela_ligado
call mensagemsenha
monitoramento2
bcf C3
bsf C3
btfsc L1
goto monitoramento2
call digitasenha
;*************************************************************************************************************
;Sub-rotina para digitar senha
;*************************************************************************************************************
digitasenha
call coluna
call coluna
call coluna
call coluna
return
;*************************************************************************************************************
;Sub-rotina de leitura das teclas
;*************************************************************************************************************
coluna
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
call wr_dado
call Delay_3us
call Delay_1s
call Delay_1s
call Delay_1s
call linha2
movlw 0xC7 ;poe cursor na liha 2 na posição 7
call wr_inst
call Delay_15ms ;atraso de 15ms para a instrucao ser escrita no LCD
call coluna1
call coluna2
call coluna3
return
;*************************************************************************************************************
;Sub-rotina de leitura da coluna 1
;*************************************************************************************************************
coluna1
bsf C1
bcf C2
bcf C3
call Delay_1s
call teclascoluna1
return
;*************************************************************************************************************
;Sub-rotina de leitura da coluna 2
;*************************************************************************************************************
coluna2
bcf C1
bsf C2
bcf C3
call Delay_1s
call teclascoluna2
return
;*************************************************************************************************************
;Sub-rotina de leitura da coluna 3
;*************************************************************************************************************
coluna3
bcf C1
bcf C2
bsf C3
call Delay_1s
call teclascoluna3
return
;*************************************************************************************************************
;Sub-rotina de leitura das teclas da coluna 1
;*************************************************************************************************************
teclascoluna1
btfss L1
goto col1tecla2
movlw '*'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
col1tecla2
btfss L2
goto col1tecla3
movlw '7'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
col1tecla3
btfss L3
goto col1tecla4
movlw '4'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
col1tecla4
btfss L4
return
movlw 'l'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
return
;*************************************************************************************************************
;Sub-rotina de leitura das teclas da coluna 2
;*************************************************************************************************************
teclascoluna2
btfss L1
goto col2tecla2
movlw '0'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
col2tecla2
btfss L2
goto col2tecla3
movlw '8'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
col2tecla3
btfss L3
goto col2tecla4
movlw '5'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
col2tecla4
btfss L4
return
movlw '2'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
return
;*************************************************************************************************************
;Sub-rotina de leitura das teclas da coluna 3
;*************************************************************************************************************
teclascoluna3
btfss L1
goto col3tecla2
bsf buzzer
call Delay_3us
bcf buzzer
goto principal
col3tecla2
btfss L2
goto col3tecla3
movlw '9'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
col3tecla3
btfss L3
goto col3tecla4
movlw '6'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
col3tecla4
btfss L4
return
movlw '3'
call wr_dado
bsf buzzer
call Delay_3us
bcf buzzer
return
;*************************************************************************************************************
;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 de mensagem para inserir senha
;*************************************************************************************************************
mensagemsenha
call linha1
call Delay_1s
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 ' '
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 ' '
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
;*************************************************************************************************************
;Sub-rotina para ler a EEPROM
;*************************************************************************************************************
ler
bsf STATUS, RP1
bcf STATUS, RP0 ;Bank 2
movf ende, W ;escreve endereço
movwf EEADR
bsf STATUS, RP0 ;Bank 3
bcf EECON1, EEPGD
bsf EECON1, RD
bcf STATUS, RP0 ;Bank 2
movf EEDATA, W
movwf dado
bcf STATUS, RP0 ;Bank0
bcf STATUS, RP1
return
;*************************************************************************************************************
;Sub-rotina para escrever na EEPROM
;*************************************************************************************************************
escrever
bsf STATUS, RP1
bsf STATUS, RP0 ;Bank 3
btfsc EECON1, WR
goto $-1
bcf STATUS, RP0 ;Bank 2
movf ende, W
movwf EEADR
movf dado, W
movwf EEDATA
bsf STATUS, RP0 ;Bank 3
bcf EECON1, EEPGD
bsf EECON1, WREN
bcf INTCON, GIE
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1, WR
bsf INTCON, GIE
bcf EECON1, WREN
bsf EECON1, EEPGD
bcf STATUS, RP0
bcf STATUS, RP1 ;Bank 0
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