Anda di halaman 1dari 28

Nama : Wahyu Aji Suseetyo

Kelas : 2EB
Subject : Laporan Praktikum Mikrokontroler 1

PERCOBAAN 1
Aplikasi Port Sebagai Output Menggunakan LED

A. PROGRAM PERCOBAAN 1
1. Membuat LED menyala semua

#include <mega32.h>
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
while (1)
{
PORTA=0xff;
};
}

Analisa Program :
Pada program 1 ini dapat dianalisa bahwa LED dapat menyala semua karena PORT A menghasilkan
output 0xFF dalam bentuk bilangan heksa yang berarti LED 0-7 akan menyala semua karena bilangan
FF dalam benttuk bilangan biner yitu 11111111 ataupun PORT A dapat menggunakan bilangan biner
0b11111111.

2. Membuat LED menyala kedip

#include <mega32.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
while (1)
{
PORTA=0xFF;
delay_ms(100);
PORTA=0X00;
delay_ms(100);
};
}
Analisa Program:
Pada program 2 ini dapat dianalisa bahwa LED dapat menyala kedip karena PORT A menghasilkan
output 0xFF yang berarti LED menyala semua kemudian diteruskan dengan delay yang berarti memiliki
jeda waktu yang akan dilanjutkan dengan PORT A menghasilkan output 0x00 yang berarti LED padam
semua dan dilanjutnya dengan delay juga. Jika siklus ini terus menerus, maka LED akan terlihat
menyala kedip.

3. Membuat LED menyala berjalan

#include <mega32.h>
#include <delay.h>
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
while (1)
{
PORTA=0b00000001;
delay_ms(200);
PORTA=0b00000010;
delay_ms(200);
PORTA=0b00000100;
delay_ms(200);
PORTA=0b00001000;
delay_ms(200);
PORTA=0b00010000;
delay_ms(200);
PORTA=0b00100000;
delay_ms(200);
PORTA=0b01000000;
delay_ms(200);
PORTA=0b10000000;
delay_ms(200);
};
}

Analisa Program:
Pada program 3 ini dapat dianalisa bahwa LED dapat menyala berjalan dengan menjalankan program
secara terstruktur dengan menggunakan output PORT A menggunakan bilangan biner. Pertama-tama
program akan menjalankan output PORT A = 0b00000001 yang berarti LED 0 akan menyala. Lalu
selanjutnya program akan menjalankan delay yang berarti program memiliki jeda waktu sebelum
menjalankan program selnajujtnya. Lalu, ketika delay terpenuhi program akan dilanjutkan dengan
menjalankan PORT A = 0b00000010 yang berarti LED 1 akan menyala. Dan dilanjutkan dengan delay
jadi program ini akan menjalankan pogram secara berurtan/tersturkur, maka LED akan berjalan sesuai
dengan output PORT A dan membuat LED pada program 3 ini akan menyala berjalan terus-menerus.

4. Membuat LED menyala berjalan (secara matematis)

#include <mega32.h>
#include <delay.h>
#include <math.h>
void main(void)
{
int i,a;
PORTA=0xff;
DDRA=0xff;
while (1)
{
for (i=0;i<=7;i++)
{a=pow(2,i);
PORTA=~a;
delay_ms(500);}
};
}

Analisa Program:
Pada program 4 ini dapat dianalisa bahwa LED dapat menyala berjalan dengan program fungsi for
(i=0;i<=7;i++) yaitu ketika i=0, i lebih kecil dari sama dengan 7, Benar maka a=pow (2,0) maka output
PORT A= ~1. Lalu dilanjutkan dengan program delay ms jeda waktu, jika waktu sudah terpenuhi
program akan kembali ke fungsi for sampai i bernilai 7 maka a=pow(2,7) maka output PORT A= ~255.

5. Membuat Led menyala berjalan(metode geser bit)

#include <mega32.h>
void delay(int n)
{
int i;
for(i=0;i<n;i++)
{
int b;
for(b=0;b<=150;b++);
}
}
void kiri()
{
unsigned char a=0x7f;
int i;
for(i=0;i<8;i++)
{
a=((a<<1)|(a>>7)); // instruksi geser bit
PORTA=a;
delay(200);
}
}
void main(void)
{
DDRA=0xFF;
while (1)
{
kiri();
};
}
Analisa Program:
Pada program 4 ini dapat dianalisa bahwa LED dapat menyala berjalan dengan menjalankan program
secara terstruktur.pada program ini menggunkan operator shift register right dan shit register left,
a=((a<<1)|(a>>7)) yang berarti program instruksi fungsi for ini akan menjalanakan pergeseran
bit kerarah kanan sebanyak 7 kali dan pergeseran kekiri 1 kali lalu di(OR) kana tau dijumlahakan
maka itulah yang akan menjadi output PORT=a,proses ini akan terus berulang smpai fungsi or tidak
terpenuhi lagi atau sudah melwati syarat nilai yang telah ditentukan instruksi FOR,

6. Membuat LED menyala berjalan (metode lookup table)

#include <mega32.h>
#include <delay.h>
void main(void)
{
unsigned char led[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int a;
PORTA=0x00;
DDRA=0xFF;
while (1)
{
for (a=0;a<=7;a++)
{
PORTA = led[a];
delay_ms(200);
}
};
}

Analisa Program:
Pada program 6 ini menggunakan fungsi character, maka terlebih dahulu membuat isi dalam fungsi
tersebut. Pada program ini memiliki isi fungsi sebagai berikut 0x01,0x02,0x04,0x08,0x10,0x20,0x40,
0x80 yang berarti LED akan menyala sesuai dengan fungsi tersebut. Untuk memanggil fungsi kita dapat
menggunakan fungsi for (a=0;a<=7;a++) maka program akan berjalan ketika fungsi for (a=0;a<=7;a++)
terpenuhi dan PORT A akan menghasilkan output sesuai isi fungsi. Contoh, a=0, berarti 0 lebih kecil
dari sama dengan 7 maka PORT A akan memanggil isi fungsi 0x01 yang berarti LED 0 akan menyala.
Dan selanjutnya nilai a+1 maka a=1 jadi fungsi for akan dilanjutkan. Berarti a=1, 1 lebih kecil dari sama
dengan 7 maka for 1 akan memanggil isi fungsi 0x02 yang berarti LED 1 akan menyala. Dan
selanjutnya nilai a+1 maka a=2 jadi fungsi for akan dilanjutkan. Berarti a=2, 2 lebih kecil dari sama
dengan 7 maka for 2 akan memanggil isi fungsi 0x04 yang berarti LED 2 akan menyala. Dan
selanjutnya nilai a+1 maka a=3 jadi fungsi for akan dilanjutkan. Berarti a=3, 3 lebih kecil dari sama
dengan 7 maka for 3 akan memanggil isi fungsi 0x04 yang berarti LED 3 akan menyala. Dan
selanjutnya nilai a+1 maka a=4 jadi fungsi for akan dilanjutkan. Berarti a=4, 4 lebih kecil dari sama
dengan 7 maka for 4 akan memanggil isi fungsi 0x08 yang berarti LED 4 akan menyala.
Dan selanjutnya nilai a+1 maka a=5 jadi fungsi for akan dilanjutkan. Berarti a=5, 5 lebih kecil dari sama
dengan 7 maka for 5 akan memanggil isi fungsi 0x10 yang berarti LED 5 akan menyala.
Dan selanjutnya nilai a+1 maka a=6 jadi fungsi for akan dilanjutkan. Berarti a=6, 6 lebih kecil dari sama
dengan 7 maka for 6 akan memanggil isi fungsi 0x20 yang berarti LED 6 akan menyala.
Dan selanjutnya nilai a+1 maka a=7 jadi fungsi for akan dilanjutkan. Berarti a=7, 7 lebih kecil dari sama
dengan 7 maka for 7 akan memanggil isi fungsi 0x40 yang berarti LED 7 akan menyala.
Jadi, LED akan terlihat menyala berjalan secara terus-menerus.
TUGAS
A. Buatlah program LED menyala berselingan

#include <mega32.h>
#include <delay.h>

void main (void)


{
PORTA=0x00;
DDRA=0xFF;
while (1)
{
PORTA=0xAA;
delay_ms(200);
PORTA=0x55;
delay_ms(200);
};
}

Analisa Program:
LED dapat menyala berselingan dengan program yang dijalankan secara terstruktur, petama-tama POT
A akan menghasilkan output 0xAA atau 0b10101010 yang berarti LED 1 3 5 7 akan menyala dan
selanjutnya program akan menjalankan delay ms yang berarti program memiliki jeda waktu sebelum
melanjutkan program selanjutnya. Ketika waktu seudah terpenuhin program akan menjalankan program
selanjutnya yaitu PORT A akan menghasilkan output 0x55 atau 0b01010101 yang berarti LED 0 2 4 6
akan menyala, lalu dilanjutkan dengan delay. Maka, ketika program continue maka LED akan terlihat
menyala berselingan.

B. Buatlah program LED menyala flip-flop (4 mati dan hidup bergantian sebanyak 5 kali kemudian LED
padam semua)

#include <mega32.h>
#include <delay.h>
int i;
void main(void)
{
PORTA=0x00;
DDRA=0x0F;
while (1)
{
for(i=0;i<5;i++)
{
PORTA=0xF0;
delay_ms(300);
PORTA=0xFF;
delay_ms(300);
}
while(i==5)
{
PORTA=0;
}
};
}

Analisa Program:
Pada program ini lampu LED 4 5 6 7 akan mati karena DDRA=0x0F, berarti kita hanya dapat menyala
atau mematikan lampu LED 0 1 2 3.
Pada program ini menggunakan fungsi for(i=0;i<5;i++). Ketika i = 0 berarti 0 lebih kecil dari 5. Benar
maka program akan menjalankan
PORTA=0xF0;
delay_ms(300);
PORTA=0xFF;
delay_ms(300
yang berart lampu LED 0 1 2 3 akan menyala kedip lalu ketika program sudah selesai kembai lagi ke
fungsi for(i=0;i<5;i++), jadi program ini akan mengulang sebanyak 5 kali. Ketika sudah 5 kali lampu
LED akan padam semua karena ketika i sudah bernilai 5 maka while 5 sama dengan 5 maka output
PORT A akan menghasilkan 0.
. while(i==5)
{
PORTA=0;

C. Buatlah program LED geser kiri ke kanan sebanyak 5 kali kemudian kanan ke kirisebanyak 5 kali,
terus-menerus

#include <mega32.h>
#include <delay.h>

int a,b,c,d;
unsigned char ledA[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char ledB[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void kiri()
{
for (c=0;c<5;c++)
{
for (a=0;a<=7;a++)
{
PORTA = ledB[a];
delay_ms(200);
}
}
}
void kanan()
{
for (d=0;d<5;d++)
{
for (b=0;b<=7;b++)
{
PORTA = ledA[b];
delay_ms(200);
}
}
}

void main(void)
{
PORTA=0x00;
DDRA=0xFF;
while (1)
{
kiri();
kanan();
};
}
Analisa Program:
Pada program ini menggunukan fungsi for memamnggil fungsi for lainya yang terdapat ARRAY dalam
sebuah fungsi maka while(1) menjalankn ata8u memngil instruksi kiri() maka program yang akan mnjlan
void kiri () ,ketika c=0 dan 0 lebih kecil dari 5 maka benar fungsi for ini akan mnjlankan fungsi for lainnya
maka akan mnjlan fungsi for (a=0;a<=7;a++) lalu ketika a=0 dan 0 lebih kecil dari sama dengan 7 maka bnar
lalu program memmangil fungsi ARRAY PORT=ledB[0] maka ouput menjadi PORT A= 0X01 ,lalu proses
ini akan terus menerus samapi a=bernilai 7 denganmengsilkan ouput PORT A=0x80 maka led akan terlihart
berjlan dri kiri ke kanan ketika sudah selsai .proses ini akan mengulang kembali sampai c bernilai 5 yang
berarti proses ini akan terjadi selam 5 kali . lalu ketika fungus for sudah terpenuhu maka akan dilanjutkan ke
program slnjutnya yaitu void kanan() dan menjalan programnya yang mana program ini sama dengan void
kiri hnay berbeda isi dalam fungsi ARRAY tersebut .

D. Buatlah program LED menyala mencacah (counter) 8bit naik kemudian turun

#include <mega32.h>
#include <delay.h>

int a;

void main(void)
{
PORTA=0x00;
DDRA=0xFF;
while (1)
{
for(a=0;a<=255;a++)
{
PORTA=a;
delay_ms(70);
}
for(a=255;a>=0;a--)
{
PORTA=a;
delay_ms(70);
}
};
}

Analisa Program:
Pada program ini LED akan menyala mencacah (counter) 8bit secara naik kemudian turun. Pada
program ini menggunkan increment fungsi for(a=0;a<=255;a++). Lalu ketika a=0, apakah 0 lebih kecil
dari sama dengan 255? Benar , maka output PORT A=0 maka LED akan padam semua, lalu a + 1 maka
a=1, apakah 1 lebih kecil dari sama dengan 255? Benar, maka output PORT A=1 maka LED 0 akan
menyala, maka proses ini akan terus menerus sampai a bernilai 255 dan output PORT A=255 maka LED
akan menyala semua. Lalu ketika syarat for(a=0;a<=255;a++) tidak terpenuhi lagi maka program akan
melanjutkan ke program selanjutnya yaitu menjalankan program decrement for(a=255;a>=0;a--) yang
berarti ketika a=255 apakah 255 lebih besar dari sama dengan 0? Benar, maka output PORT A=255.
Lalu, a-1 maka a=254. Apakah 254 lebih besar dari sama dengan 0? Benar, maka output PORT A=254.
Maka proses ini akan terus menerus sampai a bernilai 0 dan output PORT A=0. Lalu ketika syarat
for(a=255;a>=0;a--) tidak terpenuhi lagi maka program akan melanjutkan ke program awal yang berarti
proses pada program ini akan terus menerus.

PERCOBAAN 2
Input Switch dan Output Menggunakan LED

A. Program Percobaan 2
1. Membuat LED menyala sesuai dengan kondisi switch

#include <mega8535.h>
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
DDRC=0x00;
while (1)
{
PORTA=PINC;
};
}

<>Analisa Program :
Pada program ini meembuat LED menyala sesuai dengan kondisi switch maka output PORT A sesuai
dengan input PIN C yang mana input PIN C didapat dari kondisi switch. Contoh, ketika switch 1 di on-
kan maka lampu LED 0 akan menyala atau ketika switch 2 di on-kan lampu LED 1 akan menyala
ataupun switch 1-8 di on-kan maka lampu LED 0-7 akan menyala sehingga lampu LED akan menyala
sesuai switch yang di on-kan.

2. LED menyala semua atau padam semua bergantung kondisi S1


#include <mega8535.h>
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
DDRC=0x00;
while (1)
{
if(PINC.0==1) PORTA=0;
else PORTA=255;
};
}

<>Analisa Program :
Pada program ini LED menyala semua atau padam semua bergntung pada S1 dengan menggunakan
fungsi if{else} yang berarti program menjalankan jika S1 dalam posisi OFF maka output PORT A=0
yang berarti LED padam semua, karena (Benar (PIN C 0==0)). Jika ((PIN C 0==1) Salah) maka output
PORT A=255 yang berarti LED menyala semua.

3. Membuat LED menyala berjaalan bergantung kondisi S2

#include <mega8535.h>
#include <delay.h>
#include <math.h>
void main(void)
{
int i,a;
PORTA=0xff;
DDRA=0xff;
DDRC=0x00;
while(1)
{
while (PINC.1==1) // dengan pengkondisian
{
for (i=0;i<=7;i++)
{
a=pow(2,i);
PORTA=a;
delay_ms(100);
}
};
};
}

<>Analisa Program :
Pada program ini LED menyala berjalan bergantung kondisi S2 dengan menggunakan fungsi for
(i=0;i<=7;i++). Ketika S2 di on-kan maka (PIN C.1==1) Benar, maka program akan menjalankan fungsi
for (i=0;i<=7;i++). Jika i=0, apakah 0lebih kecil dari sama dengan 7? Benar, maka a=pow(2,0) maka
output PORT A=1 yang berarti, jika diubah menjadi bilangan biner menjadi 00000001 dan LED 0 akan
menyala. Lalu, i+1 maka i=1, apakah 1 lebih kecil dari sama dengan 7? Benar, maka a=pow(2,1) maka
output PORT A=2 yang berarti jika diubah menjadi bilangan biner menjadi 00000010 dan LED 1 akan
menyala. Jadi, proses ini akan terjadi terus menerus sampai i bernilai 7. Ketika i bernilai 7 maka output
PORT A=8 jika dibinerkan menjadi 10000000. Lalu, proses ini akan membuat LED terlihat menyala
bejalan secara terus-menerus jika S2 dalam posisi ON. Jika S2 di OFF kan maka program berakhir.

!.TUGAS
A. Buatlah program dengan syarat jika S1 atau S2= ON, dan yang lain OFF, maka LED menyala
berjalan.

#include <mega32.h>
#include <delay.h>
#include <math.h>
void main(void)
{
int i,a;
PORTA=0xff;
DDRA=0xff;
DDRC=0x00;
while(1)
{
while (PINC.0==1)
{
for (i=0;i<=7;i++)
{
a=pow(2,i);
PORTA=a;
delay_ms(100);

}
}
{
while (PINC.1==1) // dengan pengkondisian
{
for (i=0;i<=7;i++)
{
a=pow(2,i);
PORTA=a;
delay_ms(100);
}
};
};
};
}

<>Analisa Program :
Pada program ini LED menyala berjalan bergantung kondisi S1 atau S2 on dengan menggunakan fungsi
for (i=0;i<=7;i++). Ketika S1 di on-kan maka (PIN C.0==1), maka program akan menjalankan fungsi for
(i=0;i<=7;i++). Jika i=0, apakah 0lebih kecil dari sama dengan 7? Benar, maka a=pow(2,0) maka output
PORT A=1 yang berarti, jika diubah menjadi bilangan biner menjadi 00000001 dan LED 0 akan
menyala. Lalu, i+1 maka i=1, apakah 1 lebih kecil dari sama dengan 7? Benar, maka a=pow(2,1) maka
output PORT A=2 yang berarti jika diubah menjadi bilangan biner menjadi 00000010 dan LED 1 akan
menyala. Jadi, proses ini akan terjadi terus menerus sampai i bernilai 7. Ketika i bernilai 7 maka output
PORT A=8 jika dibinerkan menjadi 10000000. Lalu, proses ini akan membuat LED terlihat menyala
bejalan secara terus-menerus jika S1 dalam posisi ON. Jika S1 di OFF kan maka program berakhir.
Ataupun S2 yang di on-kan maka PIN C.1==1 maka program akan menjalankan seperti S1 yng di on-
kan. Jika S2 di OFF kan maka program juga akan berakhir.

B. Butalah program dengan syarat jika S1= ON maka LED menyala berjalan ke kiri ke kanan. Namun,
bila S1 di OFF-kan maka LED langsung berubah arah dari kanan ke kiri. Kondisi awal seluruh switch
= OFF dan LED padam.

#include <mega32.h>
#include <delay.h>

int a,b;
unsigned char ledA[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char ledB[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void kiri()
{
for (a=0;a<=7;a++)
{
PORTA = ledB[a];
delay_ms(200);
}
}
void kanan()
{
for (b=0;b<=7;b++)
{
PORTA = ledA[b];
delay_ms(200);
}
}

void main(void)
{
PORTA=0x00;
DDRA=0xFF;
while (1)
{ while(PINC.1==1)
{
while(PINC.1==1){kiri();}
while(PINC.1==0){kanan();}
}
};
}

<>Analisa Program :
Pada program ini jika S1 di ON-kan LED menyala berjalan dari kiri ke kanan dan jika di OFF kan LED
menyala dari kanan ke kiri dikarenakan program menjalankan pengulangan sesuai dengan kondisi S1
ON while(PINC.1==1){kiri} dan kondisi S1 OFF while(PINC.1==0){kanan}. Ketika S1 ON program
akan menjalankan fungsi for (a=0;a<=7;a++). Contoh jika a=0 maka, 0 lebih kecil dari sama dengan 7,
Benar maka a akan memanggil PORTA = ledB[0x01]; maka LED 0 akan menyala. Proses ini akan
sampai a bernilai 7. Ketika a bernilai 7 a akan memanggil PORTA = ledA[0x80]; maka LED 7 akan
menyala. Jadi, pada proses ini LED akan terlihat menyala dari kiri ke kanan.

Tetapi, jika S1 di OFF-kan program akan menjalankan fungsi for (b=0;b<=7;b++). Contoh jika a=0
maka, 0 lebih kecil dari sama dengan 7, Benar maka a akan memanggil PORTA = ledA[0x80]; maka
LED 7 akan menyala. Lalu,proses ini akan terus-menerus terjadi sampai b bernilai 7. Ketika b bernilai 7
b akan memanggil PORTA = ledA[0x01]; maka LED 0 akan menyala. Jadi, pada proses ini LED akan
terlihat menyala dari kanan ke kiri.

PERCOBAAN 3
Aplikasi Port Sebagai Output Menggunakan 7-Segment

B. Program Percobaan 2
1. Menampilkan angka “0” pada semua 7segment

// D7 D6 D5 D4 D3 D2 D1 D0
// SEG3 SEG2 SEG1 SEG0 D C B A
// 0 0 0 0 0 0 0 0 = 00H
#include <mega32.h>
#include <delay.h>
void main(void)
{
DDRA = 0xFF;
while(1)
{
PORTA = 0x00;
}
}

<>Analisa Program :
Pada program ini menampilkan angka 0 pada 7segment dengan output PORT A=0x00 yang berarti
0 yang pertama jika dibinerkan menjadi 0000 maka keempat segment dapat menampilkan angka dan
0 yang kedua menunjukkan angka yang akan ditampilkan pada keempat 7segment tersebut.

2. Menampilkan angka “0” pada satu buah 7segment saja

// D7 D6 D5 D4 D3 D2 D1 D0
// SEG3 SEG2 SEG1 SEG0 D C B A
// 1 1 1 0 0 0 0 0 = E0H
#include <mega8535.h>
#include <delay.h>
void main(void)
{
DDRA = 0xFF;
while(1)
{
PORTA = 0xE0;
}
}

<>Analisa Program :
Pada program ini menampilkan angka 0 pada satu buah 7segment saja dengan output PORT A=0xE0
yang berarti
E jika dibinerkan menjadi 1110 maka hanya segment 0 yang akan menampilkan angka,
0 adalah angka yang akan ditampilkan pada segment 0.

3. Menampilkan angka “3” pada satu buah 7segment saja

// D7 D6 D5 D4 D3 D2 D1 D0
// SEG3 SEG2 SEG1 SEG0 D C B A
// 1 1 1 0 0 0 1 1 = E3H
#include <mega8535.h>
#include <delay.h>
void main(void)
{
DDRA = 0xFF;
while(1)
{
PORTA = 0xE3;
}
}

<>Analisa Program :
Pada program ini menampilkan angka 3 pada satu buah 7segment saja dengan output PORT A=0xE3
yang berarti
E jika dibinerkan menjadi 1110 maka hanya segment 0 saja yang akan menampilkan angka,
3 adalah angka yang akan ditampilkan pada segment 0.

4. Menampilkan angka “0123”

// D7 D6 D5 D4 D3 D2 D1 D0
// SEG3 SEG2 SEG1 SEG0 D C B A
// 1 1 1 0 0 0 0 0 = E0H
// 1 1 0 1 0 0 0 1 = D1H
// 1 0 1 1 0 0 1 0 = B2H
// 0 1 1 1 0 0 1 1 = 73H
#include <mega32.h>
#include <delay.h>
void main(void)
{
DDRA = 0xFF;
while(1)
{
PORTA= 0x73;
delay_ms(1);
PORTA= 0xB2;
delay_ms(1);
PORTA= 0xD1;
delay_ms(1);
PORTA= 0xE0;
delay_ms(1);
}
}

<>Analisa Program :
Pada program ini menampilkan angka 0123 dengan menjalankan program
PORT A= 0x73 yang berarti angka 3 akan ditampilkan pada segment3 atau 0111 yang berarti hanya
segment3 yang menampilkan angka 3 dan selanjutnya dilanjutkan dengan program delay, jeda waktu
yang sangat singkat. Program akan dilanjutkan dengan output PORT A= 0xB2 yang berarti angka 2 akan
ditampilkan pada segment2 atau 1011 yang berarti hanya segment2 yang menampilkan angka 2.

dan selanjutnya dilanjutkan dengan program delay, jeda waktu. Program akan dilanjutkan dengan output
PORT A= 0xD1 yang berarti angka 1 akan ditampilkan pada segment1 atau 1101 yang berarti hanya
segment1 yang menampilkan angka 1.
Lalu dilanjutkan dengan program delay, jeda waktu. Program akan dilanjutkan dengan output PORT A=
0xE0 yang berarti angka 0 akan ditampilkan pada segment0 atau 1110 yang berarti hanya segment0 yang
menampilkan angka 0. Dengan delay yang begitu cepat maka keempat segment akan ditampilkan angka
3 2 1 0.

5. Menampilkan angka “0123”

// SEG3 SEG2 SEG1 SEG0 D C B A


// 1 1 1 0 0 0 0 0 = E0H
// 1 1 0 1 0 0 0 0 = D0H
// 1 0 1 1 0 0 0 0 = B0H
// 0 1 1 1 0 0 0 0 = 70H
#include <mega32.h>
#include <delay.h>
void main(void)
{
int rib,rat,pul,sat;
DDRA = 0xFF;
while(1)
{
sat = 3;
pul = 2;
rat = 1;
rib = 0;
PORTA= 0x70 | rib;
delay_ms(1);
PORTA= 0xB0 | rat;
delay_ms(1);
PORTA= 0xD0 | pul;
delay_ms(1);
PORTA= 0xE0 | sat;
delay_ms(1);
}
}

<>Analisa Program :
Pada program ini menampilkan angka 0123 dengan menjalankan program
PORTA= 0x70 | rib yang berarti 0x70 or 0 maka menjadi 0x70 berarti pada segment3 akan ditampilkan
angka 0. Lalu delay program selanjutnya
PORTA= 0xB0 | rat yang berarti 0xB0 or 1 maka menjadi 0xB1 berarti pada segment2 akan ditampilkan
angka 1. Lalu delay program selanjutnya
PORTA= 0xD0 | pul yang berarti 0xD0 or 2 maka menjadi 0xD2 berarti pada segment1 akan
ditampilkan angka 2. Lalu delay program selanjutnya
PORTA= 0xE0 | sat yang berarti 0xE0 or 3 maka menjadi 0xE3 berarti pada segment0 akan ditampilkan
angka 3. Dengan delay yang begitu cepat maka keempat segment akan ditampilkan angka 3 2 1 0.

6. Display data yang diambil dari PORTC (switch)

// D7 D6 D5 D4 D3 D2 D1 D0
// SEG3 SEG2 SEG1 SEG0 D C B A
// 1 1 1 0 0 0 0 0 = E0H LOKASI RIBUAN
// 1 1 0 1 0 0 0 1 = D1H LOKASI RATUSAN
// 1 0 1 1 0 0 1 0 = B2H LOKASI PULUHAN
// 0 1 1 1 0 0 1 1 = 73H LOKASI SATUAN
#include <mega32.h>
#include <delay.h>
void main(void)
{
int data,sat,pul,rat,rib;
DDRA = 0xFF;
DDRC = 0X00;
while(1)
{
data = PINC;
sat = data % 10; // sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
rib = data / 1000;

PORTA= 0x70 | sat;


delay_ms(1);
PORTA= 0xB0 | pul;
delay_ms(1);
PORTA= 0xD0 | rat;
delay_ms(1);
PORTA= 0xE0 | rib;
delay_ms(1);
}
}

<>Analisa Program :
Pada program ini output PORT A akan didasarkan pada input PIN C
sat = data % 10; // sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
rib = data / 1000
ketika PINC berlogika low 0 maka PORT=A akan menampilakn 0000 PADA 7segment PINC
berlogika high 1 semua ,maka PORT=A akan mngluarkan ouput 255 pada 7segment

!.TUGAS
A. Buatlah program konter up 0 s.d. 1000

#include <mega8535.h>
#include <delay.h>

int data,a,sat,pul,rat,rib;

void rumus()
{
sat = data % 10; // sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
}
void tampil()
{
PORTA= 0x70 | sat;
delay_ms(1);
PORTA= 0xB0 | pul;
delay_ms(1);
PORTA= 0xD0 | rat;
delay_ms(1);
PORTA= 0xE0 | rib;
delay_ms(1);
}
void stop()
{
PORTA= 0x70 | 0;
delay_ms(1);
PORTA= 0xB0 | 0;
delay_ms(1);
PORTA= 0xD0 | 0;
delay_ms(1);
PORTA= 0xE0 | 1;
delay_ms(1);
}
void main(void)
{
DDRA = 0xFF;
while(1)
{
for(data=0;data<=1000;data++)
{
rumus();
for(a=0;a<=2;a++)
{
tampil();
}
}
while(data>=1000){stop();}
}
}

<>Analisa Program :
Pada program ini membuat konter up angak 0 sampai 1000m pada 7segment dengan program yg trsusun
secara struktur ketika program menjalan void rumus() maka rumus akan mnghitung angka sesuai data pada
fungsi for contoh ketika data 1 mak nilai sat=1 dan nilai pul,rat dan rib adalah 0 lalu akan ditmoilkan angak
0001 pada 7segment proses ini akan terus bekerja sampai angka 1000 dngan syrat fungsi for terpenihi ketika
fungsi for terpenuhi maka 7segemnt akan berhnti dengan mnggunkan program while (data>1000)(stop)

B. Buatlah program konter barang dengan asumsi S1 sebagai sensornya. Jika S11 naik 1kali (naik-turun),
maka 7segment terjadi increment. S2 untuk clear data.

#include <mega32.h>
#include <delay.h>

int data=0,sat,pul,rat,rib;
void rumus()
{
sat = data % 10; // sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
}
void tampil()
{
rib = data / 1000;
PORTA= 0x70 | sat;
delay_ms(1);
PORTA= 0xB0 | pul;
delay_ms(1);
PORTA= 0xD0 | rat;
delay_ms(1);
PORTA= 0xE0 | rib;
delay_ms(1);
}
void clear()
{
rib = data / 1000;
PORTA= 0x70 ;
delay_ms(1);
PORTA= 0xB0;
delay_ms(1);
PORTA= 0xD0;
delay_ms(1);
PORTA= 0xE0;
delay_ms(1);
}
void main(void)
{

DDRA = 0xFF;
DDRC = 0X00;
while(1)
{
if(PINC.0==1)
{
data++;
while(PINC.0==1){tampil();}
}
rumus();
tampil();
while(PINC.1==1)
{
data=0;
clear();
}

}
}

<>Analisa Program :
Pada program ini mmbuat salah satu switch sbgai inputan dan salah stu witch juga sbgai pengpus ouputan
Contoh s1 mnjdi input dan s2 mnjdi clear data .jika s1 diONkan atau dkish logika high 1 dan di offkan kmbli
ke logika low 0 maka ouput pada 7segment akan mnmpilkan angka 1 dan jika dionkan lagi dan diokan kmbli
maka akan mnmpilkn angka 2 dan estrus hal ini terjadi krana kita dapat menggunkan rumus
sat = data % 10; // sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
dan ketiak s2 dionkan atau dikasih logika high 1 maka tampila 7segemnt akan kmebali ke angka 0 yang
berarti ouput telah diresrt kembali.
PERCOBAAN 4
Interacing dan Pemograman LCD 2x16

A. PROGRAM PERCOBAAN MODE 4 BIT


1. Menampilkan karakter “A” pada baris ke-0 dan kolom ke-0

#include <mega32.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
// LCD module initialization
lcd_init(16);
while(1)
{
lcd_gotoxy(0,0);
lcd_putsf("A"); //untuk karakter harus diapit dgn tanda apostrof

}
}

Analisa Program:
Pada program ini LCD menampilkan character A pada baris ke-0 dan kolom ke-0 dengan program
lcd_gotoxy(0,0) yang berarti (unsigned char x, unsigned char y) maka character akan ditampilkan pada
baris ke-0 dan kolom ke-0 dan lcd_putsf("A") yang membuat penulisan string (character A) pada LCD.

2. Menulis karakter di barsi 1 dan baris 2

#include <mega8535.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
void main (void)
{
// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf(" BARIS 1 ");
lcd_gotoxy(0,1);
lcd_putsf(" BARIS 2 ");
while(1);
}

Analisa Program:
Pada program ini LCD menampilkan character di baris-1 dan di baris-2 dengan progam

lcd_gotoxy(0,0) yang berarti (unsigned char x, unsigned char y) maka character akan ditampilkan pada
baris ke-0 dan kolom ke-0 dan lcd_putsf("BARIS 1") yang membuat penulisan string (BARIS 1) pada
LCD dan program selanjutnya
lcd_gotoxy(0,1) yang berarti (unsigned char x, unsigned char y) maka character akan ditampilkan pada
baris ke-0 dan kolom ke-1 dan lcd_putsf("BARIS 2") yang membuat penulisan string (BARIS 2) pada
LCD.

3. Menampilkan angka “0” dengan nilai ASCII

#include <mega32.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
void main(void)
{
// LCD module initialization
lcd_init(16);
while(1)
{
lcd_gotoxy(0,0);
lcd_putsf("0"); //untuk karakter harus diapit dgn tanda apostrof
// lcd_gotoxy(0,0);
// lcd_putchar(48); //dalam kode decimal ASCII untuk angka 0
// lcd_gotoxy(0,0);
// lcd_putchar(0x30); //dalam kode heksa ASCII untuk angka 0
}
}

Analisa Program:
Pada program ini LCD menampilkan character 0 pada baris ke-0 dan kolom ke-0 dengan program
lcd_gotoxy(0,0) yang berarti (unsigned char x, unsigned char y) maka character akan ditampilkan pada
baris ke-0 dan kolom ke-0 dan lcd_putsf("0") yang membuat penulisan string (character 0) pada LCD.

4. Menampilkan tulisan dan angka dengan library standard I/O bahasa C

#include <mega32.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
unsigned char n,kata[16];
void main(void)
{
// LCD module initialization
lcd_init(16);
n=4;
while(1)
{
sprintf(kata,"Percobaan %d",n);
lcd_gotoxy(0,0);
lcd_puts(kata);
}
}

Analisa Program:
Pada program ini menampilkan tulisan dan angka dengan program
sprintf(kata,"Percobaan %d",n) yang berarti string mewakili angka desimal dengan n=4
maka output pada LCD akan menampilkan percobaan 4 pada posisi baris ke-0 kolom ke-0

TUGAS
A. Buatlah program konter up (0 s.d 10) secara kontinyu pada baris 1 kolom 1

#include <mega32.h>
#include <stdio.h>
#include <delay.h>

unsigned char a,tampil[16];

#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

void main(void)
{
PORTC=0x00;
DDRC=0xFF;
lcd_init(16);
while (1)
{
for(a=0;a<=10;a++)
{
sprintf(tampil,"%d",a);
lcd_gotoxy(1,1);
lcd_puts(tampil);
delay_ms(500);
}
lcd_clear();
};
}

Analisa Program:
Pada program ini membuat konter up 0-10 secara kontinyu pada baris ke 1 dan kolom ke 1 dengan
program menjalankan fungsi for(a=0;a<=10;a++) maka ketika a=0, 0 lebih kecil dari sama dengan 10,
Benar maka sprintf(tampil,"%d",a) mewakili angka 0
lcd_gotoxy(1,1);
lcd_puts(tampil);
maka penulisan string (0) pada LCD dengan posisi baiis ke-1 dan kolom ke-1 kemudian program
menjalankan delay ms jeda waktu, ketika waktu terpenuhi kembali lagi ke fungsi for, a+1 maka a=1, a
lebih kecil dari sama dengan 10, Benar maka sprintf(tampil,"%d",a) mewakili angka 1 dan
lcd_gotoxy(1,1);
lcd_puts(tampil);
penulisan string berganti dengan 1 pada LCD dan proses ini akan terus-menerus sampai a bernilai 10
maka penulisan string akan berganti menjadi 10 pada LCD. Ketika fungsi for tidak terpenuhi lagi maka
program akan menjalankan lcd clear yang berarti menghapus layar pada LCD dan proses kembali lagi ke
while (1).

B. Buatlah program LED menyala geser kiri-kanan sebanyak 10 kali kemduian pindah kanan-kiri sebanyak
10 kali secara kontinyu, dengan display pada LCD tulisan “geser kiri” ketika terjadi geser kanan-kiri dan
sebaliknya “geser kanan” serta tampilkan juga nilai konternya

#include <mega32.h>
#include <delay.h>
#include <stdio.h>

int x=0,a,b,c=0,d;
unsigned char ledA[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char ledB[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char counter[16];

#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

void hitung()
{
sprintf(counter,"COUNTER %d",x);
lcd_gotoxy(0,1);
lcd_puts(counter);
}
void kiri()
{
lcd_gotoxy(0,0);
lcd_putsf("GESER KANAN");
hitung();
for (c=0;c<10;c++)
{
for (a=0;a<=7;a++)
{
PORTA = ledB[a];
delay_ms(200);
hitung();
}
x++;
hitung();
}
lcd_clear();
x=0;
}
void kanan()
{
lcd_gotoxy(0,0);
lcd_putsf("GESER KIRI");
hitung();
for (d=0;d<10;d++)
{
for (b=0;b<=7;b++)
{
PORTA = ledA[b];
delay_ms(200);
hitung();
}
x++;
hitung();
}
lcd_clear();
x=0;
}

void main(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTC=0x00;
DDRC=0x00;
lcd_init(16);

while (1)
{
kiri();
kanan();
};
}

Analisa Program:
Pada program ini membuat led mnyala dari kiri ke kanan sebanyak 10 kali dan ditampilakn counter selam
proses 10 kali tersebut dengan mnggunkan program
lcd_gotoxy(0,0); program ini mengartika penulisan string akan ditampilkan pada kolom ke 0 dan baris
k-0
lcd_putsf("GESER KANAN"); tulisan pada lcd tersebut
hitung();
for (c=0;c<10;c++)
{
for (a=0;a<=7;a++)
{
PORTA = ledB[a];
delay_ms(200);
hitung();
}
x++;
hitung();
}
lcd_clear();
x=0;
program diatas menjelaskan fungsi for memangi fungsi for lainya yag berarti led akan menyal berjalan
selama 10 kali dan ketiak for sudah terpenuhi maka lcd akan mengapus semuat data
dan melanjutkan ke program slenjautnya yaitu kebaliakkan dari arah led menyala yaitu dari kanan ke kiri
program nya sama hanya berbeda isi data fungus ARRAY .

E. PROGRAM PERCOBAAN MODE 8 BIT


1. Menampilkan angka ‘0’ di baris 1 dan angka ‘1’ di baris 2

void port_init(void);
void LCD_init(void);
void LCD_WriteCommand (unsigned char CMD);
void LCD_WriteData (unsigned char Data);
#define ENABLE_LCD PORTD |= 0x04
#define DISABLE_LCD PORTD &= ~0x04
#define SET_LCD_DATA PORTD |= 0x01
#define SET_LCD_CMD PORTD &= ~0x01
#include <mega8535.h>
#include <delay.h>
// Inisialisasi port AVR 8535
void port_init(void)
{
DDRA = 0x00; // PORTA INPUT
PORTA = 0x00; // SEMUA PORTA DIAKTIFKAN
DDRB = 0x00; // PORTB INPUT
PORTB = 0x00; // SEMUA PORTB DIAKTIFKAN
DDRC = 0xFF; // PORTC OUTPUT
PORTC = 0x00; // SEMUA PORTC DIAKTIFKAN
DDRD = 0xFF; // PORTD OUTPUT
PORTD = 0x00; // SEMUA PORTD DIAKTIFKAN
}
// Inisialisasi LCD
// DISPCLR = 01H
// FUNCSET = 38H
// ENTRMOD = 06H
// DISPON = 0CH
void LCD_init(void)
{
delay_ms(100); // tunggu selama 100 ms
LCD_WriteCommand (0x38); // 8 data lines = FUNCSET
LCD_WriteCommand (0x06); // cursor setting = ENTRMOD
LCD_WriteCommand (0x0f); // display ON = DISPON
LCD_WriteCommand (0x01); // clear LCD memory = DISPCLR
delay_ms(10); // tunggu 10ms untuk membersihkan LCD
}
// Prosedur untuk command instruction
void LCD_WriteCommand (unsigned char CMD)
{
SET_LCD_CMD; // Set LCD in command mode
PORTC = CMD; // Load data to port
ENABLE_LCD; // Write data to LCD
delay_ms(10);
DISABLE_LCD; // Disable LCD
delay_ms(10); // wait for 1ms
}
// Prosedur untuk data instruction
void LCD_WriteData (unsigned char Data)
{
SET_LCD_DATA; // Set LCD in data mode
PORTC = Data; // Load data to port
ENABLE_LCD; // Write data to LCD
delay_ms(10);
DISABLE_LCD; // Disable LCD
delay_ms(10); // wait for 1ms
}
//******************* MAIN FUNCTION *******************
void main()
{
port_init();
LCD_init();
LCD_WriteCommand (0x80); // pesan tempat di baris 1 kolom 0
LCD_WriteData (0x30); // data ASCII 0 = 30H
LCD_WriteCommand (0x0C0); // pesan tempat di baris 2 kolom 0
LCD_WriteData (0x31); // data ASCII 1 = 31H
}

Analisa Program :

Pada program ini menmpilkan angak 0 dibari 1 dan angka 1 dibaris 2 dengan menggunka program
dibwah ini
LCD_WriteCommand (0x80)
=yang berarti member perintah untuk mnuliskan string penuisan data pada bari 1 kolom 0
LCD_WriteData (0x30)
= mmberin prontah untuk penulisan angak 0 pada baris ke 1 dan kolom ke 0
LCD_WriteCommand (0x0C0);
= yang berarti member perintah untuk mnuliskan string penuisan data pada bari 2 kolom 0
LCD_WriteData (0x31)
= mmberin prontah untuk penulisan angak 1 pada baris ke 1 dan kolom ke 0
Maka pada lcd akan tampil
0
1.

2. Menampilkan “1234” di LCD

// D7 D6 D5 D4 D3 D2 D1 D0
// 8 4 2 1 8 4 2 1 = HEKSA
// DATA : PORTC
// RS : PORTD0
// R/-W : PORTD1
// ENABLE : PORTD2
void port_init(void);
void LCD_init(void);
void LCD_WriteCommand (unsigned char CMD);
void LCD_WriteData (unsigned char Data);
#define ENABLE_LCD PORTD |= 0x04
#define DISABLE_LCD PORTD &= ~0x04
#define SET_LCD_DATA PORTD |= 0x01
#define SET_LCD_CMD PORTD &= ~0x01
#include <mega8535.h>
#include <delay.h>
int data,rib,rat,pul,sat;
// Inisialisasi port AVR 8535
void port_init(void)
{
DDRA = 0x00; // PORTA INPUT
PORTA = 0x00; // SEMUA PORTA DIAKTIFKAN
DDRB = 0x00; // PORTB INPUT
PORTB = 0x00; // SEMUA PORTB DIAKTIFKAN
DDRC = 0xFF; // PORTC OUTPUT
PORTC = 0x00; // SEMUA PORTC DIAKTIFKAN
DDRD = 0xFF; // PORTD OUTPUT
PORTD = 0x00; // SEMUA PORTD DIAKTIFKAN
}
// Inisialisasi LCD
// DISPCLR = 01H
// FUNCSET = 38H
// ENTRMOD = 06H
// DISPON = 0CH
void LCD_init(void)
{
delay_ms(100); // tunggu selama 100 ms
LCD_WriteCommand (0x38); // 8 data lines = FUNCSET
LCD_WriteCommand (0x06); // cursor setting = ENTRMOD
LCD_WriteCommand (0x0f); // display ON = DISPON
LCD_WriteCommand (0x01); // clear LCD memory = DISPCLR
delay_ms(10); // tunggu 10ms untuk membersihkan LCD
}
// Prosedur untuk command instruction
void LCD_WriteCommand (unsigned char CMD)
{
SET_LCD_CMD; // Set LCD in command mode
PORTC = CMD; // Load data to port
ENABLE_LCD; // Write data to LCD
delay_ms(1);
DISABLE_LCD; // Disable LCD
delay_ms(1); // wait for 1ms
}
// Prosedur untuk data instruction
void LCD_WriteData (unsigned char Data)
{
SET_LCD_DATA; // Set LCD in data mode
PORTC = Data; // Load data to port
ENABLE_LCD; // Write data to LCD
delay_ms(1);
DISABLE_LCD; // Disable LCD
delay_ms(1); // wait for 1ms
}
//******************* MAIN FUNCTION *******************
void main()
{
port_init();
LCD_init();
data = 1234;
sat = data % 10; // sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
rib = data / 1000;
LCD_WriteCommand (0x80); // pesan tempat di baris 1 kolom 0
LCD_WriteData (rib + 0x30); // data ASCII ribuan
LCD_WriteCommand (0x081); // pesan tempat di baris 1 kolom 1
LCD_WriteData (rat + 0x30); // data ASCII ratusan
LCD_WriteCommand (0x82); // pesan tempat di baris 1 kolom 2
LCD_WriteData (pul + 0x30); // data ASCII puluhan
LCD_WriteCommand (0x083); // pesan tempat di baris 1 kolom 3
LCD_WriteData (sat + 0x30); // data ASCII satuan
}

Analisa Program :
Pada program ini menampilkan angka 1234 pada lcd dengan program yang memiliki fusngs rumus
sat = data % 10; // sat = sisa dari data dibagi 10
pul = data / 10;
pul = pul % 10;
rat = data / 100;
rat = rat % 10;
lalu ketika sudah didapatak data maka program akan menjalan kan program
LCD_WriteCommand (0x80); //member perintah penulisa data di tempat di baris 1 kolom 0
LCD_WriteData (rib + 0x30); // data + 0b0011000 nilai ribuan
LCD_WriteCommand (0x081); // member perintah penulisa data di tempat di baris 1 kolom 1
LCD_WriteData (rat + 0x30); // data + 0b0011000 nilai ratusan
LCD_WriteCommand (0x82); // member perintah penulisa data di tempat di baris 1 kolom 2
LCD_WriteData (pul + 0x30); // data + 0b0011000 nilai puluhan
LCD_WriteCommand (0x083); // member perintah penulisadata di tempat di baris 1 kolom 3
LCD_WriteData (sat + 0x30); // data + 0b0011000 nilai satuan
Maka lcd akan menampilkan angak 1234 .

TUGAS
A. Buatlah program menampilkan nilai pada LCD yang diambil dari data portA (switch)

Anda mungkin juga menyukai