Translate

Menampilkan Teks pada panel LCD HD44780



Teknologi LCD sudah lama ada dan sudah semakin banyak digunakan dalam berbagai macam aplikasi. Dari beberapa alasan yang dikemukakan perihal penggunaan peraga LCD, salah satunya adalah faktor konsumsi daya yang sangat kecil. Faktor lainnya, mungkin karena kemudahan dalam konstruksi dari perangkat.

Dalam kesempatan ini, penulis mencoba menampilkan peragaan menggunakan LCD berbasis teks jenis HD44780 yang sederhana. LCD yang akan digunakan memiliki 2 baris masing-masing 16 karakter. Dan seperti biasa, sebelum lebih jauh bermain dengan unit ini, kita akan merujuk pada datasheet yang ada tentang apa dan bagaimana HD44780 ini.

Unit HD44780 memiliki beberapa penyemat utama yang berfungsi untuk antarmuka dengan mikrokontroler. Penyemat-penyemat ini terbagi dalam 2 bus yaitu kendali (control bus) dan data bus. Bus kendali memiliki 3 penyemat yaitu RS (register select), R/W (read/write) dan E (enable atau start data). Sementara bus data terdiri dari 8 bit (DB7 – DB0). Di pasaran tersedia unit ini dan sudah siap pakai dengan konfigurasi terdiri dari 16 penyemat seperti ditunjukkan di bawah ini:


Fungsi dari nama-nama penyemat di atas (selain fungsi antarmuka yang sudah disebutkan sebelumnya) adalah VSS untuk terminal negatif power suplai (Gnd), VDD untuk catu daya +5 volt, VEE digunakan untuk mengatur kontras dari tampilan LCD serta BL+ dan BL- (back light) untuk lampu background.

Dalam antarmuka HD44780 dengan mikrokontroler, kita dapat memilih antarmuka dalam 4 bit data dan 8 bit data. Dalam format 4 bit maka data yang digunakan adalah DB7 – DB4 sementara DB3 – DB0 diabaikan atau tidak digunakan. Hal ini tentu bertujuan untuk mengurangi penggunaan gerbang pada mikrokontroler untuk tujuan lain.

Selanjutnya kita dapat melihat tabel instruksi pada HD44780 berikut:

Instruksi
RS
RW
D7
D6
D5
D4
D3
D2
D1
D0
Siklus
Clear display
0
0
0
0
0
0
0
0
0
1
1,52 ms
Return home
0
0
0
0
0
0
0
0
1
37 us
Entry mode set
0
0
0
0
0
0
0
1
I/D
S
37 us
Display on/off control
0
0
0
0
0
0
1
D
C
B
37 us
Cursor or display Shift
0
0
0
0
0
1
S/C
R/L
37 us
Function Set
0
0
0
0
1
DL
N
F
37 us
Set CGRAM address
0
0
0
1
ACG
ACG
ACG
ACG
ACG
ACG
37 us
Set DDRAM address
0
0
1
ACG
ACG
ACG
ACG
ACG
ACG
ACG
37 us
Read Busy flag & Address
0
1
BF
AC
AC
AC
AC
AC
AC
AC
0 us

RS    RW   Operasi
0      0      Menulis IR (instruction register) yang akan dilaksanakan untuk operasi internal seperti clear display dst...
0      1      Membaca BF (busy flag) pada bit DB7 dan nilai pencacah DB0 – DB6.
1      0      Menulis DR (data register) yaitu DR ke CGRAM atau DDRAM
1      1      Membaca DR dari CGRAM atau DDRAM

Clear display adalah instruksi untuk membersih display dan menetapkan alamat pencacah dari DDRAM ke 0.

Return home adalah instruksi untuk menetapkan alamat pencacah dari DDRAM ke 0, juga mengembalikan posisi penggeser ke awal. Isi dari DDRAM tidak berubah.

Entry mode set adalah instruksi untuk menentukan arah pergerakan kursor dan pergeserannya. Operasi ini dilaksanakan selama proses baca dan tulis. Bit I/D bernilai 1 berarti increment dan I/D bernilai 0 adalah decrement. Bit S berkaitan dengan pergeseran display, di mana nilai 0 menetapkan tidak ada pergeseran (no shift).

Display on/off control untuk mengatur kontrol on/off dari display (D), kursor (C) dan posisi blinking dari kursor (B). Nilai 1 dari masing-masing bit ini diterjemahkan sebagai on dan nilai 0 akan diterjemahkan sebagai off.

Cursor or display Shift untuk memindah kursor dan menggeser display tanpa mengubah isi DDRAM. S/C bernilai 1 untuk pergeseran display dan nilai 0 untuk memindahkan kursor. Nilai 1 pada R/L menunjukkan pergeseran ke kanan dan nilai 0 menunjuk pergeseran ke kiri.

S/C  R/L
0      0      Menggeser posisi kursor ke kiri. Nilai AC akan berkurang 1
0      1      Menggeser posisi kursor ke kanan. Nilai AC akan bertambah 1
1      0      Menggeser seluruh display ke kiri. Kursor akan mengikuti pergeseran dari display
1      1      Menggeser seluruh display ke kanan. Kursor akan mengikuti pergeseran dari display

Function Set untuk mengatur panjang data pada antarmuka (DL, data length), jumlah baris yang digunakan (N, number) dan font dari karakter (F). Nilai DL 1 untuk pengaturan antarmuka 8 bit dan nilai 0 untuk antarmuka 4 bit. Nilai N 1 untuk penampilan 2 baris dan nilai 0 untuk 1 baris. Sementar nilai 1 untuk F adalah pengaturan karakter 5x10 dots dan nilai 0 untuk 5x8 dots.

N     F      Baris      Font Karakter
0      0      1           5 x 8 dots
0      1      1           5 x 10 dots
1      *      2           5 x 8 dots             Peragaan 2 baris tidak dapat untuk karakter 5 x 10 dots

Set CGRAM address adalah instruksi untuk menetapkan alamat CGRAM. Data CGRAM akan dikirim dan diterima setelah pengaturan ini ditetapkan.

Set DDRAM address adalah instruksi untuk menetapkan alamat DDRAM. Data DDRAM akan dikirim dan diterima setelah pengaturan ini ditetapkan.

Read Busy flag & Address adalah untuk membaca status BF yang mengindikasikan operasi internal yang sedang berlangsung dan juga membaca nilai dari alamat pencacah. BF bernilai 1 mengindikasikan sedang melaksanakan operasi internal dan jika bernilai 0 menunjukkan bahwa instruksi siap diterima.

Nah... pemahaman mengenai dasar-dasar pengaturan dari unit HD44780 sesuai datasheet sudah dijelaskan di atas. Kini saatnya kita mulai mempraktekkan dalam sebuah rangkaian dengan mikrokontroler sebagai contoh dalam artikel ini menggunakan jenis dari seri AT89S2051 atau dapat diganti dengan seri AT89C2051.

Rangkaian pertama dari desain kita seperti ditunjukkan pada gambar di bawah ini dengan konsep antarmuka menggunakan format 8 bit.



Pada rangkaian di atas komponen VR1 bernilai 2k2 berfungsi untuk menentukan kekontrasan dari tampilan LCD, sobat bisa mengaturnya sesuai keinginan. Fungsi sakelar S1 adalah untuk menghidup-matikan lampu latar belakang dari LCD. Jika dinyalakan maka meskipun dalam ruang gelap tampilan LCD akan tetap terlihat. Sakelar S1 dapat dimodifikasi menggunakan transistor sehingga nyala mati dari lampu dapat di atur menggunakan program.

Dari desain minimalis di atas, dengan mikrokontroler AT89C2051, masih menyisakan 4 gerbang yang dapat digunakan untuk keperluan lain. P30 dan P31 dapat digunakan jika kita menginginkan untuk berhubungan dengan komunikasi serial atau dihubungkan ke PC melalui gerbang RS232. Atau dapat juga dihubungkan dengan perangkat lain seperti ADDC untuk pengukuran suhu atau tegangan berbasis I2C seperti PCF8591P atau lainnya. Semua terserah implementasi yang akan dibuat.

Seperti biasanya, artikel yang dibuat memang selalu narsis di mana akan menampilkan tulisan nama dari penulis sendiri sebagai contoh pada baris pertama diikuti kalimat “SELAMAT DATANG” pada baris kedua.

Berikut adalah List Code dari 8HD44780.LST dari Source Code bernama 8HD44780.TXT yang dibuat.

                       1    $mod51
                       2   
  0090                 3    LCDData         data    p1
  00B4                 4    RS              bit     p3.4
  00B5                 5    RW              bit     p3.5
  00B7                 6    EN              bit     p3.7

Baris 1 sampai 6 di atas adalah konfigurasi yang diperlukan dalam aplikasi yang akan dijalankan oleh mikrokontroler. Gerbang P1 digunakan sebagai Data dan untuk kendali RS, RW dan EN menggunakan P3

  0001                 8    ClearDisplay    equ     00000001b
  0006                 9    EntryMode       equ     00000110b
  000C                10    DisplayControl  equ     00001100b
  0038                11    FunctionSet     equ     00111000b       ;8 Bit Interface
  0080                12    LCDBaris1       equ     80h
  00C0                13    LCDBaris2       equ     0c0h

Baris 8 sampai 11 di atas adalah data instruksi yang diperlukan dalam inisialisasi. Baris 12 dan 13 merupakan alamat DDRAM di mana data karakter akan ditampilkan.

0000                  15    org     0h
0000 0122             16            ajmp    Mulai

Program diawali dengan melompat ke rutin Mulai pada baris 22 dengan lokasi ROM instruksi 0022H.

0002                  18    Kalimat:
0002 20205349         19            db '  SIGIT WIDODO  '
0006 47495420  
000A 5749444F  
000E 444F2020  
0012 2053454C         20            db ' SELAMAT DATANG '
0016 414D4154  
001A 20444154  
001E 414E4720   

Data ROM dari baris di atas adalah yang akan kita tampilkan pada LCD. Masing-masing baris terdiri dri 16 byte.

0022                  22    Mulai:
0022 1151             23            acall   Delay5ms
0024 C2B4             24            clr     RS
0026 C2B5             25            clr     RW
0028 C2B7             26            clr     EN
002A 1158             27            acall   Delay125us

Ada rutin Mulai, mikrokontroler memberi tundaan bagi unit HD44780 untuk melakukan startup secara internal selama 5 ms. Kemudian me-reset RS, RW dan EN ke logika 0 untuk persiapan antarmuka.

002C 7438             28            mov     a, #FunctionSet
002E 115D             29            acall   InstruksiLCD
0030 1151             30            acall   Delay5ms

Baris kode 28 sampai 30 dilaksanakan untuk mengirim instruksi berisi “FunctionSet” yang berisi 00111000b sesuai konfigurasi di atas. Jika diterjemahkan berarti nilai DL adalah 1 yaitu untuk antarmuka 8 bit, nilai N adalah 1 untuk menampilkan 2 baris serta nilai F ditetapkan 0 untuk karakter 5 x 8 dots. Instruksi ini akan diproses oleh subrutin “InstruksiLCD”.

Selanjutnya seting unit dilanjutkan pada baris 31 sampai 39 dengan mengirim instruksi “DisplayControl”, “EntryMode” dan “ClearDisplay”. Nilai “DisplayControl” adalah 00001100b di mana Display diset On sementara kursor dan blinking diset Off. Dari konfigurasi “EntryMode” 00000110b penulis menetapkan nilai I/D ke 1 untuk auto increment dan S bernilai 0 atau No Shift.

0032 740C             31            mov     a, #DisplayControl
0034 115D             32            acall   InstruksiLCD
0036 1151             33            acall   Delay5ms
0038 7406             34            mov     a, #EntryMode
003A 115D             35            acall   InstruksiLCD
003C 1151             36            acall   Delay5ms
003E 7401             37            mov     a, #ClearDisplay
0040 115D             38            acall   InstruksiLCD
0042 1151             39            acall   Delay5ms

Selanjutnya kita akan melakukan pencetakan data ke LCD. Register DPTR berisi alamat ROM dari data yang akan ditampilkan. Program dilanjutkan dengan mengisi akumulator dengan alamat DDRAM baris pertama (80H) dan diproses pada subrutin “CetakLCD”. Demikian pula untuk baris keduanya.

0044 900002           40            mov     dptr, #Kalimat
0047 7480             41            mov     a, #LCDBaris1
0049 1167             42            acall   CetakLCD
004B 74C0             43            mov     a, #LCDBaris2
004D 1167             44            acall   CetakLCD
004F 014F             45            ajmp    $
                      46   
0051                  47    Delay5ms:
0051 7E28             48            mov     r6, #40
                      49   
0053                  50            Dly5ms:
0053 1158             51                    acall   Delay125us
0055 DEFC             52                    djnz    r6, Dly5ms
0057 22               53                    ret
                      54   
0058                  55    Delay125us:
0058 7F7D             56            mov     r7, #125
005A DFFE             57            djnz    r7, $
005C 22               58            ret

Subrutin “InstruksiLCD” dijalankan untuk mengirim IR (instruction register) yaitu memindahkan isi akumulator ke gerbang LCDData (P1) kemudian dilanjutkan dengan pulsa EN tinggi.

005D                  60    InstruksiLCD:
005D F590             61            mov     LCDData, a
005F D2B7             62            setb    EN
0061 00               63            nop
0062 C2B7             64            clr     EN
0064 1158             65            acall   Delay125us
0066 22               66            ret

Pada subrutin “CetakLCD”, alamat DDRAM dikirim pada RS rendah. Kemudian data karakter akan dikirim dengan RS tinggi ke DDRAM sesuai alamat baris yang dimaksudkan. Baris pertama dimulai pada alamat 80H dan baris kedua dimulai pada C0H.

0067                  68    CetakLCD:
0067 C2B4             69            clr     RS
0069 115D             70            acall   InstruksiLCD
006B D2B4             71            setb    RS
006D 7D10             72            mov     r5, #16
                      73   
006F                  74            KirimData:
006F 7400             75                    mov     a, #0
0071 93               76                    movc    a, @a+dptr
0072 A3               77                    inc     dptr
0073 115D             78                    acall   InstruksiLCD
0075 DDF8             79                    djnz    r5, KirimData
0077 22               80                    ret
                      81   
                      82    end

Hasil kompilasi menunjukkan aplikasi akan menempati Flash ROM dari AT89C2051 sebesar 120 byte (0000H sampai 0077H), tidak besar bukan...!

VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND

CETAKLCD . . . . . . . . . . . .  C ADDR  0067H 
CLEARDISPLAY . . . . . . . . . .    NUMB  0001H 
DELAY125US . . . . . . . . . . .  C ADDR  0058H 
DELAY5MS . . . . . . . . . . . .  C ADDR  0051H 
DISPLAYCONTROL . . . . . . . . .    NUMB  000CH 
DLY5MS . . . . . . . . . . . . .  C ADDR  0053H 
EN . . . . . . . . . . . . . . .  B ADDR  00B7H 
ENTRYMODE. . . . . . . . . . . .    NUMB  0006H 
FUNCTIONSET. . . . . . . . . . .    NUMB  0038H 
INSTRUKSILCD . . . . . . . . . .  C ADDR  005DH 
KALIMAT. . . . . . . . . . . . .  C ADDR  0002H 
KIRIMDATA. . . . . . . . . . . .  C ADDR  006FH 
LCDBARIS1. . . . . . . . . . . .    NUMB  0080H 
LCDBARIS2. . . . . . . . . . . .    NUMB  00C0H 
LCDDATA. . . . . . . . . . . . .  D ADDR  0090H 
MULAI. . . . . . . . . . . . . .  C ADDR  0022H 
P1 . . . . . . . . . . . . . . .  D ADDR  0090H  PREDEFINED 
P3 . . . . . . . . . . . . . . .  D ADDR  00B0H  PREDEFINED 
RS . . . . . . . . . . . . . . .  B ADDR  00B4H 
RW . . . . . . . . . . . . . . .  B ADDR  00B5H 

Source Code yang dapat sobat copy paste secara lengkap tertulis di bawah ini. Penulis memberi nama 8HD44780.TXT

$mod51

LCDData           data  p1
RS          bit   p3.4
RW          bit   p3.5
EN          bit   p3.7

ClearDisplay      equ   00000001b
EntryMode   equ   00000110b
DisplayControl    equ   00001100b
FunctionSet equ   00111000b   ;8 Bit Interface
LCDBaris1   equ   80h
LCDBaris2   equ   0c0h

org   0h
      ajmp  Mulai

Kalimat:
      db '  SIGIT WIDODO  '
      db ' SELAMAT DATANG '

Mulai:
      acall Delay5ms
      clr   RS
      clr   RW
      clr   EN
      acall Delay125us
      mov   a, #FunctionSet
      acall InstruksiLCD
      acall Delay5ms
      mov   a, #DisplayControl
      acall InstruksiLCD
      acall Delay5ms
      mov   a, #EntryMode
      acall InstruksiLCD
      acall Delay5ms
      mov   a, #ClearDisplay
      acall InstruksiLCD
      acall Delay5ms
      mov   dptr, #Kalimat
      mov   a, #LCDBaris1
      acall CetakLCD
      mov   a, #LCDBaris2
      acall CetakLCD
      ajmp  $

Delay5ms:
      mov   r6, #40

      Dly5ms:
            acall Delay125us
            djnz  r6, Dly5ms
            ret

Delay125us:
      mov   r7, #125
      djnz  r7, $
      ret

InstruksiLCD:
      mov   LCDData, a
      setb  EN
      nop
      clr   EN
      acall Delay125us
      ret

CetakLCD:
      clr   RS
      acall InstruksiLCD
      setb  RS
      mov   r5, #16

      KirimData:
            mov   a, #0
            movc  a, @a+dptr
            inc   dptr
            acall InstruksiLCD
            djnz  r5, KirimData
            ret

end

Rangkaian kedua dari desain kita ditunjukkan pada gambar di bawah ini dengan konsep antarmuka menggunakan format 4 bit. Setiap desain rangkaian tentunya memiliki kelebihan masing-masing sesuai implementasinya. Tapi untuk maksud dan tujuan pada kesederhanaan terutama dalam penggunaan gerbang penyemat dari mikrokontroler maka desain rangkaian kedua ini bisa menjadi alternatif pilihan yang perlu dipertimbangkan.



Yang jelas pada mode antarmuka 4 bit dari rangkaian di atas, kita bisa menghemat 4 gerbang penyemat yang secara signifikan dapat dipergunakan untuk tujuan lain. Bahkan pada suatu kesempatan, penulis pernah meringkasnya dengan hanya menggunakan 6 penyemat untuk antarmuka, di mana penyemat R/W dari unit HD44780 dihubungkan ke GND.

Pada mode 4 bit, sobat perlu memperhatikan diagram yang menggambarkan prosedur pengiriman data dalam format 4 bit berikut ini:



Pada diagram di atas menggambarkan proses pengiriman data secara nible yang dimulai dari MSB kemudian LSB. Pada setiap pengiriman data nible memerlukan sebuah pulsa tinggi dari EN.

Pada aplikasi yang akan dijalankan pada mikrokontroler, untuk mode 4 bit maka perlu ada beberapa perubahan. Hal pertama yang harus diubah adalah nilai dari “FunctionSet” menjadi 00101000b di mana nilai DL adalah 0.

FunctionSet equ   00101000b   ;4 Bit Interface

Perubahan kedua yang perlu dilakukan adalah pada proses inisialisasi dalam rutin Mulai. Setelah inisialisasi RS, RW dan RS ke rendah maka nilai “FunctionSet” akan dikirim untuk menetapkan fungsi antarmuka ke dalam mode 4 bit. Di sini yang diproses oleh unit HD44780 hanya nible MSB di mana nilai DL berada pada DB4. Secara default atau saat awal dihidupkan unit LCD bekerja pada mode 8 bit sehingga proses pengiriman instruksi pertama dianggap sebagai 8 bit yang mana nible LSB dalam hal ini tentu tak terkirim.

Mulai:
      acall Delay5ms
      clr   RS
      clr   RW
      clr   EN
      acall Delay125us
      mov   LCDData, a
      setb  EN
      nop
      clr   EN
      acall Delay125us

Setelah instruksi di atas dikerjakan maka kini unit HD44780 telah bekerja pada format 4 bit. Byte dari “FunctionSet” perlu dikirim ulang agar nible LSB pada proses di atas yang belum dikirim dapat diproses.

      mov   a, #FunctionSet
      acall InstruksiLCD
      acall Delay5ms

Proses selanjutnya juga berlaku untuk instruksi berisi “DisplayControl”, “EntryMode” dan “ClearDisplay”. Di sini jika sobat simak sama sekali tidak ada perubahan urutan perintah.

Dalam mode 4 bit, kita perlu melakukan perubahan terakhir pada subrutin InstruksiLCD menjadi seperti berikut ini:

InstruksiLCD:
      mov   b, a
      anl   a, #0f0h
      mov   LCDData, a
      setb  EN
      nop
      clr   EN
      mov   a, b
      swap  a
      anl   a, #0f0h
      mov   LCDData, a
      setb  EN
      nop
      clr   EN
      acall Delay125us
      ret

Pada subrutin di atas kita harus memecah byte ke dalam nible MSB dan LSB dengan data pertama yang dikirim adalah nible MSB diikuti dengan LSB sesuai diagram yang sudah digambarkan di atas.

Jika source code pada mode 4 bit dikompilasi maka hasilnya adalah 147 byte (0000H – 0092H). Selisih 27 byte rasanya tidak terlalu signifikan bukan...!



Sudah ya, terima kasih sudah membaca artikel ini. Semoga apa yang penulis sampaikan bermanfaat dan bisa diterapkan oleh sobat semua.

Salam....


Tidak ada komentar:

Posting Komentar