Koneksi LCD 1602 ke Arduino melalui i2c. Koneksi modul LCD I2C ke Arduino. Program untuk memudahkan pembuatan simbol

Mungkin salah satu layar paling populer di pasaran. Dibangun pada pengontrol HD44780U yang populer. Dari nama modelnya, layarnya terdiri dari dua baris masing-masing 16 karakter. Tidak ada dukungan untuk bahasa Rusia dalam model khusus ini.

Bus data sh2s memungkinkan Anda menghubungkan hingga 127 perangkat melalui dua kabel secara bersamaan. I2C ini diimplementasikan pada chip PCF8574T.

Diagram koneksi:

Benda biru adalah resistansi variabel yang memungkinkan Anda mengatur kontras layar.

Pelompat di sebelah kiri bertanggung jawab untuk menerangi layar.

Sebuah blok yang terdiri dari 4 kontak terhubung ke Arduino seperti ini:

GND - GND
VCC - 5V
SDA - A4 (jika Arduino MEGA, lalu ke D20)
SCL - A5 (jika Arduino MEGA, lalu ke D21)

Perpustakaan

Sketsa

Layar mungkin memiliki alamat IIC yang berbeda, bukan 0x27, mungkin 0x3F. Untuk menentukan alamat secara akurat, Anda dapat menggunakan pemindai perangkat i2c.

#termasuk #termasuk //atur alamat layar LCD 0x27, 16 karakter, 2 baris LCD LiquidCrystal_I2C (0x27, 16, 2); batalkan pengaturan() ( lcd.init(); // Inisialisasi layar //nyalakan lampu latar lcd.lampu latar(); //Mengatur posisi mulai dari mana teks ditampilkan. lcd.setCursor(2, 0); //jalur keluaran 1 lcd.print("Halo Dunia!"); //cetak baris kedua dengan cara yang sama lcd.setCursor(1, 1);

lcd.print("www.situs"); ) putaran kosong () ( )

Saya mendapatkan perangkat lain di sini dari toko Chip Resistor yang bagus untuk dipelajari dan digunakan pada perangkat yang berguna. Perangkat ini ternyata dirancang untuk mengontrol layar LCD yang dikendalikan oleh pengontrol HD44780, dalam mode 4-bit. Untuk tujuan ini, sirkuit mikro dipasang di papan, yang merupakan konverter bus I2C menjadi port paralel 8-bit.

Papan tersebut dirutekan sedemikian rupa sehingga dapat langsung dihubungkan ke layar LCD. Input memasok listrik dan saluran I2C. Papan ini segera dilengkapi dengan resistor penarik pada jalur SCL dan SDA, potensiometer untuk mengatur kontras, dan catu daya untuk tampilan itu sendiri. Pelompat di sebelah kanan menyalakan/mematikan lampu latar. Kemudian, berbekal tester, disusun tabel berikut. Setelah mempelajari modul, terungkap hal itu mengontrol lampu latar. Jika jumper dipasang, maka 1 menyalakan lampu latar, dan 0 mematikannya. Saat jumper dilepas, lampu latar selalu mati. Selanjutnya, diputuskan untuk melengkapi perpustakaan axlib dengan fungsi untuk bekerja dengan bus I2C (implementasi perangkat lunak) dan fungsi untuk mengendalikan chip PCF8574. Singkatnya, cara kerja modul. Untuk menghasilkan byte secara paralel, Anda perlu mengirim alamat sirkuit mikro ke bus I2C (secara default adalah 0x4E. Anda juga dapat mengubah alamat dengan menyolder jumper di papan dan mengubah nilai tiga yang paling tidak signifikan bit alamat), kemudian setelah menerima ACK, satu byte data dikirim. Setelah chip merespons dengan ACK, byte tersebut muncul di port paralel chip. Untuk mengontrol layar LCD, saya mengambil fungsi dari perpustakaan axlib dan sedikit memodifikasinya agar berfungsi dengan bus I2C. #termasuk #termasuk #termasuk #termasuk #define TAMBAHKAN 0x4E // Alamat chip /* Chip LCD RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 Terdapat lampu latar pada kaki sambungan P3. 1 hidup, 0 mati */ // Keluaran data com |= 0x04; // E per satuan pcf8574_byte_out(com, TAMBAHKAN); // Keluaran data com &= 0xFB; // E ke nol pcf8574_byte_out(com, TAMBAHKAN); // Keluaran data) batal init(batal) ( _delay_ms(30); com(0x30); _delay_us(40); com(0x30); // Beralih ke mode 4-bit _delay_us(40); // Penundaan eksekusi perintah com(0x30); // Beralih ke mode 4-bit _delay_us(40); // Penundaan eksekusi perintah com(0x20); // Beralih ke mode 4-bit _delay_us(40); // Penundaan eksekusi perintah com(0x20); // Mengatur parameter com(0x80); // Mengatur parameter com(0x00); // Matikan tampilan com(0x80); // Matikan tampilan com(0x00); // Hapus tampilan com(0x10); // Hapus tampilan com(0x00); com(0x60); // Mengatur mode masukan data com(0x00); com(0xC0); // Nyalakan tampilan dengan kursor yang dipilih) void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Transfer 4 bit data_h yang paling signifikan |= 0x04; pcf8574_byte_out(data_h, ADD); // Transfer 4 bit paling signifikan // Transfer 4 bit paling signifikan // Transfer rendah 4 bit // Transfer rendah 4 bit // Transfer rendah 4 bit) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁP֐BET MɐP!" ); sementara(1) ( ) ) Apa yang sebenarnya terjadi di sini. Pertama kita menghubungkan perpustakaan untuk I2C dan untuk PCF8574. Saya sudah menulis tentang I2C, jadi saya akan terus membahasnya lagi, tapi saya akan memberi tahu Anda apa yang ada di PCF8574.h. Perpustakaan hanya mencakup tiga fungsi.
BYTE pcf8574_test(BYTE tambah) ( BYTE tanya = ACK; tambah &= 0xFE; i2c_start(); tanya = i2c_send_byte(tambahkan); i2c_stop(); kembali tanya; ) Fungsi pertama ditulis untuk memeriksa apakah suatu perangkat ada di bus. Pada prinsipnya, ini dapat digunakan untuk mencari perangkat apa pun yang terletak di bus. Fungsi ini mengambil alamat perangkat yang diinginkan dan jika merespons, ia mengembalikan nol. Jika perangkat dengan alamat seperti itu tidak ada di bus, perangkat tersebut akan mengembalikannya.
BYTE pcf8574_byte_out(BYTE data, BYTE tambah) ( BYTE tanya = ACK; tambah &= 0xFE; i2c_start(); tanya = i2c_send_byte(tambahkan); if(!ask) tanya = i2c_send_byte(data); i2c_stop(); kembali tanya; ) Fungsi ini telah dirancang khusus untuk chip ini. Sebagai argumen, diberikan satu byte untuk ditransfer ke bus dan alamat chip. Fungsi ini pertama-tama akan menanyakan chip berdasarkan alamat dan kemudian mengirimkan byte. Jika chip menerima satu byte dan merespons dengan ACK, maka fungsi tersebut akan selesai bekerja dengan chip tersebut dan mengembalikan nol sebagai pengiriman byte yang berhasil. Dan saat ini sirkuit mikro akan mengeluarkan byte ini ke port paralelnya. Jika tidak, kami akan menerima NACK dan mengembalikannya, transmisi gagal.
BYTE pcf8574_str_out(BYTE *data, BYTE col, BYTE tambah) ( BYTE tanya = ACK; tambah &= 0xFE; i2c_start(); tanya = i2c_send_byte(tambahkan); for(BYTE i=0; i Fungsi ini dibuat untuk eksperimen. Menerima penunjuk ke larik data satu byte, jumlah byte tersebut, dan alamat chip. Sebenarnya upaya untuk mentransfer semua data dalam satu sesi, dan bukan dalam satu byte per sesi. Fungsinya berfungsi, tetapi tidak cocok untuk layar LCD. Sekarang mari kita kembali ke program utama. Setelah menghubungkan perpustakaan, kami menulis alamat sirkuit mikro. Selanjutnya, kita membuat tiga fungsi yang mirip dengan lcd.h. Perbedaannya hanya pada prinsip transfer data.
batal com(BYTE com) ( com |= 0x08; // P3 ke satu agar lampu latar menyala pcf8574_byte_out(com, TAMBAHKAN); // Keluaran data com |= 0x04; // E per satuan pcf8574_byte_out(com, TAMBAHKAN); // Keluaran data com &= 0xFB; // E ke nol pcf8574_byte_out(com, TAMBAHKAN); // Keluaran data } Fungsi ini hanya mengirimkan perintah ke layar. Di sinilah baris pertama muncul dengan penambahan logis dari perintah dari 0x08. Bug ini diperlukan karena kami mengirimkan byte tidak langsung ke port layar LCD, tetapi melalui repeater kami. Artinya, jika kita menyediakan satu byte, dan kemudian kita hanya perlu mengeluarkan satu bit, silakan tetapkan bit yang diperlukan ke byte sebelumnya dan kirimkan lagi ke port. Ini sangat merepotkan. Penambahan dengan 0x08 diperlukan untuk selalu menjaga satu di digit ketiga. Ingat lampu latar? Penambahan inilah yang menyalakan lampu latar. Kemudian kita memanggil fungsi mentransfer satu byte ke bus. Itu tertulis di atas. Kemudian kami mentransfer byte melalui bus ke chip. Selanjutnya, Anda harus menyetel E ke satu, yang sebenarnya dilakukan oleh penambahan logis byte dari 0x04. Setelah mengatur ulang E. Dengan demikian, Anda dapat mengirim perintah apa pun ke tampilan hanya dengan meneruskan perintah itu sendiri sebagai argumen. batal init(batal) ( _delay_ms(30); // Jeda setelah dihidupkan com(0x30); // Beralih ke mode 4-bit _delay_us(40); // Penundaan eksekusi perintah com(0x30); // Beralih ke mode 4-bit _delay_us(40); // Penundaan eksekusi perintah com(0x30); // Beralih ke mode 4-bit _delay_us(40); // Penundaan eksekusi perintah com(0x20); // Beralih ke mode 4-bit _delay_us(40); // Penundaan eksekusi perintah com(0x20); // Mengatur parameter com(0x80); // Mengatur parameter com(0x00); // Matikan tampilan com(0x80); // Matikan tampilan com(0x00); // Hapus tampilan com(0x10); // Hapus tampilan com(0x00); // Mengatur mode masukan data com(0x60); // Mengatur mode masukan data com(0x00); // Nyalakan tampilan dengan kursor yang dipilih com(0xC0); // Nyalakan tampilan dengan kursor yang dipilih } Fungsi ini hanya menginisialisasi tampilan. Urutan perintah diambil dari datasheet pada layar LCD. void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Transfer 4 bit data_h yang paling signifikan |= 0x04; pcf8574_byte_out(data_h, ADD); // Transfer 4 bit paling signifikan data_h &= 0xF9; // Transfer 4 bit paling signifikan pcf8574_byte_out(data_h, TAMBAHKAN); // Transfer rendah 4 bit pcf8574_byte_out(data_l, TAMBAHKAN); // Transfer rendah 4 bit data_l |= 0x04; // Transfer rendah 4 bit } pcf8574_byte_out(data_l, TAMBAHKAN); data_l &= 0xF9; pcf8574_byte_out(data_l, TAMBAHKAN);

Fungsi ini mengirimkan data ke layar LCD. Ini dijalankan dengan cara yang sama seperti perintah, kecuali bahwa byte ditransmisikan terlebih dahulu dengan nibble paling signifikan, dan kemudian dengan byte rendah. Dan sisanya sama.

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

Nah, fungsi ini murni untuk meneruskan string ke tampilan. Sebenarnya itu tidak ada hubungannya dengan topik kita.

Proyek untuk AtmelStudio 6.2

Kompeten 08/01/15 17:11

Komanya hilang. Benar sekali: "HALO DUNIA!" Dan perangkat ini dirancang tidak hanya untuk HD44780. Resistor pull-up dipasang di sisi master. Menurut spesifikasinya, data ditulis ke pengontrol LCD dalam arah jatuh E. Dari sini fungsi pertama disederhanakan: void com(BYTE com) ( com |= 0x08; // backlight pcf8574_byte_out(com | 0x04, ADD); // Keluaran data pcf8574_byte_out(com , ADD); // E ke nol) Dan sisanya juga bisa jauh lebih sedikit. Misalnya, void char_out(BYTE data) hanya akan menerima dua panggilan, terlebih lagi tanpa variabel tambahan. Inisialisasi LCD dilakukan dengan melanggar spesifikasi waktu.

Alexei 02.08.15 19:11

Karena koma hilang, tampilan tidak akan terpengaruh. Perangkat ini dirancang khusus untuk tampilan dengan pengontrol ini atau pengontrol serupa. Tapi sirkuit mikro ini adalah port expander yang sangat sederhana. Saya setuju tentang E. Variabel tambahan diperlukan. Jika Anda meneruskan argumen ke suatu fungsi dan melakukan tindakan tertentu dengan logika, gangguan mungkin terjadi. Saya sudah mengalami hal ini. Inisialisasi dilakukan tanpa melanggar pengaturan waktu. Dokumentasi mengatakan bahwa ada jeda 40 µs antar perintah. Karena transfer dilakukan melalui bus i2c, yang merupakan perangkat lunak dan lambat, periode diselesaikan dengan penuh minat. Jika Anda masih tidak terlalu malas, tulis versi Anda dan kirimkan kepada saya. Saya akan menerbitkannya. Pada akhirnya situs ini ditujukan untuk pemirsa amatir dan siapapun yang ingin dapat mengutarakan pendapat dan visinya tentang kehidupan MK.

Alexei 06.08.15 09:14

Menambahkan pengaturan waktu saat menginisialisasi tampilan seperti yang dicatat oleh “Melek” yang dihormati

Dmitry 14/06/16 21:57

Ruslan 21.12.16 19:54
Alexei 21/12/16 21:53

Oh ya. Terutama kode di ASMA. Pakar Arduino akan menghargainya sepenuhnya)))

Py.sy.
Bahkan jika Anda tidak melihat ASM, program di sana ditulis untuk pengontrol PIC. Apakah informasi ini “sangat” berguna bagi spesialis AVR? terutama untuk pemula))) Saya tidak menentang PIC, tetapi ASM PIC dan AVR pun berbeda. Adapun detail pengoperasian layar LCD, Anda dapat melihatnya))) Benar, saya juga menulisnya di bawah CVAVR, tetapi semua perintah dibongkar dan diurutkan ke dalam rak. Tapi bagaimanapun juga, putuskan sendiri di mana itu ditulis dengan lebih jelas))) Penulis menulis, pembaca memilih.

GeK 04.01.17 12:52

"Alamat chip I2C (secara default adalah 0x4E"

4 bit alamat yang paling signifikan telah diperbaiki,
Awalan untuk PCF8574 adalah 0100, dan untuk PCF8574A adalah 0111
3 bit terbawah bergantung pada status input chip A2-A0. Secara default, ketiga jumper terbuka, masing-masing, alamat chip mengambil nilai 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

Alexei 04.01.17 14:27

Ada sesuatu yang tertukar.
Ekstrak dari dokumentasi untuk sirkuit mikro

0b01001110 adalah 0x4E
Jadi semuanya benar di sini. Dan jika Anda perlu mengubah alamatnya, maka Anda hanya perlu mengubahnya di Define.

Yuri 14/12/17 21:26

Selamat tinggal! Dan Anda juga dapat menggunakan kode fungsi lcdgotoxy dan lcdclear untuk bekerja dengan adaptor untuk PCF8574.

Alexander 20/05/18 18:14

Selamat tinggal! Bagaimana Anda menampilkan teks Rusia?

Alexei 20/05/18 23:04

Ini adalah tampilan domestik dari MELT. Alfabet Cyrillic tertanam dalam ingatannya.

Alexander 21/05/18 04:55

Selamat tinggal! Saya menulis seperti yang Anda lakukan di Proyek untuk AtmelStudio 6.2 "ЁPҐBET MҐP!" itu menghasilkan secara normal
dan jika Anda menulis "HELLO WORLD!" mengeluarkan segala macam omong kosong. Saya punya dua
Salah satu opsi tampilan memiliki alfabet Sirilik. yang kedua adalah Cina.

Alexei 21/05/18 09:22

Saya pertama-tama akan menulis program pengujian. Iterasi seluruh memori dan menampilkan simbol dan alamatnya. Dan kemudian cari tahu apa masalahnya. Kemungkinan besar tabel karakter tidak cocok dengan tabel ascii.

Andrey 03/09/18 08:32

Selamat tinggal!

Bisakah Anda memberikan diagram sirkuit untuk Proteus?

Andrey 03/09/18 10:22

Atau belum ada yang memeriksa di Proteuse?

Andrey 03/09/18 10:56

Menemukan main_init

Paulus 30/05/19 23:35

Yang aneh, alamat tampilannya adalah 0x4E, dan jika tampilan yang sama dihubungkan ke Arduino, maka alamatnya adalah 0x27

Paulus 31/05/19 11:04

Terima kasih banyak atas pekerjaan Anda! Saya menjelajahi seluruh Internet, dan tidak ada satu pun contoh yang diberikan kecuali contoh Anda yang berhasil. Satu-satunya hal adalah bahwa dalam arsip proyek, penundaan _delay_ tidak ditentukan dalam fungsi inisialisasi tampilan, dan karenanya tidak berfungsi

Alexei 01/06/19 09:52

Ya, ini lebih merupakan proyek percontohan. Untuk alasan yang baik, perpustakaan axlib perlu ditulis ulang, tetapi mengingat fakta bahwa STM32 dan STM8 bergerak dengan pesat, AVR tidak ada gunanya sama sekali.

Paulus 05/06/19 12:57

STM tidak memiliki paket DIP; lebih sulit membuat papan sirkuit tercetak. Untuk proyek saya, kemampuan AVR sangat banyak, Anda dapat memuat banyak hal dalam satu Atmega 8

Alexei 06/05/19 15:20

Ya, tapi berapa biaya Atmega8 dan stm8s003)))

Dmitry 06/07/19 00:41

Halo, Alexei.
Tolong beri tahu saya cara membaca status port dari pcf8574?
Saya ingin membuat unit eksternal, 8 GPIO di bus i2c - itu saja.

Dmitry 07/06/19 17:56

Aku akan menjawabnya sendiri
Fungsi ini mengembalikan satu byte - status port sirkuit mikro
uint8_t pcf8574_byte_rcv(uint8_t addr)
{
uint8_t tanya = ACK;
tambahan |= 0b01; //MEMBACA
uint8_t data=0;
i2c_start();
tanya = i2c_send_byte(addr);
if(!ask) data = i2c_read_byte(NACK);
i2c_stop();

Kembalikan data;
}

Paulus 07/06/19 20:37

Berapa biayanya, 150 rubel, untuk harga relay secara umum), dan bagaimana cara memasang papan untuk STM? LUT tidak dapat diandalkan, router CNC tidak yakin apa yang diperlukan (belum mencobanya)

  • Modul FC-113 didasarkan pada chip PCF8574T, yang merupakan register geser 8-bit - "expander" input-output untuk bus serial I2C. Pada gambar, sirkuit mikro diberi nama DD1.
  • R1 adalah resistor trim untuk mengatur kontras layar LCD.
  • Jumper J1 digunakan untuk menyalakan lampu latar tampilan.
  • Pin 1…16 digunakan untuk menghubungkan modul ke pin layar LCD.
  • Bantalan kontak A1...A3 diperlukan untuk mengubah alamat I2C perangkat. Dengan menyolder jumper yang sesuai, Anda dapat mengubah alamat perangkat. Tabel menunjukkan korespondensi alamat dan jumper: "0" menunjukkan sirkuit terbuka, "1" menunjukkan jumper terpasang. Secara default, ketiga jumper dan alamat perangkat terbuka 0x27.

2 Diagram koneksi untuk layar LCD ke Arduino melalui protokol I2C

Modul terhubung ke Arduino dengan cara standar untuk bus I2C: pin SDA modul terhubung ke port analog A4, pin SCL terhubung ke port analog A5 Arduino. Modul ini ditenagai oleh +5 V dari Arduino. Modul itu sendiri dihubungkan oleh pin 1…16 ke pin 1…16 yang sesuai pada layar LCD.


3 Perpustakaan untuk bekerja melalui protokol I2C

Sekarang kita memerlukan perpustakaan untuk bekerja dengan LCD melalui antarmuka I2C. Anda dapat menggunakan, misalnya, yang ini (tautan di baris "Unduh Kode Contoh dan Pustaka").

Arsip yang diunduh LiquidCrystal_I2Cv1-1.rar unzip ke folder \perpustakaan\, yang terletak di direktori Arduino IDE.

Perpustakaan mendukung serangkaian fungsi standar untuk layar LCD:

FungsiTujuan
Kristal Cair() membuat variabel tipe LiquidCrystal dan menerima parameter koneksi tampilan (nomor pin);
mulai() menginisialisasi tampilan LCD, mengatur parameter (jumlah baris dan karakter);
jernih() membersihkan layar dan mengembalikan kursor ke posisi awal;
rumah() kembalikan kursor ke posisi awal;
set Kursor() mengatur kursor ke posisi tertentu;
menulis() menampilkan simbol pada layar LCD;
mencetak() menampilkan teks pada layar LCD;
kursor() menunjukkan kursor, mis. menggarisbawahi di bawah tempat karakter berikutnya;
tanpa Kursor() menyembunyikan kursor;
berkedip() kursor berkedip;
tidak berkedip() Batalkan flashing;
tidak ada Tampilan() mematikan layar sambil menyimpan semua informasi yang ditampilkan;
menampilkan() menyalakan layar sambil menyimpan semua informasi yang ditampilkan;
gulirTampilanKiri() gulir isi tampilan 1 posisi ke kiri;
gulirTampilanKanan() gulir isi tampilan 1 posisi ke kanan;
gulir otomatis() aktifkan gulir otomatis;
tidak ada Gulir Otomatis () nonaktifkan gulir otomatis;
kiriKeKanan() mengatur arah teks dari kiri ke kanan;
kananKeKiri() arah teks dari kanan ke kiri;
buatChar() membuat karakter khusus untuk layar LCD.

4 Sketsa untuk keluaran teks ke layar LCD melalui bus I2C

Mari kita buka sampelnya: Sampel File LiquidCrystal_I2C CustomChars dan kami akan mengubahnya sedikit. Kami akan menampilkan pesan yang di ujungnya akan ada simbol berkedip. Komentar pada kode mengomentari semua nuansa sketsa.

#termasuk // sertakan perpustakaan Wire #include // menghubungkan perpustakaan LCD #define printByte(args) write(args); // uint8_t hati = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // bit mask dari simbol “hati” LiquidCrystal_I2C lcd(0x27, 16, 2); // Tetapkan alamat 0x27 untuk layar LCD 16x2 batalkan pengaturan() ( lcd.init(); // menginisialisasi tampilan LCD lcd.backlight(); // nyalakan lampu latar layar lcd.createChar(3, hati); // membuat simbol “hati” di sel memori 3 lcd.home(); // letakkan kursor di pojok kiri atas, pada posisi (0,0) lcd.!"); // mencetak satu baris teks lcd.setCursor(0, 1); // memindahkan kursor ke baris 2, karakter 1 lcd.print( " i "); // mencetak pesan pada baris 2 lcd.printByte(3); // mencetak simbol "hati" yang terletak di sel ke-3 lcd.print(" Arduino "); } lingkaran kosong() (// mem-flash karakter terakhir lcd.setCursor(13, 1); // pindahkan kursor ke baris 2, karakter 1 lcd.print("\t"); }

penundaan(500); lcd.setCursor(13, 1); // pindahkan kursor ke baris 2, karakter 1 lcd.print(" "); penundaan(500);

5 Omong-omong, karakter ditulis dengan perintah lcd.createChar();

, tetap berada di memori tampilan bahkan setelah daya dimatikan, karena ditulis untuk menampilkan ROM 1602. Buat simbol Anda sendiri untuk layar LCD {00000, 01010, 11111, 11111, 01110, 00100, 00000} Mari kita lihat lebih dekat masalah pembuatan simbol Anda sendiri untuk layar LCD. Setiap karakter di layar terdiri dari 35 titik: 5 lebar dan 7 tinggi (+1 garis cadangan untuk garis bawah). Pada baris 6 sketsa di atas kita mendefinisikan array yang terdiri dari 7 angka:

6 (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Konversi bilangan heksadesimal ke biner:

. Angka-angka ini tidak lebih dari bit mask untuk masing-masing dari 7 baris simbol, di mana "0" menunjukkan titik terang dan "1" menunjukkan titik gelap. Misalnya, simbol hati yang ditetapkan sebagai bitmask akan muncul di layar seperti yang ditunjukkan pada gambar.


7 Kontrol layar LCD melalui bus I2C

Ayo unggah sketsanya ke Arduino. Prasasti yang kami tentukan dengan kursor berkedip di bagian akhir akan muncul di layar.


Ada apa di belakang

bus I2C Sebagai bonus, mari kita lihat diagram waktu untuk menampilkan karakter Latin "A", "B" dan "C" pada layar LCD. Karakter-karakter ini disimpan dalam ROM tampilan dan ditampilkan di layar hanya dengan mengirimkan alamatnya ke layar. Diagram diambil dari pin tampilan RS, RW, E, D4, D5, D6 dan D7, mis. sudah setelah konverter “bus paralel I2C” FC-113. Kami dapat mengatakan bahwa kami sedang mendalami lebih dalam tentang perangkat keras. Diagram waktu keluaran karakter Latin “A”, “B” dan “C” pada layar LCD 1602 Diagram menunjukkan bahwa karakter yang ada di tampilan ROM (lihat halaman 11 lembar data, tautan di bawah) ditransmisikan dalam dua camilan, yang pertama menentukan nomor kolom tabel, dan yang kedua - nomor baris. Dalam hal ini, data “terkunci” di tepi sinyal pada saluran E

(Aktifkan), dan garis


R.S. (Register select) dalam keadaan logis, yang berarti data sedang ditransfer. Keadaan rendah pada saluran RS berarti instruksi sedang dikirim, yang kita lihat sebelum setiap karakter dikirimkan. Dalam hal ini, kode instruksi untuk pengangkutan kembali ke posisi (0, 0) layar LCD dikirimkan, yang juga dapat diketahui dengan mempelajari deskripsi teknis tampilan. Dan satu contoh lagi. Diagram pengaturan waktu ini menunjukkan keluaran simbol Hati pada layar LCD. Sekali lagi, dua impuls pertama(0000 0010 2) - mengembalikan kereta ke posisi (0; 0), dan dua yang kedua - menampilkan simbol "Hati" (instruksi) ke layar LCD yang tersimpan di sel memori 3 10 (0000 0011 2 lcd.createChar(3, hati); sketsa).

Pada artikel ini saya akan memberi tahu Anda cara menggunakan modul antarmuka I2C untuk mengontrol layar LCD (2x16/20x4) menggunakan Arduino. Modul ini memungkinkan Anda mengurangi jumlah pin pengontrol yang digunakan; alih-alih koneksi 8 atau 4-bit, hanya diperlukan 2 pin (SDA dan SCL).

Parameter Teknis

Dukungan tampilan: LCD 16×02 / 20×04
Opsional: penyesuaian kontras
Tegangan suplai. 5V
Antarmuka: I2C
Dimensi: 54mm x 19mm x 15mm

Informasi umum tentang modul antarmuka I2C

Karena jumlah kontak pada pengontrol Arduino terbatas dan sering habis saat menggunakan berbagai sensor dan modul, maka perlu untuk menyimpannya, untuk kasus ini, modul ini dikembangkan, dengan bantuannya Anda dapat mengimplementasikan transmisi melalui dua kontak ( ). SDA dan SCL).

Sekarang sedikit tentang modul itu sendiri; modul ini dibangun di atas chip PCF8574T. Resistor R8 (4,7 kOhm) dan R9 (4,7 kOhm) diperlukan untuk menarik jalur SDA dan SCL. Idealnya, saat menghubungkan dua atau lebih perangkat melalui bus I2C, Anda perlu menggunakan pull-up hanya pada satu perangkat, I. Saya akan menulis alasannya nanti. Ada tiga jumper di papan (diagram menunjukkan bahwa saluran A0, A1, A2 terhubung ke catu daya melalui resistor R4, R5, R6), mereka diperlukan untuk mengubah pengalamatan perangkat, ada total 8 opsi . Mengubah pengalamatan memberi kita kemampuan untuk menghubungkan hingga delapan perangkat melalui bus IC2 dengan chip PCF8574T; opsi alamat ditunjukkan pada gambar (alamat perangkat default adalah 0x27). Modul ini juga dilengkapi dengan potensiometer R11, yang dapat digunakan untuk mengubah kontras layar LCD.

Ada tiga grup kontak pada modul untuk koneksi:

Kelompok pertama:
SCL: Jam Serial
SDA: jalur data (Serial Dфta)
VCC: kekuatan "+".
GND: "-" catu daya

Kelompok kedua:
VSS: "-" kekuatan
VDD: kekuatan “+”.
VO: Pin kontrol kontras
RS: Daftar Pilih
RW: Baca/Tulis (Mode tulis saat terhubung ke ground)
E: Aktifkan (strobo jatuh)
DB0-DB3: Antarmuka bit rendah
DB4-DB7: Antarmuka bit tinggi
J: catu daya lampu latar "+".
K: "-" kekuatan lampu latar

Grup ketiga: (jumper diatur secara default)
VCC:
A dari LCD:

Menghubungkan ke Arduino

Bagian yang diperlukan:
Arduino UNO R3 x 1 buah.
Layar LCD 1602A (2×16, 5V, Biru) x 1 buah.
Modul antarmuka I2C, IIC, TWI untuk LCD x 1 buah.
Kawat DuPont, 2,54 mm, 20 cm, F-M (Wanita - Pria) x 1 pc.
Kabel USB 2.0 A-B x 1 buah.

Koneksi:
Pertama-tama kita menyolder modul I2C ke layar LCD, kemudian Anda perlu menghubungkan layar ke Arduino UNO. Untuk melakukan ini, kami akan menggunakan kabel DuPont yang kami sambungkan sesuai tabel di bawah.

Untuk lebih jelasnya, saya akan memberikan diagram lain.

Untuk percobaan ini, Anda perlu mengunduh dan menginstal perpustakaan “LiquidCrystal_I2C”. Kemudian salin dan tempel kode contoh ini ke jendela program Arduino IDE dan muat ke dalam pengontrol.

/* Diuji pada Arduino IDE 1.6.11 Tanggal pengujian 15/09/2016 */ #termasuk #termasuk LCD LiquidCrystal_I2C (0x27,16,2); // Tetapkan alamat dan ukuran tampilan void setup() ( lcd.init(); // Inisialisasi lcd lcd.backlight(); // Nyalakan lampu latar lcd.setCursor(0,0); // Atur kursor ke awal baris 1 lcd .print("Halo, dunia"); // Cetak teks lcd.setCursor(0,1); // Atur kursor ke awal baris 2 lcd.print("www. robotchip.ru"); // Cetak teksnya ) void loop() ( )

Unduh programnya

Jika Anda melakukan semuanya dengan benar, tetapi tidak ada simbol di layar, coba tingkatkan kontras dengan potensiometer.


Tautan
Unduh perpustakaan LiquidCrystal_I2C
Dokumentasi untuk chip PCF8574T
Dokumentasi untuk LCD1602A

Beli di Aliexpress

  • Modul FC-113 didasarkan pada chip PCF8574T, yang merupakan register geser 8-bit - "expander" input-output untuk bus serial I2C. Pada gambar, sirkuit mikro diberi nama DD1.
  • R1 adalah resistor trim untuk mengatur kontras layar LCD.
  • Jumper J1 digunakan untuk menyalakan lampu latar tampilan.
  • Pin 1…16 digunakan untuk menghubungkan modul ke pin layar LCD.
  • Bantalan kontak A1...A3 diperlukan untuk mengubah alamat I2C perangkat. Dengan menyolder jumper yang sesuai, Anda dapat mengubah alamat perangkat. Tabel menunjukkan korespondensi alamat dan jumper: "0" menunjukkan sirkuit terbuka, "1" menunjukkan jumper terpasang. Secara default, ketiga jumper dan alamat perangkat terbuka 0x27.

2 Diagram koneksi untuk layar LCD ke Arduino melalui protokol I2C

Modul terhubung ke Arduino dengan cara standar untuk bus I2C: pin SDA modul terhubung ke port analog A4, pin SCL terhubung ke port analog A5 Arduino. Modul ini ditenagai oleh +5 V dari Arduino. Modul itu sendiri dihubungkan oleh pin 1…16 ke pin 1…16 yang sesuai pada layar LCD.


3 Perpustakaan untuk bekerja melalui protokol I2C

Sekarang kita memerlukan perpustakaan untuk bekerja dengan LCD melalui antarmuka I2C. Anda dapat menggunakan, misalnya, yang ini (tautan di baris "Unduh Kode Contoh dan Pustaka").

Arsip yang diunduh LiquidCrystal_I2Cv1-1.rar unzip ke folder \perpustakaan\, yang terletak di direktori Arduino IDE.

Perpustakaan mendukung serangkaian fungsi standar untuk layar LCD:

FungsiTujuan
Kristal Cair() membuat variabel tipe LiquidCrystal dan menerima parameter koneksi tampilan (nomor pin);
mulai() menginisialisasi tampilan LCD, mengatur parameter (jumlah baris dan karakter);
jernih() membersihkan layar dan mengembalikan kursor ke posisi awal;
rumah() kembalikan kursor ke posisi awal;
set Kursor() mengatur kursor ke posisi tertentu;
menulis() menampilkan simbol pada layar LCD;
mencetak() menampilkan teks pada layar LCD;
kursor() menunjukkan kursor, mis. menggarisbawahi di bawah tempat karakter berikutnya;
tanpa Kursor() menyembunyikan kursor;
berkedip() kursor berkedip;
tidak berkedip() Batalkan flashing;
tidak ada Tampilan() mematikan layar sambil menyimpan semua informasi yang ditampilkan;
menampilkan() menyalakan layar sambil menyimpan semua informasi yang ditampilkan;
gulirTampilanKiri() gulir isi tampilan 1 posisi ke kiri;
gulirTampilanKanan() gulir isi tampilan 1 posisi ke kanan;
gulir otomatis() aktifkan gulir otomatis;
tidak ada Gulir Otomatis () nonaktifkan gulir otomatis;
kiriKeKanan() mengatur arah teks dari kiri ke kanan;
kananKeKiri() arah teks dari kanan ke kiri;
buatChar() membuat karakter khusus untuk layar LCD.

4 Sketsa untuk keluaran teks ke layar LCD melalui bus I2C

Mari kita buka sampelnya: Sampel File LiquidCrystal_I2C CustomChars dan kami akan mengubahnya sedikit. Kami akan menampilkan pesan yang di ujungnya akan ada simbol berkedip. Komentar pada kode mengomentari semua nuansa sketsa.

#termasuk // sertakan perpustakaan Wire #include // menghubungkan perpustakaan LCD #define printByte(args) write(args); // uint8_t hati = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // bit mask dari simbol “hati” LiquidCrystal_I2C lcd(0x27, 16, 2); // Tetapkan alamat 0x27 untuk layar LCD 16x2 batalkan pengaturan() ( lcd.init(); // menginisialisasi tampilan LCD lcd.backlight(); // nyalakan lampu latar layar lcd.createChar(3, hati); // membuat simbol “hati” di sel memori 3 lcd.home(); // letakkan kursor di pojok kiri atas, pada posisi (0,0) lcd.!"); // mencetak satu baris teks lcd.setCursor(0, 1); // memindahkan kursor ke baris 2, karakter 1 lcd.print( " i "); // mencetak pesan pada baris 2 lcd.printByte(3); // mencetak simbol "hati" yang terletak di sel ke-3 lcd.print(" Arduino "); } lingkaran kosong() (// mem-flash karakter terakhir lcd.setCursor(13, 1); // pindahkan kursor ke baris 2, karakter 1 lcd.print("\t"); }

penundaan(500); lcd.setCursor(13, 1); // pindahkan kursor ke baris 2, karakter 1 lcd.print(" "); penundaan(500);

5 Omong-omong, karakter ditulis dengan perintah lcd.createChar();

, tetap berada di memori tampilan bahkan setelah daya dimatikan, karena ditulis untuk menampilkan ROM 1602. Buat simbol Anda sendiri untuk layar LCD {00000, 01010, 11111, 11111, 01110, 00100, 00000} Mari kita lihat lebih dekat masalah pembuatan simbol Anda sendiri untuk layar LCD. Setiap karakter di layar terdiri dari 35 titik: 5 lebar dan 7 tinggi (+1 garis cadangan untuk garis bawah). Pada baris 6 sketsa di atas kita mendefinisikan array yang terdiri dari 7 angka:

6 (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Konversi bilangan heksadesimal ke biner:

. Angka-angka ini tidak lebih dari bit mask untuk masing-masing dari 7 baris simbol, di mana "0" menunjukkan titik terang dan "1" menunjukkan titik gelap. Misalnya, simbol hati yang ditetapkan sebagai bitmask akan muncul di layar seperti yang ditunjukkan pada gambar.


7 Kontrol layar LCD melalui bus I2C

Ayo unggah sketsanya ke Arduino. Prasasti yang kami tentukan dengan kursor berkedip di bagian akhir akan muncul di layar.


Ada apa di belakang

bus I2C Sebagai bonus, mari kita lihat diagram waktu untuk menampilkan karakter Latin "A", "B" dan "C" pada layar LCD. Karakter-karakter ini disimpan dalam ROM tampilan dan ditampilkan di layar hanya dengan mengirimkan alamatnya ke layar. Diagram diambil dari pin tampilan RS, RW, E, D4, D5, D6 dan D7, mis. sudah setelah konverter “bus paralel I2C” FC-113. Kami dapat mengatakan bahwa kami sedang mendalami lebih dalam tentang perangkat keras. Diagram waktu keluaran karakter Latin “A”, “B” dan “C” pada layar LCD 1602 Diagram menunjukkan bahwa karakter yang ada di tampilan ROM (lihat halaman 11 lembar data, tautan di bawah) ditransmisikan dalam dua camilan, yang pertama menentukan nomor kolom tabel, dan yang kedua - nomor baris. Dalam hal ini, data “terkunci” di tepi sinyal pada saluran E

(Aktifkan), dan garis


R.S. (Register select) dalam keadaan logis, yang berarti data sedang ditransfer. Keadaan rendah pada saluran RS berarti instruksi sedang dikirim, yang kita lihat sebelum setiap karakter dikirimkan. Dalam hal ini, kode instruksi untuk pengangkutan kembali ke posisi (0, 0) layar LCD dikirimkan, yang juga dapat diketahui dengan mempelajari deskripsi teknis tampilan. Dan satu contoh lagi. Diagram pengaturan waktu ini menunjukkan keluaran simbol Hati pada layar LCD. Sekali lagi, dua impuls pertama(0000 0010 2) - mengembalikan kereta ke posisi (0; 0), dan dua yang kedua - menampilkan simbol "Hati" (instruksi) ke layar LCD yang tersimpan di sel memori 3 10 (0000 0011 2 lcd.createChar(3, hati); sketsa).

  • Sergei Savenkov

    semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat