Laporan Tugas Akhir Kuliah Mikrokontroler tahun 2013
“
Tik-Tik [D]eVolution
”
Disusun oleh :
KELOMPOK SATRIA BAJA HITAM
Salahuddin Muhammad
(11/316882/PA/14002)
Arif Abdul Aziz
(10/300541/PA/13297)
Muhammad Iqbal
(
10/297579/PA/13020)
Program Studi Elektronika dan Instumentasi
Jurusan Ilmu Komputer dan Elektronika
Fakultas Matematika dan Ilmu Pengetahuan Alam
Universitas Gadjah Mada
Yogyakarta
A.
Ringkasan Topik
Tik-Tik [D]eVolution adalah suatu permainan sederhana yang menuntut
keterampilan pemain untuk merespon dengan perintah yang ditunjukkan pada LCD
Graphic. Perintah tersebut adalah menekan tombol pada Keypad Matrix sesuai dengan
tanda panah yang muncul pada layar. Pemain akan diberikan jeda waktu pada saat
keluarnya tanda panah untuk menekan tombol pada Keypad Matrix. Pada jeda waktu
tersebut tombol yang pertama kali ditekanlah yang akan dilihat apakah pemain menekan
tombol dengan benar atau tidak. Pemain diberi batas maksimal menekan tombol dengan
salah sebanyak lima kali. Sehingga setelah pemain salah menekan tombol sebanyak lima
kali maka permainan akan berhenti.
Sistem permainan ini adalah survival, maksudnya tidak ada batasan waktu kapan
permainan akan berhenti. Yang membuat permainan berhenti adalah ketika pemain telah
melakukan lima kali kesalahan. Pada saat permainan dimulai, tanda panah yang muncul
pada LCD Graphic mempunyai jeda yang cukup lama. Akan tetapi semakin lama pemain
berhasil menekan tombol dengan benar, maka jeda pergantian tanda panah akan semakin
cepat.
Sistem penilaian akan dilakukan ketika pemain berhasil menekan tombol dengan
benar. Nilai tersebut akan dicatat pada 7segment yang terdapat pada learning board.
Untuk setiap nilai yang benar bernilai satu poin. Tidak ada pengurangan nilai ketika
pemain salah menekan tobol. Yang membedakan apakah pemain menekan tombol
dengan benar atau tidak adalah bunyi yang dihasilkan oleh Buzzer. Dengan demikian
pemain pemain akan tahu kapan dia berhasil menekan tombol dengan benar dan kapan
pemain salah menekan tombol.
B.
Rangakaian Mikrokontroler
Pada proyek tugas ini, digunakan berbagai macam perangkat yang sudah terdapat pada
learning board NUVOTON NUC 140. Perangkat yang digunakan adalah :
1.
LCD graphic
: sebagai penampil/display utama pada permainan. LCD graphic
akan menampilkan gambar anak panah dengan berbagai macam arah, yang di tampilkan
secara bergantian dalam waktu tertentu. Serta menampilkan jumlah toleransi kesalahan
sebanyak 5 bintang yang akan berkurang satu per satu ketika pemain melakukan
kesalahan dalam bermain. LCD akan menampilkan tiga kondisi permainan saat
berlangsung, yaitu: BENAR, SALAH, dan WAKTU HABIS.
2.
Seven segment
: sebagai penampil score / jumlah kebenaran.
3.
Tombol keypad
: sebagai inputan utama pada permainan. Keypad yang di gunakan
antara lain nomor 2 untuk mewakili panah atas, nomor 4 mewakili panah kiri, nomor 5
mewakili tengah dengan symbol plus, nomor 6 mewakili panah kanan, dan nomor 8
mewakili panah bawah.
4.
Buzzer
: sebagai penanda saat tombol yang ditekan, benar atau salah.
Apabila benar akan ada tanda sebanyak 1 kali, dan apabila salah atau waktu habis maka
akan ada tanda sebanyak 3 kali.
Proses kerja nya adalah, mikrokontroler akan menampilkan melalui LCD, berbagai
macam gambar anak panah dengan berbagai macam arah yang di tampilkan secara bergantian
pada waktu tertentu. Saat salah satu panah keluar, maka pemain akan menekan tombol keypad
sesuai dengan anak panah yang di tekan olehnya. Bila tombol yang di tekan sesuai dengan arah
dari anak panah, maka mikrokontroler akan mengontrol seven segment untuk menambahkan
score dan menyalakan buzzer sebagai tanda jika tombol yang ditekan benar. Tatapi, bila tombol
yang ditekan salah, maka mikrokontroler akan memberikan tanda salah dengan buzzer, serta
menambah kesalahan. Jika jumlah kesalahan yang dilakukan mencapai 5 kali. Maka
mikrokontroler menghentkan permainan dan permainan selesai.
NUVOTON NUC 140
Mikrokontroler ( ARM
CORTEX M0)
Keypad Matrix
C.
FLowChart
TIDAK
YA
TIDAK
YA
mulai
LCD
menampilkan
gambar panah
Keypad matrik
di tekan
tombol yang
ditekan sesuai
dengan yang di
tampilkan pada
LCD
Score bertambah
Kesalahan
bertambah
Jumlah
kesalahan 5
D.
Listing dan Penjelasan
#include "NUC1xx.h" #include "DrvSYS.h" #include "DrvGPIO.h" #include "LCD_Driver.h" #include "ScanKey.h" #include "Seven_Segment.h"
int j, k;
int i, angka, sat, pul, rat, rib; int angka1, sat1, pul1, rat1, rib1; int waktu = 300;
int a = 0; int nilai; int life = 5; unsigned char temp;
void panah_kanan(void) {
for(j=85; j>=55; j--) {
SetPACA(4,j); WriteData(255); }
SetPACA(5,62); WriteData(255); SetPACA(5,61); WriteData(127); SetPACA(5,60); WriteData(63); SetPACA(5,59); WriteData(31); SetPACA(5,58); WriteData(15); SetPACA(5,57); WriteData(7); SetPACA(5,56); WriteData(3); SetPACA(5,55); WriteData(1);
SetPACA(3,62); WriteData(255); SetPACA(3,61); WriteData(254); SetPACA(3,60); WriteData(252); SetPACA(3,59); WriteData(248);
Program ini menggunakan
library NUC1xxx.h,
DrvSYS.h, dan DrvGPIO.h
sebagai dasar.
LCD_Driver.h sebagai
library untuk mengakses
LCD. Scankey.h berfung
sebagai library untuk
mengakses keypad.
Seven_segment.h sebagai
library untuk mengakses 7
segment.
Terdapat 5 buah fungsi
yaitu panah atas, kanan,
kiri, bawah , dan tengah .
Masing-masing fungsi
tersebut menggambarkan
anak panah sesuai dengan
arahnya masing-masing,
dengan cara membuat
titik-titik pada setiap
kordinat di LCD grafik
sehingga membentuk
gambar arah panah dan
plus. Digunakan fungsi
SetPACA () sebagai
penentu koordinat pada
LCD dan fungsi WriteData
() yang berfungsi
SetPACA(3,58); WriteData(240); SetPACA(3,57); WriteData(224); SetPACA(3,56); WriteData(192); SetPACA(3,55); WriteData(128);
SetPACA(4,54); WriteData(255); SetPACA(4,53); WriteData(126); SetPACA(4,52); WriteData(60); SetPACA(4,51); WriteData(24);
}
void panah_kiri(void) {
for(j=81; j>=51; j--) {
SetPACA(4,j); WriteData(255); }
SetPACA(5,74); WriteData(255); SetPACA(5,75); WriteData(127); SetPACA(5,76); WriteData(63); SetPACA(5,77); WriteData(31); SetPACA(5,78); WriteData(15); SetPACA(5,79); WriteData(7); SetPACA(5,80); WriteData(3); SetPACA(5,81); WriteData(1);
SetPACA(3,79); WriteData(224); SetPACA(3,80); WriteData(192); SetPACA(3,81); WriteData(128);
SetPACA(4,82); WriteData(255); SetPACA(4,83); WriteData(126); SetPACA(4,84); WriteData(60); SetPACA(4,85); WriteData(24);
}
void panah_atas(void) {
for(k=3;k<=5;k++) {
for(j=71; j>=64; j--) {
SetPACA(k,j); WriteData(255); }
}
SetPACA(2,71); WriteData(128); SetPACA(2,70); WriteData(192); SetPACA(2,69); WriteData(224); SetPACA(2,68); WriteData(240); SetPACA(2,67); WriteData(240); SetPACA(2,66); WriteData(224); SetPACA(2,65); WriteData(192); SetPACA(2,64); WriteData(128);
SetPACA(3,76); WriteData(240); SetPACA(3,77); WriteData(224); SetPACA(3,78); WriteData(192); SetPACA(3,79); WriteData(128);
SetPACA(3,63); WriteData(255); SetPACA(3,62); WriteData(254); SetPACA(3,61); WriteData(252); SetPACA(3,60); WriteData(248); SetPACA(3,59); WriteData(240); SetPACA(3,58); WriteData(224); SetPACA(3,57); WriteData(192); SetPACA(3,56); WriteData(128);
}
void panah_bawah(void) {
for(k=3;k<=5;k++) {
for(j=71; j>=64; j--) {
SetPACA(k,j); WriteData(255); }
}
SetPACA(5,63); WriteData(255); SetPACA(5,62); WriteData(127); SetPACA(5,61); WriteData(63); SetPACA(5,60); WriteData(31); SetPACA(5,59); WriteData(15); SetPACA(5,58); WriteData(7); SetPACA(5,57); WriteData(3); SetPACA(5,56); WriteData(1);
SetPACA(6,71); WriteData(1); SetPACA(6,70); WriteData(3); SetPACA(6,69); WriteData(7); SetPACA(6,68); WriteData(15); SetPACA(6,67); WriteData(15); SetPACA(6,66); WriteData(7); SetPACA(6,65); WriteData(3); SetPACA(6,64); WriteData(1);
}
void panah_tengah(void) {
for(j=83; j>=53; j--) {
SetPACA(4,j); WriteData(255); }
for(k=3;k<=5;k++) {
for(j=71; j>=64; j--) {
SetPACA(k,j); WriteData(255); }
void kanan(void) {
clr_all_pannal(); panah_kanan(); score(); nyawa();
for(i=0;i<=waktu;i++) {
temp=Scankey(); if (temp==6)
{
print_lcd(3,"BENAR"); close_seven_segment(); buzzer_benar();
DrvSYS_Delay(2000000); a++;
random(); }
if ((temp==2)||(temp==4)||(temp==5)||(temp==8)) {
print_lcd(3," SALAH");
close_seven_segment(); buzzer_salah();
DrvSYS_Delay(2000000); life--;
random(); }
score(); }
waktu_habis(); }
void kiri(void) {
clr_all_pannal(); panah_kiri(); score(); nyawa();
for(i=0;i<=waktu;i++) {
temp=Scankey(); if (temp==4)
{
print_lcd(3,"BENAR"); close_seven_segment(); buzzer_benar();
DrvSYS_Delay(2000000); a++;
random(); }
if ((temp==2)||(temp==6)||(temp==5)||(temp==8)) {
print_lcd(3," SALAH");
Terdapat 5 buah fungsi
selanjutnya yaitu: kanan(),
kiri(), atas(), bawah(), dan
tengah().
Fungsi kanan() memanggil
fungsi panah_kanan()
untuk menampilkan
gambar panah kanan.
Memanggil fungsi score()
untuk menampilkan score
pada seven segment.
Memanggil fungsi nyawa()
untuk menampikan
jumlah toleransi
kesalahan pada LCD. Pada
fungsin ini menggunakan
perula ga for ya g
berulang selama waktu
tertentu yang semakin
lama semakin cepat.
Didalam perulangan ini
terdapat dua kondisi yaitu
jika tombol yang di tekan
adalah tombol 6 maka
fungsi akan menampilkan
kata BENAR pada LCD lalu
menjalankan fungi
buzzer_benar(),
mengincrement nilai dari
variable a lalu ke bali
ke fungsi random().
Kondisi yang kedua ada
bila yang di tekan tombol
selain angka 6 maka
fungsi akan menampilkan
kata SALAH pada LCD lalu
menjalankan fungsi
buzzer_salah(),
close_seven_segment(); buzzer_salah();
DrvSYS_Delay(2000000); life--;
random(); }
score(); }
waktu_habis(); }
void atas(void) {
clr_all_pannal(); panah_atas(); score(); nyawa();
for(i=0;i<=waktu;i++) {
temp=Scankey(); if (temp==2)
{
print_lcd(3,"BENAR"); close_seven_segment(); buzzer_benar();
DrvSYS_Delay(2000000); a++;
random(); }
if ((temp==6)||(temp==4)||(temp==5)||(temp==8)) {
print_lcd(3," SALAH");
close_seven_segment(); buzzer_salah();
DrvSYS_Delay(2000000); life--;
random(); }
score(); }
waktu_habis(); }
void bawah(void) {
clr_all_pannal(); panah_bawah(); score(); nyawa();
for(i=0;i<=waktu;i++) {
{
print_lcd(3,"BENAR"); close_seven_segment(); buzzer_benar();
DrvSYS_Delay(2000000); a++;
random(); }
if ((temp==2)||(temp==4)||(temp==5)||(temp==6)) {
print_lcd(3," SALAH");
close_seven_segment(); buzzer_salah();
DrvSYS_Delay(2000000); life--;
random(); }
score(); }
waktu_habis(); }
void tengah(void) {
clr_all_pannal(); panah_tengah(); score();
nyawa();
for(i=0;i<=waktu;i++) {
temp=Scankey(); if (temp==5)
{
print_lcd(3,"BENAR"); close_seven_segment(); buzzer_benar();
DrvSYS_Delay(2000000); a++;
random(); }
if ((temp==2)||(temp==4)||(temp==8)||(temp==6)) {
print_lcd(3," SALAH");
close_seven_segment(); buzzer_salah();
DrvSYS_Delay(2000000); life--;
random(); }
score(); }
void nyawa(void) {
if(life == 5)print_lcd(0,"LIFE : *****"); if(life == 4)print_lcd(0,"LIFE : **** "); if(life == 3)print_lcd(0,"LIFE : *** "); angka=angka/10; pul = angka%10; angka=angka/10; rat = angka%10; angka=angka/10; rib = angka%10; sat1 = angka1%10; angka1=angka1/10; pul1 = angka1%10; angka1=angka1/10; rat1 = angka1%10; angka1=angka1/10; rib1 = angka1%10;
close_seven_segment(); show_seven_segment(0,sat1); DrvSYS_Delay(1000);
Fungsi nyawa() akan
menampilkan gambar
bi ta g * pada LCD
sesuai dengan jumlah
variable life ya g
tersisa. Bila jumlah
variable life = 0 aka
akan menjalankan fungsi
mati();
Fungsi random() akan
melakukan perandoman
bedasarkan Waktu
tempuh dari mulai panah
muncul sampai tombol
tertekan. Waktu tempuh
yang di perlukan akan
menentukan gambar
panah selanjutnya yang
akan tampil. Sehingga
perbedaan waktu tempuh
yang di perlukan akan
merandom arah panah
yang berbeda-beda. Pada
fungsi ini durasi dari
pemucunculan arah
panah akan di kurangi
sebanyak 5 setiap
putaran, dan di berikan
batas waktu minimal yaitu
sebesar 50.
Fungsi score() akan
menampilkan nilai dari
jumlah benar (variable a)
yang di tampilkan pada 4
buah seven segment yang
masing-masing mewakili
satuan, puluhan, ratusan,
ribuan. Untuk
memudahkan penampilan
score pada seven segment
di gunakan library
close_seven_segment(); show_seven_segment(1,pul1); DrvSYS_Delay(1000);
close_seven_segment(); show_seven_segment(2,rat1); DrvSYS_Delay(1000);
close_seven_segment(); show_seven_segment(3,rib1); DrvSYS_Delay(1000);
}
void mati(void) {
clr_all_pannal(); while(1)
{
score();
print_lcd(1," GAME OVER"); }
}
void waktu_habis(void) {
clr_all_pannal(); close_seven_segment();
print_lcd(1, " WAKTU HABIS "); buzzer_salah();
life--;
DrvSYS_Delay(2000000); score();
nyawa(); }
void buzzer_benar(void) {
DrvGPIO_ClrBit(E_GPB,11); DrvSYS_Delay(100000); DrvGPIO_SetBit(E_GPB,11); }
void buzzer_salah(void) {
DrvGPIO_ClrBit(E_GPB,11); DrvSYS_Delay(100000); DrvGPIO_SetBit(E_GPB,11); DrvSYS_Delay(100000); DrvGPIO_ClrBit(E_GPB,11); DrvSYS_Delay(100000); DrvGPIO_SetBit(E_GPB,11); DrvSYS_Delay(100000); DrvGPIO_ClrBit(E_GPB,11); DrvSYS_Delay(100000); DrvGPIO_SetBit(E_GPB,11); DrvSYS_Delay(100000);
Fungsi mati() di panggil
saat variable life = 0
sehingga membuat
permainan berakhir.
Fungsi ini akan menahan
proses dari program
dengan menggunakan
perulangan while(1), dan
menampilkan tulisan
GAME OVER dan
menjalankan fungsi
score().
Fungsi waktu_habis() akan
menampilkan tulisan pada
LCD WAKTU HABI“ lalu
menjalankan fungsi
buzzer_salah()
mendecrement variable
life e jala ka fu gsi
score() dan nyawa().
Fungsi buzzer_benar()
akan menghidupkan
buzzer selama 100000 us
lalu mematikannya.
}
void pembuka(void) {
print_lcd(1, " TIK TIK "); print_lcd(2, " [D]evolution");
DrvSYS_Delay(2500000); DrvSYS_Delay(2500000); DrvSYS_Delay(2500000); clr_all_pannal();
print_lcd(0, " TUGAS AKHIR "); print_lcd(1, " MIKROKONTROLER"); print_lcd(2, " BY : KESATRIA"); print_lcd(3, " BAJA HITAM");
DrvSYS_Delay(2500000); DrvSYS_Delay(2500000); clr_all_pannal();
print_lcd(1, "STARTING ON..."); print_lcd(2, " 5");
DrvSYS_Delay(2500000); print_lcd(2, " 4"); DrvSYS_Delay(2500000); print_lcd(2, " 3"); DrvSYS_Delay(2500000); print_lcd(2, " 2"); DrvSYS_Delay(2500000); print_lcd(2, " 1"); DrvSYS_Delay(2500000); clr_all_pannal();
print_lcd(1, " GO...!!! "); DrvSYS_Delay(2500000);
}
int main(void) {
/* Unlock the protected registers */
UNLOCKREG();
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
/* Waiting for 12M Xtal stalble */
//SysTimerDelay(5000);
DrvSYS_Delay(5000);
/* HCLK clock source. 0: external 12MHz; 4:internal 22MHz RC oscillator */
DrvSYS_SelectHCLKSource(0);
/*lock the protected registers */
LOCKREG();
Fungsi pembuka() akan
menampilkan kata-kata
pembuka pada game dan
melakukan counting down
dari 5 sampai 1 untuk
memulai permainan.
DrvSYS_SetClockDivider(E_SYS_HCLK_DIV, 0); /* HCLK clock frequency = HCLK clock source / (HCLK_N + 1) */
Initial_pannel(); //call initial pannel function
clr_all_pannal();
DrvGPIO_ClrBit(E_GPD,14);
OpenKeyPad();
while(1) {
pembuka(); random(); }