Jumat, 13 Juni 2014

LAPORAN PROYEK PRAKTIKUM MIKROKONTROLLER

JUDUL
3D Led Cube 4x4x4 berbasis ATMEGA 32

LATAR BELAKANG
      Proyek Akhir ini sebenarnya dapat dibuat dan diselesaikan dengan menggunakan bahasa pemrograman selain bahasa C. Namun, untuk proyek kali ini kelompok kami menggunakan bahasa ini untuk membuat proyek. Alasan kenapa kami memilih menggunakan bahasa C karena disamping bahasa ini mudah untuk dipahami juga bahasa ini adalah bahasa mayoritas bagi kaum cendekiawan teknika Elektronika-Elektro. Disamping itu alasan mengapa kami menggunakan bahasa C adalah karena IC yang digunakan adalah IC dari keluarga Atmel AVR. IC ini biasanya di program menggunakan bahasa C dengan softwarenya yang bernama CV AVR. Penggunaan bahasa C saat ini adalah bersifat umum karena banyak di luar sana kita jumpai alat-alat yang control nya menggunakan IC jenis ini. Maka tidak heran apabila dalam proyek ini kami juga menggunakannya.
       Dalam layar dot matrix, beberapa LED di dalamya ada kabel bersama-sama dalam baris dan kolom. Hal ini dilakukan untuk meminimalkan jumlah pin yang diperlukan. Misalnya, 8 × 8 dot matriks LED akan membutuhkan 64 I / O pin, satu untuk setiap pixel LED. Dengan kabel dari semua anoda yang digabung menjadi satu dalam baris (R1 melalui R8), dan katoda dalam kolom (C1 melalui C8), jumlah yang diperlukan pin I / O dikurangi menjadi 16. Setiap LED ditujukan demi baris dan jumlah kolom. Pada gambar bawah ini, jika R4 adalah ditarik tinggi dan C3 ditarik rendah, LED di baris keempat dan kolom ketiga akan dihidupkan. Karakter dapat ditampilkan oleh pemindaian cepat baik baris atau kolom.
        Namun pada era sekarang, kita bisa mengenal pengembangan dari dotmatrik yaitu dengan LED Cube. LED ini bentuknya jauh lebih kecil dan jauh lebih efisien daripada dotmatrik. Disamping itu, biaya untuk membuat LED cube juga tidak terlalu mahal. Hanya saja, proses pembuatannya sedikit memakan waktu agak lama. LED Cube adalah pekembangan inovasi dari dot matrik led yang sifatnya hampir bisa dikatakan 3D. Namun disamping kelebihan yang dimiliki LED ini, ada juga kekurangannya. Jika pada dot matrix display, tulisannya bisa muncul semuanya, untuk LED Cube ini tidak bisa muncul semuanya sekaligus atau dengan kata lain, tulisannya muncul per kata.
     Untuk masalah rangkaian, rangkaian ini tergolong rangkaian yang tidak terlalu rumit. Yang rumit hanyalah ketika membuat programya saja. Rangkaian LED Cube hanya membutuhkan sebuah system minimum seperti gambar di atas dan rangkaian cube nya.

 
TUJUAN PEMBUATAN
1.     Mahasiswa dapat mengaplikasikan bahasa pemrograman terutama bahasa C untuk rangkaian elektronik berbasis mikrokontroller tipe Atmel.
2.      Mahasiswa dapat mengerti perkembangan teknologi  3D Led Cube sebagai perkembangan inovasi dari Led Matrix.
3.      Mahasiswa dapat membuat rangkaian Led Cube 4x4 sederhana.

LANGKAH PEMBUATAN
Langkah pembuatan project :
1.      Pembuatan desain rancangan dengan menggunakan aplikasi Proteus 7.10. rancangan yang di maksut yaitu rangkaian sistem minimum, rangkaian LED cube 4x4, dan rangkaian regulator.
2.      Melakukan pengeprintnan desain rancangan yang sudah menjadi Ares / jalur pada pcb.
3.      Hasil print lalu di setrika ke bagian pcb agar jalur pada kertas glosi menempel di bagian pcb.
4.      Setelah itu pcb di larutkan menggunakan feriklorit / carian pelarut pcb.
5.      Pemasangan komponen dan penyoldieran komponen.
6.      Merangkai LED agar menjadi berbetuk kubus supaya terlihat 3D.
7.      Pada perangkaian LED ini memerlukan cetakan / tempat peletakkan LED.
8.      Untuk pola yang akan di tempilkan pada LED diperlukan software tersendiri yaitu Cube Polaers.
9.      Yang terakhir pembuatan kode program menggukanan AVR.

DESAIN RANCANGAN
1.      Rangkaian Sistem Minimum
Gambar 1. Rangkaian Sistem Minimum Led Cube 4x4 pada software ISIS
 
Rangkaian minimum ini menggunakan IC Atmega 32. PORT A dan PORT C pada IC ini digunakan untuk sambungan anoda LED. Sementara PORT D.0 sampai PORT D.3 digunakan untuk button pilihan menu, dan PORT D.4 sampai PORT  D.7 digunakan untuk pemilihan layer. Setelah rangkaian digambar pada ISIS, rangkaian ini kemudian dijadikan layout jalur PCB dengan menggunakan software ARES. Hasilnya adalah seperti pada gambar di bawah ini.


Gambar 2. Layout PCB Rangkaian Sistem Minimum LED Cube 4x4

2.      Rangkaian LED Cube 4x4

Gambar 3. Rangkaian LED Cube 4x4

Rangkaian ini terdiri atas susunan LED yang berjumlah sebanyak 64 jumlah. Setiap LED nantinya akan di program dengan fitur Timer pada CV AVR agar nantinya LED bisa dihidupkan. Namun, LED ini tidak di program untuk menyala sembarangan. Sebelumnya, terlebih dahulu kita membuat pola LED nya. Untuk membentuk pola LED, digunakanlah software Cube Dot agar saat memprogram nanti tidak perlu memikirkan dot berapa yang harus hidup karena di software ini sudah terdapat fitur copy untuk meng-copy nilai hexa dot LED berapa saja yang nantinya akan dihidupkan dan dibentuk polanya dan tinggal dimasukkan saja ke dalam programnya. Dan dibawah ini adalah gambar layout LED Cube 4x4x4 yang sudah dibuat pada software ARES.


Gambar 4. Layout PCB Rangkaian LED Cube 4x4x4

3.      Rangkaian Regulator (Penurun Tegangan)

                               
                           Gambar 5. Rangkaian Regulator dengan IC 7805

      Rangkaian regulator ini menggunakan IC 7805 dimana nanti IC ini berfungsi untuk menurunkan tegangan dari 12V (DC) menjadi 5 V (DC). Jika rangkaian ini tidak memakai regulator, maka nantinya akan berdampak pada mikrokontroller yang tidak akan bisa untuk menahan tegangan masuk, sehingga menyebabkan rangkaian minimumnya akan terbakar dan tidak dapat berjalan.


FLOWCHART

Gambar 6. Flowchart Rangkaian LED Cube 4x4x4

Flowchart ini dibuat agar dapat mempermudah kinerja dalam membuat program. Dalam flowchart ini disebutkan ada 10 efek 3D yang nantinya akan ditampilkan. Dan setelah program ini selesai running, program ini masih dapat diulang apabila kita menekan tombol start.

PENGUJIAN
Dalam pengujian disini saya perlihatkan pengujian dalam bentuk video, di bawah ini videonya :

KODE PROGRAM

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : Led Cube
Version :
Date    : 09/06/2014
Author  : SetiaBn
Company :
Comments:


Chip type                                : ATmega32
Program type                           : Application
AVR Core Clock frequency   : 12,000000 MHz
Memory model                                    : Small
External RAM size                             : 0
Data Stack size                       : 512
*****************************************************/

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

// Alphanumeric LCD Module functions
#include <alcd.h>

//blok definisi
#define baris0 PORTA
#define baris1 PORTC
#define layer PORTD
#define all_off 0x0f
#define all_on 0xf0

#define start !PIND.3
#define prev !PIND.2
#define next !PIND.1
#define keep !PIND.0


//deklarasi variabel variabel yang sering digunakan pada perulangan
unsigned char i,j,k;

//data0 untuk mengisi PORTA dan data1 untuk PORTC
//array berisi 4 elemen karena ada 4 layer
//data[0] untuk layer teratas dan data[3] terbawah
unsigned char data0[4], data1[4];

//variabel layer on digunakan untuk mengeset layer mana yang akan dinyalakan
unsigned char layer_on = 0;

//variabel layer_ke digunakan untuk mengisi data ke PORTD
unsigned char layer_ke;
// Timer 0 overflow interrupt service routine

//frekuensi timer = 11719.
//timer0 akan menghitung dari 0 ke 255 dan kemudian baru melakukan interupsi
//sehingga interupsi dilakukan 45 kali per detik
//karena ada 4 layer maka pergantian nyala dalam 1 detik ada 45/4 = 12,5 fps
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{

//mematikan semua led agar update data tidak terlihat
layer &= all_off;

//mengisikan data ke PORT
baris0 = data0[layer_on];
baris1 = data1[layer_on];

layer |= (0x80 >> layer_on);
//tiap layer dinyalakan bergantian
layer_on ++;

//jika layer sudah 4 maka dikembalikan ke layer 0 lagi
if(layer_on == 4) layer_on = 0;
}

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TCNT0 = 243;
}

//------------------ fungsi2 yang digunakan untuk inisialisasi atmega --------------------
//----------------------------------------------------------------------------------------

void timer_init()
    {
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 11,719 kHz
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=0x05;
    TCNT0=0x00;
    OCR0=0x00;
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 11,719 kHz
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x05;
    TCNT2=0x00;
    OCR2=0x00;
    }

void ioinit()
    {
    PORTA=0x00;
    DDRA=0xFF;
    PORTB=0x00;
    DDRB=0xff;
    PORTC=0x00;
    DDRC=0xFF;
    PORTD=0x0F;
    DDRD=0xF0;

    timer_init();
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x41;


    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    TWCR=0x00;

    // Alphanumeric LCD initialization
    // Connections specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTB Bit 0
    // RD - PORTB Bit 1
    // EN - PORTB Bit 2
    // D4 - PORTB Bit 3
    // D5 - PORTB Bit 4
    // D6 - PORTB Bit 5
    // D7 - PORTB Bit 7
    // Characters/line: 16
    lcd_init(16);
    }
//----------------------------------------------------------------------------------------
//--------------------- fungsi2 yang digunakan untuk grafik cube -------------------------
//----------------------------------------------------------------------------------------

//digunakan untuk mengisi semua layer dengan data yang sama
void fill(unsigned char grid0, unsigned char grid1)
    {   
    unsigned char i;
    for(i=0;i<4;i++)
        {
        data0[i] = grid0;
        data1[i] = grid1;
        }
    }

//digunakan untuk mengisi seluruh cube dengan data yang berbeda
void isi_cube(unsigned char baris00, unsigned char baris01,
              unsigned char baris10, unsigned char baris11,
              unsigned char baris20, unsigned char baris21,
              unsigned char baris30, unsigned char baris31)
    {
    data0[0] = baris00; data1[0] = baris01;
    data0[1] = baris10; data1[1] = baris11;
    data0[2] = baris20; data1[2] = baris21;
    data0[3] = baris30; data1[3] = baris31;
    }

void isi_layer(unsigned char layer_ke, unsigned char grid0, unsigned char grid1)
    {
    data0[layer_ke] = grid0; data1[layer_ke] = grid1;
    }  

//void setbit digunakan untuk mengeset salah satu led agar on

//formatnya  x,y
//kanan adalah depan
//sehingga x menentukan posisi depan belakang
//dan y menentukan kanan kiri
//sedangkan z atas bawah
//   3,0 2,0 1,0 0,0
//   3,1 2,1 1,1 0,1
//   3,2 2,2 1,2 0,2
//   3,3 2,3 1,3 0,3

//4 data dikanan(depan) merupakan data1[...] dan
//4 data dikiri(belakang) merupakan data0[...]
void set_bit(unsigned char x, unsigned char y, unsigned char z)
    {
    if(x<2) data1[z] |= ((1<<y)<<(x*4));
    else data0[z] |= ((0x80>>y)>>((x-2)*4)); 
    }


void clear_bit(unsigned char x, unsigned char y, unsigned char z)
    {
    if(x<2) data1[z] &= ~((1<<y)<<(x*4));
    else data0[z] &= ~((0x80>>y)>>((x-2)*4));
    }       

void tarik_depan(unsigned char layer)
    {                  
    unsigned char temp;
    data1[layer] = data1[layer]>>4;
    temp = data0[layer]&0xf0;
    temp = 15-temp;
    data1[layer] = data1[layer] | temp;
    data0[layer] = data0[layer]<<4;
    }     

//catatan khusus geser_kiri dan geser_kanan masih masalah----------------------
//digunakan untuk menggeser tampilan ke kanan    
void geser_kanan()
    {unsigned char j;   
    for(j=0;j<4;j++)
        {        
        data0[j]=data0[j] << 1;
        data1[j]=data1[j] >> 1;
        }
    }          

//digunakan untuk menggeser tampilan ke kiri    
void geser_kiri()
    {unsigned char j;   
    for(j=0;j<4;j++)
        {        
        data0[j]=data0[j] >> 1;
        data1[j]=data1[j] << 1;
        }
    }

//-----------------------------------------------------------------------------
//digunakan untuk menggeser tampilan ke atas
void geser_atas()
    {
    unsigned char j;   
    for(j=0;j<3;j++)
        {        
        data0[j]=data0[j+1];
        data1[j]=data1[j+1];
        }
    data0[3] = 0x00;
    data1[3] = 0x00;
    }

//digunakan untuk menggeser tampilan ke bawah
void geser_bawah()
    {
    unsigned char j;   
   for(j=3;j>0;j--)
        {        
        data0[j]=data0[j-1];
        data1[j]=data1[j-1];
        }
    data0[0] = 0x00;
    data1[0] = 0x00;
    }

//----------------------------------------------------------------------------------------
//-------------------- fungsi2 yang digunakan untuk efek dasar cube ----------------------
//----------------------------------------------------------------------------------------

//memberikan efek pola dari atas dan seolah-olah memanjang ke bawah
void turun(int tunda, unsigned char grid0,unsigned char grid1)
    {
    fill(0x00, 0x00);
    data0[0] = grid0; data1[0] = grid1; delay_ms(tunda);
    data0[1] = grid0; data1[1] = grid1; delay_ms(tunda);
    data0[2] = grid0; data1[2] = grid1; delay_ms(tunda);
    data0[3] = grid0; data1[3] = grid1; delay_ms(tunda);
    }

//memberikan efek pola dari bawah dan seolah-olah memanjang ke atas          
void naik(int tunda, unsigned char grid0,unsigned char grid1)
    {
    fill(0x00, 0x00);
    data0[3] = grid0; data1[3] = grid1; delay_ms(tunda);
    data0[2] = grid0; data1[2] = grid1; delay_ms(tunda);
    data0[1] = grid0; data1[1] = grid1; delay_ms(tunda);
    data0[0] = grid0; data1[0] = grid1; delay_ms(tunda);
    }

//----------------------------------------------------------------------------------------
//------------------ fungsi2 yang digunakan untuk efek lanjutan cube ---------------------
//----------------------------------------------------------------------------------------
//menulis LED

void rusuk_kubus()
    {
    unsigned char data,i;
    data = 0x01;     
    for(i=0;i<3;i++)
        {
        data0[0] = data;
        data1[0] = data;
        data = (data<<1)+1;    
        delay_ms(50);
        } 
    delay_ms(200);

    isi_layer(0,0x9d,0x9d); delay_ms(50);
    isi_layer(0,0x9f,0x9f); delay_ms(250);

    isi_layer(1,0x01,0x01); delay_ms(50);
    isi_layer(2,0x01,0x01); delay_ms(50);
    isi_layer(3,0x01,0x01); delay_ms(250);

    data = 0x01;     
    for(i=0;i<3;i++)
        {
        data0[3] = data;
        data1[3] = data;
        data = (data<<1)+1;    
        delay_ms(50);
        }
    delay_ms(200);
    isi_layer(3,0x9d,0x9d); delay_ms(50);
    isi_layer(3,0x9f,0x9f); delay_ms(200);

    }

void led_cube()
    {
    //Huruf L
    isi_cube(0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0f);
    delay_ms(800);
    //matikan cube
    fill(0x00,0x00);
    delay_ms(500); 
    //huruf E
    isi_cube(0x00, 0x0f, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0f);
    delay_ms(800);
    //matikan cube
    fill(0x00,0x00);
    delay_ms(500); 
    //huruf D
    isi_cube(0x00, 0x0e, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0e); 
    delay_ms(800);
    //matikan cube
    fill(0x00,0x00);
    delay_ms(1500);
    //nyalakan rusuk cube

    rusuk_kubus();
    delay_ms(500);

    isi_cube(0x9f, 0x9f, 0x09, 0x09, 0x09, 0x09, 0x9f, 0x9f);
    delay_ms(2500);
    } 

void puyuh()
    {    
    unsigned char i,z; 
    int tunda = 30;

    fill(0x00,0x00);

    for(i=4;i>0;i--)
        {        
        z=i-1;
        set_bit(2,0,z); delay_ms(tunda); clear_bit(2,0,z);
        set_bit(1,0,z); delay_ms(tunda); clear_bit(1,0,z);
        set_bit(0,1,z); delay_ms(tunda); clear_bit(0,1,z);
        set_bit(0,2,z); delay_ms(tunda); clear_bit(0,2,z);
        set_bit(1,3,z); delay_ms(tunda); clear_bit(1,3,z);
        set_bit(2,3,z); delay_ms(tunda); clear_bit(2,3,z);
        set_bit(3,2,z); delay_ms(tunda); clear_bit(3,2,z);
        set_bit(3,1,z); delay_ms(tunda); clear_bit(3,1,z);
        }  

    for(z=0;z<4;z++)
        {
        set_bit(2,0,z); delay_ms(tunda); clear_bit(2,0,z);
        set_bit(1,0,z); delay_ms(tunda); clear_bit(1,0,z);
        set_bit(0,1,z); delay_ms(tunda); clear_bit(0,1,z);
        set_bit(0,2,z); delay_ms(tunda); clear_bit(0,2,z);
        set_bit(1,3,z); delay_ms(tunda); clear_bit(1,3,z);
        set_bit(2,3,z); delay_ms(tunda); clear_bit(2,3,z);
        set_bit(3,2,z); delay_ms(tunda); clear_bit(3,2,z);
        set_bit(3,1,z); delay_ms(tunda); clear_bit(3,1,z);
        }

    }

void air_mancur()
    {    
    unsigned char i;
    //kosongkan cube
    fill(0x00,0x00);
    //nyalakan salah satu led pada kubus terbawah
    data0[3] = 0x20;      
    //naikkan led tersebut
    naik(200,0x20,0x00); 
    //buat efek ledakan dengan mengaktifkan led ke arah bawah
    turun(130,0xff,0xff); 

    for(i=0;i<3;i++)
        {
        naik(100,0xff,0xff);
        turun(100,0xff,0xff);
        if(next) break;
        if(keep) i=0;
        } 
    }   

void moving_box()
    {
    isi_cube(0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00);
    delay_ms(300);
    geser_bawah();
    delay_ms(100);
    geser_bawah();
    delay_ms(80);
    geser_bawah();
    delay_ms(300);

    isi_cube(0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x66);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0xcc);
    delay_ms(300);

    isi_cube(0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x30, 0xc0);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x33, 0x00);
    delay_ms(300);

    geser_atas();
    delay_ms(80);
    geser_atas();

    delay_ms(300);   
    isi_cube(0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00);
    delay_ms(80);
    }

void grow_box()
    { 
    isi_cube(0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
    delay_ms(200);
    isi_cube(0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00);
    delay_ms(80);
    isi_cube(0xe0, 0x77, 0xe0, 0x77, 0xe0, 0x77, 0x00, 0x00);
    delay_ms(80);
    isi_cube(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff);   
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x77, 0xe0, 0x77, 0xe0, 0x77, 0xe0);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x33, 0x00);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
    delay_ms(200);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x33, 0x00);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x77, 0xe0, 0x77, 0xe0, 0x77, 0xe0);
    delay_ms(80);
    delay_ms(80);
    isi_cube(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff);   
    delay_ms(80);
    isi_cube(0xe0, 0x77, 0xe0, 0x77, 0xe0, 0x77, 0x00, 0x00);
    delay_ms(80);
    isi_cube(0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
    delay_ms(200); 
    }

//void flip digunakan untuk membuat efek kertas yang melipat
void flip_tb() // top to back
    {
    isi_cube(0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
    delay_ms(80);
    isi_cube(0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00);
    delay_ms(80);                
    isi_cube(0x0f, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x0f);
    delay_ms(80);
    isi_cube(0x0f, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0xf0, 0x00);
    delay_ms(80);
    isi_cube(0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00);
    delay_ms(80);   
    }

void flip_bd() // back to down
    {
    isi_cube(0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00);
    delay_ms(80);
    isi_cube(0xf0, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x0f, 0x00);
    delay_ms(80);
    isi_cube(0x00, 0x0f, 0x00, 0xf0, 0xf0, 0x00, 0x0f, 0x00);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff);
    delay_ms(80);   
    }

void flip_df() //down front
    {
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff);
    delay_ms(80);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff);
    delay_ms(80);    
    isi_cube(0x0f, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x0f);
    delay_ms(80); 
    isi_cube(0x00, 0xf0, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x0f);
    delay_ms(80);
    isi_cube(0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f);
    delay_ms(80);
    }

void flip_ft() //front top
    {
    isi_cube(0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f);
    delay_ms(80);
    isi_cube(0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0xf0);
    delay_ms(80);  
    isi_cube(0x00, 0x0f, 0x00, 0xf0, 0xf0, 0x00, 0x0f, 0x00);
    delay_ms(80); 
    isi_cube(0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00);
    delay_ms(80);
    isi_cube(0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
    delay_ms(80);
    }   


//digunakan untuk meringkas kode hujan garis
void bantu1(unsigned char awal0, unsigned char awal1,
            unsigned char tengah0, unsigned char tengah1,
            unsigned char akhir0, unsigned char akhir1)
    {
    isi_layer(0,awal0, awal1);
    isi_layer(1,tengah0, tengah1); delay_ms(80); isi_layer(1,0x00, 0x00);
    isi_layer(2,tengah0, tengah1); delay_ms(80); isi_layer(2,0x00, 0x00);
    isi_layer(3,akhir0, akhir1); delay_ms(150);
    }

//digunakan untuk meringkas kode hujan garis
void bantu2(unsigned char awal0, unsigned char awal1,
            unsigned char tengah0, unsigned char tengah1,
            unsigned char akhir0, unsigned char akhir1)
    {
    isi_layer(3,awal0, awal1);
    isi_layer(2,tengah0, tengah1); delay_ms(80); isi_layer(2,0x00, 0x00);
    isi_layer(1,tengah0, tengah1); delay_ms(80); isi_layer(1,0x00, 0x00);
    isi_layer(0,akhir0, akhir1); delay_ms(150);
    }

void hujan_garis()
    {            
    //mengisi penuh layer atas
    fill(0x00,0x00); delay_ms(300);
    isi_layer(0,0x11,0x88); delay_ms(80);
    isi_layer(0,0x33,0xcc); delay_ms(80);
    isi_layer(0,0x77,0xee); delay_ms(80);
    isi_layer(0,0xff,0xff); delay_ms(300);

    //garis pertama turun
    bantu1(0x77,0xee,0x88,0x11,0x88, 0x11);
    //garis kedua turun
    bantu1(0x33,0xcc,0x44,0x22,0xcc,0x33);
    //garis ketiga turun
    bantu1(0x11,0x88,0x22, 0x44,0xee, 0x77);
    //garis keempat turun
    bantu1(0x00,0x00,0x11,0x88,0xff,0xff);
    delay_ms(300);

    //garis pertama naik
    bantu2(0x77,0xee,0x88,0x11,0x88, 0x11);
    //garis kedua naik
    bantu2(0x33,0xcc,0x44,0x22,0xcc,0x33);
    //garis ketiga naik
    bantu2(0x11,0x88,0x22, 0x44,0xee, 0x77);
    //garis keempat naik
    bantu2(0x00,0x00,0x11,0x88,0xff,0xff);


    isi_layer(0,0xff,0xff); delay_ms(250);
    isi_layer(0,0xf0,0xff); delay_ms(80);
    isi_layer(0,0x00,0xff); delay_ms(80);
    isi_layer(0,0x00, 0x0f); delay_ms(80);
    fill(0x00,0x00);
    }

void dna()
    {                                                    
    isi_cube(0x08, 0x08, 0x80, 0x80, 0x10, 0x10, 0x01, 0x01);
    delay_ms(150);                                      
    isi_cube(0x04, 0x04, 0x08, 0x08, 0x80, 0x80, 0x10, 0x10);
    delay_ms(150);                                      
    isi_cube(0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x80, 0x80);
    delay_ms(150);                                        
    isi_cube(0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08);
    delay_ms(150);                                      
    isi_cube(0x10, 0x10, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04);
    delay_ms(150);                                     
    isi_cube(0x80, 0x80, 0x10, 0x10, 0x01, 0x01, 0x02, 0x02);
    delay_ms(150);
    }

void dot_fill()
    {
    unsigned char x, y, z;
    fill(0x00,0x00);
    for(z=0;z<4;z++)
        {
        for(y=0;y<4;y++)
            {
            for(x=0;x<4;x++)
                {
                set_bit(x,y,z); 
                delay_ms(40);
                } 
            delay_ms(100);
            }
        }  
    for(z=0;z<4;z++)
        {
        for(y=0;y<4;y++)
            {
            for(x=0;x<4;x++)
                {
                clear_bit(x,y,z); 
                delay_ms(40);
                } 
            delay_ms(100);
            }
        }
    }

void maju2 (unsigned char grid0,unsigned char grid1)
    {                       
    fill(0x00,0x00);
    data0[0] = grid0; data1[0] = grid1;   
    delay_ms(500);
    tarik_depan(0);
    delay_ms(500);
    tarik_depan(0);
    delay_ms(500);
    tarik_depan(0);
    }                     

void ledakan()
    {
    isi_cube(0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60);delay_ms(200);
    isi_cube(0x00, 0x00, 0x00, 0x00, 0xf6, 0xf6, 0xf6, 0xf6);delay_ms(80);
    isi_cube(0x00, 0x00, 0x60, 0x60, 0xff, 0xff, 0xff, 0xff);delay_ms(80);
    isi_cube(0x00, 0x00, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff);delay_ms(80);
    isi_cube(0x60, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff);delay_ms(80);
    isi_cube(0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff);delay_ms(80);
    isi_cube(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff);delay_ms(500);

    for(i=0;i<4;i++)
        {
        data0[i]=0;
        data1[i]=0;
        delay_ms(150);
        }
    }

void UNY()
    {             

    lcd_clear();
    lcd_putsf("      U");
    isi_cube(0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0f, 0x00); delay_ms(80);
    isi_cube(0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0xf0, 0x00); delay_ms(80);
    isi_cube(0x00, 0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0xf0); delay_ms(80);
    isi_cube(0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0f); delay_ms(200);


    lcd_putsf("N");   
    isi_cube(0x09, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x09, 0x00); delay_ms(80);
    isi_cube(0x90, 0x00, 0xb0, 0x00, 0xd0, 0x00, 0x90, 0x00); delay_ms(80);
    isi_cube(0x00, 0x90, 0x00, 0xd0, 0x00, 0xb0, 0x00, 0x90); delay_ms(80);
    isi_cube(0x00, 0x09, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x09); delay_ms(200);

    lcd_putsf("Y");
    isi_cube(0x09, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x06, 0x00); delay_ms(80);
    isi_cube(0x90, 0x00, 0xf0, 0x00, 0x60, 0x00, 0x60, 0x00); delay_ms(80);
    isi_cube(0x00, 0x90, 0x00, 0xf0, 0x00, 0x60, 0x00, 0x60); delay_ms(80);
    isi_cube(0x00, 0x09, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x06); delay_ms(200); 

    ledakan();   
    lcd_clear();

    for(i=0;i<5;i++)
        {   
        lcd_putsf("-");
        delay_ms(50);
        }

    lcd_putsf(" UNY ");

    for(i=0;i<22;i++)
        {   
        lcd_putsf("-");
        delay_ms(50);
        }

    }

//----------------------------------------------------------------------------------------
void main(void)
{
// Declare your local variables here

ioinit();
// Global enable interrupts
#asm("sei")

lcd_putsf("--- LED Cube ---");
lcd_putsf("---- 4x4x4 -----");
led_cube();
delay_ms(1000);
lcd_clear();
lcd_putsf("- Tekan start --");

fill(0x00,0x00);

while(start == 0) {;}

ulang:

lcd_clear();
lcd_putsf("1. Air Mancur");

air_mancur();   

lcd_clear();
lcd_putsf("2. Hula Hoop");

fill(0x00,0x00);

for(i=0;i<3;i++)
    {
    puyuh();
    if(next) break;
    if(keep) i=0;
    }      

lcd_clear();
lcd_putsf("3.Fade in out");

for(i=0;i<3;i++)
    {
    dot_fill();
    if(next) break;
    if(keep) i=0;
    }   

lcd_clear();
lcd_putsf("4. Box jalan");

for(i=0;i<3;i++)
    {
    moving_box();
    if(next) break;
    if(keep) i=0;
    }

lcd_clear();
lcd_putsf("5. Ombak");

for(i=0;i<3;i++)
    {
    grow_box(); 
    if(next) break;
    if(keep) i=0;
    }

lcd_clear();
lcd_putsf("6. LED Koprol");

for(i=0;i<3;i++)
    {
    flip_tb();
    flip_bd();  
    flip_df();
    flip_ft();  
    if(next) break;
    if(keep) i=0;
    }

lcd_clear();
lcd_putsf("7.Garis jatuh");

for(i=0;i<3;i++)
    {
    hujan_garis(); 
    if(next) break;
    if(keep) i=0;
    } 

lcd_clear();
lcd_putsf("8. OX");

for(i=0;i<3;i++)
    {
    turun(100,0x69,0x69);
    naik(100,0x96,0x96);
    if(next) break;
    if(keep) i=0;
    }    

lcd_clear();
lcd_putsf("9. Balerina");

for(i=0;i<12;i++)
    {
    dna();  
    if(next) break;
    if(keep) i=0;
    }

UNY();

delay_ms(2000);
lcd_clear();
turun(100,0xff, 0xff);

lcd_putsf("- Tekan start --");

while(1)
    {       
    if(start) goto ulang;
    }
}

KESIMPULAN
Dari pembuatan project di atas dapat di simpulkan :
1.      Untuk membuat rangkaian LED Cube ini tidak terlal rumit karena hanya membutuhkan LED dan system minimum saja. Selebihnya yang sedikit sulit adalah pada pembuatan programnya.

2.      Perlu di ingat bahwa dalam pembuatan rangkaian ini, harus ada rangkaian regulator yang berfungsi untuk menurunkan tegangan input menjadi tegangan batasan yang dipakai. Karena apabila kita tidak memakai regulator, dampak terbesarnya adalah rangkaian tidak akan berjalan. Hal ini disebabkan karena mikrokontoller yang dipakai hanya dapat dimasuki tegangan ±5V. Selebihnya nanti dapat merusak mikro. Jika mikro sudah rusak, maka kita harus menggantinya dengan yang baru.

3.      Bahasa C sangat awam digunakan untuk membuat beberapa rangkaian elektronik termasuk untuk proyek akhir ini. Dan perlu diketahui pula bahwa bahasa C juga penting untuk dipelajari karena untuk dapat membuat alat elektronik berbasis kendali control jaman sekarang ini semuanya menggunakan program, dan lebih spesifiknya program bahasa C.