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>Simulasikan program di atas menggunakan AVR Studio4. Maksud dari code << yaitu untuk menggeser bit ke kiri :
#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);
}
}
PORTA=0x01<<n; //menggeser nilai sebesar 0x01 digeser ke kiri sebanyak n.misal:
//Dan mengeluarkan hasilnya ke Port A
PORTA=0x01<<2; //artinya menggeser nilai 0x01 digeser ke kiri sebanyak 2 kali.Pahami gambar berikut:
//lalu hasilnya dikeluarkan ke Port A
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<<nprogram di atas dapat juga ditulis seperti dibawah:
//nilai digeser ke kiri sebanyak n.
//tapi kali ini nilai yang digeser sebesar 0x03 = 0b000 0011
#include<mega8535.h>Pada program di atas, main program hanya berisi beberapa baris program saja. Main program memanggil prosedur geserkiri_A kemudian memanggil prosedur geserkiri_B.
#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();
}
}
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:
............Dengan menggunakan prosedur, main program akan terlihat lebih simple dan mudah dipahami.
............
geserkiri_A();
//berarti micro akan menjalankan code program yang ada di dalam prosedur geserkiri_A()
............
2. Fungsi
Fungsi merupakan prosedur yang memiliki nilai return (menghasilkan nilai).
Perhatikan code program berikut:
#include<mega8535.h>Pada contoh program di atas terdapat fungsi baca_PINA.
#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();
}
}
unsigned char baca_PINA()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:
{
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
}
PORTB=baca_PINA(); //memanggil fungsi baca_PINA ,Mungkin ada temen2 yang tanya, kenapa harus memakai fungsi segala, program untuk membaca nilai PINA lalu mengeluarkannya ke PORTB kan bisa ditulis seperti ini:
//lalu mengeluarkan hasilnya ke PORTB
...........Iya YA... kenapa mesri repot2.. HEhehe..
..........
while(1)
{
PORTB=PINA;
}
.........
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)Saat kita memanggil fungsi read_adc,kita harus memasukkan nilai variabel adc_input.
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
misal:
data_ADC=read_adc(0); //nilai 0 merupakan nilai untuk variabel adc_inputYupzzz...... 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.
Selengkapnya...