menggunakan lcd

Download Menggunakan LCD

If you can't read please download the document

Upload: totok-budioko

Post on 28-Nov-2015

29 views

Category:

Documents


0 download

DESCRIPTION

Pemrograman LCD Text dengan bahasa C (SDCC) dan antarmuka dengan mikrokontroler AT 89C51 .

TRANSCRIPT

PENGENDALI MOTOR STEPPER

MENGGUNAKAN LCDSalah satu penampil yang banyak digunakan pada aplikasi mikrokontroler adalah Liquid Crystal Display (LCD). LCD mampu menampilkan tidak hanya angka namun dapat juga menampilkan huruf dan beberapa simbol. LCD yang digunakan pada handphone dan laptop bahkan mampu menampilkan grafik dengan warnah penuh.

Pada bab ini hanya akan dibahas LCD karakter yang hanya mampu menampilkan angka, huruf dan simbol yang masih banyak digunakan dalam aplikasi-aplikasi industri yang hanya membutuhkan penampil yang sederhana. Sebagai dasar pembahasan digunakan LCD dengan chip pengontrol Hitachi HD44780 atau yang kompatibel.

Liquid Crystal Display (LCD)Ukuran LCD

Ukuran LCD ditentukan oleh jumlah karakter yang dapat ditampilkan pada tiap baris dan jumlah baris. Beberapa standar ukuran LCD antara lain 8, 16, 20, 24, 32, dan 40 karakter dengan jumlah baris 1, 2, dan 4. Contoh LCD M1632 16 karakter x 2 baris diperlihatkan pada Gambar VII.15.

Gambar VII.15 LCD M1632, 16 karakter x 2 barisDiagram Blok Modul LCD

Diagram blok modul LCD Hitachi HD44780 diperlihatkan pada Gambar VII.15.

Gambar VII.15 Diagram blok modul LCD.Register

Modul LCD mempunyai dua buah register, yaitu register instruksi (IR) dan register data (DR). Register instruksi digunakan untuk menyimpan kode instruksi seperti menghapus layar, setting kursor, menggeser kursor, mengirim alamat CGRAM dan DDRAM.

Register data digunakan untuk menyimpan data yang akan ditulis ke DDRAM atau CGRAM dan sebagai penyimpan data hasil pembacaan dari DDRAM atau CGRAM. Pemilihan register instruksi atau register data dilakukan dengan memberi logika 0 atau 1 pada kaki RS (Register Select) sebagaimana pada Tabel VII.2.

Tabel VII.2 Pemilihan registerRSR/~WFungsi

00menulis kode instruksi ke register perintah (IR)

01membaca Busy flag (DB7) dan pencacah alamat (AC) (DB6 s/d DB0)

10penulisan ke register data (DR) yang secara internal akan dituliskan ke DDRAM atau CGRAM

11pembacaan register data (DR) yang secara internal penulisan data dari DDRAM atau CGRAM ke register data (DR)

Busy Flag (BF)

Jika busy flag berlogika 1, maka modul mikro dalam kondisi sibuk yang tidak boleh diberi perintah penulisan ke register, baik register perintah maupun register data. Perintah penulisan register dapat diberikan ke modul LCD jika busy flag berlogika 0. Busy flag akan dapat dibaca pada bus data DB7 bersamaan dengan pembacaan pencacah alamat dengan memberikan logika RS dan R/~W dengan logika masing-masing 0 dan 1 sebagaimana Tabel VII.2.

Pencacah Alamat (Address Counter (AC))

Pencacah alamat digunakan untuk menandai alamat baik pada DDRAM maupun CGRAM. Pengubahan alamat dapat dilakuan dengan menuliskan kode alamat ke register instruksi.

Display Data RAM (DDRAM)

DDRAM digunakan untuk menyimpan data yang ditampilkan di layar LCD. Data disimpan dalam bentuk kode karakter 8 bit dengan kapasitas sebesar 80 karakter. Hubungan antara alamat DDRAM dengan posisi tampilan di layar LCD 16x2 diperlihatkan pada Gambar VII.15.

Gambar VII.15 LCD 16 karakter x 2 baris.

Pengendali Kursor dan Kedip

Pengendali kursor dan kedip digunakan untuk menghasilkan kursor dan efek kedip pada kursor. Posisi kursor dan kedip ditentukan oleh posisi pencacah alamat (AC) sebagaimana diperlihatkan pada Gambar VII.15.

Gambar VII.15 Contoh posisi kursor.Kode Instruksi

instruksiKodeketeranganwaktu eksekusi

DB7DB6DB5DB4DB3DB2DB1DB0Heks

clear display0000000101hdisplay dihapus counter alamat menunjuk ke DDRAM alamat 0.

return home0000001X02h/03hcounter alamat menunjuk ke DDRAM alamat 0, display yang digeser kembali ke posisi awal, data DDRAM tidak beubah1,52 ms

character entry mode000001I/DS04h 07hpengaturan gerakan kursor dan pergeseran display pada operasi penulisan dan pembacaan register data37 us

display on/off and cursor00001DUB08h 0Fhpengaturan display on/off, cursor on/off, blinking on/off37 us

dispaly/ cursor shift0001D/CR/LXX10h 1Fhmenggeser display atau kursor kekiri atau ke kanan37 us

function set0018/42/110/7XX20h 3Fhpemilihan interface 8/4 bit, display 2/1 line, format font 5x10 atau 5x737 us

set CGRAM address01AAAAAA40h 7Fhmengatur pointer untuk alamat CGRAM37 us

set DDRAM address1AAAAAAA80h FFhmengatur pointer untuk alamat DDRAM0 us

Keterangan:I/D : 1=tambah (increment), 0=kurang (decrement)S : 1=geser display, 0=tidak D: 1=display on, 0=display offU: 1=kursor on, 0=kursor offB: 1= kedip on, 0=kedip offD/C: 1=geser display. 0=geser kursorR/L: 1=kekanan, 0=kekiri8/4: 1=antarmuka 8 bit, 0=antarmuka 4bit2/1: 1=2 baris, 0=1 baris10/7: 1=format font 5x10, 0=5x7

Gambar VII.1 Kode karakter dan tampilan untuk kode ROM A00.Kaki Modul LCD

Sebagian besar modul LCD susunan kaki-nya mengikuti speisifikasi standar antarmuka. Kaki modul LCD jumlahnya 14. 8 buah untuk data, 3 buah untuk kontrol, dan 3 buah untuk catu daya. Bentuk kaki modul LCD diperlihatkan pada Gambar VII.15.

Gambar VII.15 Susunan kaki LCD

Sebagian besar modul LCD nomer kaki nya tercetak pada PCB sehingga mudah dikenal. Namun jika tidak ada maka kaki nomor 1 mudah didapatkan karena kaki 1 adalah ground. Seluruh fungsi kaki diperlihatkan pada tabel.

Tabel VII.2 Fungsi kaki modul LCDNomor KakiNamaFungsi

1GNDGround

2Vcc +5V

3VeeKontras

4RSRegister Select

5R/WRead/Write

6EEnable

7D0Data bit 0

8D1Data bit 1

9D2Data bit 2

10D3Data bit 3

11D4Data bit 4

12D5Data bit 5

13D6Data bit 6

14D7Data bit 7

15neg(-) backlight (LMB162A)

16pos(+)backlight (LMB162A)

Kaki 1 dan kaki 2 adalah jalur catu daya, kaki 1 dihubungkan dengan 0V atau ground dan kaki 2 dengan positif. Kebutuhan tegangan yang dispesifikasikan datasheet adalah 5 Volt walaupun pada tegangan 4,5 Volt dan 6 Volt masih bekerja dengan bagus. Sedangkan rangkaian kontras diperlihatkan pada Gambar VII.15.

Gambar VII.15 Rangkaian pengatur KontrasAntarmuka Dengan Mikrokontroler

Transfer data antara mikrokontroler dengan modul LCD dapat dilakukan dengan 4 bit atau 8 bit, sehingga antarmuka dengan mikrokotnroler juga dapat dilakukan dengan 8 bit atau 4 bit. Walaupun antarmuka dengan mikrokontroler AT89C/Sxx dapat dilakukan dengan dua cara, yaitu koneksi langsung ke port dan dipetakan ke memori data eksternal namun untuk antarmuka modul LCD lebih mudah dan sederhana jika menggunakan koneksi langsung ke port.Antarmuka 8 Bit

Antarmuka 8 bit menggunakan saluran data 8 bit. Pada prinsipnya semua port dapat digunakan dengan bebas, yang pelu diingat adalah bahwa P0 bersifat open drain sehingga membutuhkan resistor pull-up. Diagram blok antarmuka 8 bit dengan mikrokontroler diperlihatkan pada Gambar VII.15.

Gambar VII.15 Diagram pewaktuan siklus penulisan instruksi dan pembacaan busy flag/pencacah alamat pada antarmuka 8 bit.

Gambar VII.15 Diagram pewaktuan siklus penulisan data ke DR, pembacaan BF dan AC, dan pembacaan data dari DR pada antarmuka 8 bit.

Gambar VII.15 Antarmuka menggunakan bus data 8 bit.

Gambar VII.15 Rangkaian antarmuka 8 bit.Pemrograman Untuk Antarmuka 8 BitMembaca Data dari LCD

Pembacaan data pada LCD meliputi :pembacaan Busy Flag dan Pencacah Alamat, dan

pembacaan data dari register data.

Pembacaan data dari LCD mengacu pada Tabel VII.2, Gambar VII.15 dan Gambar VII.15.

Pembacaan Busy Flag (BF) dan Pencacah Alamat (AC) dapat dilakukan dengan fungsi sebagai berikut.

#define LCD_RS P3_0#define LCD_RW P3_1#define LCD_E P3_2#define LCD_DATA P1Uchar Baca_BF_AC8bit(){ Uchar tmp; LCD_DATA=0xff; //siapkan untuk inputLCD_RS=0; //pilih BF,ACLCD_RW=1;//operasi baca LCD_E=1;//pulsa enableLCD_E=1;tmp=LCD_DATA;LCD_E=0;return (tmp);}

Pembacaan Register Data (DR) dapat dilakukan dengan fungsi sebagai berikut.

Uchar Baca_LCD8bit(){Uchar tmp;LCD_DATA=0xff; //siapkan untuk inputLCD_RS=1;//pilih reg. DataLCD_RW=1;// operasi baca LCD_E=1;//pulsa enable LCD_E=1;tmp=LCD_DATA;LCD_E=0;return (tmp);}Menulisan Data ke LCD

Penulisan data ke LCD terdiri atas :penulisan data ke register instruksi (IR), dan

penulisan data ke register data (DR).

Penulisan data ke register instruksi dan register data membutuhkan waktu untuk proses secara internal. Penulisan data ke LCD harus dalam kondisi LCD tidak sibuk, Kondisi tidak sibuk ditandai dengan logika 0 pada Busy Flag (BF). Oleh karena itu fungsi penulisan data ke register instruksi dan register data sebaiknya diikuti oleh pembacaan status dari bit BF.

Penulisan data ke register instruksi (IR) dapat dilakukan dengan fungsi sebagai berikut.

void Kirim_Perintah8bit( Uchar kode){ LCD_RS=0;//pilih register perintahLCD_RW=0;//operasi tulisLCD_DATA =kode;//kode perintah disiapkan LCD_E=1;//pulsa enableLCD_E=1;LCD_E=0;while((0x80&Baca_BF_AC()) !=0); }

Sedangkan penulisan data ke register data (DR) dapat dilakukan dengan fungsi sebagai berikut.

void Tulis_LCD8bit(Uchar karakternya){ LCD_RS=1;//pilih register dataLCD_RW=0;//operasi tulisLCD_DATA=karakternya; //siapkan dataLCD_E=1;//pulsa enableLCD_E=1;LCD_E=0;while((0x80&Baca_BF_AC()) !=0);}Inisialisasi

Secara internal modul LCD akan melakukan inisialisasi sendiri ketika catu daya diberikan Inisialisasi sendiri yang dilakukan modul LCD menghasilkan system default yaitu :antarmuka 8 bit, display 1 baris, format font 5 x 8,

display, kursor, dan kedip pada posisi off,

kursor dinaikkan 1 dan tidak ada pergeseran

display diclearkan.

Inisialisasi diperlukan untuk mengubah setting agar sesuai dengan yang dikehendaki berkenaan dengan :set fungsi : antarmuka 8 atau 4 bit, display 2 atau 1 baris, format font 5x10 atau 5x7,

pengaturan display: display on, kursor dapat on atau off, kedip dapat on atau off,

set mode entri : pergeseran arah kursor ke kiri atau ke kanan, pergeseran display,

clear display dan kembali ke home jika dikehendaki.

Contoh fungsi inisialisasi adalah sebagai berikut.

void Init_LCD(){Kirim_Perintah8bit(0x3c); //set fungsi, 8 line, 2 baris, font 5x10 Kirim_Perintah8bit(0x0c); //display control on,cursor dan blink off Kirim_Perintah8bit(0x06); //set mode, increment, not shiftKirim_Perintah8bit(0x01); //clear display }Aplikasi

Berikut ini diberikan contoh sederhana untuk memberikan gambaran cara menggunakan LCD. Jika berhasil maka LCD akan menampilkan tulisan BELAJAR TIDUR kemudian TIDUR akan dihapus diganti dengan ATMEL AT89C/S51.

//---------------------------------------------// Nama file : lcd_8bit.h// Deskripsi : prototip fungsi untuk// baca/tulis LCD 16x2 karakter// antarmuka 8 bit// Karya : Totok Budioko//---------------------------------------------#ifndef LCD_H#define LCD_H#define LCD_RS P3_0 //disesuaikan dengan rangkaian#define LCD_RW P3_1 //disesuaikan dengan rangkaian#define LCD_E P3_2 //disesuaikan dengan rangkaian#define LCD_DATA P1 //disesuaikan dengan rangkaian#define BF P1_7 //disesuaikan dengan rangkaian

#ifndef Uchar#define Uchar unsigned char#endif

void Init_LCD8bit()void Kirim_Perintah8bit( Uchar kode);Uchar Baca_BF_AC8bit( );Uchar Baca_LCD8bit();void Tulis_LCD8bit(Uchar karakternya);#endif********Akhir Listing

//---------------------------------------------// Nama file : lcd_8bit.c// Deskripsi : definisi fungsi untuk// baca/tulis LCD 16x2 karakter// antarmuka 8 bit// Karya : Totok Budioko//---------------------------------------------#include #include "lcd_8bit.h"

// Fungsi inisialisasi LCDvoid Init_LCD8bit(){Kirim_Perintah8bit(0x3c);//set fungsi, 8 line, 2 baris, font 5x10Kirim_Perintah8bit(0x0e);//display on,cursor on, dan blink offKirim_Perintah8bit(0x06);// set mode, increment, not shiftKirim_Perintah8bit(0x01);// clear display}

// Fungsi untuk mengirim data ke register perintahvoid Kirim_Perintah8bit( Uchar kode){LCD_RS=0;//pilih register perintahLCD_RW=0;//operasi tulisLCD_DATA =kode;//kode perintah disiapkanLCD_E=1;//pulsa enableLCD_E=1;LCD_E=0;while((0x80&Baca_BF_AC8bit()) !=0);}

//Fungsi untuk membaca BF dan ACUchar Baca_BF_AC8bit(){Uchar tmp;LCD_DATA=0xff; //siapkan untuk inputLCD_RS=0; //pilih BF,ACLCD_RW=1;//operasi bacaLCD_E=1;//pulsa enableLCD_E=1;tmp=LCD_DATA;LCD_E=0;return (tmp);}//Fungsi untuk membaca register dataUchar Baca_LCD8bit(){Uchar tmp;LCD_DATA=0xff; //siapkan untuk inputLCD_RS=1;//pilih reg. DataLCD_RW=1;// operasi bacaLCD_E=1;//pulsa enableLCD_E=1;tmp=LCD_DATA;LCD_E=0;return (tmp);}

//*Fungsi untuk menulis ke register data (nampil LCD)*void Tulis_LCD8bit(Uchar karakternya){LCD_RS=1;//pilih register dataLCD_RW=0;//operasi tulisLCD_DATA=karakternya; //siapkan dataLCD_E=1;//pulsa enableLCD_E=1;LCD_E=0;while((0x80&Baca_BF_AC8bit()) !=0);}****Akhir Listing

//----------------------------------------------// Nama file : aplikasi_8bit.c// Deskripsi : contoh aplikasi LCD menggunakan// antarmuka 8 bit// Karya : Totok Budioko//----------------------------------------------#include #include "tunda_lunak.h"#include "lcd_8bit.h"

code Uchar Info[]={"BELAJAR"};code Uchar Info1[]={"TIDUR"};code Uchar Info2[]={"ATMEL AT89C/S51"};

void main(){ Uchar i;Init_LCD8bit(); //fungsi inisialisasi while(1){ Kirim_Perintah8bit(0x01);//clear displayKirim_Perintah8bit(0x02);//kembali ke homei=0;while(Info[i]!=0){Tulis_LCD8bit(Info[i]);Tunda_ms(1000); //menampilkan Infoi++;}Tulis_LCD8bit(' ');Tunda_ms(1000); //spasii=0;while(Info1[i]!=0){Tulis_LCD8bit(Info1[i]);Tunda_ms(1000); //menampilkan Info1i++;}Kirim_Perintah8bit(0x04);//kursor ke kiri stlh nulis datafor( i=0;i>4);//nibble bawahLCD_E=0;//diambilreturn (tmp);}

Untuk membaca data dari Register Data dapat dilakukan menggunakan fungsi sebagai berikut.

Uchar Baca_LCD4bit(){Uchar tmp;//nibble atasLCD_DATA=0xff; //siapkan untuk inputLCD_RS=1; //pilih reg. DataLCD_RW=1; //operasi baca LCD_E=1; //pulsa enable LCD_E=1;tmp=LCD_DATA&0xf0;//nibble atasLCD_E=0;//nibble bawahLCD_DATA=0xff; //siapkan untuk inputLCD_E=1; //pulsa enable LCD_E=1;tmp |=(LCD_DATA>>4);//nibble bawahLCD_E=0;return (tmp);}

Menuliskan Data ke LCD

Penulisan data pada antarmuka 4 bit dilakukan dua kali, yaitu nibble atas terlebih dahulu baru kemudian nibble bawah. Untuk memastikan proses penulisan selesai maka bit BF perlu dicek sampai berlogika nol.

Penulisan kode perintah ke Register Instruksi pada anatrmuka 4 bit dapat dilakukan menggunakan fungsi sebagai berikut.

void Kirim_Perintah4bit( Uchar kode){ LCD_RS=0;//pilih register perintahLCD_RW=0;//operasi tulis//nibble atasLCD_DATA =kode;//kode perintah disiapkan LCD_E=1;//pulsa enableLCD_E=1;LCD_E=0;//nibble bawahLCD_DATA =(kode