Theorie

LCD basischakeling 4-bit mode

 

In bovenstaande afbeelding zie je de basisschakeling om een LCD aan te sluiten op een Arduino. Bekijken we de aansluitpinnen van het LCD van links naar rechts, dan zien we bij de eerste 3 pinnen de massa, Vcc en contrast. Deze derde pin is de contrastregeling voor het scherm en wordt aangestuurd m.b.v. een potentiometer die als spanningsdeler geschakeld is tussen de voedingslijnen.

Vervolgens hebben we de RS, R/W en E lijnen. Dit zijn de stuursignalen. Het LCD bevat namelijk zelf een microcontroller die de individuele pixels van het display aanstuurt. Eigenlijk communiceert de Arduino controller met de LCD controller. Enerzijds moet men de data die op het display moeten verschijnen kunnen doorgeven, maar anderzijds moeten ook instelcommando's kunnen doorgegeven worden.

Dit onderscheid wordt gemaakt door middel van de RS-pin (RS staat voor register-select). Een waarde 1 geeft aan dat de gegevens displaydata zijn, terwijl een 0 aangeeft dat een instelcommando bedoeld wordt.

De R/W pin geeft de richting van de communicatie aan: Read (lezen) of Write (schrijven).

De E-pin staat voor enable. Een flank op deze pin geeft aan dat de niveau's op D0..D7 mogen overgenomen worden.

De volgende 8 pinnen zijn de datapinnen D0..D8. In de eenvoudigste versie kan het display in 4-bit mode gebruikt worden. In dat geval worden enkel D4..D8 gebruikt en wordt elke byte in 2 stappen doorgegeven. Er wordt dus gecommuniceerd op nibble-niveau.

Uiteraard kan er ook in 8-bit mode gewerkt worden. Dit neemt 4 extra pinnen in beslag, en aangezien de Leonardo al geen pinnen op overschot heeft wordt meestal de 4-bit versie gebruikt. Een andere mogelijke oplossing is het gebruik van een I²C interface, maar deze zit niet standaard op het display en moet dan hardwarematig aan het circuit worden toegevoegd.

Als laatste twee pinnen vinden we de (optionele) aansluiting voor backlighting. Dit is een led die achter het display gemonteerd is om ook in het donker het display te kunnen aflezen.

Ook bij een LCD bestaat een bibliotheek die het grootste werk uit handen neemt, zoals te zien in onderstaand "hello World" voorbeeld.

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

Na het toevoegen van de bibliotheek wordt een LCD-object geïnstantieerd (=object aangemaakt volgens typebeschrijving). Hierbij worden de verbindingen meegegeven. Tijdens de setup wordt het LCD object geïnitialiseerd als een 16x2 LCD, dus twee regels van 16 karakters.

Daarna wordt een eerste bericht op het display geplaatst: "hello world". Dit komt op de bovenste regel terecht.

In de loop()-functie wordt de cursor op de onderste lijn en op de eerste kartakterplaats gezet. Daarna wordt op die positie het aantal seconden die verlopen zijn sinds de start van het programma weergegeven.