Σύνδεση οθόνης LCD στο Arduino μέσω i2c. Σύνδεση οθόνης LCD LCM1602 με I2C στο Arduino

10.09.2021
  • Η μονάδα FC-113 βασίζεται στο τσιπ PCF8574T, το οποίο είναι 8-bit μητρώο βάρδιας- «επέκταση» εισόδων και εξόδων για σειριακό λεωφορείο I2C. Στο σχήμα, το μικροκύκλωμα χαρακτηρίζεται DD1.
  • Το R1 είναι μια αντίσταση περικοπής για τη ρύθμιση της αντίθεσης της οθόνης LCD.
  • Το Jumper J1 χρησιμοποιείται για την ενεργοποίηση του οπίσθιου φωτισμού της οθόνης.
  • Οι ακίδες 1…16 χρησιμοποιούνται για τη σύνδεση της μονάδας στις ακίδες της οθόνης LCD.
  • Απαιτούνται επιθέματα επαφής A1...A3 για την αλλαγή της διεύθυνσης I2C της συσκευής. Συγκολλώντας τους κατάλληλους βραχυκυκλωτήρες, μπορείτε να αλλάξετε τη διεύθυνση της συσκευής. Ο πίνακας δείχνει την αντιστοιχία διευθύνσεων και βραχυκυκλωτήρα: το "0" αντιστοιχεί σε ένα ανοιχτό κύκλωμα, το "1" σε έναν εγκατεστημένο βραχυκυκλωτήρα. Από προεπιλογή, και τα 3 jumpers είναι ανοιχτά και η διεύθυνση της συσκευής 0x27.

2 Διάγραμμα σύνδεσης για οθόνη LCD στο Arduinoμέσω πρωτοκόλλου I2C

Η μονάδα είναι συνδεδεμένη στο Arduino ως στάνταρ για το δίαυλο I2C: ο ακροδέκτης SDA της μονάδας είναι συνδεδεμένος στο αναλογική θύρα A4, SCL pin - στην αναλογική θύρα A5 του Arduino. Η μονάδα τροφοδοτείται με +5 V από το Arduino. Η ίδια η μονάδα συνδέεται με τις ακίδες 1…16 στις αντίστοιχες ακίδες 1…16 στην οθόνη LCD.


3 Βιβλιοθήκη για εργασίαμέσω πρωτοκόλλου I2C

Τώρα χρειαζόμαστε μια βιβλιοθήκη για να δουλεύουμε με LCD μέσω της διεπαφής I2C. Μπορείτε να χρησιμοποιήσετε, για παράδειγμα, αυτό (σύνδεσμος στη γραμμή "Λήψη δείγματος κώδικα και βιβλιοθήκης").

Λήψη αρχείου LiquidCrystal_I2Cv1-1.rarαποσυμπιέστε σε ένα φάκελο \βιβλιοθήκες\, που βρίσκεται στον κατάλογο Arduino IDE.

Η βιβλιοθήκη υποστηρίζει την πληκτρολόγηση τυπικά χαρακτηριστικάγια οθόνες LCD:

ΛειτουργίαΣκοπός
LiquidCrystal() δημιουργεί μεταβλητή τύπου LiquidCrystal και δέχεται παραμέτρους σύνδεσης οθόνης (αριθμοί ακίδων).
αρχίζω() αρχικοποίηση της οθόνης LCD, ρύθμιση παραμέτρων (αριθμός γραμμών και χαρακτήρων).
σαφής() εκκαθάριση της οθόνης και επαναφορά του δρομέα στην αρχική θέση.
σπίτι() επιστρέψτε τον κέρσορα στην αρχική θέση.
setCursor() ρύθμιση του δρομέα σε μια δεδομένη θέση.
γράφω() εμφανίζει το σύμβολο στην οθόνη LCD.
αποτύπωμα() εμφανίζει κείμενο στην οθόνη LCD.
δρομέας() δείχνει τον κέρσορα, δηλ. υπογράμμιση κάτω από τη θέση του επόμενου χαρακτήρα.
noCursor() κρύβει τον κέρσορα.
αναβοσβήνω() ο κέρσορας αναβοσβήνει.
noBlink() Ακύρωση αναβοσβήνει?
noDisplay() απενεργοποίηση της οθόνης κατά την αποθήκευση όλων των εμφανιζόμενων πληροφοριών.
επίδειξη() ενεργοποίηση της οθόνης κατά την αποθήκευση όλων των εμφανιζόμενων πληροφοριών.
scrollDisplayLeft() κυλήστε τα περιεχόμενα της οθόνης 1 θέση προς τα αριστερά.
scrollDisplayRight() κύλιση των περιεχομένων της οθόνης 1 θέση προς τα δεξιά.
autoscroll() ενεργοποίηση αυτόματης κύλισης.
noAutoscroll() Απενεργοποίηση αυτόματης κύλισης.
αριστερά προς τα δεξιά() ορίζει την κατεύθυνση του κειμένου από αριστερά προς τα δεξιά.
rightToLeft() κατεύθυνση κειμένου από δεξιά προς τα αριστερά.
createChar() δημιουργεί έναν προσαρμοσμένο χαρακτήρα για την οθόνη LCD.

4 Σκίτσο για έξοδο κειμένουσε οθόνη LCD μέσω διαύλου I2C

Ας ανοίξουμε το δείγμα: Δείγματα αρχείων LiquidCrystal_I2C CustomCharsκαι θα το αλλάξουμε λίγο. Θα εμφανίσουμε ένα μήνυμα στο τέλος του οποίου θα αναβοσβήνει ένα σύμβολο. Τα σχόλια στον κώδικα σχολιάζουν όλες τις αποχρώσεις του σκίτσου.

#συμπεριλαμβάνω // περιλαμβάνει τη βιβλιοθήκη Wire #include // συνδέστε τη βιβλιοθήκη LCD #define printByte(args) write(args); // uint8_t καρδιά = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // μάσκα bit του συμβόλου "καρδιά" LiquidCrystal_I2C lcd(0x27, 16, 2); // Ορίστε τη διεύθυνση 0x27 για οθόνη LCD 16x2 void setup() ( lcd.init(); // προετοιμασία της οθόνης LCD lcd.backlight(); // ενεργοποιήστε τον οπίσθιο φωτισμό της οθόνης lcd.createChar(3, heart); // δημιουργήστε ένα σύμβολο "καρδιά" στο κελί μνήμης 3 lcd.home(); // τοποθετήστε τον κέρσορα στην επάνω αριστερή γωνία, στη θέση (0,0) lcd.!"); // εκτυπώστε μια γραμμή κειμένου lcd.setCursor(0, 1); // μετακινήστε τον κέρσορα στη γραμμή 2, χαρακτήρας 1 lcd.print( "i "); } void loop() (// αναβοσβήνει τον τελευταίο χαρακτήρα lcd.setCursor(13, 1); // μετακινήστε τον κέρσορα στη γραμμή 2, χαρακτήρας 1 lcd.print("\t"); }

καθυστέρηση (500); lcd.setCursor(13, 1); // μετακινήστε τον κέρσορα στη γραμμή 2, χαρακτήρας 1 lcd.print(" ");καθυστέρηση (500);

5 Παρεμπιπτόντως, οι χαρακτήρες που γράφτηκαν από την εντολή lcd.createChar();

, παραμένουν στη μνήμη της οθόνης ακόμη και μετά την απενεργοποίηση του ρεύματος, επειδή γραμμένο για εμφάνιση ROM 1602. Δημιουργήστε τα δικά σας σύμβολαγια οθόνη LCD {00000, 01010, 11111, 11111, 01110, 00100, 00000} Ας δούμε λίγο πιο προσεκτικά το θέμα της δημιουργίας των δικών σας συμβόλων για οθόνες LCD. Κάθε χαρακτήρας στην οθόνη αποτελείται από 35 κουκκίδες: 5 πλάτος και 7 ύψος (+1 δεσμευτική γραμμή για υπογράμμιση). Στη γραμμή 6 του παραπάνω σκίτσου ορίζουμε έναν πίνακα 7 αριθμών:

6 (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Μετατροπή δεκαεξαδικών αριθμών σε δυαδικό:

. Αυτοί οι αριθμοί δεν είναι τίποτα άλλο από μάσκες bit για καθεμία από τις 7 γραμμές του συμβόλου, όπου το "0" υποδηλώνει ένα φωτεινό σημείο και το "1" ένα σκοτεινό σημείο. Για παράδειγμα, ένα σύμβολο καρδιάς που καθορίζεται ως bitmask θα εμφανιστεί στην οθόνη όπως φαίνεται στο σχήμα.


7 Έλεγχος οθόνης LCDμέσω λεωφορείου I2C

Ως μπόνους, ας δούμε το διάγραμμα χρονισμού για την εμφάνιση των λατινικών χαρακτήρων "A", "B" και "C" στην οθόνη LCD. Αυτοί οι χαρακτήρες αποθηκεύονται στην οθόνη ROM και εμφανίζονται στην οθόνη απλώς μεταδίδοντας τις διευθύνσεις τους στην οθόνη. Το διάγραμμα λαμβάνεται από τις ακίδες RS, RW, E, D4, D5, D6 και D7 της οθόνης, δηλ. ήδη μετά τον μετατροπέα FC-113 “I2C parallel bus”. Μπορούμε να πούμε ότι βουτάμε λίγο πιο βαθιά στο υλικό.


Διάγραμμα χρονισμού της εξόδου λατινικών χαρακτήρων "A", "B" και "C" στην οθόνη LCD 1602

Το διάγραμμα δείχνει ότι οι χαρακτήρες που βρίσκονται στην οθόνη ROM (βλ. σελ. 11 του φύλλου δεδομένων, σύνδεσμος παρακάτω) μεταδίδονται σε δύο τσιμπήματα, η πρώτη από τις οποίες καθορίζει τον αριθμό της στήλης του πίνακα και η δεύτερη - τον αριθμό της σειράς. Σε αυτή την περίπτωση, τα δεδομένα "μανδαλώνονται" στην άκρη του σήματος στη γραμμή μι(Ενεργοποίηση) και η γραμμή R.S.(Επιλογή εγγραφής) βρίσκεται σε μια λογική κατάσταση, που σημαίνει ότι τα δεδομένα μεταφέρονται. Μια χαμηλή κατάσταση στη γραμμή RS σημαίνει ότι αποστέλλονται οδηγίες, κάτι που βλέπουμε πριν από τη μετάδοση κάθε χαρακτήρα. Σε αυτήν την περίπτωση, ο κωδικός οδηγιών επιστροφής μεταφοράς μεταδίδεται στη θέση (0, 0) της οθόνης LCD, την οποία μπορείτε επίσης να βρείτε μελετώντας τεχνική περιγραφήεπίδειξη.

Και ένα ακόμη παράδειγμα. Αυτό το διάγραμμα χρονισμού δείχνει την έξοδο του συμβόλου Heart στην οθόνη LCD.


Και πάλι, οι δύο πρώτες παρορμήσεις Καθιστώ ικανόσυμμορφωθείτε με τις οδηγίες Σπίτι()(0000 0010 2) - επαναφέρετε το φορείο στη θέση (0; 0) και το δεύτερο δύο - έξοδος στην οθόνη LCD που είναι αποθηκευμένη στο κελί μνήμης 3 10 (0000 0011 2) το σύμβολο "Καρδιά" (οδηγία lcd.createChar(3, heart);σκίτσο).

Σε αυτό το άρθρο θα σας πω πώς να χρησιμοποιήσετε τη μονάδα διασύνδεσης I2C για Έλεγχος LCDοθόνη (2×16 / 20x4) με χρησιμοποιώντας Arduino. Αυτή η μονάδα σάς επιτρέπει να μειώσετε τον αριθμό των ακίδων ελεγκτή που χρησιμοποιούνται αντί για σύνδεση 8 ή 4 bit, απαιτούνται μόνο 2 ακίδες (SDA και SCL).

Τεχνικές Παράμετροι

Υποστήριξη οθόνης: LCD 16×02 / 20×04
Προαιρετικά: ρύθμιση αντίθεσης
Τάση τροφοδοσίας. 5V
Διεπαφή: I2C
Διαστάσεις: 54mm x 19mm x 15mm

Γενικές πληροφορίες σχετικά με τη μονάδα διασύνδεσης I2C

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

Τώρα λίγο για την ίδια τη μονάδα είναι χτισμένη στο τσιπ PCF8574T. Οι αντιστάσεις R8 (4,7 kOhm) και R9 (4,7 kOhm) είναι απαραίτητες για την ανύψωση των γραμμών SDA και SCL Στην ιδανική περίπτωση, όταν συνδέετε δύο ή περισσότερες συσκευές μέσω του διαύλου I2C, πρέπει να χρησιμοποιείτε ένα pull-up μόνο σε μία συσκευή, I. Θα γράψω γιατί αργότερα. Υπάρχουν τρεις βραχυκυκλωτήρες στην πλακέτα (το διάγραμμα δείχνει ότι οι γραμμές A0, A1, A2 συνδέονται στο τροφοδοτικό μέσω των αντιστάσεων R4, R5, R6), χρειάζονται για να αλλάξετε τη διεύθυνση της συσκευής, υπάρχουν συνολικά 8 επιλογές . Η αλλαγή της διευθυνσιοδότησης μας δίνει τη δυνατότητα να συνδέσουμε έως και οκτώ συσκευές μέσω του διαύλου IC2 με το τσιπ PCF8574T οι επιλογές διεύθυνσης φαίνονται στο σχήμα (η προεπιλεγμένη διεύθυνση συσκευής είναι 0x27). Η μονάδα είναι επίσης εξοπλισμένη με ποτενσιόμετρο R11, με τη βοήθειά του μπορείτε να αλλάξετε την αντίθεση της οθόνης LCD.

Υπάρχουν τρεις ομάδες επαφών στη μονάδα για σύνδεση:

Πρώτη ομάδα:
SCL: Σειριακό ρολόι
SDA: γραμμή δεδομένων (Serial Dфta)
VCC: ισχύς "+".
GND: Τροφοδοτικό "-".

Δεύτερη ομάδα:
VSS: "-" ισχύς
VDD: Ισχύς «+».
VO: Πείρο ελέγχου αντίθεσης
RS: Εγγραφή Επιλέξτε
RW: Ανάγνωση/Εγγραφή (λειτουργία εγγραφής όταν είναι συνδεδεμένο στη γείωση)
E: Ενεργοποίηση (πτώση στροβοσκοπίου)
DB0-DB3: Χαμηλά bit διεπαφής
DB4-DB7: High bits διεπαφής
Α: Τροφοδοτικό οπίσθιου φωτισμού "+".
K: "-" Ισχύς οπίσθιου φωτισμού

Τρίτη ομάδα: (το jumper που έχει οριστεί από προεπιλογή)
VCC:
A από LCD:

Σύνδεση στο Arduino

Απαιτούμενα ανταλλακτικά:
Arduino UNO R3 x 1 τεμ.
Οθόνη LCD 1602A (2×16, 5V, Μπλε) x 1 τεμ.
Μονάδα διασύνδεσης I2C, IIC, TWI για LCD x 1 τεμ.
Σύρμα DuPont, 2,54 mm, 20 cm, F-M (Γυναικείο - Αρσενικό) x 1 τεμ.
Καλώδιο USB 2,0 A-B x 1 τεμ.

Σύνδεση:
Πρώτα απ 'όλα, κολλάμε τη μονάδα I2C στην οθόνη LCD και, στη συνέχεια, πρέπει να συνδέσετε την οθόνη στο Arduino UNO. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε την καλωδίωση DuPont που συνδέουμε σύμφωνα με τον παρακάτω πίνακα.

Για λόγους σαφήνειας, θα δώσω ένα άλλο διάγραμμα.

Για αυτό το πείραμα, πρέπει να κάνετε λήψη και εγκατάσταση της βιβλιοθήκης "LiquidCrystal_I2C". Στη συνέχεια, αντιγράψτε και επικολλήστε αυτό το παράδειγμα κώδικα στο παράθυρο του προγράμματος Arduino IDE και φορτώστε τον στον ελεγκτή.

/* Δοκιμάστηκε σε Arduino IDE 1.6.11 Ημερομηνία δοκιμής 15/09/2016 */ #include #συμπεριλαμβάνω LiquidCrystal_I2C LCD (0x27,16,2); // Ορίστε τη διεύθυνση και το μέγεθος της οθόνης void setup() ( lcd.init(); // Initialize lcd lcd.backlight(); // Ενεργοποίηση του οπίσθιου φωτισμού lcd.setCursor(0,0); // Ρύθμιση του δρομέας στην αρχή της γραμμής lcd .print("Hello, world" // Εκτύπωση του κειμένου lcd.setCursor(0,1) robotchip.ru"); // Εκτυπώστε το κείμενο ) void loop() ( )

Κατεβάστε το πρόγραμμα

Εάν τα κάνατε όλα σωστά, αλλά δεν υπάρχουν σύμβολα στην οθόνη, δοκιμάστε να αυξήσετε την αντίθεση με το ποτενσιόμετρο.


Εδαφος διά παιγνίδι γκολφ
Κάντε λήψη της βιβλιοθήκης LiquidCrystal_I2C
Τεκμηρίωση για το τσιπ PCF8574T
Τεκμηρίωση για LCD1602A

Αγορά στο Aliexpress

Ίσως μια από τις πιο δημοφιλείς οθόνες της αγοράς. Κατασκευασμένο στο δημοφιλές χειριστήριο HD44780U. Από το όνομα του μοντέλου προκύπτει ότι η οθόνη αποτελείται από δύο γραμμές των 16 χαρακτήρων. Δεν υπάρχει υποστήριξη για τη ρωσική γλώσσα στο συγκεκριμένο μοντέλο.

Ο δίαυλος δεδομένων sh2s σας επιτρέπει να συνδέσετε έως και 127 συσκευές μέσω δύο καλωδίων, ταυτόχρονα. Αυτό το I2C υλοποιείται στο τσιπ PCF8574T.

Διάγραμμα σύνδεσης:

Μπλε πράγμα - μεταβλητή αντίσταση, σας επιτρέπει να προσαρμόσετε την αντίθεση της οθόνης.

Ο βραχυκυκλωτήρας στα αριστερά είναι υπεύθυνος για τον οπίσθιο φωτισμό της οθόνης.

Ένα μπλοκ 4 επαφών συνδέεται με το arduino ως εξής:

GND - GND
VCC - 5V
SDA - A4 (εάν Arduino MEGA, τότε σε D20)
SCL - A5 (εάν Arduino MEGA, τότε σε D21)

Βιβλιοθήκη

Σκίτσο

Η οθόνη μπορεί να έχει διαφορετική διεύθυνση IIC, αντί για 0x27 μπορεί να είναι 0x3F. Για να προσδιορίσετε με ακρίβεια τη διεύθυνση, μπορείτε να χρησιμοποιήσετε έναν σαρωτή συσκευής i2c.

#συμπεριλαμβάνω #συμπεριλαμβάνω //ρυθμίστε τη διεύθυνση της οθόνης LCD 0x27, 16 χαρακτήρες, 2 γραμμές LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() ( lcd.init(); // Εκκίνηση της οθόνης //ενεργοποιήστε τον οπίσθιο φωτισμό lcd.backlight(); //Ορίστε τη θέση από την οποία θα εμφανίζεται το κείμενο. lcd.setCursor(2, 0); //γραμμή εξόδου 1 lcd.print("Hello, World!"); //εκτυπώστε τη δεύτερη γραμμή με τον ίδιο τρόπο lcd.setCursor(1, 1);

lcd.print("www.site"); ) βρόχος κενού () ( ) Πήρα μια άλλη συσκευή εδώ από ένα καλό κατάστημα Chip Resistor για μελέτη και χρήσηχρήσιμες συσκευές

. Αυτή η συσκευή αποδείχθηκε ότι σχεδιάστηκε για να ελέγχει μια οθόνη LCD που ελέγχεται από έναν ελεγκτή HD44780, σε λειτουργία 4 bit. Για το σκοπό αυτό, τοποθετείται στην πλακέτα ένα μικροκύκλωμα, το οποίο είναι μετατροπέας του διαύλου I2C σε παράλληλη θύρα 8 bit.

Η πλακέτα δρομολογείται με τέτοιο τρόπο ώστε να μπορεί να συνδεθεί αμέσως στην οθόνη LCD. Η είσοδος τροφοδοτεί γραμμές ρεύματος και I2C. Η πλακέτα είναι αμέσως εξοπλισμένη με αντιστάσεις έλξης στις γραμμές SCL και SDA, ένα ποτενσιόμετρο για τη ρύθμιση της αντίθεσης και τροφοδοτικό για την ίδια την οθόνη. Ο βραχυκυκλωτήρας στα δεξιά ενεργοποιεί/απενεργοποιεί τον οπίσθιο φωτισμό. Στη συνέχεια, οπλισμένος με δοκιμαστή, καταρτίστηκε ο ακόλουθος πίνακας. Μετά τη μελέτη της ενότητας, αποκαλύφθηκε ότιελέγχει τον οπίσθιο φωτισμό. Εάν έχει εγκατασταθεί ο βραχυκυκλωτήρας, τότε το 1 ανάβει τον οπίσθιο φωτισμό και το 0 τον απενεργοποιεί. Όταν αφαιρείται ο βραχυκυκλωτήρας, ο οπίσθιος φωτισμός είναι πάντα σβηστός. Στη συνέχεια, αποφασίστηκε να συμπληρωθεί η βιβλιοθήκη axlib με λειτουργίες για εργασία με το δίαυλο I2C (υλοποίηση λογισμικού) και λειτουργίες ελέγχου του τσιπ PCF8574. Με λίγα λόγια, πώς λειτουργεί η ενότητα. Για να εξάγετε ένα byte παράλληλα, πρέπει να στείλετε τη διεύθυνση του μικροκυκλώματος στο δίαυλο I2C (από προεπιλογή είναι 0x4E. Μπορείτε επίσης να αλλάξετε τη διεύθυνση συγκολλώντας βραχυκυκλωτήρες στην πλακέτα και αλλάζοντας την τιμή των τριών λιγότερο σημαντικών bits της διεύθυνσης), μετά τη λήψη του ACK, αποστέλλεται ένα byte δεδομένων. Αφού το τσιπ αποκριθεί με ένα ACK, το byte εμφανίζεται στην παράλληλη θύρα του τσιπ. Για να ελέγξω την οθόνη LCD, πήρα λειτουργίες από τη βιβλιοθήκη του axlib και τις τροποποίησα ελαφρώς ώστε να λειτουργούν με το δίαυλο I2C. #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #define ΠΡΟΣΘΗΚΗ 0x4E // Διεύθυνση τσιπ /* Τσιπ LCD RS P0 RW P1 EL P2 D4 P4 D5 P5 D6 P6 D7 P7 Υπάρχει οπίσθιος φωτισμός στο πόδι σύνδεσης P3. 1 ενεργό, 0 απενεργοποιημένο */ // Εξαγωγή δεδομένων com |= 0x04; // E ανά μονάδα pcf8574_byte_out(com, ADD); // Εξαγωγή δεδομένων com &= 0xFB; // Ε έως μηδέν pcf8574_byte_out(com, ADD); // Εξαγωγή δεδομένων) void init(void) ( _delay_ms(30); com (0x30); _delay_us(40); com (0x30); // Μετάβαση σε λειτουργία 4-bit _delay_us(40); // Καθυστέρηση για την εκτέλεση εντολών com (0x30); // Μετάβαση σε λειτουργία 4-bit _delay_us(40); // Καθυστέρηση για την εκτέλεση εντολών com (0x20); // Μετάβαση σε λειτουργία 4-bit _delay_us(40); // Καθυστέρηση για την εκτέλεση εντολών com (0x20); // Ρύθμιση παραμέτρων com (0x80); // Ρύθμιση παραμέτρων com (0x00); // Απενεργοποιήστε την οθόνη com (0x80); // Απενεργοποιήστε την οθόνη com (0x00); // Εκκαθάριση της οθόνης com (0x10); // Εκκαθάριση της οθόνης com (0x00); com (0x60); // Ρυθμίστε τη λειτουργία εισαγωγής δεδομένων com (0x00); com (0xC0); // Ενεργοποιήστε την οθόνη με τον επιλεγμένο δρομέα) void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Μεταφορά των πιο σημαντικών 4 bit data_h |= 0x04; pcf8574_byte_out(data_h, ADD); // Μεταφέρετε τα πιο σημαντικά 4 bit // Μεταφέρετε τα πιο σημαντικά 4 bit // Μεταφορά χαμηλών 4 bit // Μεταφορά χαμηλών 4 bit // Μεταφορά χαμηλών 4 bit) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁPҐBET MҐP!" ) while(1) ( ) )Ακριβώς αυτό που συμβαίνει εδώ. Πρώτα συνδέουμε τις βιβλιοθήκες για το I2C και για το PCF8574. Έχω ήδη γράψει για το I2C, οπότε θα το συνεχίσω ξανά, αλλά θα σας πω τι υπάρχει στο PCF8574.h. Η βιβλιοθήκη περιλαμβάνει μόνο τρεις λειτουργίες.
BYTE pcf8574_test(BYTE add) ( BYTE ερώτηση = ACK; προσθήκη &= 0xFE; i2c_start(); ask = i2c_send_byte(add); i2c_stop(); επιστροφή ερώτηση; )Η πρώτη λειτουργία γράφτηκε για να ελέγξει εάν μια συσκευή βρίσκεται στο λεωφορείο. Κατ 'αρχήν, μπορεί να χρησιμοποιηθεί για την αναζήτηση οποιασδήποτε συσκευής βρίσκεται στο λεωφορείο. Η συνάρτηση παίρνει τη διεύθυνση της επιθυμητής συσκευής και αν ανταποκριθεί, επιστρέφει μηδέν. Εάν μια συσκευή με τέτοια διεύθυνση δεν βρίσκεται στο λεωφορείο, θα επιστρέψει μία.
BYTE pcf8574_byte_out(BYTE δεδομένα, BYTE προσθήκη) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(data); i2c_stop(); )Αυτή η λειτουργία είναι ήδη προσαρμοσμένη αποκλειστικά για αυτό το τσιπ. Ως ορίσματα, του δίνεται ένα byte που θα μεταφερθεί στο δίαυλο και στη διεύθυνση του τσιπ. Η συνάρτηση θα ρωτήσει πρώτα το τσιπ ανά διεύθυνση και μετά θα στείλει το byte. Εάν το τσιπ έλαβε ένα byte και ανταποκριθεί με ACK, τότε η συνάρτηση θα ολοκληρώσει τη δουλειά με το τσιπ και θα επιστρέψει το μηδέν ως επιτυχημένη αποστολή του byte. Και αυτή τη στιγμή το μικροκύκλωμα θα εξάγει αυτό το byte στην παράλληλη θύρα του. Διαφορετικά, θα λάβουμε NACK και θα επιστρέψουμε ένα, η μετάδοση απέτυχε.
BYTE pcf8574_str_out(BYTE *data, BYTE col, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); for(BYTE i=0; i Αυτή η συνάρτηση δημιουργήθηκε για πειραματισμό. Δέχεται έναν δείκτη σε μια σειρά δεδομένων ενός byte, τον αριθμό αυτών των byte και τη διεύθυνση του τσιπ. Στην πραγματικότητα, μια προσπάθεια μεταφοράς όλων των δεδομένων σε μία περίοδο λειτουργίας και όχι σε ένα byte ανά περίοδο λειτουργίας. Η λειτουργία λειτουργεί, αλλά δεν είναι κατάλληλη για την οθόνη LCD. Τώρα ας επιστρέψουμε στο κύριο πρόγραμμα. Αφού συνδέσουμε τις βιβλιοθήκες, γράφουμε τη διεύθυνση του μικροκυκλώματος. Στη συνέχεια, δημιουργούμε τρεις συναρτήσεις παρόμοιες με το lcd.h. Η μόνη διαφορά είναι στην αρχή της μεταφοράς δεδομένων.
void com(BYTE com) ( com |= 0x08; // P3 σε ένα, έτσι ώστε ο οπίσθιος φωτισμός να είναι αναμμένος pcf8574_byte_out(com, ADD); // Εξαγωγή δεδομένων com |= 0x04; // E ανά μονάδα pcf8574_byte_out(com, ADD); // Εξαγωγή δεδομένων com &= 0xFB; // Ε έως μηδέν pcf8574_byte_out(com, ADD); // Εξαγωγή δεδομένων } Αυτή η λειτουργία στέλνει μόνο εντολές στην οθόνη. Εδώ εμφανίστηκε η πρώτη γραμμή με τη λογική προσθήκη της εντολής από το 0x08. Αυτό το σφάλμα είναι απαραίτητο λόγω του γεγονότος ότι μεταδίδουμε το byte όχι απευθείας στη θύρα της οθόνης LCD, αλλά μέσω του επαναλήπτη μας. Δηλαδή, εάν παρέχαμε ένα byte και στη συνέχεια πρέπει να εξάγουμε μόνο ένα bit, τότε παρακαλούμε αντιστοιχίστε το απαιτούμενο bit στο προηγούμενο byte και στείλτε το ξανά στη θύρα. Αυτή είναι μια τέτοια ταλαιπωρία. Η πρόσθεση με 0x08 είναι απαραίτητη για να διατηρείται συνεχώς ένα στο τρίτο ψηφίο. Θυμάστε τον οπίσθιο φωτισμό; Αυτή η προσθήκη είναι που ενεργοποιεί τον οπίσθιο φωτισμό. Στη συνέχεια καλούμε τη συνάρτηση μεταφοράς ενός byte στο δίαυλο. Γράφεται για παραπάνω. Στη συνέχεια μεταφέρουμε το byte μέσω του διαύλου στο τσιπ. Στη συνέχεια, θα πρέπει να ορίσετε το E σε ένα, κάτι που κάνει στην πραγματικότητα η λογική προσθήκη του byte από το 0x04. Μετά την επαναφορά του E. Έτσι, μπορείτε να στείλετε οποιαδήποτε εντολή στην οθόνη μόνο περνώντας την ίδια την εντολή ως όρισμα. void init(void) ( _delay_ms(30); // Παύση μετά την ενεργοποίηση com (0x30); // Μετάβαση σε λειτουργία 4-bit _delay_us(40); // Καθυστέρηση για την εκτέλεση εντολών com (0x30); // Μετάβαση σε λειτουργία 4-bit _delay_us(40); // Καθυστέρηση για την εκτέλεση εντολών com (0x30); // Μετάβαση σε λειτουργία 4-bit _delay_us(40); // Καθυστέρηση για την εκτέλεση εντολών com (0x20); // Μετάβαση σε λειτουργία 4-bit _delay_us(40); // Καθυστέρηση για την εκτέλεση εντολών com (0x20); // Ρύθμιση παραμέτρων com (0x80); // Ρύθμιση παραμέτρων com (0x00); // Απενεργοποιήστε την οθόνη com (0x80); // Απενεργοποιήστε την οθόνη com (0x00); // Εκκαθάριση της οθόνης com (0x10); // Εκκαθάριση της οθόνης com (0x00); // Ρυθμίστε τη λειτουργία εισαγωγής δεδομένων com (0x60); // Ρυθμίστε τη λειτουργία εισαγωγής δεδομένων com (0x00); // Ενεργοποιήστε την οθόνη με τον επιλεγμένο δρομέα com (0xC0); // Ενεργοποιήστε την οθόνη με τον επιλεγμένο δρομέα } Αυτή η λειτουργία προετοιμάζει μόνο την οθόνη. Η σειρά των εντολών λαμβάνεται από το φύλλο δεδομένων στην οθόνη LCD. void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Μεταφορά των πιο σημαντικών 4 bit data_h |= 0x04; pcf8574_byte_out(data_h, ADD); // Μεταφέρετε τα πιο σημαντικά 4 bit data_h &= 0xF9; // Μεταφέρετε τα πιο σημαντικά 4 bit pcf8574_byte_out(data_h, ADD); // Μεταφορά χαμηλών 4 bit pcf8574_byte_out(data_l, ADD); // Μεταφορά χαμηλών 4 bit data_l |= 0x04; // Μεταφορά χαμηλών 4 bit } pcf8574_byte_out(data_l, ADD); data_l &= 0xF9; pcf8574_byte_out(data_l, ADD);

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

void str_out(BYTE *str) ( while((*str) != "\0") (char_out(*str); str++; ) )

Λοιπόν, αυτή η λειτουργία είναι καθαρά για τη μετάδοση μιας συμβολοσειράς στην οθόνη. Στην πραγματικότητα, δεν έχει καμία σχέση με το θέμα μας.

Έργο για το AtmelStudio 6.2

Αρμόδια 01.08.15 17:11

Το κόμμα λείπει. Σωστά: "Γεια σου ΚΟΣΜΟ!" Και αυτή η συσκευή δεν έχει σχεδιαστεί μόνο για το HD44780. Οι αντιστάσεις έλξης είναι εγκατεστημένες στην κύρια πλευρά. Σύμφωνα με τις προδιαγραφές, τα δεδομένα εγγράφονται στον ελεγκτή LCD στην κατεύθυνση πτώσης E. Από εδώ απλοποιείται η πρώτη λειτουργία: void com(BYTE com) ( com |= 0x08; // backlight pcf8574_byte_out(com | 0x04, ADD); // Έξοδος δεδομένων pcf8574_byte_out(com , ADD // E to zero) Και τα υπόλοιπα μπορεί επίσης να είναι σημαντικά λιγότερα. Για παράδειγμα, το void char_out (BYTE data) θα λάβει μόνο δύο κλήσεις και ακόμη περισσότερο χωρίς πρόσθετες μεταβλητές. Η προετοιμασία LCD πραγματοποιήθηκε κατά παράβαση των προδιαγραφών χρονισμού.

Alexey 02.08.15 19:11

Λόγω του κόμματος που λείπει, η οθόνη δεν θα επηρεαστεί. Αυτή η συσκευή έχει σχεδιαστεί ειδικά για οθόνες με αυτόν ή παρόμοιο ελεγκτή. Αλλά αυτό το μικροκύκλωμα είναι μια πραγματικά απλή επέκταση θύρας. Συμφωνώ για την Ε. Απαιτούνται πρόσθετες μεταβλητές. Εάν μεταβιβάσετε ένα όρισμα σε μια συνάρτηση και εκτελέσετε ορισμένες ενέργειες με λογική, ενδέχεται να προκύψουν σφάλματα. Το έχω ήδη συναντήσει αυτό. Η αρχικοποίηση πραγματοποιείται χωρίς παραβίαση των χρονισμών. Η τεκμηρίωση λέει ότι υπάρχει μια παύση 40 µs μεταξύ των εντολών. Λόγω του ότι η μεταφορά γίνεται πάνω από το λεωφορείο i2c, που με τη σειρά του είναι λογισμικό και αργό, οι περίοδοι ολοκληρώνονται με ενδιαφέρον. Αν πάλι δεν είστε πολύ τεμπέλης, τότε γράψτε την εκδοχή σας και στείλτε την σε εμένα. Θα το δημοσιεύσω. Τελικά, αυτό το site προορίζεται για ένα ερασιτεχνικό κοινό και όποιος θέλει μπορεί να εκφράσει τη γνώμη και το όραμά του για τη ζωή του ΜΚ.

Alexey 06.08.15 09:14

Προστέθηκαν χρονισμοί κατά την προετοιμασία της οθόνης όπως σημειώνεται από το σεβαστό "Literate"

Ντμίτρι 14/06/16 21:57

ruslan 21.12.16 19:54
Alexey 21/12/16 21:53

Ω ναι. Ειδικά ο κωδικός στο ASMA. Οι ειδικοί του Arduino θα το εκτιμήσουν στο έπακρο)))

Py.sy.
Ακόμα κι αν δεν κοιτάξετε το ASM, το πρόγραμμα εκεί είναι γραμμένο για έναν ελεγκτή PIC. Είναι αυτές οι «πολύ» χρήσιμες πληροφορίες για τους ειδικούς AVR; ειδικά για αρχάριους))) Δεν έχω τίποτα εναντίον του PIC, αλλά ακόμη και το ASM του PIC και του AVR είναι διαφορετικό. Όσο για τις λεπτομέρειες της λειτουργίας της οθόνης LCD, μπορείτε να ρίξετε μια ματιά))) Είναι αλήθεια ότι το έγραψα και κάτω από το CVAVR, αλλά όλες οι εντολές αποσυναρμολογούνται και ταξινομούνται σε ράφια. Αλλά σε κάθε περίπτωση, αποφασίστε μόνοι σας πού γράφεται πιο καθαρά))) Ο συγγραφέας γράφει, ο αναγνώστης επιλέγει.

GeK 01/04/17 12:52

"Διεύθυνση I2C του τσιπ (από προεπιλογή είναι 0x4E"

Τα πιο σημαντικά 4 bit της διεύθυνσης διορθώνονται,
Το πρόθεμα για PCF8574 είναι 0100 και για PCF8574A είναι 0111
Τα χαμηλότερα 3 bit εξαρτώνται από την κατάσταση των εισόδων του τσιπ A2-A0. Από προεπιλογή, και τα 3 jumpers είναι ανοιχτά, αντίστοιχα, η διεύθυνση chip παίρνει την τιμή 0111111.
// A2 A1 A0 PCF8574 PCF8574A
// 1 1 1 0x20 0x38
// 1 1 0 0x21 0x39
// 1 0 1 0x22 0x3A
// 1 0 0 0x23 0x3B
// 0 1 1 0x24 0x3C
// 0 1 0 0x25 0x3D
// 0 0 1 0x26 0x3E
// 0 0 0 0x27 0x3F

Alexey 01/04/17 14:27

Κάτι έχεις μπερδέψει.
Απόσπασμα από την τεκμηρίωση για το μικροκύκλωμα

Το 0b01001110 είναι 0x4E
Οπότε όλα είναι σωστά εδώ. Και αν πρέπει να αλλάξετε τη διεύθυνση, τότε απλά πρέπει να την αλλάξετε στο Ορισμός.

Γιούρι 14/12/17 21:26

Καλημέρα! Και μπορείτε επίσης να χρησιμοποιήσετε τον κωδικό λειτουργίας lcdgotoxy και lcdclear για να εργαστείτε με τον προσαρμογέα για PCF8574.

Αλέξανδρος 20.05.18 18:14

Καλημέρα! Πώς βγάζετε ρωσικό κείμενο;

Alexey 20.05.18 23:04

Αυτή είναι μια εγχώρια οθόνη από το MELT. Το κυριλλικό αλφάβητο είναι ενσωματωμένο στη μνήμη του.

Αλέξανδρος 21/05/18 04:55

Καλημέρα! Γράφω όπως κάνετε εσείς στο Project για το AtmelStudio 6.2 "ЁPҐBET MҐP!" βγάζει κανονικά
και αν γράψεις "ΓΕΙΑ ΚΟΣΜΟ!" βγάζει κάθε λογής ανοησία. Έχω δύο
Μία από τις επιλογές εμφάνισης έχει κυριλλικό αλφάβητο. το δεύτερο είναι κινέζικο.

Alexey 21/05/18 09:22

Θα έγραφα πρώτα ένα δοκιμαστικό πρόγραμμα. Επαναλαμβάνεται σε ολόκληρη τη μνήμη και εμφανίζει σύμβολα και τις διευθύνσεις τους. Και μετά καταλάβετε ποιο είναι το πρόβλημα. Πιθανότατα ο πίνακας χαρακτήρων να μην ταιριάζει με τον πίνακα ascii.

Andrey 09/03/18 08:32

Καλημέρα!

Μπορείτε να δώσετε ένα διάγραμμα κυκλώματος για τον Proteus;

Andrey 09/03/18 10:22

Ή δεν έχει κάνει κανείς έλεγχος στο Proteuse;

Andrey 09/03/18 10:56

Υπολόγισε το main_init

Pavel 30/05/19 23:35

Ένα περίεργο πράγμα, η διεύθυνση οθόνης είναι 0x4E και εάν η ίδια οθόνη είναι συνδεδεμένη με το Arduino, τότε η διεύθυνση είναι 0x27

Pavel 31/05/19 11:04

Σας ευχαριστώ πολύ για τη δουλειά σας! Έψαξα ολόκληρο το Διαδίκτυο και κανένα από τα παραδείγματα που δίνονται εκτός από το δικό σας δεν λειτούργησε. Το μόνο πράγμα είναι ότι στο αρχείο του έργου οι καθυστερήσεις _delay_ δεν καθορίζονται στη συνάρτηση αρχικοποίησης της οθόνης και κατά συνέπεια δεν λειτουργεί

Alexey 06/01/19 09:52

Λοιπόν, αυτό είναι περισσότερο ένα έργο επίδειξης. Για καλό λόγο, η βιβλιοθήκη axlib πρέπει να ξαναγραφτεί, αλλά δεδομένου του γεγονότος ότι τα STM32 και STM8 κινούνται αλματωδώς, δεν υπάρχει κανένα νόημα στο AVR.

Pavel 06/05/19 12:57

Η STM δεν έχει πακέτα DIP, είναι πιο δύσκολη η κατασκευή τυπωμένων κυκλωμάτων. Για τα έργα μου, οι δυνατότητες του AVR είναι πολλές, μπορείτε να χωρέσετε πολλά σε ένα Atmega 8

Alexey 06/05/19 15:20

Ναι, αλλά πόσο κοστίζει το Atmega8 και το stm8s003)))

Ντμίτρι 06/07/19 00:41

Γεια σου, Alexey.
Πείτε μου πώς να διαβάσω την κατάσταση της θύρας από το pcf8574;
Θέλω να φτιάξω μια εξωτερική μονάδα, 8 GPIO στο δίαυλο i2c - αυτό είναι.

Ντμίτρι 06/07/19 17:56

Θα απαντήσω μόνος μου
Η συνάρτηση επιστρέφει ένα byte - την κατάσταση των θυρών μικροκυκλώματος
uint8_t pcf8574_byte_rcv(uint8_t addr)
{
uint8_t ask = ACK;
addr |= 0b01; //ΑΝΑΓΝΩΣΗ
uint8_t δεδομένα=0;
i2c_start();
ask = i2c_send_byte(addr);
if(!ask) data = i2c_read_byte(NACK);
i2c_stop();

Δεδομένα επιστροφής.
}

Pavel 06/07/19 20:37

Πόσο κοστίζει, 150 ρούβλια, για την τιμή ενός ρελέ γενικά) και πώς συνδέετε τις πλακέτες για STM; Το LUT είναι αναξιόπιστο, ο δρομολογητής CNC δεν είναι σίγουρος τι θα χρειαστεί (δεν το έχω δοκιμάσει)

  • Η μονάδα FC-113 βασίζεται στο τσιπ PCF8574T, το οποίο είναι ένας καταχωρητής μετατόπισης 8-bit - ένας «επέκτασης» εισόδου-εξόδου για τον σειριακό δίαυλο I2C. Στο σχήμα, το μικροκύκλωμα χαρακτηρίζεται DD1.
  • Το R1 είναι μια αντίσταση περικοπής για τη ρύθμιση της αντίθεσης της οθόνης LCD.
  • Το Jumper J1 χρησιμοποιείται για την ενεργοποίηση του οπίσθιου φωτισμού της οθόνης.
  • Οι ακίδες 1…16 χρησιμοποιούνται για τη σύνδεση της μονάδας στις ακίδες της οθόνης LCD.
  • Απαιτούνται επιθέματα επαφής A1...A3 για την αλλαγή της διεύθυνσης I2C της συσκευής. Συγκολλώντας τους κατάλληλους βραχυκυκλωτήρες, μπορείτε να αλλάξετε τη διεύθυνση της συσκευής. Ο πίνακας δείχνει την αντιστοιχία διευθύνσεων και βραχυκυκλωτήρα: το "0" αντιστοιχεί σε ένα ανοιχτό κύκλωμα, το "1" σε έναν εγκατεστημένο βραχυκυκλωτήρα. Από προεπιλογή, και τα 3 jumpers είναι ανοιχτά και η διεύθυνση της συσκευής 0x27.

2 Διάγραμμα σύνδεσης για οθόνη LCD στο Arduinoμέσω πρωτοκόλλου I2C

Η μονάδα συνδέεται με το Arduino με έναν τυπικό τρόπο για το δίαυλο I2C: ο ακροδέκτης SDA της μονάδας συνδέεται στην αναλογική θύρα A4, ο ακροδέκτης SCL συνδέεται στην αναλογική θύρα A5 του Arduino. Η μονάδα τροφοδοτείται με +5 V από το Arduino. Η ίδια η μονάδα συνδέεται με τις ακίδες 1…16 στις αντίστοιχες ακίδες 1…16 στην οθόνη LCD.


3 Βιβλιοθήκη για εργασίαμέσω πρωτοκόλλου I2C

Τώρα χρειαζόμαστε μια βιβλιοθήκη για να δουλεύουμε με LCD μέσω της διεπαφής I2C. Μπορείτε να χρησιμοποιήσετε, για παράδειγμα, αυτό (σύνδεσμος στη γραμμή "Λήψη δείγματος κώδικα και βιβλιοθήκης").

Λήψη αρχείου LiquidCrystal_I2Cv1-1.rarαποσυμπιέστε σε ένα φάκελο \βιβλιοθήκες\, το οποίο βρίσκεται στον κατάλογο Arduino IDE.

Η βιβλιοθήκη υποστηρίζει ένα σύνολο τυπικών λειτουργιών για οθόνες LCD:

ΛειτουργίαΣκοπός
LiquidCrystal() δημιουργεί μια μεταβλητή τύπου LiquidCrystal και δέχεται παραμέτρους σύνδεσης οθόνης (αριθμοί ακίδων).
αρχίζω() αρχικοποίηση της οθόνης LCD, ρύθμιση παραμέτρων (αριθμός γραμμών και χαρακτήρων).
σαφής() εκκαθάριση της οθόνης και επαναφορά του δρομέα στην αρχική θέση.
σπίτι() επιστρέψτε τον κέρσορα στην αρχική θέση.
setCursor() ρύθμιση του δρομέα σε μια δεδομένη θέση.
γράφω() εμφανίζει το σύμβολο στην οθόνη LCD.
αποτύπωμα() εμφανίζει κείμενο στην οθόνη LCD.
δρομέας() δείχνει τον κέρσορα, δηλ. υπογράμμιση κάτω από τη θέση του επόμενου χαρακτήρα.
noCursor() κρύβει τον κέρσορα.
αναβοσβήνω() ο κέρσορας αναβοσβήνει.
noBlink() Ακύρωση αναβοσβήνει?
noDisplay() απενεργοποίηση της οθόνης κατά την αποθήκευση όλων των εμφανιζόμενων πληροφοριών.
επίδειξη() ενεργοποίηση της οθόνης κατά την αποθήκευση όλων των εμφανιζόμενων πληροφοριών.
scrollDisplayLeft() κυλήστε τα περιεχόμενα της οθόνης 1 θέση προς τα αριστερά.
scrollDisplayRight() κύλιση των περιεχομένων της οθόνης 1 θέση προς τα δεξιά.
autoscroll() ενεργοποίηση αυτόματης κύλισης.
noAutoscroll() Απενεργοποίηση αυτόματης κύλισης.
αριστερά προς τα δεξιά() ορίζει την κατεύθυνση του κειμένου από αριστερά προς τα δεξιά.
rightToLeft() κατεύθυνση κειμένου από δεξιά προς τα αριστερά.
createChar() δημιουργεί έναν προσαρμοσμένο χαρακτήρα για την οθόνη LCD.

4 Σκίτσο για έξοδο κειμένουσε οθόνη LCD μέσω διαύλου I2C

Ας ανοίξουμε το δείγμα: Δείγματα αρχείων LiquidCrystal_I2C CustomCharsκαι θα το αλλάξουμε λίγο. Θα εμφανίσουμε ένα μήνυμα στο τέλος του οποίου θα αναβοσβήνει ένα σύμβολο. Τα σχόλια στον κώδικα σχολιάζουν όλες τις αποχρώσεις του σκίτσου.

#συμπεριλαμβάνω // περιλαμβάνει τη βιβλιοθήκη Wire #include // συνδέστε τη βιβλιοθήκη LCD #define printByte(args) write(args); // uint8_t καρδιά = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // μάσκα bit του συμβόλου "καρδιά" LiquidCrystal_I2C lcd(0x27, 16, 2); // Ορίστε τη διεύθυνση 0x27 για οθόνη LCD 16x2 void setup() ( lcd.init(); // προετοιμασία της οθόνης LCD lcd.backlight(); // ενεργοποιήστε τον οπίσθιο φωτισμό της οθόνης lcd.createChar(3, heart); // δημιουργήστε ένα σύμβολο "καρδιά" στο κελί μνήμης 3 lcd.home(); // τοποθετήστε τον κέρσορα στην επάνω αριστερή γωνία, στη θέση (0,0) lcd.!"); // εκτυπώστε μια γραμμή κειμένου lcd.setCursor(0, 1); // μετακινήστε τον κέρσορα στη γραμμή 2, χαρακτήρας 1 lcd.print( "i "); } void loop() (// αναβοσβήνει τον τελευταίο χαρακτήρα lcd.setCursor(13, 1); // μετακινήστε τον κέρσορα στη γραμμή 2, χαρακτήρας 1 lcd.print("\t"); }

καθυστέρηση (500); lcd.setCursor(13, 1); // μετακινήστε τον κέρσορα στη γραμμή 2, χαρακτήρας 1 lcd.print(" ");καθυστέρηση (500);

5 Παρεμπιπτόντως, οι χαρακτήρες που γράφτηκαν από την εντολή lcd.createChar();

, παραμένουν στη μνήμη της οθόνης ακόμη και μετά την απενεργοποίηση του ρεύματος, επειδή γραμμένο για εμφάνιση ROM 1602. Δημιουργήστε τα δικά σας σύμβολαγια οθόνη LCD {00000, 01010, 11111, 11111, 01110, 00100, 00000} Ας δούμε λίγο πιο προσεκτικά το θέμα της δημιουργίας των δικών σας συμβόλων για οθόνες LCD. Κάθε χαρακτήρας στην οθόνη αποτελείται από 35 κουκκίδες: 5 πλάτος και 7 ύψος (+1 δεσμευτική γραμμή για υπογράμμιση). Στη γραμμή 6 του παραπάνω σκίτσου ορίζουμε έναν πίνακα 7 αριθμών:

6 (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Μετατροπή δεκαεξαδικών αριθμών σε δυαδικό:

. Αυτοί οι αριθμοί δεν είναι τίποτα άλλο από μάσκες bit για καθεμία από τις 7 γραμμές του συμβόλου, όπου το "0" υποδηλώνει ένα φωτεινό σημείο και το "1" ένα σκοτεινό σημείο. Για παράδειγμα, ένα σύμβολο καρδιάς που καθορίζεται ως bitmask θα εμφανιστεί στην οθόνη όπως φαίνεται στο σχήμα.


7 Έλεγχος οθόνης LCDμέσω λεωφορείου I2C

Ως μπόνους, ας δούμε το διάγραμμα χρονισμού για την εμφάνιση των λατινικών χαρακτήρων "A", "B" και "C" στην οθόνη LCD. Αυτοί οι χαρακτήρες αποθηκεύονται στην οθόνη ROM και εμφανίζονται στην οθόνη απλώς μεταδίδοντας τις διευθύνσεις τους στην οθόνη. Το διάγραμμα λαμβάνεται από τις ακίδες RS, RW, E, D4, D5, D6 και D7 της οθόνης, δηλ. ήδη μετά τον μετατροπέα FC-113 “I2C parallel bus”. Μπορούμε να πούμε ότι βουτάμε λίγο πιο βαθιά στο υλικό.


Διάγραμμα χρονισμού της εξόδου λατινικών χαρακτήρων "A", "B" και "C" στην οθόνη LCD 1602

Το διάγραμμα δείχνει ότι οι χαρακτήρες που βρίσκονται στην οθόνη ROM (βλ. σελ. 11 του φύλλου δεδομένων, σύνδεσμος παρακάτω) μεταδίδονται σε δύο τσιμπήματα, η πρώτη από τις οποίες καθορίζει τον αριθμό της στήλης του πίνακα και η δεύτερη - τον αριθμό της σειράς. Σε αυτή την περίπτωση, τα δεδομένα "μανδαλώνονται" στην άκρη του σήματος στη γραμμή μι(Ενεργοποίηση) και η γραμμή R.S.(Επιλογή εγγραφής) βρίσκεται σε μια λογική κατάσταση, που σημαίνει ότι τα δεδομένα μεταφέρονται. Μια χαμηλή κατάσταση στη γραμμή RS σημαίνει ότι αποστέλλονται οδηγίες, κάτι που βλέπουμε πριν από τη μετάδοση κάθε χαρακτήρα. Σε αυτήν την περίπτωση, μεταδίδεται ο κωδικός οδηγιών για την επιστροφή στη θέση (0, 0) της οθόνης LCD, τον οποίο μπορείτε επίσης να βρείτε μελετώντας την τεχνική περιγραφή της οθόνης.

Και ένα ακόμη παράδειγμα. Αυτό το διάγραμμα χρονισμού δείχνει την έξοδο του συμβόλου Heart στην οθόνη LCD.


Και πάλι, οι δύο πρώτες παρορμήσεις Καθιστώ ικανόσυμμορφωθείτε με τις οδηγίες Σπίτι()(0000 0010 2) - επαναφέρετε το φορείο στη θέση (0; 0) και το δεύτερο δύο - έξοδος στην οθόνη LCD που είναι αποθηκευμένη στο κελί μνήμης 3 10 (0000 0011 2) το σύμβολο "Καρδιά" (οδηγία lcd.createChar(3, heart);σκίτσο).