Ofte er det praktisk å mulighet til å vise tekst eller tallverdier på et display. Her skal vi se på et display med den mye brukte kontrolleren HD44780. Displayet jeg har brukt i eksemplene har 4 linjer med 20 tegn hver, et såkalt 20x4-display. Det mest vanlige er display som har 2 x 16 tegn, og disse er også veldig rimelige, sannsynligvis fordi det produseres utrolig store mengder av dem. Sist jeg bestilte slike fra eBay tror jeg at jeg betalte under 20 kroner per display!
Hvis du ikke har et slikt display liggende, kan du jo sjekke i haugen av kassert elektronikk-utstyr, så finner du kanskje noe der. Disse LCD-displayene er som sagt veldig mye brukt. Displayet er som regel koblet til med enten 14 eller 16 pinner, så hvis det er loddet fast, kan du kanskje få en utfordring.
Selv om vi har mange tilkoblinger er det ikke vanskelig å koble opp, vi trenger bare 6 pinner fra Arduinoen, pluss forsyningsspenning og et potensiometer for kontrastjustering. Displayet bruker parallell overføring av data, og kan ta i mot 8 bits i en gang, men for å gjøre tilkoblingen enklere og spare pinner, kjører vi det i 4-bits modus. Det vil si at hver byte må deles opp i to deler før det sendes til LCD-displayet. Men, ikke bli bekymret, alt dette tar biblioteket seg av, og vi trenger bare å forholde oss til noen enkle funksjoner.
Tilkoblingene er som følger; de vi skal bruke er markert med fet skrift:
- Ground
- VCC (+3.3 to +5V)
- Contrast adjustment (VO)
- Register Select (RS). RS=0: Command, RS=1: Data
- Read/Write (R/W). R/W=0: Write, R/W=1: Read (This pin is optional due to the fact that most of the time you will only want to write to it and not read. Therefore, in general use, this pin will be permanently connected directly to ground.)
- Clock (Enable). Falling edge triggered
- Bit 0 (Not used in 4-bit operation)
- Bit 1 (Not used in 4-bit operation)
- Bit 2 (Not used in 4-bit operation)
- Bit 3 (Not used in 4-bit operation)
- Bit 4
- Bit 5
- Bit 6
- Bit 7
- Backlight Anode (+) (If applicable)
- Backlight Cathode (-) (If applicable)
Som du ser over, er det Bit 4-7 som brukes til data, mens Bit 0-3 ikke er i bruk. Disse kobles ofte til jord for å unngå forstyrrelser, men det går som oftest bra uten. Pinne 5, Read/Write, kobler vi også til jord, fordi vi bare skal skrive til displayet, og ikke lese noe fra det. Pinne 3 brukes til å justere kontrasten på displayet. Hvis denne ikke er tilkoblet vil du sannsynligvis ikke se noen tekst. Her bruker vi bare et trimmepotensiometer koblet som en spenningsdeler mellom 5V og jord, og kobler midtuttaket til denne pinnen.
Vi har også mulighet til å koble til bakgrunnsbelysning på pinne 15 og 16. Dette trekker en del strøm, så hvis du ikke har veldig dårlige lysforhold hopper vi over denne.
Oppkobling
Her har jeg tegnet et skjema i Proteus. Det inneholder en Arduino Uno, et LCD-display, potensiometer for kontrastjustering og en knapp som skal brukes i et av eksemplene. Der det står IO og et nummer, refereres det til de digitale pinnene på Arduinoen. Dette blir ganske mange ledninger, så det er litt vanskelig å se på bildet hva som er hva. Det enkleste er å følge koblingsskjemaet. (Klikk på bildet for å åpne i en ny fane.)
Program
Eksempel 1: Det første eksemplet er (nesten) så enkelt vi kan få det, et klassisk "Hallo Verden"-program. Viser likevel hvordan vi kan skrive til en bestemt posisjon på displayet. Når vi regner posisjoner og linjer, starter vi alltid på 0 fra øverste venstre hjørne.
/* LCD-display med HD44780-kontroller
* Bruker et 20x4 display, men det fungerer like fint med 16x2
*/
#include <LiquidCrystal.h> // Inkluderer biblioteket
// Setter opp pinnene for displayet. Bruker 4 pinner for data, pluss RS og EN
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal display(rs, en, d4, d5, d6, d7);
void setup() {
display.begin(20, 4); //Setter opp LCD-displayet, antall tegn og antall linjer
}
void loop() {
display.clear(); //Blanker displayet
delay(1000); //Pause på ett sekund
display.setCursor(0,0); //Setter cursor til øverste venstre tegn
display.print("Hallo"); //Skriver Hallo der markøren står
delay(1000); //Pause på ett sekund
display.setCursor(5,1); //Setter cursor litt ut på andre linje (plass, linje)
display.print("Verden!"); //Skriver Verden! der vi satte markøren
delay(3000); //Pause på 3 sekunder
}
Eksempel 2: Dette er et litt mer avansert eksempel. Dette programmet viser i utgangspunktet teksten "Ready", men det venter på at knappen tilkoblet pinne 6 trykkes. Mens programmet venter, vises 1 til 5 punktum, for å symbolisere at programmet venter. Her har jeg også vist et eksempel på bruk av "Conditional" eller "Ternary" operator. Forklaringen ligger i kommentarer.
* Bruker et 20x4 display, men det fungerer like fint med 16x2
*/
#include <LiquidCrystal.h> // Inkluderer biblioteket
// Setter opp pinnene for displayet. Bruker 4 pinner for data, pluss RS og EN
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal display(rs, en, d4, d5, d6, d7);
int x=0;
const char tall[11][6]={"Zero","One","Two","Tree","Four","Five","Six","Seven","Eight","Nine","Ten"};
void setup() {
display.begin(20, 4); //Setter opp LCD-displayet, antall tegn og antall linjer
pinMode(6, INPUT_PULLUP); //Knapp for å starte nedtelling
}
void loop() {
display.clear(); //Blanker displayet
display.setCursor(0,0); //Setter cursor til øverste venstre tegn
display.print("Ready");
for(int y=0;y<x;y++) display.print(".");
x=x<5?x+1:0; // Hvis x er mindre enn 5, settes x til (x+1), ellers (hvis x er 5 eller større) settes x til 0
// En "forenklet" måte å skrive if (x<5) { x=x+1; } else { x=0; }
if (!digitalRead(6)){ //Hvis digitalRead(6) gir 0, altså knappen er trykt inn... Utropstegnet betyr NOT (IKKE)
for(int i=10;i>=0;i--){ //Løkke for å telle ned fra 10 til null
display.clear();
display.print(tall[i]); //Henter teksten fra arrayet vi lagde i toppen av koden
delay(1000);
}
display.clear();
display.print("Takeoff!!");
delay(3000);
}
delay(300);
}
Video fra begge programmene i aksjon ligger under fanen "Resutater"
Resultat
Eksempel 1, Hallo Verden:
Eksempel 2, nedtelling:
Oppgaver
Kommer
Løsningsforslag
Kommer