Untuk masuk
Semua rahasia komputer untuk pemula dan profesional
  • Mendapatkan Root Sony Xperia ZR LTE (C5503)
  • Menginstal program Windows di Mac Cara menjalankan program Windows di Mac
  • Persyaratan sistem untuk Ryse: Son of Rome di PC
  • Wolfenstein: Orde Baru - Persyaratan Sistem
  • Panduan untuk berbicara dengan gadis Gta san andreas bunga di peta
  • Cheat Fallout 4 untuk power armor
  • Program untuk interaksi antara indikator PIC16 dan LCD. Bekerja dengan LCD karakter berdasarkan pengontrol HD44780 Menginstal dan menginisialisasi monitor LCD

    Program untuk interaksi antara indikator PIC16 dan LCD.  Bekerja dengan LCD karakter berdasarkan pengontrol HD44780 Menginstal dan menginisialisasi monitor LCD

    Mari kita pertimbangkan interaksi antara pengguna dan perangkat berbasis mikrokontroler. Sangat sering pengguna perlu memasukkan informasi dan membacanya dari sesuatu. Keyboard dan layar () sangat cocok untuk tujuan ini. Pertimbangkan interaksi antara pengguna dan perangkat berbasis mikrokontroler. Sangat sering pengguna perlu memasukkan informasi dan membacanya dari sesuatu. Keyboard dan layar () sangat cocok untuk tujuan ini. Dalam catatan ini, kita akan melihat lebih dekat tampilan informasi secara simbolis LCD dengan sintesis tanda.

    Indikator seperti itu sering digunakan saat merancang perangkat digital, jadi Anda perlu mengetahui cara menggunakannya.
    Mari kita pertimbangkan struktur internal khas dari sintesis tanda LCD:

    Struktur internal HD44780

    LCD didasarkan pada matriks kristal cair, dengan memberikan tegangan pada elemen yang kita dapat “menerangi” suatu titik di layar. Dalam kasus kami, matriks terdiri dari ruang-ruang yang sudah dikenal (paling sering berukuran 8x5 piksel), dikelompokkan dalam beberapa baris. Ini semua dikelola oleh bawaan Pengontrol HD44780. Pengontrol memiliki sel memori byte tunggal ( DDRAM), yang isinya sebenarnya ditampilkan di layar sesuai dengan tabel yang tercatat CGRAM. Biasanya terdapat lebih banyak sel memori daripada sel memori biasa LCD, jadi Anda perlu melihat pengalamatan tempat-tempat yang familier di lembar data. Artinya, kita hanya perlu menuliskan kode karakter yang diinginkan pada posisi yang diinginkan, dan lainnya HD44780 akan melakukannya sendiri.

    Untuk memilih posisi, terdapat kursor virtual (jumlah sel memori saat ini, AC), yang dapat dikontrol menggunakan perintah agar kursor dapat terlihat. Secara default, saat menulis karakter ke dalam sel, kursor bergerak maju satu posisi. Kode karakter untuk LCD pendukung alfabet Cyrillic dapat dilihat pada tabel:

    Kode tetrad tinggi akan sama dengan baris simbol yang dipilih, dan tetrad rendah akan sama dengan garis. Anda dapat membuat tabel simbol Anda sendiri dengan menuliskannya CGRAM. Setiap karakter memerlukan 5 byte, yang bertanggung jawab atas piksel yang "menyala". Misalnya, angka "8" dikodekan sebagai 0x6c,0x92.0x92.0x92.0x6c.
    Kode perintah diberikan dalam tabel.

    Tabel karakter HD44780


    Arti bendera:


    Pertanyaannya tetap terbuka: “bagaimana cara menulis kode simbol yang diperlukan pada posisi yang diperlukan?” Untuk melakukan ini, mari kita lihat apa yang menjadi tanggung jawab kesimpulan tersebut. LCD. kesimpulan DB0-DB7 bertanggung jawab atas data masuk/keluar. Level tinggi pada pin RS memungkinkan indikator mengetahui sinyal pada pin DB0-DB7 adalah data, dan rendah adalah perintah. Kesimpulan W/R bertanggung jawab atas arah data, apakah data ditulis ke memori atau dibaca darinya (biasanya membaca dari LCD tidak digunakan, kita dapat menerapkan level rendah dengan aman). Pulsa keluaran E(dengan durasi minimal 500 ns) digunakan sebagai sinyal untuk menulis/membaca data dari pin DB0-DB7, R.S. Dan W/R.

    Kesimpulan V0 digunakan untuk mengatur kontras gambar, pin A, K - untuk menyalakan lampu latar (jika model Anda memilikinya LCD). 2 pin sisanya adalah catu daya sebenarnya. LCD. Artinya, untuk mengontrol LCD 8+1+1=10 pin diperlukan. Tapi Anda bisa bekerja dalam mode antarmuka 4-bit. Dalam hal ini, tetrad perintah/data tinggi pada pin DB4-DB7 akan dikirimkan terlebih dahulu, baru kemudian yang rendah. Kesimpulan DB0-DB3 tidak digunakan. Total diperlukan 6 pin mikrokontroler untuk kontrol.
    Sekarang mari kita lihat contoh langsung. Mari kita menulis program untuk menampilkan teks "situs web" dengan apa yang saya miliki dalam stok WH1602A(2 baris 16 karakter).

    Untuk LCD lainnya, Anda harus memeriksa korespondensi selnya DDRAM kenalan. Diagram koneksi LCD ke pengontrol terlihat seperti ini.

    Diagram koneksi ke mikrokontroler AVR


    Penghambat R3- 17 Ohm membatasi arus yang melalui lampu latar, dan AC VR1 mengatur kontras (jika semuanya terhubung dan diprogram dengan benar, tetapi indikator tidak bersuara, putar VR1 agar gambar terlihat). Selain itu, polaritasnya tidak boleh tertukar. LCD, nyalakan di atas 5.5V, dari pengalaman saya, saya dapat mengatakan bahwa mereka langsung terbakar. Tujuan dari semua bagian lainnya sama seperti di
    Sekarang mari kita lanjutkan ke penulisan programnya. Untuk mengontrol indikator, kami akan menulis sebuah program dengan beberapa fungsi utama untuk digunakan LCD: lcd_dat(unsigned char x) – untuk menulis data x, lcd_com(unsigned char x) – untuk menulis perintah x, lcd_init(void) – untuk inisialisasi awal indikator:

      #termasuk //perpustakaan masukan/keluaran

    1. #define RS 2 //RS=PD2 - sinyal kontrol LCD

      #define E 3 //E=PD3 - sinyal kontrol LCD

    2. #define TIME 10 //Konstanta waktu tunda untuk LCD

      //Frekuensi pencatatan MK - 4 MHz

    3. //Program pembangkitan penundaan

      batal jeda (unsigned int a)

      ( tidak ditandatangani ke dalam saya;

    4. untuk (saya= sebuah; saya> 0 ; saya-- ) ;

    5. //Program untuk mengirimkan perintah ke LCD

      batal lcd_com (lcd karakter tidak ditandatangani)

      ( suhu karakter yang tidak ditandatangani;

    6. suhu= (lcd& ~(1<< RS) ) | (1 << E) ; //RS=0 adalah sebuah perintah

      PORTD= suhu; //Output tetrad tertinggi dari perintah, RS, sinyal E ke portD

      asm("tidak" ) ;

      PORTD= suhu& ~(1<< E) ; //Sinyal perekaman perintah

    7. suhu= ((lcd* 16 ) & ~(1<< RS) ) | (1 << E) ; //RS=0 adalah sebuah perintah

      PORTD= suhu; //Keluarkan tetrad orde rendah dari perintah, RS, sinyal E ke portD

      asm("tidak" ) ; //Penundaan kecil 1 siklus MK, untuk stabilisasi

      PORTD= suhu& ~(1<< E) ; //Sinyal perekaman perintah

    8. jeda (10 * WAKTU) ; //Jeda untuk eksekusi perintah

    9. //Program untuk menulis data ke LCD

      batalkan lcd_dat (lcd karakter yang tidak ditandatangani)

      ( suhu karakter yang tidak ditandatangani;

    10. suhu= (lcd| (1<< RS) ) | (1 << E) ; //RS=1 adalah data

      PORTD= suhu; //Output sinyal tetrad, RS, E data paling signifikan ke portD

      asm("tidak" ) ; //Penundaan kecil 1 siklus MK, untuk stabilisasi

      PORTD= suhu& ~(1<< E) ; //Sinyal perekaman data

    11. suhu= ((lcd* 16 ) | (1<< RS) ) | (1 << E) ; //RS=1 adalah data

      PORTD= suhu; //Output sinyal tetrad, RS, E data orde rendah ke portD

      asm("tidak" ) ; //Penundaan kecil 1 siklus MK, untuk stabilisasi

      PORTD= suhu& ~(1<< E) ; //Sinyal perekaman data

    12. jeda(WAKTU) ; //Jeda untuk keluaran data

    13. //Program inisialisasi LCD

      batal lcd_init(batal)

      lcd_com(0x2c) ; //antarmuka 4 kabel, ukuran karakter 5x8

      jeda(100 * WAKTU) ;

      jeda(100 * WAKTU) ;

      jeda (100 * WAKTU) ;

    14. //Program utama

      int utama(batal)

      DDRD= 0xfc ; //Inisialisasi portD

      PORTD= 0x00 ;

    15. jeda(1000);

      lcd_init() ; //Inisialisasi LCD

    16. lcd_dat("w" ) ; //Keluaran "www.situs"

      lcd_dat("w" ) ;

      lcd_dat("w" ) ;

      lcd_dat("." ) ;

      lcd_dat("sebuah" ) ;

      lcd_dat("v" ) ;

      lcd_dat("r" ) ;

      lcd_dat("aku" ) ;

      lcd_dat("sebuah" ) ;

      lcd_dat("b" ) ;

      lcd_dat("." ) ;

      lcd_dat("c" ) ;

      lcd_dat("o" ) ;

      lcd_dat("m" ) ;

    17. lcd_dat("Saya" ) ; //Tulis "Mudah sekali"

      lcd_dat("t" ) ;

      lcd_dat(""" );

      lcd_dat("s" ) ;

      lcd_dat(" " ) ;

      lcd_dat("s" ) ;

      lcd_dat("o" ) ;

      lcd_dat(" " ) ;

      lcd_dat("e" ) ;

      lcd_dat("sebuah" ) ;

      lcd_dat("s" ) ;

      lcd_dat("y" ) ;

    18. sementara(1) //siklus tanpa akhir

    19. kembali 1 ;

    Program ini sangat sederhana, tidak akan sulit bagi siapa pun yang memiliki setidaknya sedikit pengetahuan untuk memahaminya. C Untuk AVR. Untuk bahasa Latin dan angka ASCII kodenya cocok dengan yang diprogram ke dalam generator karakter LCD, oleh karena itu diperbolehkan untuk digunakan lcd_dat('A'). Anda dapat membuat perpustakaan Anda sendiri untuk bekerja dengan LCD dengan memisahkan fungsi lcd_dat(unsigned char x), lcd_com(unsigned char x), lcd_init(void) ke dalam modul terpisah LCD.h dan sambungkan sesuai kebutuhan.

    Ide ini menghemat banyak waktu; Anda hanya perlu menulis fungsi yang diperlukan satu kali, lalu menggunakannya sepanjang waktu. Anda juga dapat mencatat bahwa tidak nyaman untuk mengeluarkan frase panjang satu huruf pada satu waktu; untuk melakukan ini, Anda dapat memasukkan string keluaran kami ke dalam array karakter yang tidak ditandatangani dan mengeluarkannya menggunakan loop:

      int utama(batal)

      ( data karakter yang tidak ditandatangani [ 14 ] = ( "w" , "w" , "w" , "." , "a" , "v" , "r" , "l" , "a" , "b" , " ." , "c" , "o" , "m" ) ;

      karakter i yang tidak ditandatangani;

      DDRD= 0xfc ; //Inisialisasi portD

      PORTD= 0x00 ;

    1. jeda(1000); //Tunda agar LCD sempat menyala

      lcd_init() ; //Inisialisasi LCD

    2. untuk (saya= 0 ; saya< 14 ; i++ ) //Keluarkan entri huruf demi huruf

      lcd_dat(data[saya] ) ;

    Jangan lupa bahwa penomoran array di C dimulai dari nol. Program yang ada dapat digunakan bersama dengan pengontrol tanpa perubahan berarti ATtiny2313, menghubungkan LCD Ke PORTB, sebagai PORTD pada ATtiny2313 hanya memiliki 7 pin, bukan 8, misalnya ATmega8.

    Saya juga merekomendasikan untuk menghubungkan LCD menggunakan koneksi yang dapat dilepas. Ini sangat berguna saat men-debug suatu program, ketika Anda perlu menampilkan beberapa data perantara. Saya menghubungkan satu konektor dan hanya itu. Sebagai kelanjutan dari catatan ini, dalam waktu dekat saya akan mempertimbangkan untuk menampilkan informasi yang telah saya baca LCD.
    Semoga harimu menyenangkan semuanya;)

    ada kesalahan kecil dalam contoh ini

    Ada kesalahan kecil dalam contoh ini, mungkin karena alasan ini contoh tersebut tidak berfungsi bagi banyak orang!

    Secara umum contohnya singkat dan sederhana, sehingga kekurangan kecilnya tidak terlalu mencolok (bagi yang sudah familiar dengan bahasa “C”), terlebih lagi bagi yang baru mengenal AVR dan “C”. ” bahasanya, mungkin mereka malah bingung bagaimana kejadiannya... .mereka menulis, lakukan seperti ini dan akan seperti di gambar....tapi bukan itu masalahnya...

    Secara umum masalahnya ada pada siklus penundaan, sehingga tampilan tetap mengikuti pengontrol, yaitu pada fungsi -

    //Program pembangkitan penundaan

    batal jeda (unsigned int a)

    ( tidak ditandatangani ke dalam saya;

    untuk (i=a;i>0;i--);

    semuanya tampak benar pada pandangan pertama, tetapi kompiler untuk mikrokontroler berusaha untuk mengoptimalkan kode untuk kekompakan maksimum dari gambar memori flash yang dihasilkan dari program... dan tidak melihat gunanya dalam loop kosong dan, karenanya, lebih jauh ke bawah rantai setelahnya itu: semua panggilan, deklarasi konstanta dan segala sesuatu yang terkait dengan fungsi ini menurut pendapatnya tidak ada artinya... itu hanya menghapusnya dari kode selama perakitan...

    setidaknya ini berlaku untuk atmel studio 6.1, dan Anda dapat memverifikasi ini dengan melihat folder proyek, ada file *.lss yang berisi kode perakitan program ini, yang dihasilkan saat membangun proyek. tidak ada petunjuk tentang penerapan fungsi jeda kosong...

    alhasil saat flashing firmware controller, tampilannya berakhir dengan sampah acak atau kekosongan.. ketika anda menekan reset beberapa kali, sampah itu mungkin hilang dan muncul kembali.. jelas prosesor dan layarnya mati sinkronisasi

    tetapi jika Anda melakukan koreksi kecil

    batal jeda (unsigned int a)

    ( tidak ditandatangani ke dalam saya;

    untuk (i=a;i>0;i--)
    asm("tidak");

    Kemudian bagi kompiler hal ini masuk akal, hal ini juga dibuktikan dengan tampilan yang jelas dari implementasi fungsi dalam kode assembly

    0000006c
    :
    6c:9c 01 gerakan r18, r24
    6e: 03 c0 rjmp .+6 ; 0x76
    70:00 00 tidak
    72: 21 50 subi r18, 0x01 ; 1
    74:31 09 sbc r19, r1
    76: 21 15 cp r18, r1
    78:31 05 bpk r19, r1
    7a: d1 f7 brne .-12 ; 0x70

    dan kemungkinan besar semuanya akan berfungsi....setidaknya bagi saya di atmega16 (sinkronisasi RC internal 1Mhz) dan menggunakan atmel studio 6.1 persis seperti itu...mungkin di frekuensi lain Anda harus bermain dengan #define TIME 10 konstanta dan/atau nilai yang diteruskan ke fungsi batal jeda

    di sini-> jeda(nilai) ...atau jeda(nilai*WAKTU) ....

    Semoga berhasil mempelajari cara mengoperasikan AVR!

    Lihat, bayangkan LCD -

    Coba bayangkan LCD itu mesin tik, kertas di mesin tik itu memori LCD, gerbongnya adalah penunjuk kursor. Selain itu, LCD tidak menampilkan keseluruhan isi memori, melainkan hanya sebagian saja. Sepertinya semacam jendela yang kita pasang di kertas kita dengan teks.

    Disini I/D menentukan bagaimana kita akan mencetak, kanan ke kiri atau kiri ke kanan.
    S menentukan apakah kita akan menggerakkan jendela layar saat kita mengetik atau tidak.
    S/C - cukup memindahkan jendela layar yang terlihat atau gerbong mesin tik.
    R/L - menentukan ke mana (kiri atau kanan) kita akan memindahkan layar atau jalur menggunakan flag S/C.

    Saya pikir ada sesuatu yang hilang!

    Saya merobek program dan proteus Anda dan tidak dapat memulai di mega8. Layarnya sunyi, saya mulai menggali lembar data dan inilah yang saya temukan:
    Yang hilang adalah inisialisasi dari tiga yang pertama!

    0011 - tunggu 5 ms
    0011 - tunggu 100 mikrodetik
    0011 - tunggu 2 ms
    0010 - tunggu 41 µs
    0000 - -dan-
    0010 - -dan-
    1000
    0000
    1000
    0000
    0001
    0000
    0100

    koreksi saya jika saya salah!

    Tidak bekerja!

    Saya mencoba mengubah frekuensi jam, penundaan selama inisialisasi dan keluaran simbol (perintah), sejauh ini tidak berhasil. Mengenai sekering, jika Anda ingin mengkonfigurasi pin port D menggunakan DDRB, PORTD terdaftar sebagai output log rendah. level, lalu saya melakukannya.
    Karena tidak ada lagi yang bisa dilakukan, saya mengkompilasi program keluaran simbol sederhana menggunakan alat CodeVisionAVR, memasukkannya ke dalam PROTEUS - berhasil!... tetapi dengan LCD asli ia menolak..

    Tidak, aku sedang membicarakan hal itu

    Tidak, yang saya maksud adalah mencoba menyalakan lampu berkedip pada port D, misalnya, atau cukup menyalakan seluruh port sekaligus. Ketika saya hanya membeli mikrokontroler, saya tidak dapat melakukan ini. Saya menjelajahi forum dan ternyata sekeringnya entah bagaimana diprogram di sana dan port D serta semua 8 bitnya tidak dihidupkan. Periksa poin ini, atau lebih baik lagi, coba pindahkan LCD ke port lain, misalnya ke B. Fakta bahwa program bekerja di Proteus tetapi tidak dengan yang asli adalah perbedaan parameter LCD yang tersumbat di Proteus dan Proteus. yang asli.

    Tidak bekerja!

    Saya merakit dan menghubungkan semuanya sesuai diagram, hanya MK yang menggunakan ATmega16 dan LCD WH1602M, dan karenanya mengkompilasi firmware untuk itu di WinAVR. Namun LCD menolak untuk mengeluarkan apapun, saya juga mengumpulkannya di Proteus (pada ATmega 8 dan LM016L), data dari MK dikeluarkan tetapi tidak ada yang terlihat di LCD. Apa masalahnya? (Jika ini penting, gunakan osilator RC internal untuk clock pada 1 MHz)

    1. Untuk Atmega16 yang Anda butuhkan

    1. Untuk Atmega16, Anda harus menyalakan sekringnya terlebih dahulu agar port D dapat berfungsi.
    2. Coba ubah frekuensi clock menjadi 4 MHz dan 8 MHz. Masalah keseluruhan dengan LCD adalah semua jeda tidak dipertahankan selama inisialisasi atau saat mengeluarkan perintah. Dan pengontrol LCD sangat sensitif terhadap hal ini.

    Saya punya pertanyaan:
    Saya merakit sirkuit kronometer pada Mega 8 dengan hex yang sudah jadi - pembacaan ditampilkan pada WH0802,
    indikasinya adalah angka tiga digit yang ditampilkan di seluruh layar, satu digit terdiri dari 4 karakter. Layar grafis semu. Bagaimana firmware bisa ditulis??
    Penulis dengan tegas menolak memberikan kode sumber dan tidak mengomentari karyanya, mungkin karena alasan “kekayaan intelektual”.
    Di waktu luang saya, saya ingin mencoba menulis firmware saya sendiri untuk tujuan pendidikan.

    Saya menemukan ini

    Saya menemukan situasi ini.
    Ada dua LCD 16x2:
    1 - MTC-S16204XFGHSAY
    2 - WH1602A-YGH-CTK

    Saya menggunakan yang pertama dalam proyek dengan GPS.
    Saya memutuskan untuk menggunakan yang kedua dalam proyek dengan keyboard. Tapi entah kenapa LCDnya tidak berfungsi.
    Kontrasnya disesuaikan dan kotak muncul. Itu saja.
    Mungkin ada urutan inisialisasi yang berbeda.
    Bantu saya untuk memahami
    Berikut adalah lembar datanya
    filebox.od.ua/?file=24a31fc50d62bfcd658bdadac84088ab

    Tampilannya tidak berbeda.

    Tampilannya tidak berbeda. Pinoutnya sama. Waktunya sedikit berbeda. Coba tingkatkan penundaan saat mengirimkan perintah ke LCD atau turunkan frekuensi mikrokontroler.

    Semua LCD pada HD44780 memiliki sistem perintah yang sama. Antarmuka apa yang Anda gunakan, 4-bit atau 8-bit? Coba juga tingkatkan penundaan antara menyalakan LCD dan inisialisasinya, menjadi sekitar 0,1 detik. Apakah polaritas catu daya untuk LCD tidak tertukar, apakah perlu sedikit terbakar? Dengan bodohnya saya membakarnya, dan kemudian mencoba menghubungkannya. Kotak hitam juga ditampilkan, data ditampilkan setiap waktu, mis. bekerja sangat tidak stabil.

    Saya menggunakan program dari artikel

    Saya menggunakan program dari artikel tentang GPS.
    antarmuka 4-bit

    Saya mencoba programnya dari sini
    chipenable.ru/index.php/programming-c/75-chasy-na-mikrokontrollere.html

    itu berhasil

    Apa yang harus Anda ubah dalam program Anda?

    Perhatikan penundaan

    Perhatikan penundaan setelah mengeluarkan perintah inisialisasi dan konfigurasi, hal ini mungkin terjadi. Saya juga punya kasus serupa, tetapi pengontrolnya sama, dan program hanya bekerja pada satu.

    Analog HD44780

    Saya mengalami masalah - Saya tidak dapat menemukan LCD WH1602A dengan harga yang wajar. Misalnya
    di chipdip ini tersedia chipdip.ru/product/wh1602a-ygh-ct-k.aspx
    700 kayu. Apa itu YGH pada nama "WH1602A-YGH-CT(K), LCD 16x2, Inggris-Rusia"
    Analog LCD berbasis HD44780 apa yang ada? Saya menemukan halaman micronika.ru/order.phtml?vid=64 - di sana nama FDCC1602A-FSBFBW-51SR berisi 1602A,
    Saya baru saja menyadarinya. Mungkin FDCC1602A-FSBFBW-51S akan berfungsi tanpa perubahan kode khusus?
    Masalah apa yang mungkin timbul saat menggunakan
    bukan HD44780 sebenarnya dari Hitachi, tapi analognya?
    PS Bukan ide yang buruk untuk membaca tentang penggunaan LCD yang berbeda, analog dari HD44780, dibandingkan yang MELT
    LCD buruk

    Pada artikel ini saya akan memberikan contoh salah satu opsi untuk menginisialisasi indikator alfanumerik kristal cair pada platform pengontrol HD44780 atau KS0066 untuk programmer pemula dalam bahasa assembly sehubungan dengan mikrokontroler PIC16.

    Program ini adalah bagian dari program pengukur suhu dan kelembaban yang dijelaskan dalam artikel "". Untuk kenyamanan bekerja dengan artikel dan file sumber program, lebih baik mengunduh proyek terlebih dahulu, mencetak file sumber dan meletakkannya di depan Anda. Saat menulis program untuk menginisialisasi tampilan LCD, menulis perintah dan menampilkan simbol pada indikator, lebih baik menggunakan makro yang dibuat untuk tujuan ini. Mari kita lihat layarnya.

    Setelah arahan penggantian teks, ada makro - program kecil yang dapat diakses dari program utama sebanyak yang Anda inginkan, kapan saja. Makro pertama, impuls_E, memastikan bahwa pulsa gerbang diterima pada jalur E, jalur gerbang dan sinkronisasi. Baris 14 – menetapkan perintah logis pada saluran, melalui dua perintah semu NOP, baris 17 – menetapkan nol logis. Jadi, kita menerima pulsa positif pada saluran E dengan durasi 2 s pada frekuensi osilator kuarsa 4 MHz. Makro berikutnya adalah Load_Znak. Memungkinkan kita memuat kode simbol ke dalam register DR untuk ditampilkan pada indikator. Anda akan melihat bahwa di makro ini ada panggilan ke makro lain yang tertulis di bawah. Mari kita lihat makro send_LCD. Baris 26 – membaca isi register Write_data, mis. kode karakter yang seharusnya ada di dalamnya. Baris – 27, tukar camilan tinggi dan rendah dari register. Baris – 28, kita memilih nibble tinggi dari kode karakter, yang sudah ada di nibble rendah, dan mengeluarkan data ini ke port B. Faktanya adalah bahwa perekaman data dalam mode operasi 4-bit dari pengontrol indikator terjadi secara berurutan, pertama register nibble tinggi, lalu junior - baris 31... 33. Setelah mengirimkan nibble, pulsa strobo harus dihasilkan. Inilah yang kita lihat, baris 30 dan 34. Agar pengontrol tampilan memproses informasi, waktu tunda 200 mikrodetik dimasukkan ke dalam makro. Setelah makro yang kita buat, terdapat prosedur standar untuk menginisialisasi mikrokontroler. Dalam artikel "" Saya berbicara tentang properti utama layar LCD dan menyentuh topik membuat simbol Anda sendiri. Seperti yang saya katakan sebelumnya, tidak ada simbol derajat di indikator saya. Jadi kita akan memuatnya ke generator karakter indikator. Untuk melakukan ini, kita akan menulis subrutin kecil, yang harus ditempatkan di belakang prosedur inisialisasi mikrokontroler dan di depan program utama. Subrutin dimulai pada baris 69, di mana kita memasukkan kode alamat di area CGRAM, 40h - pengguna pertama. alamat akan disimpan di bawah alamat ini. Lihat tangkapan layar 2.

    Karena setiap karakter memerlukan delapan register memori, karakter selanjutnya yang kita buat akan dimulai pada alamat 40h + 08h = 48h. Yang berikutnya adalah 48 jam + 08 jam = 50 jam. Jangan lupa bahwa penjumlahan terjadi pada sistem bilangan heksadesimal. Jadi, baris 69 dan 70 – memuat alamat awal simbol. Berikutnya adalah penulisan alternatif delapan byte kode karakter. Kode simbol derajat akan kita ambil dari program LCDCC.

    Kita harus mengulangi sedikit apa yang ada di artikel “Indikator alfanumerik kristal cair.” Mari kita lihat screenshot dari program ini. Dengan mengklik sel-sel matriks, kita menggambar simbol yang diinginkan, dalam hal ini adalah ikon derajat simbolis. Di bawah ini, program segera menulis kode untuk titik-titik yang dipilih dalam matriks. Sekarang kita perlu menulis kode-kode ini ke dalam pengontrol indikator. Itulah yang kami lakukan. Sekarang kita telah mencapai inisialisasi indikator itu sendiri. Lihat tangkapan layar 3.

    Sebelum inisialisasi, misalnya, kita akan menulis data ke dalam register untuk mengeluarkan nilai ke indikator. Mari kita masukkan, misalnya, nilai suhu 21,7 derajat. Kemudian kita akan membuat proyek di Proteus dan melihat apa yang kita dapatkan. Jadi. Tangkapan layar 3, baris 88... 93 – menulis angka ke register. Inisialisasi dimulai dengan label InitLCD, seperti yang diharapkan, kita menunggu setidaknya 15 ms. Setelah jeda, baris 98... 100, tulis angka tiga ke dalam register Reg_3 - ini akan menjadi berapa kali perintah dikirimkan 30h = b’0011 0000’ (30h). Dan kita menulis tiga ke register port B, untuk penulisan selanjutnya ke pengontrol indikator, angka tiga ini berada di setengah byte tinggi dari perintah. Kami membentuk pulsa strobo, saluran 102, jeda selama 5 ms. Kami kembali ke label Setloop. Kami mengirimkan perintah sampai register Reg_3 direset, mis. tiga kali. Setelah mengirimkan perintah ini, pengontrol indikator akan siap dioperasikan, tetapi dalam mode 8-bit. Sekarang mari kita alihkan ke mode 4-bit. Untuk melakukan ini, kami akan mengirimkan perintah 20h. Ingatlah bahwa perintah ditulis ke pengontrol indikator dalam mode 4-bit. Jadi, kita memiliki perintah 20h atau 0010 0000. Karena dalam mode 4-bit perintah ditransmisikan dalam dua tahap, pertama-tama data dari register yang paling signifikan, kita memasukkan keduanya ke dalam register port B dan menulisnya ke pengontrol indikator, dan karena camilan terendah kosong, maka kami tidak mengirimkan apa pun.

    Setelah menulis 2 ke port B, kita strobo jalur E dan jeda selama 200 us. Sekarang indikatornya akan bekerja dalam mode 4 digit. Perintah selanjutnya adalah perintah untuk mengatur mode operasi - dua baris, font - 5x7. Kode perintah 28 jam. Berikutnya adalah perintah 0C untuk menyalakan indikator. Kalau begitu, menurut saya, Anda akan mengetahuinya. Ya, sedikit lagi. Di Proteus, simbol ikon derajat yang kami buat tidak ditampilkan dengan benar; ia menampilkan dua titik, meskipun pada kenyataannya semuanya berfungsi dengan baik. Mari kita lihat fotonya. Semoga beruntung.

    Saat ini, indikator LCD kristal cair simbolis semakin banyak digunakan untuk menampilkan informasi simbolik sederhana. Kami akan berbicara tentang cara bekerja dengan mereka. Pada bagian artikel ini, kita akan melihat secara mendetail LCD karakter berdasarkan pengontrol HITACHI HD44780 (atau SAMSUNG KS0066 yang kompatibel). Artikel ini merupakan upaya untuk mensistematisasikan informasi yang saya temukan saat bekerja dengan LCD ini.

    LCD Karakter dengan pengontrol HD44780 (KS0066). Antarmuka

    LCD karakter tidak lebih dari matriks titik-titik, dibagi menjadi garis dan bidang karakter:

    Pengontrol khusus digunakan untuk mengontrol matriks ini dan mengeluarkan karakter sebenarnya.

    HD44780 (dan KS0066 yang kompatibel) adalah standar de facto untuk pengontrol tampilan sintesis karakter LCD monokrom dengan antarmuka paralel 4 atau 8-bit. Berdasarkan pengontrol ini, sejumlah besar model diproduksi dengan desain dan resolusi berbeda, mulai dari 8x1 (delapan karakter dalam satu baris) dan diakhiri dengan 40x4 (berisi dua chip kontrol independen). Frekuensi pengoperasian khas pengontrol adalah 270 kHz.

    Pengontrol LCD beroperasi dengan 3 blok memori:

    1. Pengontrol menggunakan memori untuk mengeluarkan karakter DDRAM(Display Data RAM), dimana disimpan kode-kode ASCII dari karakter-karakter yang ingin kita lihat pada LCD. 80 sel memori dialokasikan untuk itu. Yang jelas pada LCD kita hanya akan melihat sebagian dari karakter yang ada pada DDRAM - jika LCD kita 1 atau 2 baris dan menampilkan 8 karakter per baris, maka seperti ini:

    Area kerja tampilan, seperti yang Anda lihat, dapat digeser sepanjang sel DDRAM (Anda mendapatkan efek garis merayap).

    2. Pengontrol mengambil templat dari simbol itu sendiri CGROM(ROM Generator Karakter) – memori generator karakter. Tabel simbol dapat ditemukan di spesifikasi HD44780.

    3. Memori disediakan untuk menyimpan simbol pengguna (templatnya) CGRAM(RAM Penghasil Karakter).

    Selain itu, pengontrol, tergantung pada kondisi tertentu, mendistribusikan data yang diterima ke dalamnya daftar instruksi atau daftar data.

    Antarmuka pengontrol HD44780 14-pin yang khas:

    Tanah, umum, GND

    Tegangan suplai, Vcc (+5V)

    Menyesuaikan Kontras (Vo)

    Pemilihan register (R/S untuk HD44780, A0 untuk KS0066)

    Baca/Tulis (R/W)

    Strobo pada musim gugur E (Aktifkan)

    Bit 0 (minor untuk antarmuka 8-bit)

    Jalur data

    DB 4 (minor untuk antarmuka 4-bit)

    DB 7 (tinggi untuk antarmuka 8 (4) bit)

    Untuk tampilan dengan lampu latar

    Daya lampu latar untuk tampilan dengan lampu latar (anoda)

    Kekuatan lampu latar untuk tampilan dengan lampu latar (katoda)

    Kami melihat penomoran pin pada LCD tertentu di lembar data.

    Kontras gambar pada LCD dapat diubah dengan menghubungkan resistor trim tambahan 10 kOhm sesuai diagram berikut:

    Namun, Anda harus melihat spesifikasi pengontrol Anda (misalnya, LCD Klsn10294v-0 pada chip KS0066 memiliki 1-Vcc, dan 2-GND). Catu daya lampu latar mungkin berbeda dari model ke model tergantung pada jenisnya. Biasanya lampu latar ditenagai oleh 5 volt; resistor pembatas arus (50-100 ohm) biasanya opsional.

    Penetapan pin R/S, R/W, E:

    Saat mentransisikan E dari log tinggi. data tingkat ke rendah yang sudah “menggantung” di terminal DB0..DB7, ditulis ke memori pengontrol LCD untuk diproses selanjutnya.

    Pada log tinggi. level pada R/S (Register Select), pengontrol LCD menganggap kumpulan bit ini sebagai data (kode karakter), dan pada level rendah – sebagai instruksi dan mengirimkannya ke register yang sesuai.

    R/W menentukan arah pengoperasian pin DB0..DB7 - jika R/W adalah “0”, maka kita hanya dapat menulis ke port DB, dan jika R/W = “1”, maka kita dapat membacanya (misalnya, mencari tahu apakah pengontrol sedang sibuk atau senggang untuk menerima data baru). Jika kita tidak membaca data dari LCD, maka kita bisa “menanam” R/W di lapangan.

    Set instruksi HD44780

    Untuk mulai menampilkan informasi pada LCD, pengontrolnya harus diinisialisasi (menginformasikan tentang antarmuka, font, offset, dll.). Pengontrol dapat menerima total 11 perintah:

    Nama instruksi

    Status pin

    Waktu penyelesaian

    f budak =270kHz

    Menghapus seluruh LCD dan mengatur alamat DDRAM ke 0

    Mengatur alamat DDRAM saat ini ke 0 (kursor - home) Data DDRAM tidak berubah

    Mengatur arah pergerakan kursor (I/D) dan offset tampilan (S) saat mengeluarkan data

    Tampilkan kontrol hidup/mati

    Mati. tampilan(D), kursor(C) dan kedipannya(B)

    Pergeseran kursor atau tampilan

    Memindahkan kursor dan menggeser tampilan melintasi DDRAM

    Mengatur antarmuka (DL), jumlah baris (N) dan font karakter (F)

    Tetapkan alamat CGRAM

    Mengatur penghitung alamat CGRAM. Setelah ini, Anda dapat menulis data ke CGRAM

    Tetapkan alamat DDRAM

    Mengatur penghitung alamat DDRAM

    Baca bendera & alamat sibuk

    Jika BF = 1 maka pengontrol LCD sedang melakukan operasi internal (sibuk). AC6-AC0 – nilai alamat DDRAM saat ini

    Menulis data ke RAM

    Menulis data ke RAM

    Membaca data dari RAM

    Membaca data dari RAM

    I/D = 1: Alamat DDRAM bertambah I/D = 0: berkurang
    S = 1: diperbolehkan menggeser area kerja tampilan melalui DDRAM
    D = 1 : tampilan (gambar) menyala
    C = 1: kursor diaktifkan
    B = 1: Kursor berkedip diaktifkan

    S/C = 1: memindahkan tampilan S/C = 0: memindahkan kursor
    R/L = 1: kanan R/L = 0: kiri

    DL=1:8 bit DL=0:4 bit
    N=1:2 baris N=0:1 baris
    F = 1: 5x10 F = 0: 5x8

    ACG:Alamat CGRAM
    TAMBAHKAN: Alamat DDRAM (alamat kursor)
    AC: Penghitung alamat alamat DD dan CGRAM

    Inisialisasi LCD

    Ada 2 cara untuk menginisialisasi pengontrol LCD:

    1. Melalui sirkuit reset internal.

    2. Dalam mode manual (dengan mengirimkan sejumlah perintah ke sana, yang dengannya kami mengatur mode pengoperasian LCD)

    Sirkuit reset internal pengontrol mulai beroperasi segera setelah daya dihidupkan. Ada satu kelemahan dalam hal ini - jika daya kita “meningkat” ke tingkat pengoperasian secara perlahan (lebih lambat dari 10 ms), maka inisialisasi mandiri pengontrol mungkin tidak berjalan dengan benar. Dengan metode inisialisasi ini, pengontrol itu sendiri menjalankan perintah berikut:

    1. Tampilan jelas

    2. Kumpulan fungsi:
    DL = 1; Data antarmuka 8-bit
    N = 0; Tampilan 1 baris
    F = 0; Font karakter 5x8 titik

    3. Kontrol tampilan hidup/mati:
    D = 0; Tampilan mati
    C = 0; Kursor mati
    B = 0; berkedip

    4. Mode masuk diatur:
    Saya/D = 1; Kenaikan sebesar 1
    S = 0; Tidak ada perubahan

    Metode kedua menghilangkan ketergantungan rangkaian pada sumber listrik. Untuk menginisialisasi pengontrol LCD dalam mode manual, Anda harus melakukan algoritma berikut:

    Seperti yang Anda lihat, tidak ada yang rumit di sini: kami mengirim perintah demi perintah ke LCD, dengan mempertimbangkan waktu eksekusinya (sekitar 40 s) atau memeriksa tanda sibuk pengontrol LCD (maka kita perlu memasang pin RW kaki mikrokontroler dan atur ke “1” ketika kita ingin mengetahui, apakah LCD sedang sibuk atau tidak).

    Faktanya, hanya itu yang menyangkut teori bekerja dengan LCD simbolik. Jika Anda melewatkan sesuatu atau melakukan kesalahan, bacalah spesifikasi pengontrol atau .

    Pada bagian kedua, kita akan mempertimbangkan implementasi perangkat keras dan perangkat lunak dari komunikasi antara mikrokontroler PIC dan LCD.

    Untuk beberapa waktu, tampilan ini tidak digunakan.


    Dan sekarang ada keinginan untuk melampirkannya ke salah satu proyek; Anda tentu saja dapat mencoba mencari perpustakaan dengan fungsi yang sudah jadi, tetapi dalam hal ini gambaran tentang cara kerja tampilan tidak akan lengkap, dan ini tidak lengkap. tidak cocok untuk kita. Setelah Anda memahami prinsip pengoperasian layar LCD, tidak akan sulit untuk menulis perpustakaan Anda sendiri untuk tampilan yang diinginkan jika tidak ada atau tidak memuaskan.

    Jadi, mari kita mulai.
    Hal pertama yang harus dilakukan adalah menemukan pinout, yaitu kontak mana yang bertanggung jawab atas apa, yang kedua adalah menemukan nama pengontrol yang mengontrol tampilan, untuk melakukan ini, unduh lembar data untuk LCD ini dan buka di halaman pertama.


    Kontak dihitung dari kiri ke kanan, yang pertama ditandai dengan panah merah. Tegangan suplai 5 volt, pengontrol kontrol S6A0069 atau serupa, misalnya, ks0066U.

    Mengapa kami mencari nama pengontrol kontrol? Faktanya adalah bahwa dalam lembar data pada tampilan ada penundaan waktu (diagram waktu), sistem perintah dijelaskan, tetapi tidak ada inisialisasi dangkal, dan tanpanya tidak ada tempat.
    Selanjutnya, buka halaman kedua dan lihat tabel yang menyatakan kontak mana yang bertanggung jawab atas apa.


    DB7…DB0– bus data/alamat.

    R/W- menentukan apa yang akan kita lakukan, membaca (R/W=1) atau menulis (R/W=0)

    R/S– menentukan apakah kita akan mengirimkan perintah (RS=0) atau data (RS=1)

    E– masukan strobo, dengan mengubah sinyal pada masukan ini kita mengizinkan tampilan untuk membaca/menulis data.

    LED±– kontrol lampu latar.

    Saya harus mengatakan bahwa pada tampilan yang saya terima, lampu latar tidak hanya akan menyala; untuk melakukan ini, Anda perlu menyolder resistor yang ditandai di papan sebagai R7. Tapi untuk saat ini kami tidak membutuhkannya.

    Unduh lembar data untuk pengontrol kontrol dan temukan instruksi inisialisasi. Gambar dapat diperbesar dengan mengkliknya.



    Ternyata ada dua instruksi seperti itu, untuk mode 8-bit dan 4-bit. Modus macam apa ini? Mode ini menentukan berapa banyak kabel data yang akan dikirimkan: empat atau delapan. Mari kita lihat transmisinya 4 kabel, dalam hal ini tampilan akan bekerja lebih lambat, tetapi kita akan menghemat 4 pin mikrokontroler, dan penerapan mode delapan bit tidak jauh berbeda.

    Diagram koneksi informasi adalah sebagai berikut.


    Kontras dapat diatur dengan menghubungkan potensiometer di antara pin daya.

    Saya ingin menarik perhatian Anda pada fakta bahwa selama inisialisasi R/S Dan R/W selalu sama dengan nol, yaitu kami akan mengirimkan tim.

    Selama inisialisasi, Anda dapat mengonfigurasi:

    • N - jumlah baris yang ditampilkan
    • C - menghidupkan atau mematikan kursor
    • B - membuat kursor berkedip
    • I/D - menambah atau mengurangi nilai penghitung alamat
    • SH - pindahkan jendela tampilan
    Mari kita lihat dua poin terakhir lebih detail.
    Gambar di bawah ini menunjukkan di alamat mana kita perlu menulis data agar ditampilkan pada posisi tertentu, misalnya kita ingin menampilkan simbol pada posisi pertama baris kedua, maka kita harus menulis ke alamat 0x40.


    Setelah itu, nilai penghitung akan otomatis berubah, naik atau turun, dan seiring dengan itu, posisi kursor juga akan berubah.

    Omong-omong, memori tempat kita menulis disebut DDRAM, semua yang kita tulis ke dalam memori ini akan ditampilkan di layar, masih ada CGROM, yang menyimpan tabel generator karakter.


    Tabel ini tidak dapat diubah, tetapi simbol yang sudah jadi dapat diambil darinya. Jenis memori lainnya adalah CGRAM, ini juga merupakan tabel pembuat karakter, tetapi kami sendiri yang menggambar karakter dalam tabel ini.


    Sekarang sedikit penjelasan tentang pergerakan layar, faktanya biasanya pada tampilan kita tidak melihat seluruh DDRAM, melainkan hanya sebagian tertentu saja, seperti terlihat pada gambar di bawah ini.


    Kita juga bisa menulis di bagian yang tidak terlihat, namun apa yang kita tulis tidak akan terlihat sampai kita memindahkan jendela layar ke tempat ini.

    Kita sudah selesai dengan teori, mari beralih ke praktik.
    Gambaran komunikasi dengan layar LCD dalam mode 4-bit terlihat seperti ini.


    Data dikirim dalam byte, tetapi karena kita memiliki mode 4-bit, untuk mengirim satu byte, Anda perlu melakukan 2 pengiriman, dengan bit paling signifikan terlebih dahulu. Pada gambar, parsel pertama diberi nama D7 (tetrad tinggi), D3 kedua (tetrad rendah). Sebelum pengiriman selanjutnya kita harus mengecek flag busy dan jika belum diset kita bisa kirim lagi jika sudah diset kita tunggu sampai controller yang mengontrol LCD menyelesaikan urusannya.

    Memiliki gambaran umum tentang pengiriman, mari kita cari tahu bagaimana mengimplementasikan operasi pengiriman.


    Untuk mengirim Anda perlu menggunakan bus 8-bit:
    • R/W disetel ke 0
    • mengeluarkan kode perintah/data ke bus
    • tunda 2us
    • strobo bawah E

    Operasi baca diimplementasikan dengan cara yang sama:

    • pastikan pengontrol kontrol bebas
    • R/W disetel ke 1
    • naikkan strobo E (saat ini LCD akan mengeluarkan data ke bus)
    • tunda 2us
    • kita membaca apa yang diberikan LCD
    • strobo bawah E
    Dari mana datangnya penundaan 2us?

    Di atas timing ada tabel yang menyatakan berapa penundaan yang ditunjukkan pada grafik, sehingga durasi pulsa strobo - tw harus sama dengan 230nS atau 450nS tergantung pada tegangan suplai, kami mengambilnya sedikit dengan a batas. Mengapa kami hanya memperhitungkan penundaan ini? Sebab nilai sisa penundaan sangat kecil.

    Untuk mengirim melalui bus 4-bit:

    • pastikan pengontrol kontrol bebas
    • atur RS ke 0 (perintah) atau 1 (data), tergantung apa yang akan kita kirimkan
    • R/W disetel ke 0
    • naikkan strobo E (setel ke 1)
    • kami mengeluarkan buku catatan tertinggi ke bus
    • tunda 2us
    • strobo bawah E
    • tunda 1us
    • naikkan strobo E (setel ke 1)
    • kami mengeluarkan tetrad rendah ke bus
    • tunda 2us
    • strobo bawah E

    Untuk membaca di bus 4-bit:

    • pastikan pengontrol kontrol bebas
    • port data untuk input dengan pull-up
    • atur RS ke 0 (perintah) atau 1 (data), tergantung apa yang akan kita baca
    • R/W disetel ke 1
    • naikkan strobo E (setel ke 1)
    • tunda 2us
    • membaca buku catatan senior
    • strobo bawah E
    • tunda 1us
    • naikkan strobo E (setel ke 1)
    • tunda 2us
    • kita membaca buku catatan bawah
    • strobo bawah E

    Menaikkan strobo dan mengeluarkan perintah/data ke bus dapat ditukar. Sekarang tidak akan sulit untuk menginisialisasi tampilan. Untuk menyederhanakan inisialisasi, kami akan mengganti pembacaan flag sibuk dengan penundaan, dan kami akan mempertimbangkan untuk bekerja dengan flag tersebut nanti.
    Perlu dicatat bahwa selama inisialisasi dalam mode 4-bit, instruksi 4-bit digunakan, dan setelah inisialisasi, sistem instruksi 8-bit digunakan, jadi untuk inisialisasi kami menerapkan fungsi pengiriman perintah terpisah batal Write_Init_Command (data uint8_t).
    //Kode inisialisasi untuk Atmega16 #define F_CPU 8000000UL #define LCD_PORT PORTA #define LCD_DDR DDRA #define LCD_PIN PINA #define DATA_BUS 0XF0 #define RS 0 #define RW 1 #define E 2 #include #termasuk void Write_Init_Command(uint8_t data) ( //kaki yang dilalui perintah/data ditransmisikan ke output LCD_DDR |= DATA_BUS; //kami akan mengirimkan perintah LCD_PORT &= ~(1<Kursor yang berkedip riang menandakan inisialisasi berhasil. DI DALAM