BAB IV LCD TEXT
4.1 Tujuan
1, Mahasiswa memahami rangkaian interface mikrokontroller dengan LCD Karakter
2x16
2. Mahasiswa dapat memahami program Arduino untuk menampilkan data ke LCD
Karakter 2 x 16
3. Mahasiswa memahami beberapa instruksi pada library header liquiderystal
4. Mahasiswa memahami mencetak karakter pada posisi baris dan kolom tertentu
4.2 Peralatan
1, Sebuah Komputer
2, Satu set trainer mikrokontroler
4.3 Teori
Modul LCD Character dapat dengan mudah dihubungkan dengan mikrokontroller seperti
Arduino Uno R3. LCD yang akan kita praktikumkan ini mempunyai lebar display 2 baris
16 kolom atau biasa disebut sebagai LCD Character 2x16, dengan 16 pin konektor,
yang didifinisikan sebagai berikut:
Gambar 4.1 Komponen LCD 2x16 & I2C Modul
68Display karakter pada LCD diatur oleh pin EN, RS dan RW:
1
Jalur EN dinamakan Enable, Jalur ini digunakan untuk memberitahu LCD bahwa
anda sedang mengirimkan sebuah data. Untuk mengirimkan data ke LCD, maka
melalui program EN harus dibuat logika low “0” dan set pada dua jalur kontrol
yang lain RS dan RW. Ketika dua jalur yang lain telah siap, set EN dengan logika
“1” dan tunggu untuk sejumlah waktu tertentu (sesuai dengan datasheet dari LCD
tersebut ) dan berikutnya set EN ke logika low “0” lagi,
Jalur RS adalah jalur Register Select. Ketika RS berlogika low “0”, data akan
dianggap sebagai sebuah perintah atau instruksi khusus ( seperti clear screen,
posisi kursor dll ). Ketika RS berlogika high “1”, data yang dikirim adalah data
text yang akan ditampilkan pada display LCD.
Sebagai contoh, untuk menampilkan huruf “T” pada layar LCD maka RS harus
diset logika high “1”.
Jalur RW adalah jalur kontrol Read/ Write. Ketika RW berlogika low (0), maka
informasi pada bus data akan dituliskan pada layar LCD. Ketika RW berlogika
high "1", maka program akan melakukan pembacaan memori dari LCD.
Sedangkan pada aplikasi umum pin RW selalu diberi logika low "0".
6Tabel 4.1, Pin LCD dan Fungsi
PIN Nama Fungsi
I Vss Ground voltage
2 Veo | +5V
3 Vex Contras voltage
Register Select
4 RS 0 = Instruction Register
1 =Data Register
5 Raw _ | Read/Write, untuk memilih mode write
atau read
Enable
6 E 0 = mulai memsang data ke LCD
karakter_
1 =disable
7 DBO LSB
8 DBI -
9 DB2 -
Pada percobaan dalam modul ini akan menggunakan modul Inter-Integrated Cireuit
(12C) sebagai perantara menangani perintah yang ada pada LCD. Sehingga posisi 12C ini
diantara LCD dan Arduino, dengan konsep menghemat pin yang digunakan arduino
‘untuk mengendalikan LCD, Pada umumnya LCD dikendalikan dengan menggunakan 6
jalur yang ada pada LCD : RS, EN, D7, D6, DS, dan D4. Jika diinginkan lebih simplekita
bisa menggunakan LCD shield yang bisa langsung integrated pada board. Tapi ketika
kita ingin menggunakan yang lebih simple dari segi ukuran I2C mungkin salah satu
jawabannya,
70Gambar 4.2 Modul 12C
Hitachi 16x2 LCD menggunakan HD44780 sangat murah dan tersedia secara luas, dan
merupakan bagian pen
ing untuk setiap proyek yang menampilkan informasi.
Menggunakan LCD, data yang diinginkan dapat ditampilkan pada LCD melalui bus
12C. Pada prinsipnya, modul tersebut dibangun menggunakan PCF8574 (dari NXP) yang
konsepnya adalah dua arah 8 bit VO port expander yang menggunakan protokol I2C.
PCF8574 adalah silikon CMOS sirkuit sebagai pengendali I/O ekspansi (8-bit dua arah)
bagi sebagian besar keluarga mikrokontroler melalui dua jalur dua arah bus (I2C- bus).
Perhatikan bahwa kebanyakan modul dibuat dari varian PCF8574T (SO16 paket
PCF8574 dalam paket DIP16) dengan alamat default slave 0x27. Jika modul tertanam:
chip PCE8574AT(bisa dilihat dibagian belakangeipl2C), maka alamat slave default
akan berubah ke Ox3F. Singkatnya, perangkat didasarkan pada PCF8574T dan koneksi
alamat (A0-A1-A2) tidak dijembatani dengan solder akan memiliki 0x27 alamat slave.
Gambar 4.3 Letak Koneksi Alamat Logic I2C
TTBerikut merupakan rangkaian yang bisa dijadikan referensi untuk menghubungkan
arduino dengan LCD melalui modul I2C.
oll
Jenvstaee
|eousanbe
1
Gambar 4.4 Rangkaian I2C ke LCD
Berikut merupakan komponen I2C yang terpasang pada LCD dengan Pin yang dimiliki
dan fungsi tiap masing Pin.
Gambar 4.5 Pin 2C
Keterangan Konfigurasi kabel-kabel jumper :
+ GND-GND
+ vec-sv
SDA - ANALOG Pin 4
+ SCL- ANALOG pin 5
Pada kebanyakan papan Arduino, SDA (data line) adalah dihubungkan pada input
analog pin 4, dan SCL (clock line) pada input analog pin 5. Pada Arduino Mega SDA
2adalah digital pin 20 dan SCL adalah 21. Pada baru Arduino UNO (The "V3" pinout),
pin SCL dan SDA juga pada dua paling kiri baru pin atas.
CATATAN: Potentiometer berwarna biru pada gambar 4.6 untuk menyesuaikan
kontras atau kecerahan dari layar LCD. Jika Anda tidak melihat karakter apapun,
sesuaikan, Mulai searah jarum jam dan kembali ke tempat karakter yang cerah dan sampai
background tidak memiliki kotak yang biasanya timbul di belakang karakter.
Gambar 4.6 Konfigurasi Kabel Jumper
Untuk membuat program yang nantinya akan memanfaatkan I2C yang berkomunikasi
dengan LCD, maka dibutuhkan alamat yang tepat dari modul 12C. Alamat ini akan
berbeda-beda untuk tiap device tergantung pada IC yang dipakai oleh modul I2C.
Melihat alamat yang dipakai untuk modul I2C dapat menggunakan program scanner
yang nantinya menghasilkan alamat yang dipakai pada modul 12C yang digunakan saat
pengiriman perintah pada LCD.
Scan device I2C dengan program berikut :
#include
void setup()
{
Wire.begin();
7BSerial.begin (9600);
while (!Serial); // Leonardo: wait for
serial monitor
Serial.printin("\nI2¢ Scanner");
void loop()
{
byte error, address;
int nDevices;
Serial.printIn("Scanning...
"yr
nDevices = 0;
for (address = 1; address < 127; address++
{
// The i2¢_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the
address.
Wire. beginTransmission (address);
error = Wire.endTransmission();
if (error — 0)
{
Serial.print("12C device found at address 0x");
if (address<16
Serial.print ("0"
de
Serial.print (address, HEX) ;
Serial.println(" !");
nDevicest+;
}
else if (error=-4
{
Serial.print ("Unknow error at address 0x");
if (address<16
Serial.print ("0"
de
Serial.print1n (address, HEX) +
74)
}
if (nDevices == 0)
Serial.printin("No 12C devices found\n");
else
Serial.printin("done\n");
delay (5000) ; // wait 5 seconds for next scan
Hasil bisa dilihat dengan menggunakan menu Serial Monitor yang berada dibagian
jendela kanan atas Arduino IDE.
nea pein enaino Ue)
Gambar 4.7 Hasil Eksekusi Sean I2C
44 Percobaan 1:
CD & I2C Modul
Mencoba mengirimkan karakter dengan menggunakan LCD melalui Modul 12C,
yang pada dasarnya akan lebih mudah daripada menggunakan perintah standard
tanpa menggunakan modul I2C :
/*-----( Import needed libraries )----- /
#include // Comes with Arduino IDE
#include
Declare Constants )-
Declare objects )
// set the LCD address to 0x27 for a 16 chars 2
line display
// B® FEW use address 0x3F
// Set the pins on the 12C chip used for LCD
75connections:
// addr, en,rw,rs,d4,d5,d6,d7,b1,blpol
LiguidCrystal_I2C led (0x3F, 2, 1, 0, 4, 5, 6,
7, 3, POSITIVE); // Set the LCD I2C address
( Declare Variables ) Ff
void setup() /*
{
Serial.begin(9600);// Used to type in
characters lcd.begin(16,2); // initialize
the lcd for 16
chars 2 lines, turn on backlight
=( SETUP: RUNS ONCE )----*/
- Quick 3 blinks of backlight
- for(int i = 0; i< 3; i++)
led. backlight (17
delay (250);
cd. noBacklight ();
delay (250);
}
lcd.backlight(); // finish with backlight on
- Write characters on the display
Me
// NOTE: Cursor Position: (CHAR, LINE) start at
0 led.setCursor (0,0);
//Start at character 4 on line 0
led.print ("Hello, world!");
delay (1000);
led.setCursor (0, 1)7
led.print ("Hi, POLINES'
delay (8000);
// Wait and then tell user they can start the Serial
Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line
Ending")
led.clear();
led. setCursor (0,0);
//Start at character 0 on lined
led.print ("D3TT INFORMATIKA")
led.setCursor (0,1);
16led.print ("type to display");
}/*--(end setup )---*/
100
RUNS CON!
NTLY )
void loop() /*-
{
// when characters arrive over the ser:
if (Serial.available())
(/ wait a bit e entire message
arrive delay(100);
// clear the screen
led.clear();
// vead all the available characters
while (Serial.available() > 0) (
// displa h character to the LCD
led.write (Serial. ree
Oe
}
}/* -=(end main loop )-- */
7* (THE END ) */
Keterangan Kode Program :
1. Memanggil library, lokasi fisik library biasanya berada pada lokasi dimana
Arduino IDE diinstall. Untuk menambhakan library kita tinggal masukkan folder
library baru kitake folder library. Lokasi yang memungkinkan untuk menyimpan
library lainnya adalah di samping tempat penyimpanan skecth
Library bisa didownload di: _https://bitbucket.org/fmalpartida/new-
liquiderystal/downloads
//Default sudah ada pada Arduino IDE
include
//Tambahan Library LCD dengan 12C
f#include
2. Inisialisasi class yang ada pada header library yang nantinya object yang
dihasilkan dariproses inisialisasi digunakan untuk pemrograman selanjutnya.
1// Set the LCD 12¢ address
Liquidcrystal_12¢ led(0x3F, 2, 1, 0, 4, 5, 6 7, 3,
POSITIVE) +
Konfigurasi pin I2C terhadap LCD
Tabel 4.2 Konfigurasi pin ardunio
addr |en|rw Rs d4| dS d6 | d7_ bl | bipol
ox3F] 2] 1fo[4]s]e][7]3
3. Konfigurasi untuk fungsi setup()
Inisialisasi penggunaan baudrate/kecepatan tranfer serial :
Serial.begin (9600);
Inisialisasi tipe LCD yang digunakan
led. begin (16,2);
Membuat efek flash blink/berkedip padalayar LCD sebanyak 3 kali
for(int i = 0; i< 3; itt)
{
led. backlight (17
delay (250);
ed. noBacklight (
); delay (250);
}
Membuat LCD dengan tampilan lampu latar belakang menyala
led.backlight(); // finish with backlight on
Menginstrusikan kursor pada posisi sesuai dengan parameter, dimulai dari 0 untuk
baris pertama, dan increment | untuk baris berikutnya.
led. setCursor (0,0);
8Mencetak pada LCD dengan karakter yang ada pada parameter
led.print ("Hello, world!");
Memberikan delay () waktu tunda sebelummengeksekusi baris program
s
lanjutnya, Satuan dalam millisecond.
delay (1000);
led. setCursor (0,1);
led. (HI!
POLINES"); delay (8000) ;
ein
Membersihkan layar LCD untuk semua baris
led.clear();
‘Mengarahkan kursor ke baris pertama
ex 0 on lined
led.setCursor (0,0); //
arac}
Menuliskan karakter pada LCD pada posisi kursor yang berarti
mereplace/mengganti karakter lama dengan karakter yang baru.
led.print ("D3 TEKNIK INFORMATIKA") ;
led. setCursor (0,1);
led. print ("POLINES
}/*--(end setup )-
4, Mengeksekusi rutin fungsi loop)
Jika serial port menerima masukkan yang akan dirubah menjadi karakter setiap
yang diterima serial akan ditampilkan pada LCD.
// when c cters arrive over the seria
port...
if (Ser
available ())
t a bi
// wa r
arrive delay (100)
// clear the ser:
79led.clear ()i
// read all the available characters
while (Serial.available() > 0) {
// display each character to the LCD
led. write (Serial. read());
4.5 Percobaan 2 : LCD SHIELD ARDUINO
Cara Jain untuk menggunakan LCD dengan cara menggunakan Shield untuk LCD
yang akan menambahkan board diatas arduino sesuai dengan konfigurasi pin yang
ada pada arduino, Dengan LCD Shield kita bisa menggunakan LCD sekaligus
‘menghemat pemanfaatan pin yang ada di arduino,
Jadi jika dibandingkan dengan pemanfaatan 12C pada bahasan sebelumnya, LCD
shield ini berbeda, pin LCD akan seolah-olah seperti tertancap secara langsung pada
Arduino tanpa menggunakan modul 12C.
Gambar 4.8 LCD Shield Arduino
‘Tombol keypad yang berada pada bagian bawah akan langsung terhubung dengan
Analoginput Pin 0.
80Detail Konfigurasi Pin LCD Shield :
Tabel 4.3 Konfigurasi Pin dan fungsi
Analog 0 Button (select, up, right, down and left)
Digital 4 DB4
Digital 5 DBS
Digital 6 DB6
Digital 7 DB7
Digital 8 RS (Data or Signal Display Selection)
Digital 9 Enable
Digital 10 Backlight Control
Instruction for 04 To 010 and Analog Pin 0
Pin Function instruction
Dam AH
ution set Select up ght, down and it
Gambar 4,9 Konfigurasi Pin LCD Shield
81Berikut merupakan konfigurasi pemasangan LCD Shield pada Arduino :
Gambar 4.10 Pemasangan LCD Shield pada Arduino
Rangkaian :
Gambar 4.11 Konfigurasi pengkabelan LCD dan Potensiometer
82Contoh Kode Program :
//Sample using LiquidCrystal library
#include
// select the pins used on the LCD panel
Liquidcrystal lcd(8, 9, 4, 5, 6, 7)
// define some values used by the panel and
buttons int led_key = 0;
int ade_key_in= 0;
#define btnRIGKT 0
#define btnuP 1
#define btndowN 2
#define btnLEFT 3
Hdefine btnSELECT 4
#define btnNONE 5
// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0) ;
// read the value from the sensor
// my buttons when read are centered at these
valies: 0, 144, 329, 504, 741
// we add approx 50 to these values and check to
see if we are close
if (adc_key_in > 1000) return btnNONE;
// We make this the 1st option for speed reasons
since it will be the most likely result
// For V1.1 us this threshold
if (ade_key_in < 50) return btnRIGHT,
if (ade_key_in < 250) return btnUP,
if (adc_key_in < 450) return btnDOWN
if (adc_key_in < 650) return btnberT.
if (ade_key in < 850) return btnSELECT
return btnNONE; // when all others fail,
83return this...
}
void setup ()
{
led.begin(16, 2); // start the
library led.setCursor (0,0);
led.print ("Push the buttons"); // print a
simple message
)
void loop(
{
led.setCursor (9,1); // move cursor to
second line and 9 spaces over
led.print (millis()/1000);// display
seconds elapsed since power-up
led.setCursor (0,1); // move to the
begining of the second line
led_key = read_LCD_buttons(); // read
the buttons
switch (led_key) // depending on which
button was pushed, we perform an action
{
case btnRIGHT:
{
led.print ("RIGET ");
break;
)
case btnLEFT:
{
led.print ("LEFT ");
break;
)
case btnUP:
{
led.print ("UP");
break;
}
case btnDOWN:
{
84led.print ("DOWN");
break;
)
case btns)
led. print ("SELECT
break;
)
case btnNoN
lcd.print ("NONE "
4.6 Percobaan 3 : LCD SEBAGAI DAFTAR MENU
Pada dasamya LCD hanya untuk menampilkan tampilan yang dihasilkan dari kode
program saja, tapi tipe LCD shield mempunyai keypad yang tujuannya untuk memilih
tampilan yang sekaligus akan menentukan aksi yang akan dilakukan setelahnya.
Pada kasus tertentu kita membutuhkan tampilan sebagai kontrol dari aktivitas yang
kita lakukan sebagai pengganti mouse atau touchscreen yang kita sering pakai dalam
layar smartphone atau fouchScreen Monitor.
Fungsi pemilihan ini digambarkan sebagai menu navigasi yang ada pada sebuah
webs
. yang akan memberikan informasi yang berbeda untuk tiap menu yang terpilih
dengan memanfaatkan tombol keypad yang ada pada LCD Shield.
85Gambar 4.12 Keypad pada LCD Shield
Keypad pada shield akan mempunyai nilai range analog pada & bit jalur data, yang
kisaran nilainya antara 0 — 1023. Nilai ini akan bisa didapatkan dengan menggunakan
fungsi analogRead() pada arduino,
ade_key_in
alogRead (0);
Misal kita mempunyai nilai hasil pembacaan pada masing-masing keypad :
RIGHT = 0
uP
DOWN = 329
LEFT = 504
SELEC’= 741
sehingga kita bisa membuat range untuk menangkap setiap inputan keypad yang
dilakukan oleh user. Untuk mendekatkan nilai yang dihasilkan Analog Digital Converter
kita berikan tambahan nilai 50 untuk tiap nilai default.
if
if
if
(adc_key
(adc_key_in
(ade_key_in
if (adc_key_in
if (ade_key_in
if (ade_key in
Dengan kode program diatas
000)
50)
250) return
450) return
650) return
850) return
return btnNONe;
btnRIGHT;
>
< return
<
<
<
<
akan menentukan aksi, dengan menyesuaikan tombol
86yang ditekan dengan nilai tombol tersebut,
Contoh kasus :
Membuat seleksi menu yang tertampil pada LCD
Bisnis proses :
Pada LCD shield akan ditampilkan Sejumlah menu dengan level yang sama kita sebut
MainMenu,
1
Ketika keypad up ditekan pada LCD akan ditampilkan menu selanjutnya, dan jika
keypad Down ditekan akan ditampilkan menu terakhir (pada urutan terbalik dari
keypad Up)
Ketika keypad Select ditekan pada main menu, pada LCD akan menampilkan
submenu yang ada dalam tiap main menu, Atau jika tidak mempunyai submenu
maka akan melakukan aksi sesuai dengan menu terpilih
Kode Program :
[oettteeette
tet
Description : Simple Menu function on LCD
Button ion
#include
Liquidcrystal led(8,9,4,5,6,7)7
int keypad pin = AO;
int keypad_value = 0;
int keypad_value_old = 0;
char btn_push;
87byte mainMenuPage = 1;
byte mainMenuPagedld
1; byte mainMenuTotal
4a;
void setup ()
{
led.begin(16,2); //Initialize a 2x16 type LCD
MainMenuDisplay (0;
delay (1000);
}
void loop()
{
btn_push = ReadKeypad();
MainMenuBtn () ;
if (btn_push
{
"s')//enter selected menu
WaitBtnRelease();
switch (mainMenuPage
{
case 1:
Menwa () +
break;
case 2:
MenuB () 7
break;
case 3:
Menu () 7
break;
case 4:
MenuD ()
break;
MainMenuDisplay ();
WaitBtnRelease ();
)
delay (10)¢
88VMi--
void MenuA()
{
End of loop() loop--:
led.clear();
led.setCursor (0,0);
led.print ("Inside Menu A");
while (ReadKeypad () !
{
hy
//Insert Task for Menu A here
)
)
void MenuB()
{
led.clear();
led.setCursor (0,0);
led.print ("Inside Menu B");
"hy
while (ReadKeypad ()
{
//tnsert Task for Menu B here
)
)
void Menuc()
{
led.clear();
led.setCursor (0,0);
lcd.print ("Inside Menu C");
while (ReadKeypad()
{
"LY
//Insert Task for Menu C here
)
)
void MenuD()
{
lcd.clear();
led.setCursor (0,0);
led.print ("Inside Menu D");
while (ReadKeypad ()
‘hry
89//Insert Task for Menu D here
void MainMenuDisplay()
{
led.clear();
led. setCursor (0,0) 4
switch
(mainMenuPage)
{
case 1:
led.print("1. Menu A");
breaks
case 2:
led.print("2. Menu BY);
break;
case 3:
led.print("3. Menu C");
break
case 4:
led.print("4. Menu D");
brea!
void MainMenuBtn (}
{
WaitBtnRelease();
if (btn_push == 'U")
{
mainMenuPage++;
if (mainMenuPage > mainMenuTotal)
mainMenuPage = 1;
)
else if(btn_push
{
tbr
mainMenuPage-~;
if (mainMenuPage
0)
mainMenu?age = mainMenuTotal;
90if (mainMenuPage != mainMenuPageOld)
//only update display when page change
{
MainMenuDisplay ();
mainMenuPageOld = mainMenuPage
char ReadKeypad (
{
/* Keypad button analog
Value no button pressed
1023
select 741
left 503
down 326
up 142
right 0
*/
keypad_value = analogRead(keypad_pin);
if (keypad_value < 50)
return 'R';
else if(keypad_value < 250
return 'U';
else if(keypad_value < 450)
return 'D';
else if(keypad_value < 650
return 'L"
else if(keypad_value < 850)
return 'S';
else
return 'N';
void WaitBtnRelease ()
{
while( analogRead(keypad_pin) < 800) {}
}
//END Program
94.7 Latihan
1, Buat running text geser kekiri pada LCD dengan I2C dan LCD Shield
Karakter - [NAMA] - D3TI POLINES
2. Gunakan fungsi untuk meletakkan karakter pada baris pertama dan kedua sehingga
posisi karakter yang ditampilkan berada ditengah, Jika jumlah karakter lebih dati
16, maka karakter akan dipotong di karakter 16,
3. Gunakan Arduino dengan LCD Shield. Manfaatkan keypad pada LCD Shield
untuk memasukkan kombinasi password jika pasword benar akan tertampil “Selamat
Datang” dan Lampu Led Hijau akan menyala, jika inputan kombinasi salah Led
Merah menyala tampilan LCD “Password Salah”.
92