Witam serdecznie!
Zabrałem się za oprogramowanie wyświetlacza LCD przy pomocy wspomnianego wyżej pic-a i jak to w życiu bywa wyświetlacz nie chce współpracować
Podłączyłem wyswieltacz do Pica w następujący sposób
LCD<->PIC
RS- RA0
RW na stałe do GND
E - RA1
D4 - RB0
D5 - RB1
D6 - RB2
D7 - RB3
Z podłączenia widać, że chciałbym sterować wyświetlaczem w trybie 4 bitowym. Wtedy zgodnie z informacjami, które udało mi się zebrać najpierw należy zapisać do wyświetlacza starsze 4 bity danych (podając opadające zbocze na wejście E), a następnie młodsze 4-bity. Po włączeniu wyświetlacz jednak przechodzi automatycznie w tryb pracy 8-bitowy więc należy go najpierw zmienić . Wszystko jest jasne, jednak pomimo wielu prób nadal nic nie wyświetla. Podświetla się i na tym się kończy jego działanie.
Jest to wyświetlacz 2x16, który posiada 16, a nie jak w większości źródeł w internecie 14 linij sterowania. Dodatkowo posiada jeszcze z boku dwa dodatkowe wejścia. Nie wiem do czego mogą one służyć i może z tego powodu nie działa.
Druga sprawa dotyczy trzeciego portu wyświetlacza (kontrast), który zgodnie ze schematami jakie widziałem w internecie powinien zostać podłączony przez regulowany rezystor 4,7kOm-a. Ja nie miałem takiego, dlatego połączyłem dwa rezystory 0,5kOm-a i 1KOm szeregowo i sygnał na port numer 3 podciągnąłem z pomiędzy tych rezystorów. Napięcie zasilające 5V. Jednak czy jest ten syg podłączony czy nie, nie ma to wpływu na stan wyświetlacza...
Oto kod, który napisałem (używam sygnału zegarowego 8Mhz):
Gdyby ktoś miał taki problem i miał jakieś informacje na ten temat, uprzejmie proszę o pomoc...
Pozdrawiam!
Zabrałem się za oprogramowanie wyświetlacza LCD przy pomocy wspomnianego wyżej pic-a i jak to w życiu bywa wyświetlacz nie chce współpracować
Podłączyłem wyswieltacz do Pica w następujący sposób
LCD<->PIC
RS- RA0
RW na stałe do GND
E - RA1
D4 - RB0
D5 - RB1
D6 - RB2
D7 - RB3
Z podłączenia widać, że chciałbym sterować wyświetlaczem w trybie 4 bitowym. Wtedy zgodnie z informacjami, które udało mi się zebrać najpierw należy zapisać do wyświetlacza starsze 4 bity danych (podając opadające zbocze na wejście E), a następnie młodsze 4-bity. Po włączeniu wyświetlacz jednak przechodzi automatycznie w tryb pracy 8-bitowy więc należy go najpierw zmienić . Wszystko jest jasne, jednak pomimo wielu prób nadal nic nie wyświetla. Podświetla się i na tym się kończy jego działanie.
Jest to wyświetlacz 2x16, który posiada 16, a nie jak w większości źródeł w internecie 14 linij sterowania. Dodatkowo posiada jeszcze z boku dwa dodatkowe wejścia. Nie wiem do czego mogą one służyć i może z tego powodu nie działa.
Druga sprawa dotyczy trzeciego portu wyświetlacza (kontrast), który zgodnie ze schematami jakie widziałem w internecie powinien zostać podłączony przez regulowany rezystor 4,7kOm-a. Ja nie miałem takiego, dlatego połączyłem dwa rezystory 0,5kOm-a i 1KOm szeregowo i sygnał na port numer 3 podciągnąłem z pomiędzy tych rezystorów. Napięcie zasilające 5V. Jednak czy jest ten syg podłączony czy nie, nie ma to wpływu na stan wyświetlacza...
Oto kod, który napisałem (używam sygnału zegarowego 8Mhz):
#include 16f84.h
N EQU 0x0C
FIXDELAY EQU 0x0D
TMP equ 11h
#define E porta,1
#define RS porta,0
;*******************************************************************
org 0x00
START
CLRF porta
CLRF portb
MOVLW 0x00
BSF RP0
MOVWF trisa
MOVWF trisb
BCF RP0
MOVLW 0xE6
CALL NDELAY
MOVLW 0xE6
CALL NDELAY
INITLCD BCF RS
movlw .2 ;przejscie w tryb 4-bitowy
movwf portb
CALL ENABLEPULSE
MOVLW 0xFF
CALL NDELAY
movlw .8 ;wyłącz wyświetlacz
call WR_CMD
movlw .1 ;wyczyść wyswietlacz
call WR_CMD
movlw .2 ;powrót karetki
call WR_CMD
movlw .15 ;wyswietlacz on, miganie on, kursor on
call WR_CMD
movlw .8 ;entry mode, auto-incrementacja
call WR_CMD
MAIN
movlw 80h ;ustalenie adresu poczatkowego na 00h
call WR_CMD
movlw A'p'
call WR_DATA
movlw A'i'
call WR_DATA
movlw A'c'
call WR_DATA
FOREVER
nop
goto FOREVER
;*******************************************************************
ENABLEPULSE ;opadające zbocze sygnału E (zapis instrukcji do wyswietlacza)
BSF E
CALL DELAY200
CALL DELAY200
CALL DELAY200
CALL DELAY200
BCF E
CALL DELAY200
CALL DELAY200
CALL DELAY200
CALL DELAY200
RETURN
;************************************************************************
WR_DATA ;zapis danej do wyświetlacza
bsf RS
goto ET_WR
WR_CMD ;zapis instrukcji do wyswietlacza (w trybie 4-bitowym)
bcf RS
ET_WR bsf E
movwf TMP
swapf TMP,0
movwf portb
MOVLW 0x04
CALL NDELAY
bcf E
MOVLW 0x04
CALL NDELAY
bsf E
movlw TMP
movwf portb
MOVLW 0x04
CALL NDELAY
bcf E
MOVLW 0x04
CALL NDELAY
bsf E
MOVLW 0x0F
CALL NDELAY
return
;***********************************************************************************
NDELAY
MOVWF N ; N is delay multiplier
NOTOVER CALL DELAY200 ; Call for 200us
CALL DELAY200 ; Call for 200us
DECFSZ N, 1 ; Decrease N by 1
GOTO NOTOVER ; The delay isn't done
RETURN
;***********************************************************************************
DELAY200
MOVLW 0xC8 ; 200 LOOPS
MOVWF FIXDELAY ; 200us fixed delay
NOTDONE200 DECFSZ FIXDELAY, 1 ; Decrement of FIXDELAY
GOTO NOTDONE200 ; If 200us isn't up go back to NOTDONE200
RETURN ; If 200us is up then return to instruction.
;***********************************************************************************
DELAY50
MOVLW 0x32 ; 50 LOOPS
MOVWF FIXDELAY ; 50us fixed delay
NOTDONE50 DECFSZ FIXDELAY, 1 ; Decrement of FIXDELAY
GOTO NOTDONE50 ; If 50us isn't up go back to NOTDONE50
RETURN ; If 50us is up then return to instruction.
END
Gdyby ktoś miał taki problem i miał jakieś informacje na ten temat, uprzejmie proszę o pomoc...
Pozdrawiam!