Game Buzzer Berbasis Mikrokontroler Nuvoton NUC140VE3CN

14
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

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().