Diktat Kuliah Mikrokontroler
Diktat Kuliah Mikrokontroler
PENGENALAN MIKROKONTROLER
Mikrokontroler, jika diterjemahkan secara harfiah, berarti pengendali yang berukuran
mikro. Sekilas mikrokontroler hampir sama dengan mikroprosesor. Namun
mikrokontroler memiliki banyak komponen yang terintegrasi didalamnya, misalnya
timer/counter.Sedangkan pada mikroprosesor, komponen tersebut tidak terintegrasi.
Mikroprosesor umumnya terdapat pada komputer dimana tugas dari mikroprosesor
adalah untuk memproses berbagai macam data input maupun output dari berbagai
sumber. Mikrokontroler lebih sesuai untuk tugas-tugas yang lebih spesifik
DiktatSistem Mikrokontroler
REGISTER DAN MEMORI INTERNAL MCS-51
Memori Internal MCS51 terdiri dari 3 bagian yaitu ROM, RAM, SFR
ROM/Read Onli Memory adalah adalah memori tempat menyimpan program / source
code.
Sifat ROM adalah non-volatile, data / program tidak akan hilang walaupun tegangan
supply tidak ada. Kapasitas ROM tergantung dari tipe mikrokontroler. Untuk MCS-51
kapasitas ROM adalah 4 Kbyte yang menempati address 0000 s/d 0FFF.
RAM/Random Acces Memoryadalah memori tempat menyimpan data sementara.
Sifat RAM adalah volatile, data akan hilang jika tegangan supply tidak ada. RAM pada
MCS-51 memiliki kapasitas 128 byte yang menempati alamat (00h-7Fh). Yang dapat
diakses dengan pengalamatan langsung(direct) maupun tidak langsung (indirect).
Contoh:
>>direct
mov 30h,#120
;pindahkan data 120 ke alamat 30h
>>indirect
mov R0, #30h
;isi register R0 dengan 30h
mov @R0, #120
;isikan data 120 ke alamat sesuai isi R0
SFR/Special Function Registeradalah register dengan fungsi tertentu menempati
alamat (80h-FFh). Penjelasan SFR akan dipaparkan pada bagian lain dari modul ini.
Peta Memori Internal MCS-51
DiktatSistem Mikrokontroler
P0
SP
Port 0
Stack Pointer
DiktatSistem Mikrokontroler
82h
83h
87h
88h
89h
8Ah
8Bh
8Ch
8Dh
90h
98h
99h
A0h
A8h
B0h
B8h
D0
E0
F0
DPL
DPH
PCON
TCON
TMOD
TL0
TL1
TH0
TH1
P1
SCON
SBUF
P2
IE
P3
IP
PSW
ACC
B
DiktatSistem Mikrokontroler
P
Parity Flag digunakan untuk menggenapi jumlah bit yang bernilai 1 pada
accumulator. Parity flag bernilai 1 jika jumlah bit yang bernilai
1 pada
accumulator berjumlah ganjil dan bernilai 0 jika jumlah bit yang bernilai 1 pada
accumulator berjumlah genap.
Register ACC (Accumulator)
Register Accumulator (ACC) banyak digunakan dalam berbagai instruksi. ACC
bersama dengan register B dalam proses perkalian dan pembagian. ACC akan
menyimpan hasil perkalian 8 bit terbawah (low byte) dan hasil bagi. Selain itu
register ACC juga merupakan general purpose register selebar 8 bit yang dapat
digunakan untuk aplikasi user.
Register B
Register B digunakan bersama dengan Accumulator dalam proses perkalian dan
pembagian. Register B akan menyimpan hasil perkalian 8 bit teratas (high byte)
dan sisa pembagian. Selain itu register B juga merupakan general purpose
register selebar 8 bit yang dapat digunakan untuk aplikasi user.
Stack Pointer
Stack Pointer (SP) merupakan register 8 bit yang berisi lokasi dimana data
alamat stack teratas disimpan. Instruksi PUSH, LCALL, proses interrupt, dan
sejenisnya akan menambah nilai pada SP. Sedangkan instruksi POP, RET, RETI,
dan sejenisnya akan mengurangi nilai pada SP.
Data Pointer
Data Pointer (DPTR) merupakan register 16 bit yang terdiri dari 8 bit Data Pointer
High (DPH) dan 8 bit Data Pointer Low (DPL). DPTR umumnya digunakan untuk
mengakses alamat pada memori eksternal.
Port Register (P0,P1,P2 dan P3)
Port register merupakan register yang mewakili alamat port. Register
input/output ini meliputi Port 0 (P0), Port 1 (P1), Port 2 (P2), dan Port 3 (P3).
Timer Register
Timer Register merupakan register yang digunakan untuk mengatur operasi
timer. Register ini meliputi Timer 1 High Byte (TH1), Timer 0 High Byte (TH0),
Timer 1 Low Byte (TL1), Timer 0 Low Byte (TL0), Timer Mode (TMOD), dan Timer
Control (TCON).
Serial Port Register
Serial Port register merupakan register yang digunakan dalam proses komunikasi
serial. Register ini meliputi Serial Data Buffer (SBUFF) dan
Serial Port Control (SCON).
Interrupt Register
Interrupt register merupakan register yang digunakan untuk mengatur proses
interrupt. Register ini meliputi Interrupt Enable (IE) dan Interrupt Priority (IP).
DiktatSistem Mikrokontroler
DiktatSistem Mikrokontroler
Bit
P3.0
Nama
RXD
P3.1
TXD
P3.2
P3.3
P3.4
P3.5
P3.6
P3.6
T0
T1
Fungsi Lain
Jalur penerimaan data pada komunikasi
serial
Jalur pengiriman data pada komunikasi
serial
External Interrupt 0
External Interrupt 1
Timer/Counter 0 External Input
Timer/Counter 1 External Input
External data memory write strobe
External data memory read strobe
PSEN
Program Store Enable ( PSEN) merupakan jalur kontrol untuk mengakses
external program memory. PSEN umumnya dihubungkan dengan output
enable pada external memory. PSEN akan bernilai low pada saat pembacaan
program dari external memory. PSEN akan bernilai high pada saat pembacaan
program dari internal memory.
ALE
Address Latch Enable (ALE) berfungsi sebagai demultiplexer pada saat port 0
bekerja sebagai multiplexed address/data bus.
EA
External Access ( EA) merupakan pin yang berfungsi sebagai input kontrol.
Jika EA bernilai low, maka program hanya akan dijalankan dari external
program memory. Jika EA bernilai high, maka program akan dijalankan dari
internal program memory.
RST
Pin ini berfungsi sebagai input untuk melakukan reset terhadap MCS-51. Jika
RST bernilai high selama minimal 2 machine cycle, MCS-51 akan di-reset dan
nilai internal register akan dikembalikan seperti keadaan awal pada saat MCS51 baru mulai bekerja.
OSC (On-Chip Oscillator)
Koneksi dengan on-chip oscillator terdiri dari dua pin yaitu XTAL1 dan XTAL2.
Pin XTAL1 merupakan input bagi inverting oscillator amplifier yang terdapat
dalam IC MCS-51. Pin XTAL2 merupakan output dari inverting oscillator
amplifier tersebut.
Dalam mikrokontroler dikenal istilah Machine Cycle (MC) / Siklus Mesin,
dimana : 1 MC= 6 state = 12 periode clock. Jika frekuensi crystal yang
digunakan adalah 12 MHz maka 1 MC = 12/frekuensi crystal = 12/12 MHz
=1uS
DiktatSistem Mikrokontroler
DiktatSistem Mikrokontroler
Perangkat
8 buah PORT I/O
1 Buah RAM 2 KB (11 bit Alamat)
Pada pemetaan diatas ketika MCS51 mengakses alamat 800h maka data yang terhubung
ke Bus data adalah data dari/ke perangkat memori. Misalkan MCS51 mengeluarkan
alamat 800h dan data 40h maka data 40h tersebut akan dikirimkan ke perangkat
DiktatSistem Mikrokontroler
memori bukan port I/O. Contoh lainya, misalkan MCS51 mengeluarkan alamat 35h dan
data 23h maka data 23h tersebut akan dikeluarkan melalui Port I/O (8 LED) bukan ke
perangkat lain.
Pendekodean alamat akses memori:
Pada kasus ini alamat memori yang digunakan 800h s/d FFFh
A15
0
0
0
A14
0
0
0
A13
0
0
0
A12
0
0
0
A11
1
1
1
A10
0
x
1
A9
0
x
1
A8
0
x
1
A7
0
x
1
A6
0
x
1
A5
0
X
1
A4
0
x
1
A3
0
x
1
A2
0
x
1
A1 A0
0
0 800h
x
x
s/d
1
1
FFFh
x => 0 atau 1
Perhatikan bit alamat A0-A10 mengalami perubahan jika MCS 51 mengakses lokasi
alamat dari 800h sampai FFFh. Sehingga bit alamat A11-A15 yang digunakan untuk
proses pendekodean alamat.
A15 A14 A13 A12 A11
0
0
0
0
1
Ketika MCS51 mengeluarkan alamat dengan kondisi A11-A15 seperti pada tabel maka
MCS51 akan mengakses data dari memori dengan lokasi sesuai nilai alamat yang
ditunjukan oleh A0-A10.
Proses pendekodean alamat memori dilakukan dengan memperhatikan bit A11-A15. Bitbit alamat ini diinputkan ke rangkaian pendekodean yang dirancang sedemikian rupa
agar ketika bit alamat A11-A15 pada kondisi seperti tabel diatas, maka keluaran dari
rangkaian decoder akan meng-aktifkan IC memori yang terhubung melalui pin CE atau
CS atau OE tergantung IC memori yang digunakan.
A14
0
0
0
A13
0
0
0
A12
0
0
0
A11
0
0
0
A10
0
0
0
A9
0
0
0
A8
0
0
0
A7
0
0
0
A6
0
0
0
A5
1
1
1
A4
1
1
1
A3
0
0
0
A2 A1 A0
0
0
0
30h
x
x
x
s/d
1
1
1
37h
x => bisa 0 atau 1
Sama seperti pendekodean alamat akses memori, dari tabel diatas terlihat bit alamat A4
A15 tidak berubah ketika MCS51 mengakses 8 Port I/O.
Sehingga bit penentu alamat akses memori dan 8 Port I/O tersebut dapat dilihat pada
tabel berikut:
A15
0
A14
0
A13
0
A12
0
A11
0
A10
0
A9
0
A8
0
A7
0
A6
0
A5
1
A4
1
A3
0
A2
-
A1
-
A0
-
30h37h
800hFFFh
Perhatikan nomor bit alamat yang dilingkari, bit A11-A13 digunakan untuk membedakan
pengaksesan memori 800h-FFFh (001) atau pengaksesan Port 30h-37h (000) sedangkan
bit A0-A2 digunakan menentukan Port mana yang dipilih dari 8 buah port yang ada
(000-111) yaitu port 30h s/d 37h. Sementara itu bit lainnya dihubung ke gerbang logika
atau dihubungkan langsung ke IC dekoder 74LS138. Bentuk rangkaiannya dapat dilihat
pada gambar berikut:
DiktatSistem Mikrokontroler
DiktatSistem Mikrokontroler
Untuk melakukan antar muka PORT I/O ke MCS51 sebagai jalur input, biasanya
digunakan sebuah IC Buffer Bidireksional 74LCS245. Prinsip kerja IC ini adalah
melewatkan data dari A ke B atau sebaliknya. Arah perpindahan data ditentukan dari pin
input AB/BA. Jika pin ini diberi logika 0 maka arah perpindahan data adalah dari B ke A,
sebaliknya jika pin ini diberi logika 1 maka arah data adalah dari A ke B. Pin CE
digunakan sebagi pengaktif chip (Chip Enable) ketika CE bernilai 0 maka IC 74LS245
dapat berfungsi, jika CE bernilai 1 maka IC 74LS245 tidak berfungsi (non-aktif).
Perhatikan gambar berikut :
DiktatSistem Mikrokontroler
DiktatSistem Mikrokontroler
DiktatSistem Mikrokontroler
Untuk mendeklarasikan konstanta penulisannya adalah sebagai berikut:
[#define] [nama konstanta] [nilai konstanta]
Contoh:
#define phi 3.14
#define data_led 0xFF
Selain variabel dan konstanta kita juga dapat mendeklarasikan sebuah
variabel data dari sebuah PORT I/O atau Memori External dengan
alamat tertentu. Yaitu dengan cara mengalokasikan lokasi memori
/alamat PORT I/O secara manual menggunakan kata kunci xdata
at(alamat)
Contoh penggunaan xdata at(0x4002)
#include <at89x51.h>
xdata at(0x4002) unsigned char PORT_LED;
unsigned char data_led
void main(){
PORT_LED = 0x40;
}
Pada contoh program diatas, alamat 0x4002 dialokasikan sebagai alamat
PORT_LED.Alamat external ini merupakan alamat yang dikeluarkan melaui
Bus Alamat dari MCS51.
Tipe data yang harus digunakan untuk
mendeklarasikan sebuah PORT adalah unsigned char.
Contoh
menuliskan/mengeluarkan data ke sebuah PORT Output
[nama_port] = [data_port]
PORT_LED = 0x40;
membaca data dari sebuah PORT Input
[variabel_data] = [nama_port]
data_led = PORT_LED;
Struktur Percabangan
Struktur percabangan digunakan untuk memilih atau menyeleksi kondisi yang
dipersyaratkan dalam mengeksekusi perintah dalam pemrograman.
Bentuk penulisannya
If (kondisi1) {perintah1 } else{perintah2}
if(a==0xff){
b=0x1f;
}else{
b=0x00;
}
Jika kondisi1 terpenehi maka barisan perintah1 dieksekusi, jika kondisi1 tidak
terpenuhi maka barisan perintah2 yang dieksekusi.
DiktatSistem Mikrokontroler
If (kondisi1){perintah1} else if(kondisi2) {perintah2}
if(a==0xff){
b=0x1f;
}else if(a==0x00){
b=0x00;
}
Jika kondisi1 terpenuhi maka barisan perintah1 dieksekusi, jika kondisi1 tidak
terpenuhi tetapi kondisi2 terpenuhi maka barisan perintah2 yang dieksekusi.
if (kondisi1){perintah1}else if(kondisi2){pernitah2}
else{perintah3}
if(a==0xff){
b=0x1f;
}else if(a==0x00){
b=0x00;
}else{
b = 0xff;
}
Jika kondisi1 terpenuhi maka barisan perintah1 dieksekusi, jika kondisi1 tidak
terpenuhi tetapi kondisi2 terpenuhi maka barisan perintah2 yang dieksekusi,
dan jika tidak ada kondisi yang terpenuhi maka barisan perintah3 yang
dieksekusi.
Struktur Perulangan
Struktur perulangan digunakan untuk mengeksekusi barisan perintah secara
berulang sesuai dengan kondisi atau jumlah perulangan yang dipersyaratkan.
Perulangan dengan for
Pada Perulangan ini looping dilakukan sesuai dengan jumlah yang
ditentukan. Contoh:
for (n=0;n<10;n++){
b= b+1;
}
Baris perintah b=b+1akan dieksekusi berulang kali. Dimana
perulangan eksekusi dilakukan sebanyak 10 kali dari n = 0 (kondisi
awal) s/d n = 9 (kondisi akhir n<10). Nilai n akan dinaikkan setiap
perulagan (n++)
for (n=10;n>0;n--){
b= b+1;
}
Baris perintah b=b+1 akan dieksekusi berulangkali .dimana
perulangan eksekusi dilakukan sebanyak 10 kali dari n = 10 (kondisi
awal) s/d n = 1 (kondisi akhir n > 0).nilai n akan berkurang setiap
perulangan (n--).
Perulangan dengan while
Perulangan jenis ini kan melakukan looping selama kondisi yang
dipersyaratkan terpenuhi.
DiktatSistem Mikrokontroler
Contoh
PORT_LED2 = 0xFF;
while(data_led !=0xFF){
data_led = PORT_LED1;
}
PORT_LED2 = 0x00;
Kondisi awal PORT_LED2 adalah 0xFF kemudian program akan
melakukan perulangan while(). Pada perulangan ini program akan
mengeksekusi perintah data_led = PORT_LED1 atau perintah
membaca data pada PORT_LED1 berulangkali. Selama data_led tidak
sama (!=) dengan 0xFF maka perulangan akan terus terjadi.
ketikadata_led=0xFF maka perulangan akan berhenti. Dan program
akan lanjut ke baris perintah dibawahnya yaitu perintah PORT_LED2 =
0x00.
Fungsi dan Subrutin
Fungsi adalah blok program yang digunakan untuk melakukan sekumpulan
instruksi akan mengembalikan nilai tertentu setelah semua instruksi
dilaksanakan.
Subrutin adalah blok program yang digunakan untuk melakukan sekumpulan
instruksi tertentu. Perbedaannya dengan fungsi adalah subrutin hanya
menjalankan sekumpulan instruksi dan tidak mengembalikan nilai tertentu.
//contoh subrutin
void counter_up(){
counter++;
}
//contoh fungsi
int kalikan(int ct){
int temp;
temp = 2 * ct;
return temp; //pengembalian nilai
}
Prototype fungsi dan subrutin
Jika sebuah penulisan kode fungsi atau subrutin berada dibawah program
utama (subrutin main()), agar fungsi atau subrutin tersebut dapat dipanggil
oleh program utama maka perlu dilakukan deklarasi fungsi/subrutin atau yang
disebut dengan prototype. Perhatikan contoh berikut:
#include <at89x51.h>
int hasil = 0;
int counter = 0;
int kalikan(int); //prototype fungsi kalikan
void counter_up(); //prototype subrutin counter_up
void main(){
counter_up();
hasil = kalikan(counter);
}
void counter_up(){
counter++;
}
int kalikan(int ct){
int temp;
temp = 2 * ct;
return temp;
}
DiktatSistem Mikrokontroler
Operasi relasional (perbandingan)
Sama dengan : ==
Tidak sama dengan : !=
Lebih besar : >
Lebih besar sama dengan : >=
Lebih kecil : <
Lebih kecil sama dengan : <=
Operasi aritmatika
+ , , * , / : tambah,kurang,kali,bagi
+= , -= , *= , /= : nilai di sebelah kiri operator di tambah/kurang/kali/bagi
dengan nilai di sebelah kanan operator
% : sisa bagi
++ , : tambah satu (increment) , kurang satu (decrement)
Contoh :
a = 5 * 6 + 2 / 2 -1 ;
maka nilai a adalah 30 a *= 5 ;
jika nilai awal a adalah 30, maka nilai a = 305 = 150. a += 3 ;
jika nilai awal a adalah 30, maka nilai a = 30+5 = 33. a++ ;
jika nilai awal a adalah 5 maka nilai a = a+1 = 6. a ;
jika nilai awal a adalah 5 maka nilai a = a-1 = 4.
Operasi logika dan biner Logika
Logika AND :&&
Logika NOT : !
Logika OR : ||
Biner AND : &
Biner OR : |
Biner XOR : ^
Shift right biner: >>
Shift left biner : <<
Komplemen : ~
Beberapa struktur dan elemen bahasa C lainnya dapat dilihat pada literatur
yang ada baik di-internet maupun di buku.
DiktatSistem Mikrokontroler
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
x
1
0
x
1
0
x
1
0
x
1
0
x
1
0
x
1
0
x
1
0
x
1
0
x
1
0
x
1
0
x
1
0x0000
RAM 2KB
0x07FF
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
x
1
0
x
1
0
x
1
0x1200
8 PORT
0x1207
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
x
1
0
x
1
0
x
1
0x1300
8 PORT
0x13007
DiktatSistem Mikrokontroler
APLIKASI LED
Aplikasi Running LED
Berikut ini adalah aplikasi running led dengan menggunakan PORT I/O pada alamat
1200H. Rangkaian LED dan PORT I/O yang digunakan, dapat dilihat pada gambar
berikut :
DiktatSistem Mikrokontroler
Aplikasi Led dan Input Switch
Pada aplikasi berikut digunakan 2 buah PORT yang berbeda, salah satu PORT
digunakan sebagai jalur input dan PORT lainnya sebagai jalur Output. PORT input
digunakan untuk membaca data switch, sedangkan PORT Output digunakan untuk
display 8 led yang merepresentasikan kondisi switch. Berikut rangkaian aplikasinya
DiktatSistem Mikrokontroler
APLIKASI 7 SEGMEN
Untuk mempermudah display data dengan 7 segmen,biasanya digunakan komponen
dekoder BCD to 7 Segmen. Dekoder yang digunakan adalah IC 7447. Prinsip utama dari
dekoder ini adalah mendekodekan data BCD ke data display 7 segmen common katoda.
Data BCD yang digunakan untuk 1 buah dekoder 7 segmen adalah 4 bit yang mewakili
angka 0 sampai 9. Contoh rangkaian aplikasi seven segmen dapat dilihat pada gambar
berikut:
DiktatSistem Mikrokontroler
Program Aplikasi Menampilkan angka ke Seven Segmen
#include <at89x51.h>
typedef unsigned char ubyte;
xdata at(0x1202) ubyte PORT_7SEG;
ubyte angka ;
ubyte data_seg;
void delay (int);
void main(){
angka = 34;
data_seg = (angka / 10)*16 + (angka % 10);
PORT_7SEG = data_seg;
delay(800);
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m<0xFF;m++){}
temp--;
}
}
Program Aplikasi Counting Up dengan display 7 segmen
#include <at89x51.h>
typedef unsigned char ubyte;
xdata at(0x1202) ubyte PORT_7SEG;
ubyte angka ;
ubyte data_seg;
void delay (int);
void main(){
while(1){
if (angka > 99){angka = 0;}
data_seg = (angka / 10)*16 + (angka % 10);
PORT_7SEG = data_seg;
angka++;
delay(800);
}
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m<0xFF;m++){}
temp--;
}
}
DiktatSistem Mikrokontroler
KEYPAD 4x3
Proses scaning keypad dilakukan untuk setiap kolom C0-C2 dengan memberikan logika
0 pada kolom yang akan diaktifkan dan memberikan logika 1 pada kolom lainya.
Kemudian membaca data pada baris R0-R3.Jika terjadi penekanan tombol pada keypad
maka tombol yang ditekan dapat diketahui dengan melihat baris dan kolom yang
berlogika 0.
C1
1
1
1
1
0
0
0
0
1
1
1
1
C2
1
1
1
1
1
1
1
1
0
0
0
0
R0
0
1
1
1
0
1
1
1
0
1
1
1
R1
1
0
1
1
1
0
1
1
1
0
1
1
R2
1
1
0
1
1
1
0
1
1
1
0
1
R3
1
1
1
0
1
1
1
0
1
1
1
0
KEY
1
4
7
*
2
5
8
0
3
6
9
#
Keterangan
Kolom 0 Aktif
Kolom 1
Aktif
Kolom 2
Aktif
DiktatSistem Mikrokontroler
Program Aplikasi:
Scanning Keypad dengan display 7 Segmen (gambar 16)
#include <at89x51.h>
typedef unsigned char ubyte;
xdata at(0x1204) ubyte PORT_BARIS ;
xdata at(0x1205) ubyte PORT_KOLOM ;
xdata at(0x1202) ubyte PORT_7SEG;
ubyte tabel_key[3][4];
ubyte scan_keypad();
void init_tabel_keypad();
void delay(int);
void main(){
ubyte key;
init_tabel_keypad();
while(1){
key = scan_keypad();
if (key !=0xFF){
PORT_7SEG = key;
}
delay(80);
}
}
DiktatSistem Mikrokontroler
ubyte scan_keypad(){
ubyte k;
ubyte data_kolom;
ubyte data_baris;
ubyte s_key= 0xFF;
for (k =0;k<3;k++){
data_kolom = (0x01 << k) ^ 0xFF;
PORT_KOLOM = data_kolom;
data_baris = PORT_BARIS;
data_baris = data_baris & 0x0F;
if (data_baris !=0x0F){
if(data_baris ==0x0E){
s_key = tabel_key[k][0];
}else if(data_baris == 0x0D){
s_key = tabel_key[k][1];
}else if(data_baris == 0x0B){
s_key = tabel_key[k][2];
}else if(data_baris == 0x07){
s_key = tabel_key[k][3];
}
while(data_baris !=0x0F){
data_baris = PORT_BARIS;
data_baris = data_baris & 0x0F;
}
return s_key;
}
}
return s_key;
}
void init_tabel_keypad(){
//tabel_key[kolom][baris]
tabel_key[0][0] = 1;
tabel_key[0][1] = 4;
tabel_key[0][2] = 7;
tabel_key[0][3] = 10; //tanda *
tabel_key[1][0]
tabel_key[1][1]
tabel_key[1][2]
tabel_key[1][3]
=
=
=
=
2;
5;
8;
0;
tabel_key[2][0]
tabel_key[2][1]
tabel_key[2][2]
tabel_key[2][3]
=
=
=
=
3;
6;
9;
11; //tanda #
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m<0xFF;m++){}
temp--;
}
}
DiktatSistem Mikrokontroler
Fungsi ubyte scan_keypad()akan melakukan scanning keypad mulai dari kolom 0
sampai kolom 3. Setiap kali melakukan scanning pada kolom , MCS51 akan
mengeluarkan logic 0 pada kolom tersebut dan logic 1 pada kolom lainya.Data kolom
dikeluarkan melalui PORT_KOLOM (0x1205). Kemudian dilakukan pengecekan pada
setiap barisnya, melalui pembacaan PORT_BARIS (0x1204). Setiap pasangan kolom dan
baris disesuaikan dengan tabel_key[3][4]. Fungsi ini akan mengembalikan sebuah nilai
dari tombol yang ditekan ke variable key dari program utama.
DiktatSistem Mikrokontroler
Pada dasarnya akses dari microcontroller ke Modul LCD ini terdiri dari 4 jenis sebagai
berikut:
Pengiriman Instruksi Register
Pembacaan Address Counter dan Busy Flag
Pengiriman Data Register
Pembacaan Data Register
Register
LCD mempunyai dua buah Register yang aksesnya diatur dengan menggunakan kaki RS.
Pada saat RS berlogika 0, maka register yang diakses adalah Register Perintah dan pada
saat RS berlogika 1, maka register yang diakses adalah Register Data
DiktatSistem Mikrokontroler
Register Perintah
Register ini adalah register di mana perintah-perintah dari mikrokontroler ke HD44780
pada saat proses penulisan data atau tempat status dari HD44780 dapat dibaca pada
saat pembacaan data.
Penulisan Data ke Register Perintah
Penulisan data ke Register Perintah dilakukan dengan tujuan mengatur tampilan LCD,
inisialisasi dan mengatur Address Counter maupun Address Data. Gambar 17
menunjukkan proses penulisan data ke register perintah dengan menggunakan mode 4
bit interface. Kondisi RS berlogika 0 menunjukkan akses data ke Register Perintah. RW
berlogika 0 yang menunjukkan proses penulisan data akan dilakukan. Data instruksi
dikirimkan dengan diawali pulsa logika 1 pada sinyal E Clock dan dalam selang waktu
yang singkat sinyal E di kembalikan ke logika 0.
Register Data
Register ini adalah register di mana mikrokontroler dapat menuliskan atau membaca
data ke atau dari DDRAM. Penulisan data pada register ini akan menempatkan data
tersebut ke DDRAM sesuai dengan alamat yang telah diatur sebelumnya.
Penulisan Data ke Register Data
Penulisan data pada Register Data dilakukan untuk mengirimkan data yang akan
ditampilkan pada LCD. Proses diawali dengan adanya logika 1 pada RS yang
menunjukkan akses ke Register Data, kondisi R/W diatur pada logika 0 yang
menunjukkan proses penulisan data. Data karakter dikirimkan dengan diawali pulsa
logika 1 pada sinyal E Clock dan dalam selang waktu yang singkat sinyal E di kembalikan
ke logika 0.
DiktatSistem Mikrokontroler
Gambar 18. Interfacing LCD pada PORT 1206H dan PORT 1207H
Program Aplikasi:
Menampilkan Tulisan LCD-MCS51 pada baris pertama
#include <at89x51.h>
typedef unsigned char ubyte ;
xdata at(0x1206) ubyte PORT_LCD_DATA;
xdata at(0x1207) ubyte PORT_LCD_CTL;
//D0-D7 => PORT_LCD_DATA
//PORT_LCD_CTL: bit0-E bit1-RS bit2-RW
#define
#define
#define
#define
funcset
clrscreen
displayon_cursoroff
cursor_inc
0x38
0x01
0x0C
0x06
void kirim_karakter(ubyte);
void kirim_instruksi(ubyte);
void delay(int);
void main(){
//inisialisasi lcd
kirim_instruksi(funcset);
kirim_instruksi(clrscreen);
kirim_instruksi(displayon_cursoroff);
kirim_instruksi(cursor_inc);
kirim_instruksi(0x80); //posisikan cursor kolom 0 baris 0
//kirim karkater
kirim_karakter('L');
kirim_karakter('C');
kirim_karakter('D');
kirim_karakter('-');
kirim_karakter('M');
kirim_karakter('C');
kirim_karakter('S');
DiktatSistem Mikrokontroler
kirim_karakter('5');
kirim_karakter('1');
}
void kirim_instruksi(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
PORT_LCD_CTL = 0x01; //E = 1 RS 0 RW 0;
delay(5);
PORT_LCD_CTL = 0x00; //E = 0 RS 0 RW 0;
delay(5);
}
void kirim_karakter(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
delay(5);
PORT_LCD_CTL = 0x03; //E 1 RS 1 RW 0;
delay(5);
PORT_LCD_CTL = 0x02; //E 0 RS 1 RW 0;
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m<0xFF;m++){}
temp--;
}
}
Subruitn kirim_instruksi() digunakan untuk mengirimkan perintah ke register perintah
LCD. Jenis perintah yang dikirimkan dapat dilihat pada table instruksi LCD.sedangkan
fungsi kirim_karakater() digunakan untuk mengirimkan data karakter ke register data
sesuai dengan counter alamat atau posisi cursor. Pada program aplikasi diatas posisi
cursor dinaikkan setiap kali mengirimkan data karakter ke LCD ini dikarenakan adanya
data instruksi cursor_inc (0x06).
Program Aplikasi:
Menampilkan Tulisan POLITEKNIK pada baris pertama dan
Tulisan JAMBI pada baris kedua.
#include <at89x51.h>
#include <string.h>
typedef unsigned char ubyte ;
xdata at(0x1206) ubyte PORT_LCD_DATA;
xdata at(0x1207) ubyte PORT_LCD_CTL;
//D0-D7 => PORT_LCD_DATA
//PORT_LCD_CTL: bit0-E bit1-RS bit2-RW
#define
#define
#define
#define
#define
funcset
0x38
clrscreen
displayon_cursoroff
cursor_inc
shifentry_left
0x01
0x0C
0x06
0x05
void kirim_karakter(ubyte);
void kirim_instruksi(ubyte);
DiktatSistem Mikrokontroler
void kirim_string(char *str);
void delay(int);
void main(){
//inisialisasi lcd
kirim_instruksi(funcset);
kirim_instruksi(clrscreen);
kirim_instruksi(displayon_cursoroff);
kirim_instruksi(cursor_inc);
kirim_instruksi(0x80); //posisikan cursor kolom 0 baris 1
kirim_string("POLITEKNIK");
kirim_instruksi(0xC0); //posisikan cursor kolom 0 baris 2
kirim_string("JAMBI");
}
void kirim_instruksi(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
PORT_LCD_CTL = 0x01; //E = 1 RS 0 RW 0;
delay(5);
PORT_LCD_CTL = 0x00; //E = 0 RS 0 RW 0;
delay(5);
}
void kirim_karakter(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
delay(5);
PORT_LCD_CTL = 0x03; //E 1 RS 1 RW 0;
delay(5);
PORT_LCD_CTL = 0x02; //E 0 RS 1 RW 0;
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m<0xFF;m++){}
temp--;
}
}
void kirim_string(char *str){
ubyte n;
if (str[n]!=0){
kirim_karakter(str[n]);
}
}
Program aplikasi ini sama seperti program aplikasi LCD sebelumnya hanya saja ada
penambahan subrutin kirim_string() yang berfungsi untuk mengirimkan satu-persatu
karakter yang diinputkan melalui variable str.
DiktatSistem Mikrokontroler
DiktatSistem Mikrokontroler
Resolusi ADC untuk permisalan di atas mempunyai arti seperti ditunjukkan padsa tabel
berikut:
Tabel Tegangan Resolusi ADC 0804 untuk Tegangan Maks 4 Volt
Vin (Volt)
Data Digital
Data Desimal
(biner)
0
00000000
0
0,0156
00000001
1
0,0313
00000010
2
...
...
...
4
11111111
255
ADC ini dapat dirangkai untuk menghasilkan konversi secara kontinu.Untuk
melaksanakannya, kita harus menghubungkan CS, dan RD ke ground dan
menyambungkan WR dengan INTR seperti pada gambar dibawah ini. Maka dengan ini
keluaran digital yang kontinu akan muncul, karena sinyal INTR menggerakkan masukan
WR. Pada akhir konversi INTR berubah menjadi low, sehingga keadaan ini akan mereset
konverter dan mulai konversi.
Untuk membaca nilai tegangan Input (Vin) dapat menggunakan Rumus Berikut:
DiktatSistem Mikrokontroler
Program Aplikasi Menampilkan data ADC Pada LED (PORT LED gambar 13)
#include <at89x51.h>
typedef unsigned char ubyte ;
xdata at(0x1302) ubyte PORT_ADC;
xdata at(0x1200) ubyte PORT_LED;
//P1.5 RD adc
//P1.6 WR adc
//P1.7 INTR adc
#define RD_ADC P1_5
#define WR_ADC P1_6
#define INT_ADC P1_7
ubyte data_adc;
void delay(int);
void main(){
while(1){
WR_ADC = 0;
while(INT_ADC==0){}
WR_ADC = 1;
RD_ADC = 0;
data_adc = PORT_ADC;
RD_ADC = 1;
PORT_LED = data_adc;
delay(1000);
}
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m<0xFF;m++){}
temp--;
}
}
Langkah langkah membaca data ADC 0804
- Sinyal WR di set logika 0
- Tunggu sampai konversi selesai atau tunggu pin INTR berlokgika 0
- Sinyal WR di set logika 1
- Sinyal RD di set logika 0
- Baca data dari keluaran D0-D7 dari ADC
- Setelah data di baca sinyal RD di set kembali ke logika 1
DiktatSistem Mikrokontroler
Program Aplikasi Menampilkan data ADC Pada LCD (PORT LCD gambar 18)
#include
#include
#include
#include
#include
#include
<at89x51.h>
<stdlib.h>
<math.h>
<string.h>
<float.h>
<float_str.h>
typedef unsigned
xdata at(0x1302)
xdata at(0x1206)
xdata at(0x1207)
char ubyte ;
ubyte PORT_ADC;
ubyte PORT_LCD_DATA;
ubyte PORT_LCD_CTL;
//P1.5 RD adc
//P1.6 WR adc
//P1.7 INTR adc
#define RD_ADC P1_5
#define WR_ADC P1_6
#define INT_ADC P1_7
#define
#define
#define
#define
funcset
0x38
clrscreen
0x01
displayon_cursoroff
cursor_inc
0x06
0x0C
void kirim_karakter(ubyte);
void kirim_instruksi(ubyte);
void delay(int);
ubyte read_adc();
void init_lcd();
void kirim_string(char *str);
ubyte
float
float
ubyte
str_adc[16];
VMAX = 5;
VIN;
ADC;
void main(){
init_lcd();
while(1){
ADC = read_adc();
VIN = __uchar2fs(ADC);
VIN = __fsdiv(VIN * VMAX,255);
float2str(VIN, str_adc);
kirim_instruksi(0x01);
kirim_instruksi(0x80);
kirim_string(str_adc);
kirim_string(" Volt");
delay(500);
}
}
ubyte read_adc(){
ubyte data_adc;
WR_ADC = 0;
while(INT_ADC==0){}
WR_ADC = 1;
RD_ADC = 0;
data_adc = PORT_ADC;
RD_ADC = 1;
return data_adc;
}
DiktatSistem Mikrokontroler
void init_lcd(){
kirim_instruksi(funcset);
kirim_instruksi(clrscreen);
kirim_instruksi(displayon_cursoroff);
kirim_instruksi(cursor_inc);
kirim_instruksi(0x80); //posisikan cursor kolom 0 baris 0
}
void kirim_instruksi(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
PORT_LCD_CTL = 0x01; //E = 1 RS 0 RW 0;
delay(5);
PORT_LCD_CTL = 0x00; //E = 0 RS 0 RW 0;
delay(5);
}
void kirim_karakter(ubyte data_lcd){
PORT_LCD_DATA = data_lcd;
delay(5);
PORT_LCD_CTL = 0x03; //E 1 RS 1 RW 0;
delay(5);
PORT_LCD_CTL = 0x02; //E 0 RS 1 RW 0;
}
void kirim_string(char *str){
ubyte n;
for (n = 0;n <strlen(str);n++){
if (str[n]!=0){
kirim_karakter(str[n]);
}
}
}
void delay(int n){
int temp;
ubyte m;
temp = n;
while(temp > 0){
for (m=0;m<0xFF;m++){}
temp--;
}
}
Prinsip program aplikasi diatas adalah menampilkan data adc yang di konversikan ke nilai tegangan yang sesuai
dengan rumus konversi ADC , kemudian hasil perhitungan ini di tampilkan ke LCD.
Sebelum program aplikasi dibuat buatlah terlebih dahulu library float_str.h.Isi library float_str.h adalah sebagai
berikut:
void float2str(float n , unsigned char *str){
long temp;
float f_bulat;
float f_pecahan;
unsigned char pre = 5;
unsigned char i ;
unsigned char j ;
unsigned char str1[16];
unsigned char str2[16];
for (i = 0; i < 16;i++){
str[i] = 0;
}
j = 0;
if (n < 0){
str[j] = '-';
j++;
}
DiktatSistem Mikrokontroler
n = fabsf(n);
f_bulat = floorf(n);
temp = __fs2slong(f_bulat);
_ltoa(temp,str1,10);
for(i = 0; i < strlen(str1); i++){
str[j] = str1[i];
j++;
}
n = n-f_bulat;
str[j] = '.';
j++;
if (n < 0.1){
str[j] = '0';
j++;
}else if(n<0.01){
str[j] = '0';
j++;
str[j] = '0';
j++;
}
else if(n<0.001){
str[j] = '0';
j++;
str[j] = '0';
j++;
str[j] = '0';
j++;
}else if (n <0.0001){
str[j] = '0';
j++;
str[j] = '0';
j++;
str[j] = '0';
j++;
str[j] = '0';
j++;
}
else if (n <0.00001){
str[j] = '0';
j++;
str[j] = '0';
j++;
str[j] = '0';
j++;
str[j] = '0';
j++;
str[j] = '0';
j++;
n = 0.0000000;
}
if (n > 0.0000000){
f_pecahan = n * 1000000;
temp = __fs2slong(f_pecahan);
_ltoa(temp, str2,10);
for (i=strlen(str2)-1;i>=pre;i--){
if(str2[i]>=('0'+5)){
str2[i-1]+=1;
}
}
for (i=0; i<pre;i++){
str[j] = str2[i];
j++;
}
}
DiktatSistem Mikrokontroler
Simpan kode library diatas sebagai file header (*.h) dengan nama float_str.h simpan ke directori tempat
program aplikasi ADC disimpan. Fungsi library ini adalah untuk mengkonversikan bilangan decimal (float) ke
bentuk string, sehingga dapat di tampilkan ke LCD.