26. HD44780 LCD-näyttö

Monissa mikrokontrolleriprojekteissa eteen tulee lähes aina jossain vaiheessa tarpeen näyttää symboleita, kirjaimia ja numeroita käyttäjälle. Sovelluksena voi olla esimerkiksi jännitteiden ja lämpötilojen seuranta tietyssä suljetussa järjestelmässä, tai vaikka kellonajan tai muun tarpeellisen tiedon näyttäminen.

Edellisissä osissa käytiin hieman läpi yhdenlaista näyttötyyppiä; 7-segmenttinäyttöä. Tässä osassa perehdytään LCD-näytön ohjaukseen ja otetaan näytöksi HD44780 ohjaimeen perustuva merkkinäyttömoduuli. Toisin kuin 7-segmenttinäyttö, LCD-näyttö kykenee näyttämään hyvin useita erilaisia symboleita ja ohjelmoija voi niitä luoda itsekin. Tämä johtuu siitä, että LCD-näytössä on yksittäisiä elementtejä (segmenttejä) paljon enemmän kuin esimerkiksi 7-segmenttinäytössä.

Yksittäisiä näyttösegmenttejä kutsutaan tutummin myös pikseleiksi. Aivan kuin tietokoneenkin ruudulla, niin myös LCD-näytön ruudulla kirjaimet, merkit ja numerot koostuvat pienistä pikseleistä, jotka voidaan yksitellen asettaa päälle tai pois päältä.

HD44780-pohjainen näyttömoduuli on kenties yksi yleisimpiä näyttömoduuleita, mitä yksinkertaisissa sulautetuissa laitteissa on käytetty. HD44780 nimike viittaa käytettyyn Hitachin LCD-ohjainpiiriin, joka ohjaa edellä mainittuja yksittäisiä pikseleitä. LCD-näytöstä voit lukea lisää LCD-näyttö -sivulla.

Tarvittavat osat ja näyttö

Tässä osassa käytetty näyttömoduuli on Solomonin valmistama ja merkiltään LM1250TGR. Tämä näyttö on 2-rivinen 16-merkkinen näyttö ja sen ohjainpiirin ROM-muistissa on jo valmiiksi merkkejä, joita voidaan käyttää. Käytettävän näyttötyypin ei ole pakko olla juuri tällainen, vaan riittää kunhan käytettävä näyttö on HD44780-pohjainen näyttö ja nastajärjestys on sama (mikä yleensä kaikissa näytöissä on). Alla olevasta kuvassa nähdään vastaavanlainen näyttö, kuin mitä tässä on käytetty.

 (kuvan lähde)

Näytön lisäksi tarvitaan:

  • Johtimia
  • Launchpad + MSP430G2231 mikrokontrolleri
  • Signaalitason muunnin (esim. TXB0106), jos näyttö 3,3 voltin logiikalle ei-yhteensopiva. EI VÄLTTÄMÄTTÄ PAKOLLINEN.
  • Koekytkentäalusta

Tässä kannattaa huomioida, että mikäli näyttö ei toimi Launchpadin ohjausjännitteillä, niin näyttö pitää vaihtaa tai rakentaa signaalitason muunnin itse tai käyttää jotain valmista kaupallista piiriä. Esimerkki signaalitason muuntimesta löytyy rakenteluista tältä sivulta. On kuitenkin hyvin mahdollista, että näyttö toimii myös Launchpadin käyttöjännitteellä eikä signaalimuuntimia tarvita - tämä selviää testaamalla.

HD44780-näytön nastajärjestys

Alle on listattu yleinen nastajärjestys 14-pinniselle HD44780-näytöille.

Nasta nro: Nimi Toiminto
1 VSS/GND Maa
2 VDD Käyttöjännite
3 VEE Kontrasti (Merkitään joskus myös VO)
4 RS Rekisterin valinta (Register Select)
5 R/W Luku/Kirjoitus (Read/Write, 0 = Write)
6 E Datan sallinta (Enable)
7 D0 Databitti 0
8 D1 Databitti 1
9 D2 Databitti 2
10 D3 Databitti 3
11 D4 Databitti 4
12 D5 Databitti 5
13 D6 Databitti 6
14 D7 Databitti 7

HD44780 näytöt voidaan kytkeä niin, että käytetään kaikkia yllä esiteltyjä nastoja. Tämä vie kuitenkin mikrokontrollerin IO-kapasiteettia hyvinkin paljon ja tähän tarvittaisiin jokin muu tapa kytkeä näyttö mikrokontrollerille. Onneksi HD44780 näyttö voidaan kytkeä niin sanotusti puolitavu-moodiin.

"Puolitavu-moodi" tarkoittaa sitä, että ainoastaan neljää ylintä bittiä käytetään tiedonsiirtoon. R/W-bitti voidaan kytkeä puolestaan kiinteästi maahan, koska näytölle aina kirjoitetaan (ainakin tässä esimerkissä). E-nasta tarvitaan datanastojen lisäksi, sillä se on olennainen nasta kirjoitusoperaatioita tehdessä. Näiden viiden nastan lisäksi tarvitaan vielä kuudes eli RS eli Register Select-nasta. Tällä nastalla valitaan kirjoitetaanko näytölle vai komennetaanko näyttöä jotenkin muuten (esimerkiksi vaihdetaan näytön asetuksia).

LCD-näytön kytkeminen

Tässä osassa on käytetty TXB0106 signaalitason muunninta, joka muuntaa alemman jännitetason ohjauksen 5 voltin logiikkajännitteen tasoiksi (CMOS -> TTL). Jos näyttö on CMOS-yhteensopiva (eli ohjausnastat toimivat myös 3 voltin jännitteellä, niin muunninta TXB0106 ei tarvita).

5 voltin jännitteen voit ottaa näytölle suoraan launchpadilta, USB-liittimen vierestä (TP1), jolloin erillisiä virtalähteitä ei tarvita.

Esimerkki 1: Näytön alustus ja merkkien tulostaminen

LCD-näytöille ja muillekin näytöille on tyypillistä se, että ne täytyy alustaa ennen kuin niille voidaan tulostaa. HD44780 näytön alustusrutiinissa tarvitaan ensiksi komentaa näyttö 4-bitin moodiin, jotta yllä oleva kytkentä toimii. Tämä tapahtuu asettamalla DB4-DB7 nastoihin luku 0x2 (DB4 = 0, DB5 = 1, DB6 = 0, DB7 = 0), asettamalla RS-bitti "0" tilaan ja käyttämällä E-bittiä "1" -tilassa. Tämän jälkeen nastoihin ladataan luku 0x8 ja toistetaan edellinen sekvenssi. Tällä tavalla näytölle on nyt kirjoitettu luku 0x28 kahdessa neljän bitin ryhmässä. Alustuksen jälkeen näytölle voidaan siis tulostaa 8-bittisiä merkkejä neljän bitin ryhmässä lähettämällä ylemmät neljä bittiä ensin, minkä jälkeen lähetetään loput neljä bittiä.

LCD-näyttöä ohjataan API-funktioiden avulla. API tarkoittaa Application Programming Interfacea, ja on suomeksi sanottuna ohjelmointirajapinta. API yleensä piilottaa käyttäjän kannalta tarpeettomia toimintoja, kuten alemman tason bittien naksuttelua. Alla on lyhyesti selitetty mitä mikäkin funktio tekee:

LCD_SetCursor(x,y)

Asettaa kursorin näytölle näkyvälle paikalle.
x = kursorin paikka vaakasuunnassa
y = kursorin paikka pystysuunnassa

LCD_SetCursorAddress(addr)

Asettaa kursorin haluttuun kohtaan näytön muistissa.

LCD_ShiftDisplayLeftRight(RL)

Siirtää näyttöä oikealle tai vasemmalle yhden pykälän.
RL = 1 siirtää oikealle, 0 tai muut arvot vasemmalle.

LCD_WriteNumberIntToChar(number)

Kirjoittaa näytölle numeron (16 bittinen + etumerkki mikäli miinus). Funktio tulostaa numerot oikealta vasemmalle, joten kursorin paikasta pitää käyttäjän huolehtia.
number = 16 bittinen kokonaisluku

LCD_ClearArea(x1,x2,y)

Tyhjentää halutulta riviltä halutun alueen x1 ja x2 sijainnin väliltä. Numeroiden suuruusjärjestyksestä ei tarvitse huolehtia.
x1 = aloitus- tai lopetuspaikka
x2 = aloitus- tai lopetuspaikka
y = rivi miltä tyhjennetään

LCD_WriteLine(*pBuf)

Kirjoittaa rivin näytölle.

HUOM! Syötettävän merkkijonon pitää päättyä (null = 0) merkkiin!
*pBuf = osoitin merkkijonoon.

Esim 1:

LCD_WriteLine("tekstia ");

Esim 2:

char bufferi[30] = {'t','e','k','s','t','i','a',' '};
LCD_WriteLine(bufferi);
Näyttöä voi käskyttää myös suoraan käyttämällä LCD_WriteInstruction() funktiota, mutta tällöin pitää tietää mitä käskyjä voidaan lähettää. APIa käyttämällä tästä ei tarvitse välittää vaan voi käskyttää näyttöä mm. X ja Y koordinaateilla. LCD_WriteInstruction() funktiota käyttäessä täytyy ohjauskomennot luntata HD44780 ohjaimen datalehdestä (tai vaihtoehtoisesti esimerkkikoodista).

Tarkempi kuvaus ohjelman toiminnasta löytyy lähdekoodista, joka on jaoteltu useampaan eri tiedostoon. Alla on lyhyt esittelyvideo koodin toiminnasta ja ohjelman lähdekoodin voit ladata alta löytyvästä zip-paketista:

Lataa tämän esimerkin CCSv5 projekti tästä.

Seuraavassa osassa tehdäänkin sitten jotain ihan muuta ja otetaan tarkasteluun SPI-väylä.