20081123

Mendalami Prosedur dan Fungsi

Dalam penulisan program bahasa C, kadang terdapat program yang kita gunakan berulang-ulang. Dengan metode penulisan secara sederhana kita akan menulisa code tersebut berulang-ulang, hmmm..... pasti merepotkan. Dengan Prosedur dan Fungsi, kita gak perlu repot-repot menulis setiap baris code tersebut.

1. Prosedur

Perhatikan contoh program berikut:

#include<mega8535.h>

#include<delay.h>

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.

Logika yang sama juga digunakan untuk code program berikut:

PORTA=0x03<<n

//nilai digeser ke kiri sebanyak n.

//tapi kali ini nilai yang digeser sebesar 0x03 = 0b000 0011

program di atas dapat juga ditulis seperti dibawah:

#include<mega8535.h>

#include<delay.h>

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<mega8535.h>

#include<delay.h>

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. Silahkan kembangkan ke dalam program yang lebih komplek. CHayooo..!!!!

any questions?? post comment on this blog: http:\\avrku.blogspot.com

or send email to: zigan@ymail.com

CodeVisionAVR C Compiler is copyright by Pavel Haiduc, HP InfoTech s.r.l.
AVR is a registered trademark of Atmel Corporation.