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.
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:
Asettaa kursorin näytölle näkyvälle paikalle.
x = kursorin paikka vaakasuunnassa
y = kursorin paikka pystysuunnassa
Asettaa kursorin haluttuun kohtaan näytön muistissa.
Siirtää näyttöä oikealle tai vasemmalle yhden pykälän.
RL = 1 siirtää oikealle, 0 tai muut arvot vasemmalle.
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
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
Kirjoittaa rivin näytölle.
HUOM! Syötettävän merkkijonon pitää päättyä (null = 0) merkkiin!
*pBuf = osoitin merkkijonoon.
Esim 1:
Esim 2:
LCD_WriteLine(bufferi);
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ä.