Λειτουργία του LCD module χαρακτήρων

Όταν κάνουμε ηλεκτρονικές κατασκευές σε πολλές περιπτώσεις θέλουμε να απεικονίσουμε δεδομένα όπως κείμενο ή αριθμούς. Αυτό μπορούμε να το πραγματοποιήσουμε χρησιμοποιώντας ένα LCD module χαρακτήρων. Η οθόνη LCD είναι ιδανική για την απεικόνιση αλφαριθμητικών δεδομένων.

Οι LCD χαρακτήρων αποτελούνται από μικρά ορθογώνια στα  οποία κάθε χαρακτήρας απεικονίζεται μέσα σε αυτά, τα οποία αποτελούνται από ένα πλέγμα 8 Χ 5 σημείων.

Τα LCD χαρακτήρων παράγονται σε διάφορα μεγέθη τα οποία καθορίζονται με τον αριθμό των γραμμών και των στηλών των χαρακτήρων που μπορούν να απεικονιστούν (για παράδειγμα 16Χ4, 16Χ1, 20Χ4).

Τα περισσότερα LCD modules περικλείουν πίσω φωτισμό που σε ορισμένα από αυτά μπορείς να επιλέξεις το χρώμα φωτισμού. Συνήθως ο πίσω φωτισμός τροφοδοτείται με τάση 4,2V και αν η τροφοδοσία είναι στα 5V πρέπει να τοποθετήσεις μια αντίσταση (150Ω) σε σειρά μεταξύ από τα 5V και με τον ακροδέκτη LED+

Στα περισσότερα LCD χαρακτήρων η λειτουργία τους βασίζεται στο ολοκληρωμένο κύκλωμα HD44780 της εταιρίας Hitachi. Για την ηλεκτρική διασύνδεση της LCD υπάρχουν οπές καταμήκος της άνω πλευράς στα αριστερά οι οποίες αριθμούνται από 1 έως 16 από αριστερά προς δεξιά.

Σε αυτό το εδάφιο θα δούμε πως μπορούμε να συνδέσουμε ένα LCD module χαρακτήρων με το Arduino κάνοντας χρήση της κατάλληλης βιβλιοθήκης που η κοινότητα χρηστών του Arduino έχει αναπτύξει.

Διάταξη ακροδεκτών του LCD module χαρακτήρων

GND: θα πρέπει να συνδεθεί στα 0V του Arduino.
VCC: είναι η τροφοδοσία τάσης 5V από το Arduino.
Vo(LCD contrast): ελέγχει την αντίθεση και τη φωτεινότητα του LCD. Μπορεί να χρησιμοποιηθεί ένας διαιρέτης τάσης με ποτενσιόμετρο.
SR(Register Select): αυτός ο ακροδέκτης του LCD δέχεται εντολή που καθορίζει αν οι είσοδοι του LCD δέχονται εντολές ή δεδομένα. Για παράδειγμα, αν ο ακροδέκτης RS τεθεί σε LOW τότε στέλνουμε εντολές στο LCD (για παράδειγμα να μετακινήσει τον κέρσορα σε ορισμένη θέση, να καθαρίσει την οθόνη κ.ά.) Όταν ο ακροδέκτης τεθεί σε HIGH μεταφέρονται δεδομένα / χαρακτήρες στο LCD.
R/W(Read / Write): Αυτός ο ακροδέκτης του LCD ελέγχει αν διαβάζουμε δεδομένα από το LCD ή γράφουμε δεδομένα στο LCD. Όταν θέλομε να χρησιμοποιήσουμε την LCD σαν OUTPUT θέτουμε τον ακροδέκτη R/W σε LOW, δηλαδή θέτει το LCD σε «Write mode»
Ε(Enable): αυτός ο ακροδέκτης ενεργοποιεί το LCD. Δηλαδή εάν αυτός ο ακροδέκτης τεθεί σε LOW, οι ακροδέκτες του LCD απομονώνονται από το υπόλοιπο κύκλωμα και αυτός τεθεί σε HIGH το LCD επεξεργάζεται τα εισερχόμενα δεδομένα.
D0 – D7(Data Bus): αυτοί οι ακροδέκτες μεταφέρουν τα 8-bit δεδομένα προς το LCD.
A – K(Anode & Cathode): αυτοί οι ακροδέκτες χρησιμοποιούνται για τον έλεγχο του πίσω φωτισμού του LCD.

Διασύνδεση του LCD module με το Arduino

Στη συνέχεια αυτού του εδαφίου θα μάθουμε πως το character LCD module συνδέεται με το Arduino και πως τρέχει τον αντίστοιχο κώδικα. Το LCD module μπορεί να επικοινωνήσει με τον «έξω κόσμο» με ένα δίαυλο δεδομένων πλάτους 8-bit (8-bit mode). Τα LCD που βασίζονται στο ολοκληρωμένο κύκλωμα HD44780 μπορούν να λειτουργήσουν με δίαυλο δεδομένων πλάτους 4-bit (4-bit mode).

Με την λειτουργία 8-bit mode έχουμε πιο γρήγορη μεταφορά δεδομένων από την λειτουργία 4-bit mode. Στη λειτουργία 8-bit mode η μεταφορά δεδομένων γίνεται ένα byte κάθε φορά, σε αντίθεση της λειτουργίας 4-bit mode όπου το byte διαχωρίζεται σε 2 nibbles και έτσι εκτελούνται δυο λειτουργίες εγγραφής.

Με την κατάσταση 4-bit mode έχουμε χρήση λιγότερων Ι/Ο ακροδεκτών. Αν επιθυμούμε μεγαλύτερη ταχύτητα επικοινωνίας και ακροδέκτες Ι/Ο είναι διαθέσιμοι τότε μπορούμε να διαμορφώσουμε 8-bit mode.

Ακολουθεί μια εφαρμογή στην οποία θα διασυνδέσουμε ένα LCD module σε κατάσταση 4-bit mode και επομένως θα χρειαστούμε 6 ακροδέκτες: RS, EN, D7, D6, D5 και D4. Συνδέουμε το LCD με το Arduino ως εξής: Τα τέσσερα πινς δεδομένων (D4 – D7) από το LCD συνδέονται στα ψηφιακά πινς #4 – 7 του Arduino. To Enable πιν του LCD συνδέεται στο πιν #2 του Arduino και το πιν RS του LCD συνδέεται στο πιν #1 του Arduino.

Στο ακόλουθο διάγραμμα φαίνεται η επιθυμητή διασύνδεση του Arduino Uno με το LCD module χαρακτήρων:

Κώδικας Arduino

Ακολουθεί ένα παράδειγμα σε κώδικα Arduino το οποίο τυπώνει το μήνυμα «Hello World» στην οθόνη LCD:

// Εισαγωγή της LCD βιβλιοθήκης:
#include <LiquidCrystal.h>

// Δημιουργεί ένα αντικείμενο LCD. Παράμετροι: (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() 
{
	// Δηλώνει τον αριθμό των στηλών και των γραμμών του LCD.
	lcd.begin(16, 2);

	// Καθαρίζει την οθόνη του LCD 
	lcd.clear();
}

void loop() 
{
	// Τυπώνει ένα μήνυμα στη μονάδα LCD.
	lcd.print(" Hello world!");

	// μετακινεί τον κέρσορα στη στήλη 0, και στη γραμμή 1
	lcd.setCursor(0, 1);
	// Τυπώνει ένα μήνυμα στη LCD.
	lcd.print(" LCD Tutorial");
        while(1);
}

Αν ο κώδικας εκτελεστεί σωστά θα έχουμε το ακόλουθο αποτέλεσμα:

Επεξήγηση του κώδικα

Ο κώδικας ξεκινά με την συμπερίληψη της βιβλιοθήκης LiquidCrystal η οποία έχει αναπτυχθεί από την κοινότητα χρηστών του Arduino.

// Συμπεριλαμβάνει τον κώδικα βιβλιοθήκης:
# include <LiquidCrystal. h>

Μετά θα πρέπει να δημιουργήσουμε ένα αντικείμενο LiquidCrystal. Αυτό το αντικείμενο ορίζεται με 6 παραμέτρους στη συνάρτηση δημιουργίας που ορίζει ποια Arduino πινς συνδέονται στα αντίστοιχα πινς του LCD και συγκεκριμένα στα RS, Enable και τα πινς δεδομένων d4, d5, d6 και d7.

//Δημιουργεί ένα αντικείμενο LCD. Παράμετροι (RS, Enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Τώρα που έχεις δημιουργήσει ένα αντικείμενο LiquidCrystal μπορείς να το χρησιμοποιήσεις με τις μεθόδους (δηλ. συναρτήσεις) που είναι ορισμένες για το LCD.

Στη συνάρτηση «setup» χρησιμοποιούμε δυο συναρτήσεις. Η πρώτη από αυτές είναι η begin(). Αυτή χρησιμοποιείται για να δηλώσουμε τις διαστάσεις της οθόνης LCD. Π.χ. το πόσες στήλες και γραμμές έχει το LCD module. Η δεύτερη συνάρτηση είναι η clear(). Αυτή καθαρίζει την οθόνη LCD και μεταφέρει τον κέρσορα στην πάνω αριστερή γωνία.

Lcd.begin(16, 2);  //Δηλώνει 16 στήλες και 2 γραμμές.
lcd.clear();

Στη συνάρτηση «loop» χρησιμοποιούμε τη συνάρτηση print() η οποία απεικονίζει το μήνυμα στην οθόνη LCD:

//Τυπώνει ένα μήνυμα στην LCD
lcd.print(“  Hello world  “);


Έπειτα θα πρέπει να μετακινήσουμε τον κέρσορα στη δεύτερη γραμμή που το κάνουμε με τη συνάρτηση  setCursor(). Συγκεκριμένα αυτή η συνάρτηση ορίζει τη θέση που ξεκινά το κείμενο που εισάγουμε. Η πάνω αριστερή γωνία δηλώνεται ως στήλη = 0, γραμμή = 0

lcd.setCursor(0, 1);
lcd.print(“  LCD  Tutorial  “);

Με το βρόγχο επανάληψης while(1) σταματά η ροή του προγράμματος εκεί.

Άλλες χρήσιμες συναρτήσεις της βιβλιοθήκης LiquidCrystal

Υπάρχουν μερικές χρήσιμες συναρτήσεις που μπορείς να χρησιμοποιήσεις με ένα αντικείμενο LiquidCrystal:
— Αν θέλεις να μετακινήσεις τον κέρσορα στην πάνω αριστερή γωνία του LCD χωρίς να καθαρίσεις την οθόνη, χρησιμοποίησε την συνάρτηση home()
— Η συνάρτηση blink() αναβοσβήνει ένα μπλοκ 5Χ8 σημείων στη θέση του εισερχόμενου χαρακτήρα, ενώ η συνάρτηση lcd.cursor() εμφανίζει μια κάτω παύλα στη θέση που ο επόμενος χαρακτήρας θα εισαχθεί.
— Μπορείς να χρησιμοποιήσεις την συνάρτηση noBlink() για να ακυρώσεις το αναβόσβημα του κέρσορα και την lcd.noCursor() για να κρύψεις τον κέρσορα.
— Μπορείς να κυλήσεις τα δεδομένα της οθόνης ένα διάστημα προς τα δεξιά χρησιμοποιώντας τη συνάρτηση: lcd.scrollDisplayRight() ή ένα διάστημα αριστερά με τη συνάρτηση lcd.scrollDisplayLeft(). Εάν θέλεις το κείμενο να κυλίεται συνέχεια χρησιμοποίησε αυτές τις συναρτήσεις μέσα σε ένα βρόγχο «for»