Elektroda.pl
Elektroda.pl
X
Renex
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

LCD Graficzny na ST7920 - Jak cokolwiek na nim wyświetlić?

mirek1968 18 Maj 2013 11:26 5355 14
  • #1 18 Maj 2013 11:26
    mirek1968
    Poziom 13  

    Mam prośbę o pomoc w sprawie uruchomienia wyświetlacza LCD graficznego 12864 na ST7920 ,mój procesor to Atmega16.

    Poniżej wysyłam kawałek kodu do tego wyświetlacza ze strony sprzedawcy.
    Proszę o pomoc i wskazówki.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 14
  • Renex
  • Renex
  • #3 18 Maj 2013 11:37
    mirek1968
    Poziom 13  

    Mój problem polega na tym że nic mi nie wyświetla na LCD a chciałbym coś nieco zobaczyć na nim:-)

    0
  • #5 18 Maj 2013 17:21
    mirek1968
    Poziom 13  

    Posyłam zdjęcie mojego podłączenia z płytki testowej.
    LCD Graficzny na ST7920 - Jak cokolwiek na nim wyświetlić?

    Dodano po 3 [godziny] 48 [minuty]:

    Chciałem jeszcze coś dopisać tzn. czy linia RST wyświetlacza może być na stałe podpięta do plusa tak jak jest u mnie ?
    Bo o oryginalnym kodzie RST jest podpięte do PB4 i musiałem zmodyfikować ten kod takim wpisem,i niewiem czy dobrze zrobiłem.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    oraz dalej w kodzie
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 19 Maj 2013 21:21
    kowalelektronik
    Poziom 12  

    Witam.

    Akurat sam przerabiałem ten lcd niedawno.

    Sam użyłem interfejsu szeregowego ( bo taki tez ma :) i jest to plus bo wystarcza 2 piny procka aby na nim wyświetlić to co chcemy ).

    Komendy i pinologia zgodna ze standardowymi HDxxxx.

    Ten LCD posiada dodatkowy pin PSB - zmienia on tryb pracy lcd z transmisji szeregowej na równoległą. Pin 15 / cs1 na twoim schemacie. U mnie jest on na stale podpięty do masy ( transmisja szeregowa w moim przypadku- przy równoległej musi być podpięty do + ).

    Reset na stałe do +, nie wymaga żadnych resetów ten lcd jak go testowałem.

    Wszystko jest w PDF :)

    Pewnie problemem jest w twoim przypadku Pin PSB oraz brek ustawienia lcd w trybie transmisji równoległej.

    A jeszcze jedno, bym zapomniał, dlaczego napięcie regulacji kontrastu pobierasz z wbudowanej przetwornicy LCD ?? pin 18 ??

    U mnie wystarczył zwykły rezystor do + zasilania 1K. Przy zasilaniu z 5V.

    Mój kod na pic16f628 w asm do testu, transmisja szeregowa:

    Code:

       LIST P=16F628, R=HEX   ;typ procesora i format liczb
       #include P16F628.INC   ;dolaczenie pliku z definicjami
       __CONFIG h'3f10'      ;ustalenie zaw. rej. konfiguracyjnego
       
       errorlevel -302         ;maskuje komunikat o bledzie 302

    reg1      equ   h'20'      ;adres rejestru reg1
    licz      equ h'21'      ;adres rejestru licz
    temp1      equ h'22'      ;adres rejestru temp1
    templcd      equ h'23'      ;adres rejestru tempcmd
    licznik    equ h'24'      ;adres rejestru licznik
    tempspi      equ h'25'      ;adres rejestru tempspi
    counter      equ h'26'
    adr_data   equ h'27'
       
       #define wy porta,   1   ;definicja wyjscia
       #define we portb,   4   ;definicja wejscia
       #define wsk reg1,   0   ;wskaznik, bit o w rejestrze reg1
       #define sid porta,   0   ;linia danych lcd
       #define sclk porta,   7   ;linia zegara lcd
       #define ca status, c   ;flaga c
       #define ze status, z   ;flaga z
       #define bank0 bcf status, rp0
       #define bank1 bsf status, rp0





       #define nn   .150      ;czas opoznienia=nn/3 (ms)
       #define nn2   .5      ;czas opoznienia=nn/3 (ms)

       movlw h'07'
       movwf cmcon            ;wylacz komparator
       clrf porta            ;inicjalizacja portu a
       movlw b'00000001'      ;wsk=1
       movwf reg1            ;inicjalizacja reg1
       clrf templcd
       clrf adr_data

       movlw .64
       movwf counter         ;inicjacja licznika

       bank1         ;bank 1
       bcf pcon, oscf         ;gen. wewn. 37 kHz. Tcm= 108 us
       clrf trisa            ;port a wyjscia
       bcf option_reg, not_rbpu ;zalacz oporniki podciagajace
       bank0         ;bank 0
       call del
       call lcdinit         ;lcd incjacja

    loop                  ;petla glowna programu
                         ;pierwsze sprawdzenie przycisku
       btfss we            ;nacisnieto przycisk ?
       goto tak            ;tak, we=0
       goto nie            ;nie, we=1

    tak call del            ;czekaj 50ms
       btfsc we            ;drugie sprawdzenie
       goto tend            ;we=1 ->trwaja drgania stykow, idz na koniec
                         ;we=0 po opoznieniu, wyeliminowane drg. stykow

       btfsc wsk            ;sprawdz poprzedni stan
       goto tend            ;dalej jest 1, idz na koniec
       bsf wsk               ;zmiana stanu wyjscia z 1 na 0, ustaw wskazn.
                         ;neguje stan wyjscia po nacisnieciu przycisku
       movlw b'00000010'      ;maska dla linii RA1
       xorwf porta, f         ;zaneguj stan wyjscia (tylko linii RA1)


       movlw b'00000010'      ;komenda powrotu kursora
       call lcdsendcmd
       movlw "T"
       call lcdsenddata
       movlw "e"
       call lcdsenddata
       movlw "s"
       call lcdsenddata
       movlw "t"
       call lcdsenddata
       movlw "u"
       call lcdsenddata
       movlw "j"
       call lcdsenddata
       movlw "e"
       call lcdsenddata
       movlw " "
       call lcdsenddata

    looptxt
       movfw adr_data
       call tab
       addlw 0
       btfsc ze
       goto ttend
       call lcdsenddata
       incf adr_data, 1
       goto looptxt

    ttend
       clrf adr_data
       goto tend            ;idz na koniec

    nie call del            ;czekaj 50ms
       btfss we            ;drugie sprawdzenie
       goto tend            ;we=0 ->trwaja drgania stykow, idz na koniec
                         ;we=1 po opoznieniu, wyeliminowane drgania stykow
       
       btfss wsk            ;sprawdz poprzedni stan
       goto tend            ;dalej jest 0, idz na koniec
       bcf wsk               ;zmiana stanu wyjscia z 0 na 1, zeruj wskaznik
                         ;neguje stan wyjscia po zwolnieniu przycisku

       ;movlw b'00000010'      ;maska dla linii RA1
       ;xorwf porta, f         ;zaneguj stan wyjscia (tylko linii RA1)

    tend                  ;koniec procedury
          ;..... inne procedury petli
       movfw templcd
       call lcdsenddata
       incf templcd, 1
       decfsz counter, 1
       goto loop            ;idz do petli

       movlw b'00000010'      ;komenda powrotu kursora
       call lcdsendcmd
       movlw .64
       movwf counter         ;ponowna inicjacja licznika

       goto loop


    lcdinit
       movlw b'00110000'      ; // 8 bit data, basic instructions
       call lcdsendcmd
       movlw b'00110000'      ; // 8 bit data, basic instructions
       call lcdsendcmd
       movlw b'00001100'      ; // display on
       call lcdsendcmd
       movlw b'00000001'      ; // display clear
       call lcdsendcmd
       call del
       call del
       movlw b'00000110'      ; // increment, no shift
       call lcdsendcmd
       return

    lcdsendcmd
       movwf temp1            ;skopiowanie w do temp1
       movlw b'11111000'      ;start transmisji 5 jedynek, R/W, R/S, i zero - r/w=0 oraz r/s=0
       call sendspi
       movfw temp1
       andlw h'f0'
       call sendspi
       swapf temp1, 0
       andlw h'f0'
       call sendspi
       call del
       return

    lcdsenddata
       movwf temp1            ;skopiowanie w do temp1
       movlw b'11111010'      ;start transmisji 5 jedynek, R/W, R/S, i zero - r/w=0 oraz r/s=1
       call sendspi
       movfw temp1
       andlw h'f0'
       call sendspi
       swapf temp1, 0
       andlw h'f0'
       call sendspi
       call del
       return

    sendspi
       movwf tempspi
       movlw .8
       movwf licznik
       bcf ca
    looptxspi
       rlf tempspi, f
       btfss ca
       bcf sid
       btfsc ca
       bsf sid
       bsf sclk
       call delspi
       bcf sclk
       decfsz licznik
       goto looptxspi

       return


    del                     ;opoznienie (czas opoznienia w przyblizeniu = Tcm*3*nn)
       movlw nn            ;czas opoznienia
       movwf licz            ;wpis nn do rejestru licz
       decfsz licz, f         ;dekrementuj rejestr licz
       goto $-1            ;petla gdy licz > 0

       return               ;powrot

    delspi                  ;opoznienie (czas opoznienia w przyblizeniu = Tcm*3*nn)
       movlw nn2            ;czas opoznienia
       movwf licz            ;wpis nn do rejestru licz
       decfsz licz, f         ;dekrementuj rejestr licz
       goto $-1            ;petla gdy licz > 0

       return               ;powrot

    tab
       addwf pcl, f
       dt "Test LCD by Kowal ;-) ", 0, 0

       end


    Pozdrawiam.
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #7 20 Maj 2013 11:03
    mirek1968
    Poziom 13  

    Co do regulacji kontrastu to tak zaprojektował to producent płyty testowej,natomiast odnośnie pinu CS1 (ale u mnie na LCD opisany jest jako PSB) to wymusiłem mu na stałe plus poprzez "#define USE_PSB 1" natomiast nie wiem jak ustawić linię CS2 czyli u mnie NC(tak opisany jest ten pin na moim LCD) czy mam go ustawić na 0 czy 1?

    Ja programuję jedynie w C i niestety nie znam innych języków

    To mój obecny kod po modyfikacjach proszę go przejrzeć bo nadal nic na LCD nie widać:-(

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I jeszcze jedna sprawa coś zaczęło mi się przebijać na LCD ale jest bardzo jasny LCD i nie mogę wyregulować kontrastu pomimo że kręcę i kręcę potencjometrem w czym może być problem ,może ta linia VEE u mnie jest do niej z jednej strony podpięty potencjometr zamiast do masy ,W jaki sposób uruchomić tę linię VEE na lCD aby poprawnie wyregulować kontrast?

    0
  • #8 22 Maj 2013 09:31
    mirek1968
    Poziom 13  

    Jest ktoś w stanie z szanownych kolegów pomóc w sprawie tego kontrastu?
    Kontrast mam wpięty w ten sposób.potencjometr 10K pomiędzy VCC i GND a suwak do VO wyświetlacza ,regulacja napięcia na VO działa poprawnie(zmienia się napięcie w całym zakesie 0...5V ) ale widać tylko cienie napisu na LCD i nie działa tak naprawdę ta regulacja.A może mam coś nie tak z programem?
    Ale jak wpiszę cokolwiek to pokazuje mi to na LCD tylko że jest bardzo słabo widoczny napis bardzo jasny nie wiem co dalej z tym robić.Proszę o pomoc.

    Ach i jeszcze jedna sprawa pomyliłem się chyba w programie z opisem linii LCD
    Tak jest w rzeczywistości terraz.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 15 Lip 2013 19:22
    mirek1968
    Poziom 13  

    Mój problem z tym LCD polega na tym że mój wyświetlacz jest na 3,3V a ja mam zasilanie 5V na mojej płytce testowej.Proszę o pomoc w jaki sposób zaadoptować ten LCD do napięcia jego zasilania 3,3V.nie wiem jak to zrobić ponieważ sygnały sterujące też pewnie muszą mieć poziom H jako 3,3V i tu już jest problem.Jeśli Ktoś z kolegów ma jakiś pomysł to proszę o odpowiedź.

    0
  • #10 16 Lip 2013 08:44
    mkpl
    Poziom 37  

    Wyświetlacz jest jednokierunkowy. Wystarczą dzielniki napięcia na każdej lini sterującej i się "zgada" 5 z 3.3V. Właśnie czytałem kartę katalogową tego sterownika i o ile on może pracować na 5V to wewnątrz ma jeszcze podwajacz napięcia który jak jest tam na wykresie daje zbyt duże napięcie przy 5V

    0
  • #11 19 Lip 2013 18:21
    mirek1968
    Poziom 13  

    Jak wykonać w prosty przede wszystkim tanim kosztem (nie przekraczającym koszt nowego LCD) te dzielniki napięcia.Muszę zbić z 5 na 3,3V cztery linie sterujące oraz zasilanie LCD oraz zasilanie podświetlenia,kontrast chyba już nie bo tam podczas regulacji będę uważał żeby nie przekroczyć 3,3V.Jeśli masz jakiś pomysł prosty w formie schemaciku to proszę o pomoc.Na portalu xyz hobby robot widziałem coś takiego dla lcd Nokii. LCD Graficzny na ST7920 - Jak cokolwiek na nim wyświetlić?

    Nie wiem tylko czy konieczny jest ten układ scalony tzn. bufor 74LS07 czym go zastąpić i jaka jest jego cena.Proszę o odpis co ty na to?

    0
  • #13 20 Lip 2013 17:44
    mirek1968
    Poziom 13  

    Muszę spróbować wdrożyć ten dzielnik w życie i wtedy dam znać o efektach-dzięki za podpowiedź.:-)

    0
  • #14 16 Lis 2013 23:19
    smajlas
    Poziom 12  

    Odświeżę temat. Właśnie próbowałem zmusić wyświetlacz 12864ZW (sterownik ST7920) do pracy.
    Głównym problemem było ustawianie kontrastu. Problem pokonałem, a tutaj dwie istotne sprawy:
    1. Ten wyświetlacz nie współpracuje z podstawową konfiguracją typu potencjometr do Vcc druga strona do GND a ślizgacz do Vo (pin kontrastu). W tym konkretnym modelu należy użyć potencjometru o wartości co najmniej 10kohm (ja takiego użyłem) jeden koniec do Vcc (+5V), drugi koniec do Vout (pin18 w LCD), odczep do Vo (pin 3 w LCD).
    2. Kontrast nie będzie działał poprawnie dopóki zworka J1 "na plecach" naszego LCD nie jest zwarta. (Kropelka cyny i lutownica załatwiają sprawę)

    Powodzenia

    0
  • #15 20 Sty 2015 19:28
    mirek1968
    Poziom 13  

    Kupiłem wyświetlacz graficzny z tym samym procesorem w srodku tylko że na 5V i wszystko działa dobrze.
    Zamykam temat i dziękuję Wszystkim za pomoc.

    0