Grafinio LCD valdymas AVR mikrokontrolerio pagalba

Tikriausiai ne vienas esate susidūrę su grafiniais LCD ekranais kurie yra valdomi standartiniu KS0108 LCD kontroleriais. Būtent tokie yra HQM1286404 LCD moduliai. Jų raiška neįspūdinga – 128×64, tačiau pakankama daugeliams įdomių projektų. Šių modulių aprašymas <datasheet>. Tik pagal datasheet nesusimaišykite su išvadais, nes HQM1286404 modulio PCB versija yra 4, o datasheete aprašyta 5 versija, kurio išvadų išdėstymas skiriasi. Šis modulis taip pat yra aprūpintas apšvietimu, kurio lygis gali būti reguliuojamas potenciometru arba interaktyviai PWM pagalba. Na čia jau kit klausimai.

Po sėkmingo išbandymo su maketine plokšte, nuspręsta pasigaminti paprastą GLCD testavimo plokštę.

GLCD_board.JPG

Su maketine plokšte yra nemažai vargo vien dėl kokybiško GLCD išvadų pajungimo, nes jų yra 20, be to kištuko standartas truputį kitoks nei maketavimo plokštės priima. Tarpai tarp išvadų yra 2mm o ne 2,54. Todėl tenka arba persilituoti didesnį kištuką arba, kaip šiuo atveju, pasigaminti atskirą plokštę patogiam prijungimui.

Pirmiausia kaip buvo minėta skiriasi LCD išvadų išdėstymas, todėl teko panaršyti internete, palandžioti po forumus pavyko sudėlioti teisingą išdėstymą:

1: Vcc(+5V);

2: GND

3: VCON

4-11: DB0-DB7

12: CS2

13: CS1

14: RESET

15: R/W

16: D/I

17: EN

18: VEE

19: LED Anode

20: LED Kathode

Kaip matote jungimas kažkuo primena tekstinio LCD jungimą, tačiau čia dar yra tokie išvadai kaip CS1, CS2, VEE. Reikalas tame, jog Grafinis LCD reikalauja neigiamos įtampos GND atžvilgiu. Dėl to potenciometras yra jungiamas tarp GND ir VEE, o reguliuojamas išvadas į VCON kuris reguliuoja LCD kontrastą. CS1 ir CS2 signalai valdo du atskirus 64×64 LCD blokus. Todėl praktiškai 128×64 LCD yra nekas kita kaip 2 atskiri LCD po 64×64 pikselių. Analogiški LCD su didesniu pikselių skaičiumi turi daugiau CS išvadų, nes tokių blokų yra daugiau.

Kadangi pradiniai bandymai buvo daryti su Atmega8, pateikiamas teisingas pajungimo būdas:

GLCD_pins.png

Grįžtame prie testavimo plokštės. Jai pagaminti buvo nuspręsta naudoti Atmega16 kuris gali būti pakeičiamas į Atmega32, nes sutampa išvadai. Prijungus LCD, lieka dar nemažai laisvų išvadų, kuriuos galima panaudoti kitoms reikmėms, pvz ADC nuskaitymui, mygtukų pajungimui, bei RS232 sąsajos įgyvendinimui. Todėl gaminant plokštę šie išvadai numatyti ir galima juos patogiai naudoti. PVZ per ADC galima skaityti kad ir temperatūros reikšmes ir atvaizduoti jos kitimo grafiką LCD. O prijungtais mygtukais galima valdyti menu. Čia jau fantazijos reikalas.

Testavimo plokštės schema:

circuit_thumb.PNG

Kadangi po ranka buvo 100x50mm vienpusė fotorezistu dengta plokštė, tai nuspręsta ant jos viską ir sutalpinti. Rezultate gavosi Nesudėtingai pagaminama testavimo plokštė, kuri turi šias savybes:

· Keičiamas Atmega16 arba Atmega32;

· 16MHz kvarcinis rezonatorius;

· ISP programavimui neišimant mikroschemos;

· RS232 interfeisas per MAX232;

· Reguliuojamas AREF įtampos lygis;

· Grafinio LCD patogus prijungimas bei reguliuojamas kontrastas;

· 3 ADC įėjimai;

· 10 bendros paskirties išvadų;

· Įtampos reguliatorius su LED indikacija;

· Reset mygtukas.

Plokštės išvadų išdėstymas:

pcbsilk.png

Gaunasi plokštė su nemažu potencialu eksperimentams.

Kai plokštė baigta, sekantis žingsnis – jos programavimas. Tikriausiai programuoti nuo 0 tikrai būtų menkas malonumas. O iš tikro kam išradinėti dviratį. LCD modulis yra pakankamai senai naudojamas pasaulyje, todėl galima rasti nemažai prirašytų programų jiems, o tuo labiau bibliotekų. Todėl mažai galvojus reikia imti vieną tinkamiausią ir naudoti. Tada kodo rašymas tampa vienu malonumu, nes nereikia galvoti apie atskirus signalus, bet pakankama parašyti pora eilučių ir jau matai rezultatą ekrane. Pasižvalgius po interneto platybes buvo nuspręsta priglausti Fabian Maximillian kadaise suprogramuotą KS0108 valdymo biblioteką tinkamą WinAVR GCC kompiliatoriui. Parsisiųsti GLCD biblioteką. Kuo ypatinga ši biblioteka, ogi tuo kad ji turi galingą funkciją – patogų šriftų valdymą, na ir žinoma kitos grafinės funkcijos kaip piešimas. Biblioteka labai lengva modifikuoti įvedant papildomas funkcijas. Bet labiausiai patiko šriftų įrankis. Tereikia parsisiųsti GLCDFontCreator2 java programėlę, kurios pagalba galima susigeneruoti bet kuriuos šriftus esančius Windows sistemoje ir juos lengvai naudoti atvaizdavimui LCD ekrane.

Font_creator.jpg

Šriftų generatorius generuoja .h failiuką kurį galima įkelti į programą (#include „manosriftas.h“) ir pasirinkti norimą šriftą paprasta komanda:

ks0108SelectFont(manosriftas, ks0108ReadFontData, BLACK);

o išvedimas dar paprastesnis:

ks0108Puts(”www.dreifas.net”);

arba tiesiai iš flash atminties:

ks0108Puts_P(PSTR(”Testuojam”));

Aišku kokia biblioteka būtų jeigu negalėtum piešti. Yra labai daug komandų, kurios leidžia valdyti piešimą LCD ekrane. Pvz.:

//užapvalintas stačiakampis

ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK);

//linija

ks0108DrawLine(5, 50, 122, 50, BLACK);

//apskritimas

ks0108DrawCircle(25, 55, 5, BLACK);

yra žinoma daugiau, kuriuos rasite bibliotekoj.

Kas naudojasi Proteus simuliatoriumi, ten taip pat yra galimybė virtualiai simuliuoti grafinio LCD darbą. Ten reikia pasirinkti LGM12641BS1R modelį iš bibliotekos kuris yra adekvatus realiam HQM1286404 modeliui. Todėl programos parašytos simuliatoriui veiks ir ant realaus LCD.Bet palikim simuliavimą kitam kartui.

Pabaigai prisegu bandymo programos pavyzdį, kuris išveda paprastą BMP vaizdą. Archyve taip pat rasite Eagle projekto bylas, GLCD kištuko biblioteką, grafinio LCD biblioteką su visu WinAVR projektu (Eagle bylos, WinAVR projektas).

Sėkmės.

Pažymėti: , ,
7 comments on “Grafinio LCD valdymas AVR mikrokontrolerio pagalba
  1. assembled parašė:

    Sunervino mane tavo „kiek bus“ testukas nusunešdamas mano rašliavą, tad trumpai:
    http://www.scienceprog.com/controlling-graphical-128×64-lcd-based-on-ks0108/ rašo, kad būtent šio modelio (HQM1286404) pinoutas kitas – kaip čia yra? Kuris čia teisus? Ar čia kiniečiai atsitiktine tvarka tuos kontaktus dėlioja?

  2. assembled parašė:

    O šiaip šaunus straipsniukas! Daugiau tokių.

  3. admin parašė:

    Del to pinouto mane irgi biesino biški. Turejau PDF naujesnės PCB 5 versijos. O šitas ekraniukas yra 4 versijos. O kodel pinai išmėtyti tai irgi klausimas… Tai teko forumuose panaršyti ir paeksperimentuoti.
    Beje nesuprantu kas negerai su tuo „kiek bus“. Ar neteisingai suveikia pirma karta? Kiek testavau atrodo veikė gerai. Jeigu kartosis reikės labiau pasigilinti.

  4. admin parašė:

    Ups, dekui, assembled, jog užsiminei. Iš tikro žiūriu jog straipsnyje turiu ipylęs kaip tik 5 versijos pinouta. Dabar jau pataisiau.

  5. denny parašė:

    man tai nesuprantama tas kad kodel D/I R/W E CS1 ir CS2 LCD ishvadai jungiami prie ADC atmegos pinu?
    aciu

    • admin parašė:

      Tai kad didelio skirtumo nera prie kuriu pinu jungsi. Kokius turi laisvus tokius ir naudoji. Tie pinai gali buti naudojami ne tik kaip ADC, bet ir kaip bendros paskirties isvadai.

  6. denny parašė:

    Tai taip, ta as zinau, tik nustebau kodel visur kur paziuriu jie jungiasi prie adc pinu, beto turint omeny kad atmegoj(16) 3×8 output ir tik 1×8 input, tai tokius portus rektu pacius paskutinius naudot kaip ishejimus… cia mano nuomone… 🙂
    beja, kazkaip sunku rast normalios ir yskaitoma kalba parasytos info apie jungima, ir tokio tipo lcd pakurima…
    arba problema ta kad naudoju BASCOMavr…. gal kas programu pvz turi,kad toki lcd pakurt…? tai shain diena pasijunges gal 6 h kariavau, ir ishsekes gavau tik shvelniai pulsuojanty ekrana – nieko daugiau 😀
    shame 🙁
    aciu

Parašykite komentarą