Toată lumea a fost de mult obișnuită cu faptul că fiecare dispozitiv electronic are un ecran cu care oferă unei persoane toate informațiile utile. Playerul MP3 arată numele piesei care este redată, telecomanda quadcopterului afișează telemetria zborului, chiar și mașina de spălat afișează timpul până la sfârșitul spălării, iar un smartphone conține în general un întreg desktop al unui computer personal! Cel mai probabil, următorul tău dispozitiv va folosi și un dispozitiv mic de afișare 🙂 Să încercăm să facem un ceas electronic simplu! Și ca tablou de bord folosim un LCD 1602 cu caractere larg răspândit și ieftin. La fel ca în imagine: Pe lângă 16x2, un afișaj de caractere 20x4 (patru linii a câte 20 de caractere fiecare), precum și un afișaj grafic cu o rezoluție de 128x64 pixeli, este considerat destul de popular. Iată-le în imagini:
1. Conectarea caracterului LCD 1602
Ecranul 1602 are 16 pini. Ele sunt de obicei numerotate de la stânga la dreapta când te uiți la el ca în imagine. Uneori sunt semnați pini, cum ar fi: DB0, DB1, EN etc. Și uneori indică doar numărul PIN. În orice caz, lista de pini este întotdeauna aceeași: 1 - "GND", masă (minus sursa de alimentare); 2 - "Vcc", alimentare + 5V; 3 - "VEE", contrast; 4 - "RS" , selectarea registrului; 5 - "R / W", direcția de transfer de date (citire / scriere); 6 - "EN", sincronizare; 7-14 - "DB0", "DB1", .., "DB7" - magistrală de date 15 - anod de iluminare din spate (+5V); 16 - catod de iluminare din spate (masa). Liniile VEE, RS și patru linii de date DB4, DB5, DB6, DB7 sunt conectate la pinii digitali ai controlerului. Conectați linia "R / W" la "pământul" controlerului (deoarece avem nevoie doar de funcția de scriere în memoria afișajului). Nu vom conecta lumina de fundal deocamdată, presupun că vă puteți da seama cu ușurință singur cu asta 🙂 Schema de conectare a afișajului la Arduino UnoAspectul aspectului
Pentru orice eventualitate, tot sub formă de farfurie:
LCD 1602 | 1 | 2 | 4 | 6 | 11 | 12 | 13 | 14 | 15 | 16 |
Arduino Uno | GND | + 5V | 4 | 5 | 6 | 7 | 8 | 9 | + 5V | GND |
2. Programare „Bună, lume!”
Pentru a lucra cu afișaje LCD de diferite dimensiuni și tipuri, există o bibliotecă specială în editorul Arduino IDE Cristal lichid... Pentru a include biblioteca, scrieți următoarea expresie în prima linie a programului nostru: #include3. Programăm ceasul
Acum că afișajul funcționează exact, să încercăm să transformăm dispozitivul nostru simplu într-un adevărat ceas electronic. Atenţie! Pentru a afișa ora, avem nevoie de biblioteca „Timp”. Dacă nu este încă instalat, puteți descărca arhiva din link. Să-l includem: #include- year () - ne va returna anul;
- luna () - luna;
- zi () - zi;
- oră () - oră;
- minute () - va returna minutul;
- secundă () - secundă.
Pentru a lucra cu afișaje grafice simbolice, vă sugerăm să utilizați biblioteca LiquidCrystal, care este inclusă în setul standard Arduino IDE și este proiectată să funcționeze pe o interfață paralelă de 8 biți (4 biți). Dacă afișajul dvs. este conectat la Arduino prin magistrala I2, atunci trebuie să instalați biblioteca LiquidCrystal_I2C (cele mai multe dintre funcții repetă funcțiile primei biblioteci).
Afișaje acceptate:
Afişa | Conectare și inițializare |
---|---|
LCD1602 - afișaj de caractere (16x02 caractere), |
#include [ , 8 , 9 , 10 , 11 ]); void setup () ( lcd.begin (16, 2);} // Explicație:
|
cu interfață I2C (albastru) |
#include #include LiquidCrystal_I2C LCD (0x27 sau 0x3F, 16 , 2); void setup () ( lcd.init (); } // Explicație: |
LCD1602 I2C - afișaj de caractere (16x02 caractere), cu interfață I2C (verde) |
#include #include LiquidCrystal_I2C LCD (0x27 sau 0x3F, 16 , 2); void setup () ( lcd.init (); } // Explicație: |
LCD2004 - afișaj de caractere (20x04 caractere), cu interfata paralela (albastru) |
#include LCD cristal lichid (2, 3, 4, 5, 6, 7[ , 8 , 9 , 10 , 11 ]); void setup () ( lcd.begin (20, 4);} // Explicație: // Dacă sunt folosite 8 fire ale magistralei de date, atunci le indicăm pe toate |
LCD2004 I2C - afișaj de caractere (20x04 caractere), cu interfață I2C (albastru) |
#include #include LiquidCrystal_I2C LCD (0x27 sau 0x3F, 20 , 4); void setup () ( lcd.init (); } // Explicație: |
# 1 Exemplu
Afișăm inscripția pe display-ul LCD1602 conectat prin magistrala I2C. Pentru a lucra cu afișajul LCD2004, trebuie să schimbați a treia linie la LiquidCrystal_I2C lcd (0x27,20,4);
#include
# 2 Exemplu
Afișăm inscripția pe afișajul LCD1602 conectat printr-o magistrală paralelă pe 4 biți. Pentru a lucra cu afișajul LCD2004, trebuie să schimbați a 5-a linie la lcd.begin (20, 4);
#include
# 3 Exemplu
Afișăm inscripția „Limba rusă” pe afișajul LCD1602 conectat prin magistrala I2C:
#include
# 4 Exemplu
Afișăm timpul scurs după pornire pe afișajul LCD1602 conectat prin magistrala I2C:
#include
Funcții comune bibliotecilor LiquidCrystal și LiquidCrystal_I2C:
- începe ( cols, rânduri, ); - Inițializarea afișajului prin specificarea numărului de coloane, rânduri și a mărimii caracterului.
- clar ();- Șterge afișajul cu cursorul la 0.0 (Durează mult timp!).
- Acasă ();- Setarea cursorului pe poziția 0,0 (Ia mult timp!).
- afișaj ();- Pornirea rapidă a afișajului (fără modificarea datelor din RAM).
- noDisplay ();- Opriți rapid afișajul (fără a schimba datele din RAM).
- clipi ();- Porniți cursorul intermitent (cu o frecvență de aproximativ 1 Hz).
- nu Blink ();- Opriți cursorul care clipește.
- cursor ();- Activați sublinierea cursorului.
- noCursor ();- Dezactivați sublinierea cursorului.
- scrollDisplayLeft ();- Derulează afișajul spre stânga. Shift display coordonează o coloană la stânga (fără a schimba RAM).
- scrollDisplayRight ();- Derulează afișajul spre dreapta. Shift display coordonează o coloană la dreapta (fără a schimba RAM).
- de la stânga la dreapta ();- Indică pe viitor deplasarea poziției cursorului, după afișarea următorului caracter, cu o coloană la dreapta.
- de la dreapta la stanga ();- Indică pe viitor deplasarea poziției cursorului, după afișarea următorului caracter, cu o coloană la stânga.
- noAutoscroll ();- Indică justificarea suplimentară a textului din stânga poziției cursorului (ca de obicei).
- autoscroll ();- Indică o justificare suplimentară la dreapta a textului din poziția cursorului.
- createChar ( num, matrice ); - Scrierea unui caracter personalizat pe afișajul CGRAM sub numărul specificat.
- setCursor ( col, rând ); - Setarea cursorului în poziția indicată de numărul coloanei și al liniei.
- imprimare ( text ); - Afișați text, simboluri sau numere pe ecranul de afișare. Sintaxa este similară cu funcția cu același nume din clasa Serial.
Funcții implementate numai în biblioteca LiquidCrystal_I2C:
- init ();- Inițializarea afișajului. Ar trebui să fie prima comandă a bibliotecii LiquidCrystal_I2C după crearea obiectului. De fapt, această funcție se află și în biblioteca LiquidCrystal, dar în acea bibliotecă este apelată automat (implicit) atunci când obiectul este creat.
- iluminare din spate ();- Porniți iluminarea de fundal a afișajului.
- nuBacklight ();- Opriți iluminarea de fundal a afișajului.
- setBacklight ( steag ); - Controlul luminii de fundal (true - activare / fals - dezactivare), utilizat în locul funcțiilor noBacklight și backlight.
Conexiune:
// Pentru magistrala I2C: |
Parametru:
|
// Pentru o magistrală paralelă cu 4 fire: #include Cristal lichid lcd ( Rs , E , D4 , D5 , D6 , D7 ); void setup () ( lcd.begin ( col , rând ); } |
Parametru:
|
// Pentru o magistrală paralelă cu 8 fire: #include Cristal lichid lcd ( Rs , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 ); void setup () ( lcd.begin ( col , rând ); } |
|
începe ( col ,
rând ,
);
Inițializarea afișajului prin specificarea dimensiunilor și simbolurilor ecranului. |
Parametru:
|
Funcții de control a afișajului:
afișaj (); Pornește afișajul după ce a fost oprit de funcția noDisplay. |
Notă: Funcția este executată rapid și fără modificări ale RAM-ului afișajului. |
noDisplay (); Oprește afișajul. Datele de pe afișaj nu vor fi afișate până când nu este apelată funcția de afișare, dar nu vor fi șterse din memoria RAM, iar după ce funcția de afișare este apelată, acestea vor fi afișate din nou. |
Notă: Funcția este executată rapid și fără modificări ale RAM-ului afișajului. |
scrollDisplayLeft (); Schimbă coordonatele de afișare cu o coloană la stânga. |
|
scrollDisplayRight (); Schimbă coordonatele de afișare cu o coloană la dreapta. Apelul constant al acestei funcții va crea efectul unei linii rampante. Coordonatele sunt deplasate atât pentru informațiile disponibile pe afișaj, cât și pentru informațiile care vor fi afișate ulterior. |
Notă: Funcția este efectuată fără modificarea memoriei RAM de afișare. Dacă apelați funcția de 40 de ori la rând, atunci coordonatele se vor întoarce la punctul inițial |
clar (); Șterge afișajul cu cursorul setat la 0.0. Informațiile de pe afișaj vor fi șterse definitiv. |
Notă: durează mult. |
iluminare din spate (); Pornește iluminarea de fundal a afișajului. |
|
nuBacklight (); Opriți iluminarea de fundal a afișajului. |
Notă: Această funcție este implementată numai în biblioteca LiquidCrystal_I2C. |
setBacklight ( steag );
Controlul luminii de fundal (în loc de funcțiile fără iluminare de fundal și iluminare de fundal). |
Parametru:
|
Funcții de control al cursorului:
setCursor ( col ,
rând );
Poziționează cursorul la poziția specificată. |
Parametru:
|
Acasă (); Setarea cursorului pe poziția 0,0. Funcționează ca setCursor (0,0); |
Notă: durează mult. |
clipi (); Pornește cursorul care clipește. |
Notă: Cursorul ocupă întreg câmpul simbolului și clipește la o frecvență de aproximativ 1 Hz, în poziția în care a fost setat anterior. |
nu Blink (); Opriți cursorul care clipește. |
Notă: Cursorul devine invizibil, dar poziția sa este păstrată. |
cursor (); Activați sublinierea cursorului. |
Notă: Cursorul ia forma unui caracter de subliniere și se află în poziția în care a fost plasat anterior. |
noCursor (); Dezactivați sublinierea cursorului. |
Notă: Cursorul devine invizibil, dar poziția sa este păstrată. |
Funcții care indică direcția și alinierea:
de la stânga la dreapta (); Indică faptul că după fiecare caracter nou, poziția cursorului trebuie deplasată cu o coloană la dreapta. |
Notă: Dacă introduceți textul „abc”, afișajul va afișa „abc”, iar textul va fi în dreapta poziției inițiale a cursorului. (Ca de obicei) |
de la dreapta la stanga (); Indică faptul că după fiecare caracter nou, poziția cursorului trebuie deplasată cu o coloană la stânga. |
Notă: Dacă introduceți textul „abc”, afișajul va afișa „cba” și textul va fi la stânga poziției inițiale a cursorului. (Scriind de la dreapta la stânga) |
noAutoscroll (); Indică faptul că, în viitor, textul ar trebui să fie aliniat la stânga față de poziția inițială a cursorului. |
Notă: dacă plasați cursorul în poziția 10.0 și afișați textul, atunci primul caracter al textului afișat va fi localizat în această poziție. (Ca de obicei) |
autoscroll (); Indică faptul că, în viitor, textul ar trebui să fie aliniat la dreapta față de poziția inițială a cursorului. |
Notă: dacă plasați cursorul în poziția 10.0 și afișați textul, atunci cursorul va fi localizat în această poziție. (Coordonatele afișajului vor fi deplasate la stânga, ca și cum ați fi apelat funcția scrollDisplayLeft de câte ori există litere în textul afișat) |
Funcții pentru introducerea textului și a simbolurilor:
createChar (num, array); Scrierea unui caracter personalizat pe afișajul CGRAM sub numărul specificat. Dacă doriți să afișați textul (folosind funcția de imprimare) în care ar trebui să fie caracterul pe care l-ați instalat, specificați slash-ul și numărul sub care a fost scris acest caracter: print ("C \ 1MBO \ 2"). |
Parametru:
|
imprimare (text); Afișează text, caractere sau numere pe ecranul de afișare. |
Parametru:
|
Linie târâtoare pe LCD pe HD44780.
Căutarea unei „soluții gata făcute” a liniei de rulare în C nu a dat niciun rezultat. Așa că a trebuit să o fac eu.
Această „piesă” de cod vă permite să afișați o linie târâtoare (de la dreapta la stânga), oriunde și folosind orice număr de familiaritate, în afișajele LCD cu controlerul HD44780 sau similar.
Primul lucru de menționat este că limbajul C nu vă permite să lucrați cu șiruri „direct”. Adică, este imposibil să copiați un caracter dintr-un șir în altul folosind operatorul de atribuire ( = ) ... pentru aceasta trebuie să folosiți o funcție specială strncpy (). În general, există mai multe funcții folosite pentru a manipula șirurile în C. În Autotutorii, un capitol separat este dedicat utilizării acestor funcții. În Ajutor „e pe CV_AVR, descrierea funcțiilor pentru lucrul cu șiruri este în secțiune „Funcții șir”... Prototipurile acestor funcții se află în fișier sfoară.h.
„... linia originală...” - linia de caractere din care doriți să afișați în linia „târâtoare”;
„... caractere afișate...” este de fapt o linie târâtoare.
Pentru a organiza linia târâtoare, a fost ales următorul algoritm:
1. Caracterele afișate sunt deplasate de la dreapta la stânga. Extrema stângă este „pierdută” în acest caz.
2. După schimbare, următorul caracter din șirul original este copiat în caracterul din dreapta.
3. Când se ajunge la sfârșitul liniei originale, primul caracter al liniei originale devine următorul.
Pentru a schimba caracterele - pentru celula deplasată, codul caracterului este citit din RAM-ul ecranului HD44780 (DDRAM) și scris în celula RAM din stânga.
Conform fișei de date de pe HD44780, caracterul din stânga al rândului de sus are o adresă DDRAM de 0x00, iar caracterul din stânga al rândului de jos este 0x40. Trebuie amintit că, pentru a ne referi în mod specific la RAM-ul ecranului (și nu la RAM generator de caractere), bitul RS trebuie să fie egal cu 1 (RS este bitul cel mai semnificativ din octetul de adresă, vezi Fișa de date).
Ca urmare, obținem că pentru a „adresa” al doilea caracter din stânga liniei de sus, este necesar să „lucram” cu adresa 0x01 | 0x80 = 0x81.
Funcțiile pentru scrierea și citirea „conținutului intern” al HD44780 sunt în bibliotecă (prototipuri în lcd.h) .... prin urmare ... programul în sine:
/ * pentru CV_AVR În acest exemplu, linia progresivă este afișată în cifre de la 8 (0xC7) la 16 din linia de jos a unui indicator pe 16 biți. . ...... #include unsigned char n_sim = 1, m_end = 43; // 43 - lungimea liniei din exemplu beg_stroka () ( // deplasează linia târâtoare dacă (beg_str) ( // scrie următorul caracter în poziția cea mai din dreapta lcd_gotoxy (15,1); |
Glosar: n_sim - pointer către poziția caracterului curent în linia sursă; m_end - numărul total de caractere din linia sursă; beg_str- shift bit "permisiv". Cu ajutorul acestuia, puteți regla viteza de „rulare”; ish_str este șirul original. |
Cel mai probabil, fiecare dintre compilatoarele C existente are funcții de bibliotecă pentru a lucra cu HD44780. Prin urmare, nu va fi dificil să „refaceți” programul pentru compilatorul „tău”.
„Pregătesc” linia originală folosind binecunoscutul utilitar „HD44780.exe”. Când îl utilizați, comentariile indică lungimea liniei: "/ * Lungimea maximă a unei linii: 43 octeți * /"