Monday, November 23, 2009

Prosedur dan Fungsi dalam C

Dalam penulisan program bahasa C, kadang terdapat code program yang harus kita gunakan beberapa kali. Dengan metode penulisan sederhana, kita akan menulisa code tersebut berulang kali juga. Misal: saat kita ingin menggunakan baris code itu 13x maka kita akan menulisnya 13x juga. Hmmm..... pasti merepotkan.
Dengan Prosedur dan Fungsi, kita gak perlu repot-repot, cukup menulis setiap baris code tersebut sekali aja.

1. Prosedur
Perhatikan contoh program berikut:

#include
#include


void main()
{
DDRA= 0xff;
PORTA=0x00;
while(1)
{
PORTA=0x01<<0;
delay_ms(50);
PORTA=0x01<<1;
delay_ms(50);
PORTA=0x01<<2;
delay_ms(50);
PORTA=0x01<<3;
delay_ms(50);
PORTA=0x01<<4;
delay_ms(50);
PORTA=0x01<<5;
delay_ms(50);
PORTA=0x03<<0;
delay_ms(50);
PORTA=0x03<<1;
delay_ms(50);
PORTA=0x03<<2;
delay_ms(50);
}
}
Simulasikan program di atas menggunakan AVR Studio4. Maksud dari code << yaitu untuk menggeser bit ke kiri :

PORTA=0x01<<n; //menggeser nilai sebesar 0x01 digeser ke kiri sebanyak n.
//Dan mengeluarkan hasilnya ke Port A
misal:

PORTA=0x01<<2; //artinya menggeser nilai 0x01 digeser ke kiri sebanyak 2 kali.
//lalu hasilnya dikeluarkan ke Port A
Pahami gambar berikut:
image


nilai yang dikeluarkan ke Port A, sama seperti gambar di samping.
Pertama, kondisi high pada Port A.0 lalu Port A.1 kemudian Port A.2 dan seterusnya.




























program di atas dapat juga ditulis seperti dibawah:

#include
#include

void geserkiri_A()
{
PORTA=0x01<<0;
delay_ms(50);
PORTA=0x01<<1;
delay_ms(50);
PORTA=0x01<<2;
delay_ms(50);
PORTA=0x01<<3;
delay_ms(50);
PORTA=0x01<<4;
delay_ms(50);
PORTA=0x01<<5;
delay_ms(50);
}

void geserkiri_B()
{
PORTA=0x03<<0;
delay_ms(50);
PORTA=0x03<<1;
delay_ms(50);
PORTA=0x03<<2;
delay_ms(50);
}


void main()
{
DDRA= 0xff;
PORTA=0x00;
while(1)
{
geserkiri_A();
geserkiri_B();
}
}
Pada program di atas, main program hanya berisi beberapa baris program saja. Main program memanggil prosedur geserkiri_A kemudian memanggil prosedur geserkiri_B.
Saat sebuah prosedur dipanggil, maka code program yang berada di dalam prosedur (di dalam kurung kurawal ) akan dijalankan oleh microcontroller. Cara memanggil prosedur cukup dengan menuliskan nama prosedurnya diikuti tanda kurung ( ) . Contoh:
............
............
geserkiri_A();
//berarti micro akan menjalankan code program yang ada di dalam prosedur geserkiri_A()
............
Dengan menggunakan prosedur, main program akan terlihat lebih simple dan mudah dipahami.
2. Fungsi
Fungsi merupakan prosedur yang memiliki nilai return (menghasilkan nilai).
Perhatikan code program berikut:

#include
#include
unsigned char baca_PINA()
{
unsigned char d;


d=PINA;
return d;
}
void main()
{
DDRA=0x00;
DDRB=0xff;
while(1)
{
PORTB=baca_PINA();
}
}
Pada contoh program di atas terdapat fungsi baca_PINA.

unsigned char baca_PINA()
{
unsigned char d; //mendeklarasikan variabel d dengan tipe data unsigned char

d=PINA; //memasukkan nilai PINA ke variabel d
return d; //mengembalikan(return) nilai d
//nilai d ini merupakan nilai yg dihasilkan saat fungsi baca_PINA dipanggil
}
Cara memanggil fungsi seperti di atas sama dengan cara memanggil prosedur. Cuman karena fungsi menghasilkan sebuah nilai, maka kita harus menyediakan tempat untuk menampung nilai tersebut. Contohnya pada program di atas terdapat code program berikut:
PORTB=baca_PINA(); //memanggil fungsi baca_PINA ,
//lalu mengeluarkan hasilnya ke PORTB
Mungkin ada temen2 yang tanya, kenapa harus memakai fungsi segala, program untuk membaca nilai PINA lalu mengeluarkannya ke PORTB kan bisa ditulis seperti ini:
...........
..........
while(1)
{
PORTB=PINA;
}
.........
Iya YA... kenapa mesri repot2.. HEhehe..
Program di atas kan hanya contoh simple aja biar gak bingung. Aplikasi sesungguhnya dari penggunaan fungsi adalah saat kita membaca data dari sensor, adc, serial dll...
NB:
Ada prosedur dan fungsi yang membutuhkan nilai masukan. Misal:

unsigned int read_adc(unsigned char adc_input)

{

ADMUX=adc_input|ADC_VREF_TYPE;

ADCSRA|=0x40;

while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10;

return ADCW;

}
Saat kita memanggil fungsi read_adc,kita harus memasukkan nilai variabel adc_input.
misal:
data_ADC=read_adc(0); //nilai 0 merupakan nilai untuk variabel adc_input
Yupzzz...... Sekarang kita telah mempelajari dasar fungsi dan prosedur.

No comments:

Post a Comment