Interfacing
Materi 5: LCD and Keyboard Interfacing
Disusun Oleh:
Outline
• LCD Interfacing
• Keyboard Interfacing
• Workshop
LCD Interfacing
• LCD
mulai
saat ini telah banyak digunakan dan
mulai menggeser penggunaan LED (seven segment
atau multi segment yg lain) dgn bbrp alasan
berikut:
1.
Harga LCD yg mulai terjangkau
2.
Kemampuannya dlm menampilkan angka,
karakter, dan gambar
3.
Meringankan beban CPU dlm me-refresh
tampilan
4.
Mudah dlm memprogram karakter & gambar
LCD Interfacing
• Beberapa jenis LCD:
2 x 40 character LCD
1 x 16 character LCD
LCD Interfacing
• Fungsi Pin LCD:
LCD Interfacing
VCC, VSS, VEE
• VSS tersambung ground sdgkan
VCC/VDD ke +5V
RS (Register Select)
• Jika RS = 0: memungkinakan
user mengirim perintah ke LCD
(misal clear)
• Jika RS = 1: memungkinkan
user mengirim data utk
LCD Interfacing
R/W (Read/Write)
• Memungkinkan user utk
menulis dan membaca
informasi
• R/W = 1 : membaca
• R/W = 0 : menulis
Enable
• Latch info dlm LCD
• Pulsa min 450ns diaplikasikan
ke LCD ketika mengirim data
LCD Interfacing
D0-D7
• 8-bit
data pin mengirim
dan membaca data
• Karakter ASCII : A-Z, a-z dan
0-9, dgn RS =1
• Antarmuka LCD pd AVR ada
2 cara:
• 8
-bit
• 4
-bit
LCD Interfacing
Sending Commands and Data to LCD
• Berikut langkah utk mengirim data dan
perintah pd LCD:
1. Inisialisasi LCD
2. Kirim brbagai
command
brdasarkn tabel di
atas
3. Kirim karakter yg akan ditampilkan ke LCD
• Langkah 2 dan 3 dpt dilakukan berulang kali
LCD Interfacing
Inisialisasi LCD
• Berdasarkan tabel LCD
command, Utk
menginisialisasi
8-bit LCD 5 x
7, diperlukan urutan perintah
berikut:
0x38
,
0x0E
,
0x01
• Setelah LCD di
power-up
tunggu sekitar 15 ms sblm
diinisialisasi
LCD Interfacing
Mengirim Data ke LCD
Langkah
2
nya sbb:
1. Utk mengirim data buat RS = 1 dan R/W = 0
2. Tempatkan data ke data pin (D0-D7)
3. Kirim pulsa high-to-low ke pin E (Enable) utk
mengaktifkan internal lacth pd LCD
4. Stelah mengirim data tunggu 100µs utk
memberi ksempatan modul LCD menampilkan
data ke screen LCD
LCD Interfacing
Contoh Program utk mengirim Data:
void lcdData (unsigned char data){
LCD_DPRT = data; //kirim data ke data port LCD_CPRT |= (1<<LCD_RS); //RS = 1 utk data
LCD_CPRT &= ~(1<<LCD_RW); //RW = 0 utk write
LCD_CPRT |= (1<<LCD_EN); //EN = 1 utk pulsa H-to-L delay_us(1); //tunggu sebentar utk enable LCD_CPRT &= ~(1<<LCD_EN); //EN = 0 utk pulsa H-to-L delay_us(100); //tunggu sebentar utk enable }
LCD Interfacing
Contoh Program utk mengirim Command:
Kusuma Wardana - Interfacing 2013 14
void lcdCommand (unsigned char cmnd) {
LCD_DPRT = cmnd; //kirim command ke data port LCD_CPRT &= ~(1<<LCD_RS); //RS = 0 utk command
LCD_CPRT &= ~(1<<LCD_RW); //RW = 0 utk write
LCD_CPRT |= (1<<LCD_EN); //EN = 1 utk pulsa H-to-L delay_us(1); //tunggu sebentar utk enable LCD_CPRT &= ~(1<<LCD_EN); //EN = 0 utk pulsa H-to-L delay_us(100);
LCD Interfacing
Mengirim 4-bit Kode atau Data
• Pd bbrp kasus, akan lebih menguntungkan utk
mengirimkan data hanya 4-bit
• Hal ini utk menghemat penggunaan Pin
• Ingat, inisialisasi akan berbeda dr 8-bit
• Utk menginisialisasi kirim scr berurutan: 33, 32
dan 28 (hex)
• Kita menggunakan high nibble
LCD Interfacing
• Utk menginisialisasi kirim scr berurutan:
33, 32 dan 28 (hex)
• Ini utk mengatakan ke LCD bahwa mode yg
akan dipakai adlh 4-bit data
LCD Interfacing
LCD Interfacing
Timing Diagram
Kusuma Wardana - Interfacing 2013 20
LCD Interfacing
DD (Display Data) RAM address location:
• Dimana utk 20 x 2 LCD:
• XXXXXXXX
=
00000000
s/d
0100111
(line 1)
• XXXXXXXX
=
10000000
s/d
1100111
(line 2)
LCD Interfacing
LCD Interfacing
Contoh:
• Berapakah alamat dr kursor berikut jika
menggunakan LCD 20x4?
a) Line 1, kolom 1
b) Line 2, kolom 1
c) Line 3, kolom 2
d) Line 4, kolom 3
LCD Interfacing
Jawab:
a) 80
b) C0
c) 95
d) D6
Berapakah alamat dr kursor berikut jika menggunakan LCD 20x4?
a) Line 1, kolom 1 b) Line 2, kolom 1 c) Line 3, kolom 2 d) Line 4, kolom 3
LCD Programming in C
LCD Programming in C
• Buatlah program utk mengirim kalimat ke LCD
menggunakan 8-bit data dgn skematik berikut:
LCD Programming in C
#include
<mega16.h>
#include
<delay.h>
#define
LCD_DPRT PORTD //LCD data port
#define
LCD_DDDR DDRD //LCD data DDR
#define
LCD_DPIN PIND //LCD data Pin
#define
LCD_CPRT PORTC //LCD command Port
#define
LCD_CDDR DDRC //LCD command DDR
#define
LCD_CPIN PINC //LCD command Pin
#define
LCD_RS 0 //LCD RS
#define
LCD_RW 1 //LCD RW
LCD Programming in C
Subrutin utk pengiriman perintah (command)
Kusuma Wardana - Interfacing 2013 32
//***********************************************************
void lcdCommand (unsigned char cmnd) {
LCD_DPRT = cmnd; //kirim command ke data port
LCD_CPRT &= ~(1<<LCD_RS); //RS = 0 utk command
LCD_CPRT &= ~(1<<LCD_RW); //RW = 0 utk write
LCD_CPRT |= (1<<LCD_EN); //EN = 1 utk pulsa H-to-L
delay_us(1); //tunggu sebentar utk enable
LCD_CPRT &= ~(1<<LCD_EN); //EN = 0 utk pulsa H-to-L
delay_us(100); }
LCD Programming in C
Subrutin utk pengiriman data
//***********************************************************
void lcdData (unsigned char data) {
LCD_DPRT = cmnd; //kirim command ke data port
LCD_CPRT |= (1<<LCD_RS); //RS = 1 utk data
LCD_CPRT &= ~(1<<LCD_RW); //RW = 0 utk write
LCD_CPRT |= (1<<LCD_EN); //EN = 1 utk pulsa H-to-L
delay_us(1); //tunggu sebentar utk enable
LCD_CPRT &= ~(1<<LCD_EN); //EN = 0 utk pulsa H-to-L
delay_us(100); }
LCD Programming in C
Subrutin utk inisialisasi LCD
Kusuma Wardana - Interfacing 2013 34
//*********************************************************** void lcd_init() { LCD_DDDR = 0xFF; LCD_CDDR = 0xFF; LCD_CPRT &= ~(1<<LCD_EN); //LCD EN = 0
delay_us(2000); //tunggu utk inisialisasi
lcdCommand(0x38); //init LCD 2 line
lcdCommand(0x0E); //display on, cursor on
delay_us(2000); //tunggu bentar
lcdCommand(0x06); //shift kursor ke kanan
Subrutin utk posisi kursor dan menulis data
//***********************************************************
void lcd_gotoxy(unsigned char x, unsigned char y) {
unsigned char almtKarakterPertama[]={0x80,0xC0,0x94,0xD4}; //lihat tabel lcdCommand(almtKarakterPertama[y-1] + x - 1); delay_us(100); } //*********************************************************** void lcd_print(char * str) { unsigned char i = 0; while(str[i]!= 0) { lcdData(str[i]); i++; }
LCD Programming in C
Program utama
Kusuma Wardana - Interfacing 2013 36
//***********************************************************
void main(void) {
lcd_init();
lcd_gotoxy(1,1);
lcd_print("Aku pasti bisa!"); lcd_gotoxy(1,2);
lcd_print("Yakin!");
while(1); // diam di sini selamanya
LCD Programming in C
• Buatlah program utk mengirim kalimat ke LCD
menggunakan
4-bit
data dgn skematik berikut:
LCD Programming in C
#include
<mega16.h>
#include
<delay.h>
#define
LCD_DPRT PORTD //LCD data port
#define
LCD_DDDR DDRD //LCD data DDR
#define
LCD_DPIN PIND //LCD data Pin
#define
LCD_CPRT PORTC //LCD command Port
#define
LCD_CDDR DDRC //LCD command DDR
#define
LCD_CPIN PINC //LCD command Pin
#define
LCD_RS 0 //LCD RS
#define
LCD_RW 1 //LCD RW
LCD Programming in C
Subrutin utk pengiriman perintah (command)
Kusuma Wardana - Interfacing 2013 40
void lcdCommand (unsigned char cmnd) {
LCD_DPRT = cmnd & 0xF0; //kirim high nibble
LCD_CPRT &= ~(1<<LCD_RS); //RS = 0 utk command
LCD_CPRT &= ~(1<<LCD_RW); //RW = 0 utk write
LCD_CPRT |= (1<<LCD_EN); //EN = 1 utk pulsa H-to-L
delay_us(1); //tunggu sebentar utk enable
LCD_CPRT &= ~(1<<LCD_EN); //EN = 0 utk pulsa H-to-L
delay_us(100);
LCD_DPRT = cmnd<<4; //kirim low nibble
LCD_CPRT |= (1<<LCD_EN); //EN = 1 utk pulsa H-to-L
delay_us(1);
LCD_CPRT &= ~(1<<LCD_EN); //EN = 0 utk pulsa H-to-L
delay_us(100); }
LCD Programming in C
Subrutin utk pengiriman data
//***********************************************************
void lcdData (unsigned char data) {
LCD_DPRT = data & 0xF0; //kirim high nibble
LCD_CPRT |= (1<<LCD_RS); //RS = 1 utk data
LCD_CPRT &= ~(1<<LCD_RW); //RW = 0 utk write
LCD_CPRT |= (1<<LCD_EN); //EN = 1 utk pulsa H-to-L
delay_us(1); //tunggu sebentar utk enable
LCD_CPRT &= ~(1<<LCD_EN); //EN = 0 utk pulsa H-to-L
delay_us(100);
LCD_DPRT = data<<4; //kirim low nibble
LCD_CPRT |= (1<<LCD_EN); //EN = 1 utk pulsa H-to-L
delay_us(1);
LCD Programming in C
Subrutin utk inisialisasi LCD
Kusuma Wardana - Interfacing 2013 42
void lcd_init() { LCD_DDDR = 0xFF; LCD_CDDR = 0xFF; LCD_CPRT &= ~(1<<LCD_EN); //LCD EN = 0
lcdCommand(0x33); //kirim $33 utk init
lcdCommand(0x32); //kirim $32 utk init
lcdCommand(0x28); //init LCD 2 line
lcdCommand(0x0E); //display on, cursor on
lcdCommand(0x01); //clear LCD
delay_us(2000); //tunggu utk inisialisasi
lcdCommand(0x06); //shift kursor ke kanan
Subrutin utk posisi kursor dan menulis data
//***********************************************************
void lcd_gotoxy(unsigned char x, unsigned char y) {
unsigned char almtKarakterPertama[]={0x80,0xC0,0x94,0xD4}; //lihat tabel lcdCommand(almtKarakterPertama[y-1] + x - 1); delay_us(100); } //*********************************************************** void lcd_print(char * str) { unsigned char i = 0; while(str[i]!= 0) { lcdData(str[i]); i++; }
LCD Programming in C
Program utama
Kusuma Wardana - Interfacing 2013 44
//***********************************************************
void main(void) {
lcd_init();
lcd_gotoxy(1,1);
lcd_print("Aku pasti bisa!"); lcd_gotoxy(1,2);
lcd_print("Yakin!");
while(1); // diam di sini selamanya
LCD Programming in C
LCD Programming in C
• Jauh lebih sederhana, tapi…. Menghilangkan
detil program
46 #include <mega16.h> #asm .equ __lcd_port=0x15 #endasm #include <lcd.h> void main(void) { lcd_init(16); lcd_gotoxy(0,0);lcd_putsf("Aku pasti Bisa"); lcd_gotoxy(0,1);
lcd_putsf("Yakin!"); while(1);