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

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

Αν κοιτάξετε πολύ προσεκτικά την οθόνη, θα παρατηρήσετε μικρά ορθογώνια πλαίσια για κάθε θέση χαρακτήρα. Μέσα σε καθένα από αυτά τα ορθογώνια υπάρχει ένα πλέγμα από 5×8 μικροσκοπικές κουκκίδες ή pixels. Αυτά τα pixels φωτίζονται με διαφορετικά μοτίβα ώστε να σχηματίζουν διαφορετικά γράμματα, αριθμούς ή σύμβολα.

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

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

Στα περισσότερα LCD χαρακτήρων η λειτουργία τους βασίζεται στο ολοκληρωμένο κύκλωμα HD44780 της εταιρίας Hitachi. Αυτό το chip αναλαμβάνει όλη τη σύνθετη δουλειά της αποστολής των σωστών σημάτων για τον έλεγχο και την εμφάνιση των pixels. (Σημείωση: σε αυτό τον ιστότοπο χρησιμοποιούμε μόνο αυτόν τον τύπο οθόνης LCD).

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

Σε αυτό το εδάφιο θα δούμε πως μπορούμε να συνδέσουμε μια LCD μονάδα χαρακτήρων 16×2 με το Arduino κάνοντας χρήση της κατάλληλης βιβλιοθήκης που η κοινότητα χρηστών του Arduino έχει αναπτύξει. Αν έχετε διαφορετικό μέγεθος LCD, όπως 16×1, 16×4 ή ακόμα και 20×4, τα βασικά βήματα και οι ιδέες που θα καλύψουμε εδώ ισχύουν και για αυτές.

Ένα από τα καλύτερα πράγματα στη χρήση αυτών των οθονών στα project σας είναι το πόσο εύκολα μπορείτε να τις αντικαταστήσετε. Αν αποφασίσετε ότι θέλετε μια LCD διαφορετικού μεγέθους ή χρώματος, μπορείτε να την αλλάξετε χωρίς να χρειαστεί να ξανακάνετε όλη την καλωδίωση. Ίσως χρειαστεί να κάνετε μικρές αλλαγές στον κώδικά σας, αλλά η συνδεσμολογία θα παραμείνει ίδια!

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

Πριν περάσουμε στη συνδεσμολογία και στον παράδειγμα κώδικα, ας δούμε τη διάταξη ακροδεκτών μιας τυπικής LCD χαρακτήρων, η οποία διαθέτει 16 ακροδέκτες:

GND: θα πρέπει να συνδεθεί στα 0V του Arduino.
VCC: είναι η τροφοδοσία τάσης 5V από το Arduino.
Vo(LCD contrast): ελέγχει την αντίθεση και τη φωτεινότητα του LCD. Μπορεί να χρησιμοποιηθεί ένας διαιρέτης τάσης με ποτενσιόμετρο, ρυθμίζοντας την τάση σε αυτό το pin από 0 έως 5V.
SR(Register Select): αυτός ο ακροδέκτης του LCD δέχεται εντολή που καθορίζει αν οι είσοδοι του LCD ερμηνεύονται σαν εντολές ή δεδομένα. Για παράδειγμα, αν ο ακροδέκτης RS τεθεί σε LOW τότε στέλνουμε εντολές στο LCD (για παράδειγμα να μετακινήσει τον κέρσορα σε ορισμένη θέση, να καθαρίσει την οθόνη κ.ά.) Όταν ο ακροδέκτης τεθεί σε HIGH μεταφέρονται χαρακτήρες στο LCD.
R/W(Read / Write): Αυτός ο ακροδέκτης του LCD ελέγχει αν διαβάζουμε δεδομένα από το LCD ή γράφουμε δεδομένα στο LCD. Όταν θέλομε να χρησιμοποιήσουμε την LCD σαν είσοδο δεδομένων θέτουμε τον ακροδέκτη R/W σε LOW, δηλαδή θέτει το LCD σε «Write mode». Όταν κάνουμε ανάγνωση δεδομένων θέτουμε τον ακροδέκτη R/W σε HIGH, δηλαδή θέτει το LCD σε «Read mode».
Τις περισσότερες φορές, χρειάζεται μόνο να στείλουμε πληροφορίες στην LCD, οπότε ο ακροδέκτης RW συνήθως συνδέεται μονιμα σε LOW.
Ε(Enable): αυτός ο ακροδέκτης ενεργοποιεί το LCD. Δηλαδή εάν αυτός ο ακροδέκτης τεθεί σε LOW, οι ακροδέκτες του LCD απομονώνονται από το υπόλοιπο κύκλωμα και αν αυτός τεθεί σε HIGH το LCD επεξεργάζεται και αποθηκεύει τα εισερχόμενα δεδομένα.
D0 – D7(Data Bus): Είναι οι οκτώ ακροδέκτες που μεταφέρουν τα πραγματικά δεδομένα ή τις εντολές προς την LCD. Στη λειτουργία 8-bit χρησιμοποιούνται και οι οκτώ ακροδέκτες (D0−D7). Στη λειτουργία 4-bit χρησιμοποιούνται μόνο οι τέσσερις ανώτεροι (D4−D7), ενώ οι τέσσερις κατώτεροι (D0−D3) μένουν ασύνδετοι.
A – K(Anode & Cathode): τροφοδοτούν το LED οπίσθιου φωτισμού που φωτίζει την οθόνη. Η άνοδος συνδέεται στη θετική τάση (συνήθως 5V) και η κάθοδος στη γείωση. Μερικές φορές προστίθεται και μία αντίσταση για τον περιορισμό του ρεύματος και την προστασία του LED οπίσθιου φωτισμού, εκτός αν η 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 σε κατάσταση 4-bit mode και επομένως θα χρειαστούμε 6 ακροδέκτες: RS, EN, D7, D6, D5 και D4. Συνδέουμε το LCD με το Arduino ως εξής:

  • Τα τέσσερα pins δεδομένων (D4 – D7) από το LCD συνδέονται στα ψηφιακά πινς #4 – 7 του Arduino.
  • To Enable pin του LCD συνδέεται στο pin #11 του Arduino
  • Το RS pin του LCD συνδέεται στο pin #12 του Arduino.
  • Το R/W pin του LCD συνδέεται στο GND του Arduino.

Η τροφοδοσία της LCD με τάση γίνεται σε δυο διαφορετικά σημεία: η μία σύνδεση τροφοδοτεί την ίδια την οθόνη LCD (pins 1 και 2) και η άλλη τον οπίσθιο φωτισμό (pins 15 και 16). Συνδέστε τα pins 1 και 16 της LCD στο GND (γείωση) και συνδέστε τα pins 2 και 15 της μονάδας LCD στα 5V.

Οι LCD χαρακτήρων μπορεί είτε ναι είτε όχι να διαθέτουν ενσωματωμένη αντίσταση για τον οπίσθιο φωτισμό. Αυτή η αντίσταση προστατεύει τον οπίσθιο φωτισμό από υπερβολική τροφοδοσία. Αν η LCD σας δεν έχει αυτή την αντίσταση (ή αν δεν είστε σίγουροι), είναι ασφαλέστερο να προσθέσετε εσείς μια ανάμεσα στα 5V και στο pin 15. Μια αντίσταση 220Ω λειτουργεί αρκετά καλά.

Στο ακόλουθο διάγραμμα φαίνεται η επιθυμητή διασύνδεση του 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 και χρησιμοποιείται για τον έλεγχο του LCD της εταιρείας Hitachi που χρησιμοποιεί το chip HD44780.

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

Μετά θα πρέπει να δημιουργήσουμε ένα αντικείμενο LiquidCrystal. Αυτό το αντικείμενο ορίζεται με 6 παραμέτρους στη συνάρτηση δημιουργίας του. Με αυτό τον τρόπο ορίζουμε ποια Arduino pins συνδέονται στα αντίστοιχα pins του LCD και συγκεκριμένα στα RS, Enable και τα pins δεδομένων 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) η εκτέλεση του προγράμματος σταματά σε αυτό το σημείο.

Αν έχετε ένα μήνυμα που είναι μεγαλύτερο από 16 χαρακτήρες ή θέλετε να δημιουργήσετε ένα εφέ κυλιόμενης επιγραφής, μπορείτε να χρησιμοποιήσετε τις συναρτήσεις scrollDisplayLeft() ή scrollDisplayRight() μέσα σε έναν βρόχο, ώστε το κείμενο να μετακινείται στην οθόνη.

Το παρακάτω sketch δείχνει πώς να κάνετε ένα μήνυμα να κυλά συνεχώς προς τα αριστερά:

#include <LiquidCrysta.h>
// Δημιουργεί ένα αντικείμενο LCD. Παράμετροι: (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// Δήλωση των αριθμών των στηλών και γραμμών:
lcd.begin(16, 2);
// Καθαρίζει την οθόνη LCD
lcd.clear();
// Προβολή ενός μηνύματος στην LCD.
lcd.print("Scrolling Text Demo");
delay(1000); // Παύση ενος δευτερολέπτου
}
void loop() {
lcd.scrollDisplayLeft(); // κύλιση των περιεχομένων προς τα
//αριστερά κατά μια θέση
delay(300); // μικρή παύση για δημιουργία ορατής κίνησης
}

Σε αυτό το παράδειγμα, εμφανίζουμε στην LCD ένα μήνυμα με μήκος 19 χαρακτήρων («Scrolling Text Demo»). Επειδή η οθόνη μπορεί να εμφανίσει μόνο 16 χαρακτήρες κάθε φορά, αρχικά θα είναι ορατοί μόνο οι πρώτοι 16 χαρακτήρες.

// Εμφάνιση ενός μηνύματος στην LCD
lcd.print("Scrolling Text Demo");

Στη συνάρτηση loop(), καλούμε τη lcd.scrollDisplayLeft(), η οποία μετακινεί ολόκληρο το περιεχόμενο της οθόνης μία θέση προς τα αριστερά. Επαναλαμβάνοντας αυτή τη διαδικασία με μια μικρή καθυστέρηση ανάμεσα σε κάθε κύλιση, το μήνυμα φαίνεται να κινείται ομαλά στην οθόνη.

void loop() {
lcd.scrollDisplayLeft(); // κύλιση όλου του περιεχομένου μία θέση προς τα αριστερά
delay(300); // μικρή καθυστέρηση για ορατή ταχύτητα κύλισης
}

Καθώς το κείμενο κυλίεται, οι χαρακτήρες που βγαίνουν από το αριστερό άκρο εξαφανίζονται και κενά διαστήματα εμφανίζονται στη δεξιά πλευρά της οθόνης. Αν θέλετε το μήνυμα να επαναλαμβάνεται συνεχώς, θα πρέπει να προσθέσετε κώδικα που να το επανεμφανίζει περιοδικά.

Για κύλιση προς την αντίθετη κατεύθυνση, μπορείτε να χρησιμοποιήσετε αντί για τη lcd.scrollDisplayLeft() τη lcd.scrollDisplayRight().

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

Μερικές φορές μπορεί να θέλετε να εμφανίσετε ειδικούς χαρακτήρες που δεν ανήκουν στο τυπικό αλφάβητο ή στους αριθμούς – για παράδειγμα, σύμβολα όπως ένα χαμογελαστό πρόσωπο, το σύμβολο των βαθμών (∘) για ενδείξεις θερμοκρασίας ή διασκεδαστικά εικονίδια όπως καρδιές, μουσικές νότες ή βέλη.

Τα καλά νέα είναι ότι οι LCD HD44780 σας επιτρέπουν να δημιουργήσετε έως και 8 προσαρμοσμένους χαρακτήρες δικού σας σχεδιασμού! Όπως είδαμε νωρίτερα σε αυτό το tutorial, κάθε χαρακτήρας στην LCD εμφανίζεται χρησιμοποιώντας ένα μικρό πλέγμα από pixels διατεταγμένα σε μοτίβο 5×8 (5 pixels πλάτος και 8 pixels ύψος). Για να δημιουργήσετε τον δικό σας χαρακτήρα, πρέπει να αποφασίσετε ποια από αυτά τα μικροσκοπικά σημεία θα είναι αναμμένα και ποια θα είναι σβηστά.

Για να δημιουργήσετε τον προσαρμοσμένο χαρακτήρα σας, πρέπει πρώτα να φτιάξετε έναν πίνακα 8 byte μέσα στον κώδικά σας. Κάθε byte σε αυτόν τον πίνακα αντιπροσωπεύει μία οριζόντια γραμμή του χαρακτήρα σας, ξεκινώντας από την επάνω γραμμή και κατεβαίνοντας προς την κάτω. Για κάθε byte, θα χρησιμοποιήσετε τα bits (τα 1 και 0 στο δυαδικό σύστημα) για να υποδείξετε ποια pixels θα είναι ON (1) και ποια OFF (0). Χρησιμοποιούνται μόνο τα πρώτα 5 bits από κάθε byte, αφού ο χαρακτήρας έχει πλάτος 5 pixels.

Μόλις σχεδιάσετε τον χαρακτήρα σας ρυθμίζοντας αυτόν τον πίνακα, μπορείτε να χρησιμοποιήσετε τη συνάρτηση createChar() για να αποθηκεύσετε τον προσαρμοσμένο χαρακτήρα σας στη CGRAM (Character Generator RAM) της LCD, που είναι μια ειδική περιοχή μνήμης σχεδιασμένη ακριβώς για την αποθήκευση προσαρμοσμένων χαρακτήρων.

Τώρα, ας προχωρήσουμε και ας δημιουργήσουμε μερικούς όμορφους προσαρμοσμένους χαρακτήρες για τα projects σας!

Το παρακάτω sketch σας δείχνει ακριβώς πως να εμφανίσετε τους προσαρμοσμένους χαρακτήρες σας στην LCD.

// Συμπερίληψη της βιβλιοθήκης για το LCD χαρακτήρων:
#include <LiquidCrystal.h>

// Αρχικοποίηση της LCD βιβλιοθήκης με δήλωση των pins της LCD.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Δημιουργία μερικών προσαρμοσμένων χαρακτήρων:
byte Heart[8] = {
0b00000, 0b01010, 0b11111,
0b11111, 0b01110, 0b00100,
0b00000, 0b00000
};

byte Bell[8] = {
0b00100, 0b01110, 0b01110,
0b01110, 0b11111, 0b00000,
0b00100, 0b00000
};


byte Alien[8] = {
0b11111, 0b10101, 0b11111,
0b11111, 0b01110, 0b01010,
0b11011, 0b00000
};

byte Check[8] = {
0b00000, 0b00001, 0b00011,
0b10110, 0b11100, 0b01000,
0b00000, 0b00000
};

byte Speaker[8] = {
0b00001, 0b00011, 0b01111,
0b01111, 0b01111, 0b00011,
0b00001, 0b00000
};


byte Sound[8] = {
0b00001, 0b00011, 0b00101,
0b01001, 0b01001, 0b01011,
0b11011, 0b11000
};


byte Skull[8] = {
0b00000, 0b01110, 0b10101,
0b11011, 0b01110, 0b01110,
0b00000, 0b00000
};

byte Lock[8] = {
0b01110, 0b10001, 0b10001,
0b11111, 0b11011, 0b11011,
0b11111, 0b00000
};

void setup() 
{
// Αρχικοποίηση της LCD και δήλωση του αριθμού των στηλών και γραμμών. 
        lcd.begin(16, 2);

        lcd.createChar(0, Heart);
        lcd.createChar(1, Bell);
        lcd.createChar(2, Alien);
        lcd.createChar(3, Check);
        lcd.createChar(4, Speaker);
        lcd.createChar(5, Sound);
        lcd.createChar(6, Skull);
        lcd.createChar(7, Lock);

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

        // Προβολή μηνύματος στην LCD.
        lcd.print("Custom Character");
}

// Προβολή όλων των προσαρμοσμένων χαρακτήρων.
void loop() 
{ 
        lcd.setCursor(0, 1); lcd.write(byte(0));
        lcd.setCursor(2, 1); lcd.write(byte(1));
        lcd.setCursor(4, 1); lcd.write(byte(2));
        lcd.setCursor(6, 1); lcd.write(byte(3));
        lcd.setCursor(8, 1); lcd.write(byte(4));
        lcd.setCursor(10, 1); lcd.write(byte(5));
        lcd.setCursor(12, 1); lcd.write(byte(6));
        lcd.setCursor(14, 1); lcd.write(byte(7));
        
        while(1);
}

Όταν ανεβάσεις τον κώδικα στο Arduino, θα πάρεις το ακόλουθο αποτέλεσμα στην οθόνη LCD:

Αφού συμπεριλάβουμε τη βιβλιοθήκη LiquidCrystal και ρυθμίσουμε το αντικείμενο της LCD, ο κώδικας ορίζει ειδικούς πίνακες για τους προσαρμοσμένους χαρακτήρες μας. Κάθε πίνακας έχει ακριβώς 8 bytes και κάθε byte ελέγχει μία γραμμή από τελείες στο πλέγμα χαρακτήρα 5×8.

Το παράδειγμα περιλαμβάνει οκτώ διαφορετικούς προσαρμοσμένους χαρακτήρες. Ας δούμε ως παράδειγμα τον πίνακα Heart:

byte Heart = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};

Κάθε γραμμή αντιπροσωπεύει μία σειρά από pixels, ξεκινώντας από την κορυφή του χαρακτήρα. Το “0b” στην αρχή απλώς δηλώνει στην Arduino ότι πρόκειται για δυαδικό αριθμό (αποτελούμενο από 0 και 1). Κάθε 0 σημαίνει «pixel σβηστό» και κάθε 1 σημαίνει «pixel αναμμένο». Αν παρατηρήσετε προσεκτικά το μοτίβο, μπορείτε να δείτε πώς τα 1 σχηματίζουν την εικόνα μιας καρδιάς!

Στο τμήμα setup του κώδικα, χρησιμοποιούμε τη συνάρτηση createChar() για να αποθηκεύσουμε τον προσαρμοσμένο χαρακτήρα μας στη μνήμη της LCD. Αυτή η συνάρτηση χρειάζεται δύο πληροφορίες: έναν αριθμό από 0 έως 7 (ο οποίος λέει στην LCD ποια από τις οκτώ διαθέσιμες θέσεις μνήμης θα χρησιμοποιήσει) και το όνομα του πίνακα που περιέχει το σχέδιο του χαρακτήρα μας.

Ο παρακάτω κώδικας αποθηκεύει το σχέδιο της καρδιάς μας στη θέση 0 της μνήμης CGRAM της LCD.

// δημιουργία νέου χαρακτήρα
lcd.createChar(0, Heart);

Τέλος, στο τμήμα loop, εμφανίζουμε τον προσαρμοσμένο χαρακτήρα μας χρησιμοποιώντας τη συνάρτηση write(). Της υποδεικνύουμε ποιον χαρακτήρα να εμφανίσει περνώντας τον αριθμό της θέσης μνήμης:

// το byte(0) αντιπροσωπεύει τον χαρακτήρα Heart.
lcd.write(byte(0));