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....