Game Buzzer Berbasis Mikrokontroler Nuvoton NUC140VE3CN
Transcript of Game Buzzer Berbasis Mikrokontroler Nuvoton NUC140VE3CN
LAPORAN TUGAS AKHIR KULIAH MIKROKONTROLER
“SHOW OFF YOUR EARS”
disusun oleh:
Kelompok A.R.A
Fredy Aga Nugroho (12/334888/PA/15054)
Anggit Wicaksana (12/331283/PA/14560)
Ryan Eko Saputro (12/331380/PA/14638)
PROGRAM STUDI ELEKTRONIKA DAN INSTRUMENTASI
JURUSAN ILMU KOMPUTER DAN ELEKTRONIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS GADJAH MADA
2014
[TUGAS AKHIR MIKROKONTROLER] [2014]
1
A. Ringkasan Topik
Game “Show Off Your Ears” ialah permainan sederhana untuk menguji
ketangkasan maupun kepekaan indera pendengar, dengan menggunakan buzzer pada
Learning Board Nuvoton NUC140VE3CN.
Sesaat setelah game dijalankan, akan terdengar bunyi buzzer sebanyak satu (1) kali
hingga 9 (Sembilan) kali. Urutan bunyi buzzer tersebut dibuat acak (random), sehingga user
yang memainkan game “Show Off Your Ears” tidak akan menyadari berapa kali buzzer akan
berbunyi.
Yang harus dilakukan oleh user ialah menekan tombol keypad sesuai dengan
jumlah suara yang dikeluarkan oleh buzzer. Apabila user bisa mendengar jumlah suara
buzzer dengan baik dan menekan tombol yang tepat, maka game akan tetap berlanjut.
Namun, jika user tidak segera menekan tombol ataupun salah menekan tombol, maka game
akan selesai (game over).
Setiap kali user berhasil mendengar bunyi buzzer dengan baik dan menekan tombol
yang tepat, score akan bertambah dan ditampilkan pada seven segment. Setiap kenaikan
level, tingkat kesulitan game akan semakin bertambah. Hal tersebut kami wujudkan dengan
semakin mengurangi waktu jeda tiap bunyi buzzer dan batas waktu menekan tombol sesaat
setelah buzzer berhenti berbunyi. Oleh karena itu, “Show Off Your Ears”! Dengarkan dengan
saksama dan tekan tombol yang tepat untuk mencapai score tertinggi!
B. Rangkaian Mikrokontroler
Rancangan Sistem
KEYPAD
SEVEN
SEGMENT
MIKROKONTROLER
NUVOTON
NUC140VE3CN
BUZZER LCD
[TUGAS AKHIR MIKROKONTROLER] [2014]
2
Penjelasan Sistem
Untuk merealisasikan tugas akhir mata kuliah mikrokontroler ini, kami
memanfaatkan beberapa fasilitas yang telah terdapat pada Learning Board Nuvoton
NUC140VE3CN, yaitu :
1. LCD Graphic
LCD berfungsi sebagai display utama, yaitu menampilkan kalimat
pembuka, memberikan arahan kepada user untuk segera bersiap-siap
mendengarkan buzzer, menampilkan pemberitahuan bahwa tombol yang
ditekan oleh user benar ataupun salah, sehingga lanjut ke level selanjutnya
ataupun permainan selesai (game over).
2. Buzzer
Buzzer merupakan tokoh utama dalam game “Show Off Your Ears”
ini. Buzzer mengeluarkan suara sebanyak 1 (satu) kali hingga 9 (sembilan) kali
secara random, sehingga tidak dapat ditebak dengan mudah oleh user.
3. Seven Segment
Seven Segment berfungsi untuk menampilkan score yang didapat oleh
user. Setiap kali user berhasil menebak jumlah suara yang dihasilkan buzzer
dengan benar, maka score yang ditampilkan pada seven segment akan
bertambah secara otomatis.
4. KeyPad
KeyPad berfungsi untuk menginputkan nilai 1 (satu) hingga 9
(sembilan) yang sesuai dengan jumlah suara buzzer. KeyPad inilah senjata
utama user untuk bisa memperoleh score tertinggi.
Proses Kerja
Proses kerja dari sistem ini yaitu :
1. Mikrokontroler mengontrol LCD graphic untuk menampilkan kalimat pembuka
dan memberikan arahan kepada user untuk segera bersiap-siap mendengarkan
buzzer.
2. Setelah itu, mikrokontroler mengontrol buzzer untuk berbunyi secara random.
3. Mikrokontroler menampilkan kalimat ke LCD graphic sebagai pemberitahuan
kepada user untuk segera menekan tombol yang tepat. Bersamaan dengan itu,
mikrokontroler juga menghitung waktu yang dibutuhkan oleh user untuk
menekan tombol hingga batas waktu yang telah ditentukan oleh kelompok kami.
4. Jika sebelum batas waktu tercapai user telah berhasil menekan tombol yang
tepat, mikrokontroler akan menampilkan kata “BENAR” dan “NEXT LEVEL”
pada LCD Graphic serta menambah score dan menampilkannya pada seven
segment.
[TUGAS AKHIR MIKROKONTROLER] [2014]
3
5. Apabila user tidak segera menekan tombol hingga batas waktu yang telah
ditentukan ataupun salah dalam menekan tombol, maka mikrokontroler akan
menampilkan kalimat “Astaghfirullah” dan “GAME OVER” pada LCD,
menampilkan score akhir yang didapat oleh user, dan menghentikan game.
C. Flowchart
MULAI
TEXT
Pembukaan
Buzzer Bunyi
Tekan Tombol
Jika
tombol ditekan =
Jumlah Bunyi
Score = Score
Game Over
TEXT
Penutup
Score tambah 1
Next Level
TIDAK
YA
[TUGAS AKHIR MIKROKONTROLER] [2014]
4
D. Listing Program dan Penjelasan
#include "NUC1xx.h"
#include "DrvSYS.h"
#include "DrvGPIO.h"
#include "LCD_Driver.h"
#include "DrvSPI.h"
#include "ScanKey.h"
#include "Seven_Segment.h"
int acak, satuan, puluhan, ratusan,
ribuan;
int acak1, satuan1, puluhan1, ratusan1,
ribuan1;
int i;
int time=400000;
int waktu=180;
int temp;
int x;
int score;
void opening()
{
print_lcd(0," Assalamualaikum");
DrvSYS_Delay(1000000);
print_lcd(1," Welcome to ");
DrvSYS_Delay(1000000);
print_lcd(2," Micro PROJECT");
DrvSYS_Delay(1000000);
print_lcd(3,"ShowOffYourEars!");
DrvSYS_Delay(1000000);
clr_all_pannal();
print_lcd(0,"Dengarkan!");
print_lcd(1,"Bunyi Brp Kali?");
DrvSYS_Delay(500000);
print_lcd(2,"tekan tombol");
print_lcd(3,"sesuai jmlh nada");
DrvSYS_Delay(1000000);
clr_all_pannal();
}
void b1()
{
for (i = 1; i<=1;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
for (i=0;i<=waktu;i++)
{
Program game “Show Off Your Ears”
ini menggunakan library NUC1xx.h,
DrvSYS.h, dan DrvGPIO sebagai dasar
program.
Library LCD_Driver.h dan DrvSPI.h
digunakan untuk mengakses LCD
graphic
ScanKey.h merupakan library untuk
mengakses tombol keypad.
Seven_Segment.h berfungsi sebagai
library untuk mengakses seven
segment.
Fungsi opening() berisi mengenai
kalimat pembuka pada game dan
meminta user untuk segera bersiap-
siap memainkan game (menekan
tombol).
Terdapat 9 fungsi bunyi buzzer, yaitu
b1(), b2(), b3(), b4(), b5(), b6(), b7(),
b8(), dan b9().
Masing-masing fungsi tersebut
mengaktifkan buzzer untuk berbunyi
dari 1 hingga 9 kali. Jadi, fungsi b1()
akan membunyikan buzzer sebanyak
1 kali, fungsi b6() akan membunyikan
buzzer sebanyak 6 kali, dan
seterusnya.
[TUGAS AKHIR MIKROKONTROLER] [2014]
5
temp=Scankey();
if (temp==1)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
print_lcd(3,"
LEVEL");
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==3)||(temp==2)||(temp==4)||(temp=
=5)||(temp==6)||(temp==7)||(temp==8)||(t
emp==9))
{
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
if(temp==0)GAMEOVER();
}
void b2()
{
for (i = 1; i<=2;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
for (i=0;i<=waktu;i++)
{
temp=Scankey();
if (temp==2)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
print_lcd(3,"
LEVEL");
Pada setiap fungsi bunyi, juga
terdapat perintah untuk menekan
tombol yang tepat, sesuai dengan
jumlah bunyi buzzer.
Jika user benar dalam menekan
tombol, maka game akan berlanjut
ke level selanjutnya dan score akan
bertambah. Sedangkan jika user
salah dalam menekan tombol
ataupun terlambat menekan tombol,
maka game akan selesai (game over)
dan akan ditampilkan score akhirnya.
[TUGAS AKHIR MIKROKONTROLER] [2014]
6
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==1)||(temp==4)||(temp==3)||(temp=
=5)||(temp==6)||(temp==7)||(temp==8)||(t
emp==9))
{
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
if(temp==0)GAMEOVER();
}
void b3()
{
for (i = 1; i<=3;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
for (i=0;i<=waktu;i++)
{
temp=Scankey();
if (temp==3)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
print_lcd(3,"
LEVEL");
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==1)||(temp==2)||(temp==4)||(temp=
=5)||(temp==6)||(temp==7)||(temp==8)||(t
emp==9))
{
[TUGAS AKHIR MIKROKONTROLER] [2014]
7
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
if(temp==0)GAMEOVER();
}
void b4()
{
for (i = 1; i<=4;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
for (i=0;i<=waktu;i++)
{
temp=Scankey();
if (temp==4)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
print_lcd(3,"
LEVEL");
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==1)||(temp==2)||(temp==3)||(temp=
=5)||(temp==6)||(temp==7)||(temp==8)||(t
emp==9))
{
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
if(temp==0)GAMEOVER();
[TUGAS AKHIR MIKROKONTROLER] [2014]
8
}
void b5()
{
for (i = 1; i<=5;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
for (i=0;i<=waktu;i++)
{
temp=Scankey();
if (temp==5)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
print_lcd(3,"
LEVEL");
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==1)||(temp==2)||(temp==3)||(temp=
=4)||(temp==6)||(temp==7)||(temp==8)||(t
emp==9))
{
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
if(temp==0)GAMEOVER();
}
void b6()
{
for (i = 1; i<=6;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
[TUGAS AKHIR MIKROKONTROLER] [2014]
9
for (i=0;i<=waktu;i++)
{
temp=Scankey();
if (temp==6)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
print_lcd(3,"
LEVEL");
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==1)||(temp==2)||(temp==3)||(temp=
=5)||(temp==4)||(temp==7)||(temp==8)||(t
emp==9))
{
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
if(temp==0)GAMEOVER();
}
void b7()
{
for (i = 1; i<=7;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
for (i=0;i<=waktu;i++)
{
temp=Scankey();
if (temp==7)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
[TUGAS AKHIR MIKROKONTROLER] [2014]
10
print_lcd(3,"
LEVEL");
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==1)||(temp==2)||(temp==3)||(temp=
=5)||(temp==6)||(temp==4)||(temp==8)||(t
emp==9))
{
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
if(temp==0)GAMEOVER();
}
void b8()
{
for (i = 1; i<=8;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
for (i=0;i<=waktu;i++)
{
temp=Scankey();
if (temp==8)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
print_lcd(3,"
LEVEL");
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==1)||(temp==2)||(temp==3)||(temp=
=4)||(temp==6)||(temp==7)||(temp==5)||(t
emp==9))
[TUGAS AKHIR MIKROKONTROLER] [2014]
11
{
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
if(temp==0)GAMEOVER();
}
void b9()
{
for (i = 1; i<=9;i++)
{
DrvGPIO_ClrBit(E_GPB,11);
DrvSYS_Delay(time);
DrvGPIO_SetBit(E_GPB,11);
DrvSYS_Delay(time);
}
print_lcd(2,"TEKAN TOMBOL");
for (i=0;i<=waktu;i++)
{
temp=Scankey();
if (temp==9)
{
clr_all_pannal();
print_lcd(0,"
BENAR");
print_lcd(2,"NEXT");
print_lcd(3,"
LEVEL");
DrvSYS_Delay(500000);
score++;
random();
}
if
((temp==1)||(temp==2)||(temp==3)||(temp=
=5)||(temp==4)||(temp==7)||(temp==8)||(t
emp==6))
{
clr_all_pannal();
print_lcd(2,"SALAH");
DrvSYS_Delay(500000);
GAMEOVER();
}
point();
}
[TUGAS AKHIR MIKROKONTROLER] [2014]
12
if(temp==0)GAMEOVER();
}
void random(void)
{
while(1)
{
clr_all_pannal();
point();
time = time - 8000;
if(time <= 500)waktu = 500;
acak = i;
satuan = acak%10;
acak=acak/10;
puluhan = acak%10;
acak=acak/10;
ratusan = acak%10;
acak=acak/10;
ribuan = acak%10;
if(satuan == 0)b3();
if(satuan == 1)b7();
if(satuan == 2)b9();
if(satuan == 3)b6();
if(satuan == 4)b4();
if(satuan == 5)b8();
if(satuan == 6)b1();
if(satuan == 7)b5();
if(satuan == 8)b2();
if(satuan == 9)b9();
}
}
void point(void)
{
acak1 = score;
satuan1 = acak1%10;
acak1=acak1/10;
puluhan1 = acak1%10;
acak1=acak1/10;
ratusan1 = acak1%10;
acak1=acak1/10;
ribuan1 = acak1%10;
close_seven_segment();
show_seven_segment(0,satuan1);
DrvSYS_Delay(1000);
close_seven_segment();
show_seven_segment(1,puluhan1);
DrvSYS_Delay(1000);
close_seven_segment();
show_seven_segment(2,ratusan1);
DrvSYS_Delay(1000);
close_seven_segment();
show_seven_segment(3,ribuan1);
DrvSYS_Delay(1000);
}
Fungsi random() berfungsi untuk
mengacak urutan jumlah bunyi
buzzer, sehingga tidak akan bisa
ditebak oleh user.
Dapat dilihat pada listing program di
samping, jumlah bunyi buzzer
selanjutnya bergantung pada user
dalam menekan tombol.
Misalkan jika saat user menekan
tombol waktu tersisa 854 (satuan =4)
maka fungsi b4() akan aktif dan
selanjutnya buzzer akan berbunyi
sebanyak 4 kali.
Fungsi point() berfungsi untuk
menampilkan score user saat
memainkan game pada seven
segment.
Kami mengaktifkan 4 buah seven
segment yang masing-masing
menunjukkan ribuan, ratusan,
puluhan, dan satuan.
[TUGAS AKHIR MIKROKONTROLER] [2014]
13
void GAMEOVER(void)
{
clr_all_pannal();
while(1)
{
point();
print_lcd(1,"
Astaghfirullah!!");
print_lcd(2," GAME OVER");
}
}
int main(void)
{
UNLOCKREG();
DrvSYS_SetOscCtrl(E_SYS_XTL12M,1);
SYSCLK->PWRCON.XTL12M_EN=1;
DrvSYS_Delay(5000);
DrvSYS_SelectHCLKSource(0);
LOCKREG();
DrvSYS_SetClockDivider(E_SYS_HCLK_
DIV,0);
DrvGPIO_Open(E_GPD,14,E_IO_OUTPUT)
;
DrvGPIO_ClrBit(E_GPD,14);
DrvGPIO_Open(E_GPB,11,E_IO_OUTPUT)
;
uint8_t tekan;
OpenKeyPad();
Initial_pannel();
clr_all_pannal();
//DrvSYS_Delay(1000000);
while(1)
{
opening();
random();
}
}
Fungsi GAMEOVER() akan aktif ketika
user salah dalam menekan tombol
yang tepat ataupun waktu yang
dibutuhkan untuk menekan tombol
telah habis.
Fungsi main() merupakan fungsi
utama pada program game “Show
Off Your Ears” ini.
Di dalam fungsi main() terdapat
program untuk menyetting clock
dengan menggunakan sumber clock
eksternal sebesar 12MHz.
Juga terdapat listing program untuk
mengaktifkan lampu latar LCD,
buzzer, dan menginisialisasi LCD
graphic.
Fungsi OpenKeyPad() berfungsi
untuk mengaktifkan tombol keypad,
dimana fungsi ini terdapat dalam
library ScanKey.h
Terdapat perulangan while(1) yang
menjalankan dua buah fungsi, yaitu
fungsi opening() dan fungsi
random().