Friday, January 18, 2013

Program LCD Dengan Mikrokontroller ATMEL

         18 - 01 - 2013
         11 : 09 PM



         

         Pada kesempatan kali ini saya akan coba membahas bagaimana cara membuat program tampilan LCD dengan menggunakan bahasa assembler / mikrokontroller keluar ATMEL ( AT89S51 / AT89S52 dsb ). Baiklah pertama yang menjadi referensi saya dalam belajar pemrograman tampilan LCD adalah dari website berikut : http://www.8052.com/tutlcd.phtml . Sekarang saya coba terangkan dalam bahasa Indonesia apa yang saya dapat dari sana.
         Pertama, kita harus tahu dahulu 3 pin kontrol pada LCD. Ketiga pin kontrol tersebut adalah : EN, RS, RW.
                  - EN atau singkatan dari Enable. Pin kontrol ini berfungsi untuk memberitahu LCD bahwa kamu akan mengirim data. Untuk mengirim data ke LCD, kamu harus membuat program di Pin ini berlogika Low (0). Setelah itu set kedua Pin kontrol lainnya untuk mengirim data ke data bus. Saat kedua Pin kontrol tersebut telah selesai mengirimkan datanya. Berikan logika high (1) pada kaki EN. Lalu tunggu sampai waktu yang di perlukan oleh LCD untuk menjalankan perintah selanjutnya, rentang waktu ini bergantung pada LCD nya, setiap LCD memiliki rentang waktu untuk menjalankan instruksi selanjutnya berbeda-beda. Kamu dapat melihat pada datasheet LCD tersebut. Setelah waktu rentang untuk menjalankan instruksi selanjutnya telah siap, berikan logika low (0) lagi pada kaki EN.

                  - RS atau singkatan dari Register Select. Saat RS berlogika Low (0), data siap untuk di perlakukan sebagai perintah atau instruksi special ( Seperti Clear Screen, Screen Position, dsb. ). Saat RS berlogika High (1), data akan siap untuk mengirim text data untuk di tampilkan di LCD. Sebagai contoh, untuk menampilkan huruf 'K' pada layar LCD maka kamu harus memberikan RS logika High (1).

                  - RW atau singkatan dari Read / Write. Saat RW berlogika Low (0), informasi pada data bus akan di tulis ke LCD. Saat RW berlogika High (1), program akan efektif untuk membaca LCD. Hanya terdapat satu instruksi untuk membaca kondisi LCD, yaitu 'Get LCD Status'. Sisanya adalah perintah untuk menulis. Sehingga RW hampir selalu di beri logika Low (0).

         Lalu yang terakhir, data bus terdiri dari 4 atau 8 pin, bergantung pada mode operasi yang di pilih oleh pengguna. Pada kasus penggunaan data bus 8 pin, itu berarti DB0-DB7.

         Sekarang saya beri contoh hardware konfigurasi, atau pemasangan pin-pin LCD ke mikrokontroller. Seperti ini :



         Seperti yang terlihat di atas, kita sudah menyambungkan Pin kontrol dan data buss ke mikrokontroller. Sekarang kita ketikkan programnya dengan perintah equ untuk penamaan variable. Seperti ini :


    DB0 EQU P1.0
    DB1 EQU P1.1
    DB2 EQU P1.2
    DB3 EQU P1.3
    DB4 EQU P1.4
    DB5 EQU P1.5
    DB6 EQU P1.6
    DB7 EQU P1.7
    EN EQU P3.7
    RS EQU P3.6
    RW EQU P3.5
    DATA EQU P1


         Sekarang kita telah memberikan nama pada pin-pin LCD yang terhubung pada mikrokontroller dengan nama pin LCD itu sendiri. Lalu untuk memberikan logika High kepada pin kontrol, dapat di gunakan perintah SETB. Dan untuk memberikan logika Low kepada pin kontrol, dapat di gunakan perintah CLR. Seperti ini :

SETB RW
CLR EN

         Lalu bagaimana untuk mengecek status sibuk LCD? Atau bagaimana kita tahu bahwa LCD sudah siap untuk menjalankan instruksi selanjutnya atau tidak? Ya, benar. Jawabannya kita dapat melihat datasheet delay waktu LCD yang kita gunakan seperti yang di jelaskan di atas tadi. Tetapi ada cara lebih mudah, kita tidak perlu repot-repot melihat datasheet LCD tersebut. Kita hanya perlu membuat program kondisi pada pin DB07. Apabila pin DB07 masih berlogika High (1), itu berarti bahwa LCD masih sibuk dan belum siap untuk menjalankan perintah selanjutnya. Jadi ketika pin DB07 sudah berlogika Low (0), kita baru dapat memberikan instruksi selanjutnya pada LCD. Seperti ini programnya :

WAIT_LCD:
CLR EN ;Start LCD command
CLR RS ;Memberi perintah
SETB RW ;Membaca perintah
MOV DATA,#0FFh ;Set semua pin awal ke FF
SETB EN ;Mengirim perintah clock ke LCD
MOV A,DATA ;Memberikan DATA ke register A
JB DB7,WAIT_LCD ;Apabila bit 7 high, LCD masih sibuk
CLR EN ;Menyelesaikan perintah
CLR RW ;Menyiapkan RW untuk ke perintah selanjutnya
RET ;Kembali ke baris pemanggil subroutine.

         Baiklah, kita sudah mempunyai subroutine delay LCD. Sekarang kita memerlukan subroutine Inisialisasi LCD. Saya tidak menjelaskan kenapa inisialisasinya seperti ini, mungkin untuk LCD yang 4 bit kontrol maupun LCD yang ukuran lain akan berbeda inisialisasinya. Tapi saya mencoba dengan LCD 16x2 dan 8 bit kontrol dengan inisialisasi seperti ini :


INIT_LCD:
CLR RS
MOV DATA,#38h
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DATA,#0Eh
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DATA,#06h
SETB EN
CLR EN
LCALL WAIT_LCD
RET

         Lalu apa lagi yang kita butuhkan, kita memerlukan subroutine untuk membersihkan LCD / LCD CLEAR. Ada baiknya kita membersihkan LCD dahulu sebelum memulai menulis di LCD. Subroutinenya adalah seperti ini :

CLEAR_LCD:
CLR RS
MOV DATA,#01h
SETB EN
CLR EN
LCALL WAIT_LCD
RET

         Lalu yang terakhir yang kita perlukan adalah subroutine untuk menulis data ke LCD. Seperti ini :

WRITE_TEXT:
SETB RS
MOV DATA,A
SETB EN
CLR EN
LCALL WAIT_LCD
RET

         Ok, semua sudah komplit. Lalu bagaimana cara membuat tulisan sederhana 'HELLO WORLD' ? Perintahnya adalah seperti ini :

LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'H'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT

         Lalu bagaimana mengatur posisi teks atau kursor untuk memulai memasukkan data. Lihat gambar berikut :


         Dapat di lihat bahwa line 1 di mulai dari 00h, dan line 2 di mulai dari 40h. Jadi ketika kita memasukkan data melebihi 16 karakter pada LCD 16x2. Data selanjutnya tidak akan otomatis langsung pindah ke line 2. Data tersebut akan masuk ke 10h dst yang mana berarti tidak akan tampil pada LCD 16x2. Sehingga kita harus menset kordinat baru di 40h.

         Ok kita langsung ke contoh, misal kita ingin membuat tampilan 'WORLD' nya berada pada karakter ke 10 line ke 2. Yang mana posisinya adalah 4Ah. Karena posisi awal untuk meletakkan kursor adalah 80h. Maka untuk meletakkannya menjadi seperti ini : 80h + 4Ah = CAh


         Sehingga subroutinenya menjadi seperti ini :

CLR RS
MOV DATA,#0CAh
SETB EN
CLR EN
LCALL WAIT_LCD

         Jadi untuk membuat tulisan 'HELLO WORLD' yang mana kata 'WORLD' nya berada di line ke 2 dan karakter ke 10, programnya seperti ini :

LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'H'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
CLR RS
MOV DATA,#0CAh
SETB EN
CLR EN
LCALL WAIT_LCD
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT


         Kesimpulannya :
         
         Tutorial ini menampilkan konsep pokok dari programming LCD. Tapi ini bukan berarti sudah semuanya kita pelajari, LCD 44780 kontroller memiliki lebih banyak fungsi lainnya untuk mengakses LCD tersebut, yang mana tidak di bahas disini.



----        
        Semoga review saya ini dapat membantu anda dalam memahami rangkaian dan lalu membuat programnya berdasarkan gambar dan kondisi rangkaian. Kurang lebihnya saya minta maaf. By the way, saya membuka jasa pembuatan program, rangkaian, maupun konsultasi ataupun diskusi tentang rangkaian-rangkaian mikrokontroller seperti ini. Jika tertarik, kalian dapat langsung berkomentar saja pada tulisan ini. Nanti kita akan lanjutkan berkomunikasinya di luar komentar ini, entah dengan email, ym, fb, sms, dan sebagainya. Yang pasti kita tidak akan berdiskusi di kolom komentar. Baiklah, terima kasih banyak karena sudah meluangkan waktu untuk membaca tulisan saya.
----

2 comments:

duniaku said...

terima kasih sangat membantu

duniaku said...

bisa minta alamat email nya?

Post a Comment

 
Free Website TemplatesFreethemes4all.comFree CSS TemplatesFree Joomla TemplatesFree Blogger TemplatesFree Wordpress ThemesFree Wordpress Themes TemplatesFree CSS Templates dreamweaverSEO Design