Epson
SED1200 LCD Module
Oleh: Budhy Sutanto
Tampilan LCD dalam dunia elektronika digital termasuk barang
mewah, karena harga tampilan ini cukup mahal tapi karena bisa dipakai untuk
menampilkan kalimat, tampilan LCD tetap menjadi idaman. Berikut ini akan dibahas
teknik interface mikrokontroler dengan tampilan LCD murah.
Jenis tampilan LCD yang beredar di pasar tidaklah banyak, mula-mula beredar ‘LCD
Display Module M1632’ buatan Seiko Instrument Inc., harganya cukup mahal lebih
dari seratus ribu rupiah. Belakangan ini ada jenis yang lain, buatan Epson
Corporation dengan type SED1200, harganya hanya sekitar 20% dari jenis pertama,
jadi memang sangat menarik untuk dipelajari lebih lanjut.
Tampilan LCD murah ini bisa dipakai untuk menampilkan 20 huruf/angka sekali gus,
cukup memadai untuk menampilkan nomor telpon dan pesan pesan pendek lainnya.
Seperti tampilan LCD pada umumnya, SED1200 terdiri dari dua bagian, yakni bagian
panel LCD yang terdiri dari banyak ‘titik-titik’ LCD dan sebuah mikrokontroler
yang menempel di panel dan berfungsi mengatur ‘titik-titik’ LCD tadi menjadi
huruf/angka yang terbaca, serta berfungsi pula untuk komunikasi antara tampilan
LCD dengan mikrokontroler lainnya yang memakai tampilan LCD itu.
Huruf/angka yang akan ditampilkan dikirim ke SED1200 dalam bentuk kode ASCII,
kode ASCII ini diterima dan diolah oleh mikrokontroler di dalam SED1200 menjadi
‘titik-titik’ LCD yang terbaca sebagai huruf/angka. Dengan demikian tugas
mikrokontroler pemakai tampilan LCD hanyalah mengirimkan kode-kode ASCII untuk
ditampilkan.
Sinyal interface
SED1200
Dalam lembaran data (data sheet) SED1200 dikatakan tampilan LCD ini kompatible
dengan mikroprosesor 4 bit maupun 8 bit, hal ini disebabkan SED1200 hanya
dilengkapi dengan 4 jalur data (DB0
.. DB3) yang dipakai untuk menyalurkan kode ASCII maupun perintah
untuk mengatur kerjanya SED1200. Pada hal kode ASCII maupun perintah tersebut
semuanya merupakan kode 8 bit, maka kode-kode itu dikirimkan dua kali, yang
pertama dikirimkan adalah 4 bit yang berbobot lebih besar (most significant bit
– D4..D7)
baru kemudian 4 bit sisanya (D0..D3).
Selain DB0..DB3,
SED1200 dilengkapi pula dengan
CS,
WR dan
A0 seperti
layaknya komponen yang kompatibel dengan mikroprosesor, yang agak menyimpang
adalah sinyal CLK yang akan dibicarakan lebih lajut di bawah.
A0 dipakai
untuk membedakan data yang dikirimkan ke SED1200, kalau
A0=0
data yang dikirim adalah perintah untuk mengatur kerja SED1200 dan sebaliknya
kalau A0=1
data yang dikirim adalah kode ASCII yang ingin ditampilkan.
Proses pengiriman data ke SED1200 digambarkan dalam Gambar 1 bisa dijabarkan
sebagai berikut :
·
sinyal
CS dipakai untuk mengaktipkan proses pengiriman data ini, selama
proses ini berlangsung
CS
diaktipkan dengan level tegangan ‘0’.
·
Data yang akan dikirimkan ke SED1200 disiapkan di
DB0..DB3,
seperti dibicarakan di atas kode-kode yang
dikirimkan ke SED1200 dipecah menjadi 2 kali pengiriman, hal ini terlihat jelas
di gambar 1 yang
menggambarkan pengiriman
D4..D7 dan
selanjutnya pengiriman
D0..D3.
·
Setelah data siap, sinyal WR dipakai sebagai sinyal
‘komando’ bagi SED1200 agar mengambil data
di DB0..DB3.
Pengambilan data ini tepatnya terjadi pada saat
WR berubah
dari ‘0’
menjadi ‘1’.
Gambar 1 Proses pengiriman data ke SED1200
Interface ke AT89C51
Sinyal di Gambar 1 setara dengan sinyal-sinyal MCS51 pada saat AT89C51
mengerjakan instruksi
MOVX @DPTR,A.
Instruksi
MOVX
hanya bisa dilaksanakan di AT89C51 yang dirangkai dengan memori eksternal, jadi
pada sistem berbasis AT89C51 yang sudah dilengkapi 74HC573 (U2)
sebagai pemisah jalur-alamat (address bus demultiplexer) untuk keperluan
pemakaian memori eksternal, seperti terlihat di Gambar 2 dengan mudah bisa
ditambah SED1200.
Seperti layaknya menambah IC memori pada AT89C51, hubungan SED1200 ke ke AT89C51
dilakukan dengan cara sebagai berikut:
·
DB0..DB3 SED1200 dihubungkan ke
DB0..DB3
AT89C51,
·
WR
kedua komponen dihubungkan jadi satu,
·
A0
SED1200 didapatkan dari output 74HC573 yang berfungsi sebagai address bus
multiplexer
·
CS
SED1200 dikendalikan lewat output 74LS138 yang berfungsi sebagai address decoder
Dalam lembar data SED1200 tidak banyak dibicarakan tentang sinyal
CLK, tidak
ada ketentuan berapa frekuensi clock dan tidak ada keterangan bilamana clock
tersebut diperlukan. Setelah dianalisa secara mendalam dan uji coba di
laboratorium, ternyata sinyal
CLK hanya
diperlukan setelah sinyal
WR yang kedua
dan cukup 16 pulsa saja (lihat Gambar 1), meskipun demikian boleh juga clock itu
diumpankan secara terus menerus.
Kaki
ALE
AT89C51 selalu mengeluarkan clock dengan frekuensi sama dengan seper-enam
frekuensi kristal, clock pada
ALE ini bisa
dipakai untuk sinyal
CLK SED1200, jadi clock ini tidak perlu dibangkitkan secara khusus.
Selama 16 pulsa clock tersebut di atas, SED1200 melakukan proses internal dalam
chip, dan selama itu pula SED1200 tidak bisa menerima kiriman data. Keadaan ini
bisa dipantau lewat Register Status yang ada di dalam SED1200, untuk keperluan
ini SED1200 dilengkapi kaki
RD yang
dipakai untuk membaca isi Register Status.
Karena satu-satunya kegunaan kaki
RD hanya
untuk keperluan di atas, padahal waktu sibuk SED1200 bisa diperkirakan
dengan pasti, yakni 16 pulsa clock setelah sinyal
WR yang kedua,
maka kaki RD
tapi tidak perlu dipakai cukup dihubungkan ke Vcc.
Gambar 2 Hubungan SED1200 ke AT89C51
Program interface SED1200 terdiri dari sub-rutin
KirimPerintah
dan sub-rutin
KirimASCII,
KirimPerintah
dilakukan dengan
A0=0
dan KirimASCII dilakukan dengan
A0=1.
Sebelum memakai kedua sub-rutin ini, data yang akan dikirim ke SED1200 sudah
harus disiapkan di Akumulator A.
Pada saat melaksanakan instruksi
MOVX
@DPTR,A di
baris 22, AT89C51 akan membangkitkan sinyal yang diperlukan SED1200 seperti
terlihat di Gambar 1.
CS dari
SED1200 dihubungkan ke kaki
Y7 dari
74LS138 (Gambar 2), kaki ini akan menjadi ‘0’
jika kaki A
(tehubung ke
A13
AT89C51), kaki
B
(terhubung ke
A14)
dan kaki C
(terhubung ke
A15)
semuanya bernilai ‘1’.
Keadaan ini terpenuhi kalau pada saat instruksi
MOVX
@DPTR,A
dilaksanakan nilai
DPTR berkisar antara
1110
0000
0000
0000 (E000
heksadesimal) dan
1111
1111
1111
1111 (FFFF
heksadesimal). Dalam hal ini dikatakan SED1200 mempunyai alamat dasar
$E000 (awalan
$ artinya
bilangan heksadesimal).
·
Nilai
$E000 di baris 2 akan mengakibatkan
A12,
A13 dan
A14
dirangkaian Gambar 2 bernilai ‘1’
sehingga CS
akan bernilai ‘0’,
dan A0
(kaki Q1
dari 74HC573) menjadi ‘0’,
data yang dikirim AT89C51 diterima SED1200
sebagai perintah untuk mengatur kerja SED1200
·
Sedangkan nilai
$E001 di
baris 6 akan mengakibatkan
CS akan
bernilai ‘0’,
dan A0
(kaki Q1
dari 74HC573)
menjadi ‘1’,
data yang dikirim AT89C51 diterima SED1200 sebagai kode ASCII yang akan
ditampilkan.
SED1200 hanya mempunyai 4 jalur data, sehingga data 8 bit yang sudah disimpan di
Acc
dikirim dua kali, pertama dikirim 4 bit yang berbobot lebih besar (A4..A7,
baris 10) setelah itu dikirim 4 bit berikutnya (A0..A3,
baris 11)
Setelah pengiriman data yang kedua (baris 12), SED1200 memerlukan paling sedikit
16 pulsa clock untuk memproses data yang baru saja diterima. Selama AT89C51
mengerjakan instruksi di baris 15..17,
ALE yang
menjadi sumber clock bagi SED1200 sudah mengeluarkan lebih dari 16 pulsa,
sehingga saat keluar dari sub-rutin SED1200 sudah siap menerima data lagi. (1
instruksi DJNZ
= 4 pulsa ALE)
Potongan Program 1 Sub-rutin dasar untuk
mengirim data ke SED1200
01: KirimPerintah:
02: MOV DPTR,#$E000 ; A0=0 : Command mode
03: SJMP OutByte
04: ;
05: KirimASCII:
06: MOV DPTR,#$E001 ; A0=1 : Character mode
07: OutByte:
08: PUSH A ; simpan dulu
09: SWAP A ; A0..A3 dan A4..A7 tukar
tempat
10: ACALL OutNibble ; outputkan A4..A7
11: POP A ; ambil kembali simpanan
12: ACALL OutNibble ; outputkan A0..A3
13:
14: ***** Tunggu selama minimal 16 pulsa ALE
15: MOV R6,#4
16: Tunggu16ALE:
17: DJNZ R6,Tunggu16ALE ; 4 ALE setiap
instruksi DJNZ
18: RET
19: ; Nibble adalah setengah Byte
20: OutNibble:
21: MOVX @DPTR,A ; kirim ke SED1200
22: RET
Interface ke
AT89C2051
AT89C2051 adalah AT89C51 yang disederhanakan menjadi mikrokontroler yang hanya
berkaki 20, penyederhanaan itu mengakibatkan AT89C2051 tidak punya kaki-kaki
DB0..DB7, P2.0..P27, WR,
RD dan
ALE
dan berapa kaki lainnya, selain itu instruksi
MOVX
@DPTR,A tidak
bisa dipakai, dengan demikian rangkaian Gambar 2 sama sekali tidak bisa dipakai
untuk AT89C2051, sebagai gantinya dibuat rangkaian Gambar 3, dalam rangkaian ini
DB0..DB3
dan WR
digantikan dengan Port 1 dan fungsi kerjanya disimulasikan lewat program.
Kaki
CLK
SED1200 dihubungkan dengan kaki
P1.7
AT89C2051, pulsa yang diperlukan SED1200 untuk memproses data yang diterima
dibangkitkan dengan program, tidak perlu disediakan rangkaian khusus untuk
membangkitkan clock.
Gambar 3 Hubungan SED1200 ke AT89C2051
Potongan Program 2 merupakan sub-rutin untuk mengendalikan SED1200 yang
dihubungkan ke AT89C2051 seperti terlihat di Gambar 3, sebelum memakai kedua
sub-rutin ini, data yang akan dikirim ke SED1200 sudah harus disiapkan di
Akumulator A.
·
Perbedaan sub-rutin
KirimPerintah
dan KirimASCII
terletak pada nilai
A0 pada saat sub-rutin itu bekerja.
Sub-rutin
KirimPerintah bekerja dengan
A0=‘0’
(baris 7), data yang dikirim AT89C2051 diterima SED1200
sebagai perintah untuk mengatur kerja SED1200. Sub-rutin
KirimASCII
bekerja dengan
A0=‘1’
(baris 11), data
yang dikirim AT89C2051 diterima SED1200 sebagai kode ASCII yang akan ditampilkan
·
Sepanjang proses pengiriman data
CS diaktipkan
dengan level tegangan ‘0’ yang dilakukan di baris 13 dan di-
nonaktip-kan kembali di baris 19.
·
Data di Akumulator A dikirimkan setengah byte demi setengah byte
sebanyak dua kali, pertama dikirim
A4..A7
(baris
15 dan 16) kemudian dikirim
A0..A3 (baris
17 dan 18).
·
Mengingat AT89C2051 tidak punya sinyal
ALE, sebagai
gantinya dibaris 22 sampai dengan 25 dibangkitkan 16
pulsa clock yang dibutuhkan oleh
CLK
SED1200.
16 pulsa ini dibangkitkan setelah
A.0..A.3
dikirimkan ke
SED1200, keluar dari sub-rutin ini SED1200 sudah siap menerima data lagi.
· Baris
29 sampai 36 Potongan Program 2 mensimulasikan baris 21 Potongan Program 1, di
baris 29 kaki
WR
SED1200 di-nol-kan, baris 30 sampai 35 mengirimkan
A0..A3 ke
DB0..DB3 (P1.0..P1.3)
tanpa merubah sinyal-
sinyal lain yang sudah berada di Port 1. Di baris 36
WR
dikembalikan ke ‘1’,
saat itulah informasi di
DB0..DB3
diambil oleh SED1200.
Potongan Program 2 AT89C2051 dengan SED1200
01: Write bit P1.4
02: A0 bit P1.5
03: CS bit P1.6
04: CLK bit P1.7
05:
06: KirimPerintah:
07: CLR A0 ; A0=0 : Command mode
08: SJMP OutByte
09: ;
10: KirimASCII:
11: SETB A0 ; A0=1 : Character mode
12: OutByte:
13: CLR CS ; selama proses ini
CS=’0’
14: PUSH A ; simpan dulu
15: SWAP A ; A0..A3 dan A4..A7 tukar
tempat
16: ACALL OutNibble ; outputkan A4..A7
17: POP A ; ambil kembali simpanan
18: ACALL OutNibble ; outputkan A0..A3
19: SETB CS ; proses selesai, CS
kembali = ‘1’
20:
21: ***** Membuat 16 pulsa CLK
22: MOV R6,#32
23: Buat16CLK:
24: CPL CLK ; CLK dibalik, ‘0’->’1’
dan ‘1’->’0’
25: DJNZ R6,Buat16CLK ;sebanyak 32 kali
26: RET
27: ;
28: OutNibble:
29: CLR Write ; ‘0’-kan dulu kaki WR
SEED1200
30: ANL A,#$0F ; hanya A.0..A3 yang
dipakai
31: MOV R6,A ; simpan dulu
32: MOV A,P1 ; ambil nilai yang sudah
ada di P1
33: ANL A,#$F0 ; pertahankan nilai
A.4..A.7
34: ORL A,R6 ; gabungkan dengan
simpanan A.0..A.3
35: MOV P1,A ; siapkan ke SED1200
36: SETB Write ; data diambil SED1200
37: RET
Mengatur tampilan
SED1200
SED1200 mempunyai seperangkat perintah untuk mengatur tata kerjanya, perangkat
perintah tersebut terlihat dalam Tabel 1.
SED1200 merupakan tampilan LCD 1 baris yang bisa menampilkan 20 huruf, meskipun
demikian dalam chip SED1200 tampilan ini disusun sebagai tampilan LCD 2 baris
dan masing-masing baris terdiri dari 10 huruf. Tampilan ini bisa di-nyala/padamkan
dengan kelompok perintah Display On/Off.
Kelompok perintah Line Select dipakai untuk menentukan banyaknya baris
yang akan dipakai. Sedangkan kelompok perintah Cursor Address dipakai
untuk memilih baris tampilan yang dipakai.
Perintah-perintah pengaturan cursor terdiri atas Cursor On/Off, Cursor
Font yang dipakai untuk menentukan bentuk cursor, bisa berupa garis bawah
atau satu blok titik. Cursor Blink dipakai untuk menentukan apakah cursor
ber-kedip sedangkan Cursor Direction dipakai untuk menentukan arah gerak
cursor, ke kanan atau ke kiri.
Tabel 1 Daftar Perintah Pengatur SED1200
|
Jenis Perintah |
Input pertama |
Input kedua |
Keterangan
|
|
D3 |
D2 |
D1 |
D0 |
D3 |
D2 |
D1 |
D0 |
|
System Reset |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
|
|
Line Select |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
Tampilan 1 baris |
|
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
Tampilan 2 baris |
|
Display On/Off |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
Tampilan aktip |
|
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
Tampilan padam |
|
Cursor On/Off |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
Tidak pakai cursor |
|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
Pakai Cursor |
|
Cursor Font |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
Cursor : Garis bawah |
|
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
Cursor : semua titik nyala |
|
Cursor Blink |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
Cursor berkedip |
|
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
Cursor tak berkedip |
|
Cursor Direction |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
Cursor bergerak ke kanan |
|
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
Cursor bergerak ke kiri |
|
Cursor Address |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Pindah ke baris pertama |
|
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
Pindah ke baris kedua |
Untuk memudahkan pembuatan program, Tabel 1 ditulis dalam format assembler
seperti terlihat dalam Potongan Program 3. Dengan adanya tabel dalam Potongan
Program 3 tersebut, selanjutnya untuk mengatur SED1200 tidak perlu lagi menulis
kombinasi 0 dan 1 seperti terlihat di Tabel 1, tapi cukup menulis sebagai
berikut:
MOV A,#ResetSED1200
LCALL KirimPerintah
.. .. ..
Potongan Program dibentuk dengan Assembler Directive
EQU, artinya
hanya sekedar ‘pemberitahuan’ pada assembler bahwa selanjutnya kalau
menjumpai kata
SystemRest anggaplah sebagai bilangan biner
00010000 dan
lain sebagainya. Susunan program seperti ini, sama sekali tidak menempati memori
microcontroller.
Potongan Program 3 Daftar Perintah Pengatur
SED1200
01: ResetSED1200 EQU %00010000
02: ;
03: Tampilan1Baris EQU %00010010
04: Tampilan2Baris EQU %00010011
05: ;
06: DisplayOff EQU %00001100
07: DisplayOn EQU %00001101
08: ;
09: TanpaCursor EQU %00001110
10: PakaiCursor EQU %00001111
11: ;
12: GarisBawah EQU %00001000
13: Blok EQU %00001001
14: ;
15: TidakKedip EQU %00001010
16: Berkedip EQU %00001011
17: ;
18: CursorKeKanan EQU %00000100
19: CursorKeKiri EQU %00000101
20: ;
21: KeBarisSatu EQU %10000000
22: KeBarisDua EQU %11000000
Tata kerja SED1200 harus ditentukan terlebih dulu sebelum tampilan itu dipakai,
Potongan Program 4 merupakan contoh persiapan pemakaian SED1200.
Baris 3 dan 4 adalah baris yang harus ditambahkan jika SED1200 dirangkai dengan
AT89C2051 seperti Gambar 2 dan dikendalikan dengan Potongan Program 2. Kedua
baris ini menentukan keadaan awal sinyal
Write dan
CS, harus
=’1’.
Perintah pertama yang harus diberikan adalah
ResetSED1200
(baris 6 dan 7), perintah-perintah lain diberikan sesuai dengan kebutuhan, tapi
perintah DisplayOn
pada baris 19 dan 20 harus ada.
Potongan Program 4 Mempersiapkan tata kerja
SED1200
01: ; ***** Initialize EPSON SED1200 LCD Module
02: SiapkanSED1200:
03: SETB Write level tegangan baku
04: SETB CS
05:
06: MOV A,#ResetSED1200
07: ACALL KirimPerintah
08: MOV A,#Tampilan2Baris
09: ACALL KirimPerintah
10:
11: MOV A,#KeBarisSatu
12: ACALL KirimPerintah
13: MOV A,#GarisBawah
14: ACALL KirimPerintah
15: MOV A,#PakaiCursor
16: ACALL KirimPerintah
17: MOV A,#Berkedip
18: ACALL KirimPerintah
19: MOV A,#DisplayOn
20: ACALL KirimPerintah
21: RET
Potongan-potongan Program di atas dihimpun menjadi dua file, masing-masing
adalah SED-51.ASM berisi perangkat program untuk mengendalikan SED1200 dengan
AT89C51 sesuai dengan Gambar 2, dan SED-2051.ASM berisi perangkat program untuk
mengendalikan SED1200 dengan AT89C2051 sesuai dengan Gambar 3. Kedua file itu
dikemas jadi satu dalam SED-BIOS.ZIP
Kedua file itu ditulis sesuai dengan format ALDS, perlu diadakan
penyesuaian tata tulis jika akan di-assembly dengan program assembler lain.