Professional Documents
Culture Documents
Sadsa
Sadsa
www.picproje.org
TEEKKRLER..
CokuN
Bunalmis
CaFFeiNe
Gsever
Kurumahmut
Macera
Microcozmoz
Otm
Oyhan
Petek
Picusta
Respected
SpeedyX
Timpati
Ziya
www.picproje.org
TRKYENN ELEKTRONK PLATFORMU
www.picproje.org
indekiler
nsz
Tarihe
Neden C?
PC ye kar PICmicro MCU tabanl program gelitirme
rn gelitirme
Terminoloji
Kodu deneme ve test etme
C kodlama standartlar
Temeller
C Temelleri
C programlarnn yaps
Bir C programnn bileenleri
#pragma
main()
#include
printf Fonksiyonu
Deikenler
Sabitler
Yorumlar
Fonksiyonlar
C komutlar
Deikenler
Veri Tipleri
Deiken Bildirimleri
Deiken Atamalar
Sralama
typedef
Tip Dnmleri
Fonksiyonlar
Fonksiyonlar
Fonksiyon Prototipleri
Fonksiyon Argmanlarnn Kullanm
Fonksiyonlardan Deer Dndrme
Klasik ve Modern Fonksiyon Bildirimleri
Operatrler
Aritmetik
likisel
Mantksal
Bit Operatrleri
Arttrma ve Azaltma
Operatr ncelikleri
www.picproje.org
Diziler / Katarlar
Tek Boyutlu Diziler
Katarlar
ok Boyutlu Diziler
ndeerli Diziler
Katar Dizileri
aretiler
areti Temelleri
aretiler ve Diziler
Fonksiyonlara Geen aretiler
Yaplar / Birleimler
Yap Temelleri
Yap aretileri
ie Yaplar
Birleim Temelleri
Birleim aretileri
PICmicro MCUe zg C
Giriler ve klar
C ve Assembly Birlikte Kullanm
Gelimi BIT leme
Zamanlayclar
A/D evrim
Veri letiimi
IC letiimi
SPI letiimi
PWM
LCD Srme
Kesmeler
Ktphaneler
www.picproje.org
nsz
Neden C?
C dili Dennis Ritchie ve Brian Kernighan tarafndan 1970li yllarn balarnda
Bell laboratuarlarnda gelitirilmitir. lk uygulama platformlarndan biri UNIX
ortamnda alan bir PDP-11 olmutur. Tantmndan bu yana, kendini
kantlam bir uygulama gelitirme dili olarak bilgi ilem endstrisinin bandan
sonuna dek evrim geirmitir ve standartlatrlmaktadr. PC, C++ ve dier ANSI
standardndaki versiyonlar iin dk maliyetli bir gelitirme ortam olmutur.
C, programlarn bir bilgisayardan baka bir bilgisayara minimum deiiklik
yaplarak aktarlabilmesi iin tanabilir bir dil olarak tasarlanmtr. PCler ve
anabilgisayarlar ile alrken bu ok iyi bir zelliktir. Fakat mikrokontrolrler ve
mikroilemciler farkl trlerdir. Ana program ak deimeden kalacaktr ama
eitli ayarlar ve port/evresel kontroller mikroilemciye zgdr. Buna rnek
olarak PICmicro MCU iin port yn yazmalarn verebiliriz, 1=Giri 0=k iken
H8 mikrokontrolrler iin 0=Giri 1=k belirtir.
reticilerin daha fazla program ve RAM hafzalar ile yksek iletim hzlar
sunmas C dilinin mikrodenetleyici uygulamalarnda kullanlmasna sebep
olmutur.
Bana aktarlan bir rnek hibir eye inanmayan biri olarak uydu: bir
zamanlayc fonksiyonunu assemblyde iki haftada C de ise birgnden ksa bir
srede yazabilirsiniz. Yani hemen koup bir C derleyicisi almam m
sylyorsunuz assemblyde yazmaktan niye sklaymki? Daha ksa kod retiyor
assemlyde yazlm bir program C de yazlm bir programa gre ortalama
%20 daha az yer kaplyor. Program hafzas yksek modellerde iyi fakat dk
modellerde pek randmanl deil.
www.picproje.org
rn gelitirme
rn gelitirme tecrbe ve ansn birleimidir. Baz ok kk program
paralar uzun gelitirme srelerine malolur fakat rnn mkemmelliinde
byk pay sahibidirler.
Bir rn gelitirmek iin unlara ihtiya vardr: zaman huzur ve sessizlik
mantksal dnce ve en nemlisi ihtiyalarn tam olarak anlalmasdr.
Bana gre gelitirmeye balamak iin en kolay yol fikirlerle beraber birka
sayfa temiz kattr.
e mmkn olan zmleri iziktirmekle balayn ve en basit, en gvenilir
seenei bulmak iin herbirini dikkatle gzden geirin. Bu aamada dier
fikirleri pe atmayn ilerinde gzel dnceler olabilir.
Ak diyagram, blok diyagram, G/ balantlarn izin.
Tm G/ pinleri ile prototip kartnz oluturun. Kartnz G/ pinleri
deitirilebilecek ekilde dizayn etmeniz kullanl olacaktr.
Programnz test edilebilir bloklar eklinde yazmaya balayn ve yava
yava byterek programnz oluturun. Bu sizi 2000 satrlk bir program tek
seferde hatalardan arndrmaktan kurtarr!
www.picproje.org
Eer ilk projenizse O ZAMAN BAST TUTUN devasa bir uygulamadan nce
komutlara almak, assembly tekniklerini ve hata ayklamay renmek iin bir
LED i butonlarla yakp sndrme gibi basit uygulamalar yapn.
Programnz basit admlarla test ederek oluturun. Ak diyagramnz elden
geirerek gncel kalmasn salayn.
Fikir
Bir fikir belki EVREKA! tarznda sizden kabilir veya baka birinin bir ihtiyac
olarakta doabilir.
Tasarm ilemine balamadan nce gerekli olan temel terminoloji
anlalmaldr. Bu durumda PICmicro MCU tabanl tasarm yapmaya
balamadan nce PIC dili (komut seti, terimler ve gelitirme kiti) tam olarak
anlalmaldr.
imdi genel terimlerle, PICler hakkndaki gereklerle ve mikroilemci ile
mikrodenetleyici sistemler arasndaki farklarla balyoruz.
Terminoloji
Kullanlan baz temel terimler
Mikrodenetleyici bir yazlm olmadan hibir i yapmayan plastik, metal ve kum
ynndan baka birey deildir. Yazlm ile kontrol edildiinde snrsz bir
uygulama alan vardr.
G/ d dnya ile iletiime geen MCU bacadr. Giri veya k olarak
ayarlanabilir. ou durumda G/ birimleri mikrodenetleyicinin iletiim, kontrol
ve bilgi almasna imkan verirler.
Yazlm mikrodenetleyicinin ilem yapmas ve almas iin gerekli olan bilgidir.
Baarl bir uygulama veya rn iin hatalardan arndrlm olmas gerekir.
Yazlm deiik dillerle yazlabilir C, pascal, basic veya assembly gibi (binary
kodlardan oluan makine dilinin bir st)
Donanm mikrodenetleyici, hafza, arabirim bileenleri, g kayna, sinyal
artlandrma devreleri ile sistemin almasn ve d dnya ile iletiimini
salayan bileenlerden oluur.
Baka bir bak asyla (zellikle almadnda) donanm frlatp atabilirsiniz.
www.picproje.org
www.picproje.org
www.picproje.org
www.picproje.org
10
www.picproje.org
C kodlama standartlar
Program yazmak ev ina etmeye benzer temel salam ise iler iyi gider.
Aadaki neriler C++ standartlar dokmanndan alnm ve PICe adapte
edilmitir.
simler fonksiyonlarna uygun olmasn salayn
simler programlamann kalbidir ve programda kullanl amac ile yerine
getirdii ileve uygun olarak verilmelidir. Okunabilirlii arttrmak iin byk
kk harfleri birlikte kullanabilirsiniz.
HataKontrol, HATAKONTROL den daha kolay okunur.
Yine okunabilirlii arttrmak iin n ek olarak bir kk harf kullanlabilir.
g
r
s
Global
Referans
Statik
gLog;
rStatus();
sValueIn;
Parantezler { }
Parantezler geleneksel UNIX yntemiyle;
if(koul){
}
veya kolay okunan u yntemle kullanlabilir
if(koul)
{
}
Kenar boluklar
Kenar boluklar kullanarak yazlar ieriden balatmak programn
okunabilirliini arttrmak iin gereklidir.
Satr uzunluu
Monitr ve yazc uyumluluu iin satr uzunluunun 78 karakteri gememesine
dikkat edin.
11
www.picproje.org
Else If format
Herhangi bir koulu yakalamak iin koyacanz ekstra Else ifadesi nceki if ler
tarafndan kapsanmaz.
if(koul)
{
}
else if(koul)
{
}
else
{
/* yukardakiler tarafndan kapsanmaz */
}
Koul format
Derleyici izin veriyorsa sabit deerleri eitlik/eitsizlik karlatrmalarnda sol
tarafa yazn. = iaretinin biri unutulursa derleyici hata bildirir. Ayrca deer gze
batan yerde olmu olur.
if(6 == HataNo)
Deikenlere balang deeri verin
Rastgele deer iermemesi iin tm deikenlere nceden deer verin.
int a=6, b=0;
Yorumlar
yorumlar hikayenin br yarsdr. Programnzn bugn nasl altn
biliyorsunuz peki iki hafta veya iki yl sonra hatrlayabilecek misiniz? Programnz
baka biri incelese neler olduunu anlayabilecek mi? leriki almalarnz
kolaylatrmak, hatalar bulabilmek ve ileride rnnz gelitirebilmek iin
yorumlar kullann.
Temeller
Btn bilgisayar programlar bir balang noktasna sahiptir. Bu balang
noktas mikrodenetleyicilerde reset vektrdr. 14bit PIC16CXX ailesinin reset
vektr 00h, 12bit PIC16C5X ve 12C50X ailesinin reset vektr ise hafzann en
yksek adresidir. 1FFh, 3FFh, 7FFh
Biti noktas eer program sadece bir kez alacaksa (rnein iletiim iin hz
ayarlayan bir rutin gibi) programn durduu yerdir. Trafik k kontrol gibi dier
programlar srekli balang noktasna dnerler.
Yksek seviyeli dillerde en yaygn olarak kullanlan ilk programlama rnei
ekrana Merhaba Dnya yazdrmaktr.
12
www.picproje.org
PIC retirken kullandm basit bir program bir butonla bir ledi yakma
programdr. Basit bir programla balayn 2000 satrlk bir program ile deil!
Assemblyde u ekilde:
main
lp1
btfss
goto
bsf
btfsc
goto
bcf
goto
porta,
main
portb,
porta,
lp1
portb,
main
switch
led
switch
led
;
;
;
;
;
;
;
switchi test et
baslana kadar bekle
ledi yak
switchi test et
braklana kadar bekle
ledi sndr
baa dn
C de u ekilde:
main()
{
set_tris_b(0x00);
while(true)
{
if(input(PIN_A0))
output_high(PIN_B0);
else
output_low(PIN_B0);
}
}
// portb yi k yap
// switchi test et
// kapalysa ledi yak
// aksa ledi sndr
13
www.picproje.org
main()
{
set_tris_b(0x00);
0007
0008
MOVLW
TRIS
00
6
0009
000A
output_high(PIN_B0); 000B
000C
else
output_low(PIN_B0); 000D
000E
BTFSS
GOTO
BSF
GOTO
05,0
00D
06,0
00E
BCF
GOTO
06,0
009
while(true)
{
if(input(PIN_A0))
}
}
Grdnz gibi derlenmi hali hafzada assemblyden daha fazla yer kaplar
14 word C, 9 word Assembly. Fakat programlar bymeye baladnda C
kod kullanmnda daha etkili olur.
14
www.picproje.org
1. C Esaslar
PICPROJE EKB EVR GRUBU
15
www.picproje.org
1.1
C Programnn Yaps
Durum fadeleri
16
www.picproje.org
/*
/*
/*
/*
nilemci direktifi */
standart C balk dosyasn dahil eder */
global bildirim */
prototip bildirimi */
main()
{
/* main fonksiyonunun balangc */
int radius_squared; /* local bildirim */
int radius = 3;
/* bildirim ve ayarlanmas */
radius_squared = square (radius);
/* fonksiyona deer gnderme */
area = PI * radius_squared;
/* ilikilendirme ifadesi */
printf(Area is %6.4f square units\n,area);
}
/* main fonksiyonu ve program sonu */
square(int r)
{
int r_squared;
r_squared = r * r;
return(r_squared);
/* fonksiyon ba */
/* sadece square fonksiyonu tarafndan */
/* tannan bildirimler */
/* aran ifadeye deer dndrme */
1.2
17
www.picproje.org
printf(Merhaba Dnya);
}
#include <stdio.h>
edilmesini bildirir.
.h uzants balk dosyasn belirtir. Balk dosyas programda kullanlan standart
fonksiyonlar hakknda bilgi ierir. Standart giri k balk dosyas stdio.h
adyla anlr ve en ok kullanlan giri k fonksiyonlarn ierir. Sadece
programda standart giri klarla ilgili blmler olduunda kullanlmas
gerekir.
ifadesi C iin bir aklama satrdr. Geleneksel olarak
aklamalar /* ve */ karakterleri arasnda bulunur. Yeni sitil aklamalar ise //
karakterleri ile balar ve satr sonuna kadar aklama kabul edilir. Aklamalar
derleyici tarafndan dikkate alnmaz ve bu nedenle derlenmi kodun boyutu
ve hz zerinde bir etkisi yoktur.
/* lk C programm */
1.3
#pragma
device
PIC16C54
18
www.picproje.org
1.4
PIC16C54
main()
Her programda sadece birkez grnen bir main fonksiyonu olmak zorundadr.
() parantezler arasnda parametreler bulunamaz. void szc parantezler
ierisinde parametre olmadn gstermek iin kullanlabilir. main fonksiyon
olarak snflandrlmtr ve ardndan gelen komutlar {} parantezleri arasnda
bulunmak zorundadr.
main
{
komutlar
}
1.5
#include
19
www.picproje.org
#include dosya2.h
ilk olarak o anda kullanlan klasre bakmasn belirtir. Dikkat ettiyseniz #include
direktifinden sonra noktal virgl konulmuyor. Bunun nedeni #include
direktifinin bir C ifadesi deil nilemci direktifi olmasdr. Btn balk
dosyasnn ierii derlenme zamannda kaynak dosyasna eklenir.
Kontrol karakterleri dizisi ift trnak iinde bulunan bir karakter dizisidir. Bu dizi
iinde harf, rakam ve sembol kombinasyonlar bulunabilir. zel semboller %
iareti ile birlikte kullanlrlar. Bir printf() fonksiyonu iinde mutlaka bir kontrol
karakteri dizisi olmaldr. Eer biim belirteleri kullanlmadysa argman listesi
bulunmayabilir. Argman listesi sabitler ve deikenlerden oluabilir. Aada
printf() fonksiyonunun sabit ve deikenlerle kullanmna dair iki rnek
bulunmaktadr:
printf(Merhaba Dnya);
printf(Microchip #%d numara!,1);
Biim belirteci (%d) gsterilecek olan verinin tipine baldr. Aada Cde
kullanlan btn biim belirteleri ve ilgili veri tipleri gsterilmitir:
printf() Biim Belirteleri
%c
tek bir karakter character
%d
aretli Desimal Tamsay
%f
Kayar noktal (ondalk gsterim)
%e
Kayar noktal (stel veya bilimsel gsterim)
%u
iaretsiz Desimal tamsay
%x
iaretsiz hexadesimal tamsay (kk harf)
%X
iaretsiz hexadesimal tamsay (Byk harf)
l neki uzun tamsaylar belirtmek iin %d, %u, %x
%02x\n,12);
yenisatr
20
www.picproje.org
\t
\r
\f
\
\
\\
%%
\?
\b
\0
\v
\xhhh
yatay tab
carriage return
formfeed
tek trnak
ift trnak
backslash
yzde iareti
Soru iareti
backspace
bo(null) karakter
dikey tab
insert HEX code hhh
birim karedir\n,alan);
1.7 Deikenler
Deiken, bellekteki belirli bir konuma verilen isimdir. Bu bellek blgesi
deikenin bildirimine gre deiik deerleri tutabilir. C dilinde btn
deikenlerin kullanlmadan nce bildirimleri yaplm olmaldr. Deiken
bildirimleri derleyiciye ne tr bir deiken kullanldn bildirir. Btn deiken
bildirimlerinin sonunda noktal virgl (;) bulunmaldr. Temel C veri tipleri char,
int, float, ve longdur. Deiken bildirimlerinin genel biimi u ekildedir:
tip degisken_ismi;
Deiken bildirimine rnek olarak char kar; rneini verebiliriz.Burada kar
deikeni karakter olarak tanmlanyor (8 bit iaretsiz tamsay)
1.8 Sabitler
Sabit, program tarafndan deitirilemeyen deer demektir. rnein 25 says
bir sabittir. -100 ve 40 gibi tamsay sabitler olabilecei gibi 456.75 gibi kayar
21
www.picproje.org
1.9 Yorumlar
22
www.picproje.org
ok ok ok ok ok ok ok ok uzun
1.10 Fonksiyonlar
Fonksiyonlar C programlarnn temel yaptalardr. Her bir C program en az bir
fonksiyon, main(), barndrr. Yazdnz birok program birden fazla fonksiyon
bulunduracaktr. Birok fonksiyonu barndran bir C programnn genel yaps u
ekildedir:
main()
{
fonksiyon1()
{
}
fonksiyon2()
{
}
}
23
www.picproje.org
printf(Cyi);
fonksiyon1();
printf(cok);
}
fonkisyon1()
{
printf( seviyorum );
}
1.11 Makrolar
#define nceki blmlerde de grld gibi gl bir direktiftir. C define
direktifinin parametre almasn da salayarak daha da gl hale getirir.
Parametrelerle birlikte kullanldnda bunlara makro denilir. Makrolar
programlarn okunabilirliini artrmak veya yazma kolayl salamak iin
kullanlrlar. Basit bir makro rnei:
#define var(x,v) unsigned int x=v;
var(a,1);
var(b,2);
var(c,3);
aadakine edeerdir:
unsigned int a=1;
unsigned int b=2;
unsigned int c=3;
24
www.picproje.org
25
www.picproje.org
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
Altrmalar:
1. Adnz ekrana yazdran program yaznz.
2. Yl adl bir tamsay deikeni tanmlayan bir program yaznz. Ardndan printf()
komutuyla ekrana yl u ekilde yazdran bir program yaznz. Programnzn kts
u ekilde olmaldr. 2006 ylndayz.
2. Deikenler
C Dilinin nemli bir yan dilin deikenleri nasl saklad ile ilgilidir. Bu blmde,
verilerin hafzada tutulmas iin Cde deikenlerin nasl kullanlaca yakndan
incelenecektir.
26
www.picproje.org
Anlam
Anahtar Kelimeler
char
int
float
double
void
signed
unsigned
long
short
Her bir veri tipi kullanlan deitiriciye gre, belirli bir aralktaki saylar temsil
eder. Sonraki tablo temel veri tiplerinin mmkn olan kombinasyonlar iin
geerli aralklar gstermektedir.
Tip
Bit Genilii
short
short int
int
char
unsigned
unsigned int
signed
signed int
long
long int
signed long
float
1
1
8
8
8
8
8
8
16
16
16
32
Aralk
0 veya 1
0 veya 1
0..255
0..255
0..255
0..255
-128..127
-128..127
0..65536
0..65536
-32768..32767
3.4E-38..3.4E+38
27
www.picproje.org
=
=
29
tm bitleri evir
1 ekle
-29
= 12000;
MOVLW
MOVWF
MOVLW
MOVWF
E0
11
2E
12
ALITIRMALAR:
1. Verilen ifadeyi ksa gsterimde yaznz.
long int i;
2. aretli ve iaretsiz saylar arasndaki fark anlamak iin, aadaki program
yaznz. aretsiz tam say 35000, iaretli say biiminde -30536 olarak
gsterilecektir.
main()
{
int i;
/* iaretli tam say */
unsigned int u;
/* iaretsiz tam say */
u = 35000;
i =u;
printf(%d %u\n, i, u);
}
28
www.picproje.org
29
www.picproje.org
main()
{
max=10;
f1();
return0;
}
Deiken atamas bir ifade olduundan tr, ifadenin sonuna noktal virgl
konulur. rnek olarak 100 deerini sayac tam say deikenine atamak iin:
30
www.picproje.org
sayac = 100;
ALITIRMALAR:
1. sayac isimli tamsay tipli bir deikenin bildirimini yaznz. Bu deikene 100
deerini atayp, printf() fonksiyonu ile bu deeri gsteriniz.
Programn kts u ekilde olmaldr:
sayac deikeninin deeri 100dr.
2. char, float ve double tiplerinde ch, f, ve d isimli deikenlerin bildirimini
yapp, R yi karakter, 50.5i float, 156.007yi double deikenine ataynz. Bu
deikenlerin deerlerini ekranda yazdrnz.
kt aadaki ekilde olmaldr:
ch = R
f = 50.5
d = 156.007
2.4 Numaralandrma
31
www.picproje.org
32
www.picproje.org
2.5 typedef
Cde yeni veri tipleri yaratmak iin typedef ifadesi kullanlr. Bu aadaki
biimde gerekletirilir:
typedef eski_isim yeni_isim;
Yeni isim deikenleri bildirmek amacyla kullanlabilir. rnein aadaki
program signed char tipi yerine kucuktamsayi ismini kullanr.
typedef signed char kucuktamsayi;
main()
{
kucuktamsayi i;
for(i=0;i<10;i++)
printf(%d ,i);
}
typedef kullanrken iki noktaya dikkat etmelisiniz: typedef orijinal tipi veya ismin
etkinliini ortadan kaldrmaz yani; nceki rnekte signed char hala geerli bir
tiptir, ayn orijinal tipte deiik yeni isimler oluturmak iin birka typedef ifadesi
kullanlabilir.
typedef genellikle iki sebepten tr kullanlr. ncelikli olarak tanabilir
programlar oluturmak amacyla kullanlr. Eer yazdnz program 16-bit ve
32-bitlik tam say tabanl makinelerde kullanlacaksa, 16-bitlik tam saylarn
kullanlacandan emin olmak isteyebilirsiniz. 16-bitlik makineler iin oluturulan
programda tm tam saylar 16-bitlik olarak bildirmek iin u ifade kullanlrd.
typedef int tamsayim;
33
www.picproje.org
ALITIRMALAR:
1. unsigned long tipi iin UL adnda yeni bir isim oluturunuz. Bu oluturduunuz
yeni ismi kullanp, buna bir deer atamas gerekletiriniz ve bu deeri ekrana
yazdrnz.
2. Aadaki kod paras geerli midir?
typedef int yukseklik;
typedef yukseklik uzunluk;
typedef uzunluk derinlik;
derinlik d;
34
www.picproje.org
deikende artk tam say olduklarndan, her hangi bir tip dnm
gerekletirilmez. Sonraki ilem fnin ch*i ifadesine blmdr. Algoritmaya
gre, eer operandlardan biri float ise dieri float tipine dntrleceinden,
ch*i/f ifadesinin sonucu float tipindedir, fakat sonuc double olduu iin
double tipine dntrlecektir.
Derleyicinin tip deiimlerini yapmasna gvenmek yerine, tip dnmlerini
aada gsterildii gibi aka yapabilirsiniz.
(tip) deger
Bu (ak) tip dntrme adn alr ve deikende geici deiiklik yaplmasna
neden olur. tip geerli bir C veri tipidir ve deger deiken yada sabittir.
Aadaki kod paras kayar noktal bir saydaki tam say ksmn nasl
gsterileceini rneklemektedir.
float f;
f = 100.2;
printf(%d, (int)f);
Sonu 196 olacaktr. long tipinde sonuca ihtiyacnz varsa, bir deiken iin
aka tip dnm yapmanz gerekmektedir.
c = (long) a * b;
35
www.picproje.org
Bir kod blouna girildiinde, derleyici bildirilmi deikenler iin RAM alann
ayrr. RAM alanlar bu yerel kod blou iin kullanlr ve dier kod bloklar
tarafndan kullanlabilir.
main()
{
char c = 0;
int a =1, b = 3, e = 5;
0007: CLRF 0E
; 0Eh yazmacnn ierii Cye atanr
0008: MOVLW 01 ; wye 1 ykle
0009: MOVWF 0F ; aya wdeki deeri ata
000A: MOVLW 03 ; wye 3 ykle
000B: MOVWF 10 ; bye wdeki deeri ata
000C: MOVLW 05 ; wye 3 ykle
000D: MOVWF 11 ; cye wdeki deeri ata
}
Extern
extern anahtar kelimesi harici balama sahip bir deiken ya da fonksiyon
bildirir. Bunun anlam, bu deiken ya da fonksiyonun tanmland dosyalar
haricinde de grlebilir olmasdr. CCS Cde harici balama sahip fonksiyon
yoktur.
Static
static deiken snf, nceden belirtilmedike 0 ile ilk deer atanm global
aktif deikenleri tanmlar.
void test()
{
char x,y,z;
static int sayac = 4;
printf(sayac = %d\n,++sayac);
}
sayac deikenine bir kez ilk deer atamas yaplmtr ve sonra her fonksiyon
arsnda deeri bir kez arttrlr.
36
www.picproje.org
Register
register deiken snf, byk sistemlerde yksek hzl hafzalarn sklkla
kullanlan deikenler iin ayrlmas mantndan tretilmitir. Bu snf sadece
derleyiciye neri amala kullanlr CCS C iinde bu trden bir fonksiyon
yoktur.
3. Fonksiyonlar
Fonksiyonlar C dilinin temel yaptalardr. Cdeki btn ifadeler bir fonksiyonun
iinde yer almaldr. Bu blmde fonksiyonlara argmanlarn iletilmesi ve bir
fonksiyonlardan deer dndrlmesi gibi konular inceleyeceiz.
Bu blmde incelenen konular:
Argmanlarn Fonksiyonlara letilmesi
Fonksiyonlarn Deer Dndrmesi
Fonksiyon Prototipleri
Klasik ve Modern Fonksiyon Bildirimleri
37
www.picproje.org
3.1 Fonksiyonlar
nceki blmlerde,ana programdan arlan birok fonksiyon rnei
grmtk.rnein:
main(){
f1();
}
int f1(){return 1;}
38
www.picproje.org
Yukardaki rnekte, her bir deikenin tipi farkl olabilir. Bir fonksiyon prototipi
rnei aadaki programda gsterilmitir. Fonksiyon uzunluk, genilik ve
ykseklik deerlerinden hacmi hesaplamaktadr.
return ifadesinden sonra bir sabit ya da deiken yerine bir ifade kullanldna
dikkat edin.
Prototiplerin nemi imdiye kadar yazdmz ufak programlarda tam olarak
ortaya kmam olabilir. Ancak programlar birka satrdan binlerce satra
doru bydnde, prototiplerin hata gidermedeki nemi ortaya kacaktr.
ALITIRMALAR:
1. Derleyicinin hatalar nasl yakaladn gstermek iin, yukardaki program
hacim fonksiyonuna 4 parametre yollayacak ekilde deitirin:
hcm = hacim(5,7,12,15)
2. Aadaki program doru mu? Deilse neden?
double fonk(void)
void main()
{
printf(%f\n,fonk(10.2));
}
double fonk(double sayi)
{
return sayi/2.0;
}
3.3 void
Bir fonksiyon hibir parametre almadnda ve hibir deer dndrmediinde
bildirimi u ekilde yaplr:
39
www.picproje.org
void hic(void)
rnek olarak:
double pi(void)
{
return 3.1415926536;
}
main()
{
double pi_degeri;
pi_degeri = pi();
//pi fonksiyonuyla pi deeri alnyor
printf(%d\n,pi_degeri);
}
//Fonksiyon prototipi
40
www.picproje.org
tip fonksiyonun dndrecei deerin veri tipini belirtmektedir. Bir fonksiyon dizi
dnda herhangi bir veri tipi deeri dndrebilir. Eer herhangi bir veri tipi
belirtilmezse, C derleyicisi fonksiyonun tam say (integer - int) deeri
dndrdn varsayar. Eer fonksiyonunuz deer dndrmyorsa, ANSI C
standard fonksiyonun void dndrmesi gerektiini belirtir. Bu derleyiciye
fonksiyonun bir deer dndrmediini anlatr. Aadaki fonksiyon deer
dndren bir fonksiyona tipik bir rnektir.
#include <math.h>
main()
{
double sonuc;
41
www.picproje.org
sonuc = sqrt(16.0);
printf(%f\n,sonuc);
}
42
www.picproje.org
printf(%f\n,sonuc);
}
int f1()
{
return 60;
}
function_name(deg1,deg2,...degn)
deg1;
deg2;
degn;
<ifadeler>
43
www.picproje.org
aadakine edeerdir:
lcd_yaz(a);
lcd_yaz(b);
lcd_yaz(c);
lcd_yaz(d);
4. C Operatrleri
fadeler Cde nemli rol oynar. Bunun en byk sebebi Cde dier dillere gre
daha ok operatr tanmlanmtr. Bir ifade operatrler ve operandlarn
bileimidir. Birok durumda C operatrleri cebir kurallarn takip eder ve gze
anlalr gelir.
Bu blmde aada saylan operatrleri inceleyeceiz:
Aritmetik
likisel
Mantksal
Bit lemleri
44
www.picproje.org
toplama
karma
arpma
blme
kalan
=
=
a b
;karma
-a
;ann iaretinin deitirilmesi
a=a*b
a=a/b
a=a+b
a=a-b
a=a%b
a=a<<b
a=a>>b
a=a&b
a=a|b
a=a^b
edeerdir
45
www.picproje.org
a = b + c;
MOVF
ADDWF
MOVWF
0F,W
10,W
0E
; byi ykle
; cyi bye ekle
;sonucu aya kaydet
a = b - c;
MOVF
MOVWF
MOVF
SUBWF
0F,W
0E
10,W
0E,F
;
;
;
;
byi ykle
aya kaydet
cyi ykle
adan kar
MOVF 0F,W
MOVWF 0E
; byi ykle
; aya kaydet
buna karn
a==b;
ifadesi u ekle dnr:
0007:
0008:
0009:
000A:
MOVF
SUBWF
BTFSC
GOTO
0F,W
0E,F
03,2
00D
;
;
;
;
byi ykle
adan kar
sonuc sfr m test et
evet yleyse dallan
46
www.picproje.org
>
>=
<
<=
==
!=
byktr
byktr ya da eittir
kktr
kk ya da eittir
eittir
eit deildir
ALITIRMALAR:
1. Aadaki ifadeyi farkl bir ilikisel operatr kullanara yeniden yazn!
sayac != 0
q
0
1
0
1
AND
p&&q
0
0
0
1
OR
p||q
0
1
1
1
NOT
!p
1
1
0
0
47
www.picproje.org
q
0
1
0
1
XOR
0
1
1
0
ifade nin deeri degisken in bitlerinin ka kere kaydrlacan belirtir. Her bir
sola kaydrma ilemi, btn bitleri bir pozisyon sola kaydrr ve sa tarafa 0
deeri verilir. Deikenin en sonundaki bitin deeri kaybolur.
Saa ve sola kaydrma ilemleri ile ilgili nemli bir zellik, sola kaydrmak 2 ile
arpma ilemine, saa kaydrmak ise 2 ile blme ilemine edeerdir.
Kaydrma ilemleri MBnin alma sisteminden dolay aritmetik ilemlerden
daha hzldrlar.
Aada btn bit ilem operatrlerine ilikin rnekler verilmitir:
&
AND
00000101
00000110
- - - - 00000100
(5)
(6)
- - - - - - - (4)
XOR
00000101
(5)
^
00000110
(6)
- - - - - - - - - - - - - - - 00000011
(3)
48
OR
00000101
(5)
00000110
(6)
- - - - - - - - - - - - - 00000111
(7)
NOT (1e tmleme)
00000101
(5)
- - - - - - - - - - - - - 11111010
(250)
www.picproje.org
LEFT SHIFT
00000101
(5)
<< 2
- - - - - - - - - - - - 00010100
(20)
RIGHT
00000101
>> 2
- - - - - 00000001
SHIFT
(5)
- - - - - - - (1)
NOT:
Bir ilenenin bit saysndan fazla sayda kaydrma yapmayn tanmsz sonuc
a = b | c;
u ekle dntrlr:
0007:
0008:
0009:
MOVF 0F,W
IORWF 10,W
MOVWF 0E
; byi ykle
; c ile veya ilemine sok
; sonucu aya kaydet
a = b & c;
u ekle dntrlr:
0007:
0008:
0009:
MOVF 0F,W
ANDWF 10,W
MOVWF 0E
; byi ykle
; c ile VE ilemine sok
; sonucu aya kaydet
a = b >> 3;
u ekle dntrlr:
0007:
0008:
0009:
000A:
000B:
000C:
000D:
MOVF
MOVWF
RRF
RRF
RRF
MOVLW
ANDWF
0F,W
0E
0E,F
0E,F
0E,F
1F
0E,F
;
;
;
;
;
;
;
byi ykle
aya kaydet
ierii
3 kere
saa kaydr
ann ierii iin
maskeleme yap
j = ~a;
u ekle dntrlr:
0007:
0008:
0009:
MOVF 0F,W
MOVWF 0E
COMF 0E,F
; ay ykle
; jye kaydet
; jnin tersini al
ALITIRMALAR:
1. aretli karakter tipindeki bir deikenin sadece MSBini tersleyen bir program
yaznz.
2. Karakter tipindeki bir saynn ikili say eklini gsteren bir program yaznz.
49
www.picproje.org
a = a+1;
veya
a = a-1;
Cnin tasarmclar bir artrma ve azaltma iin bir ksayol oluturmulardr. Genel
biim u ekildedir:
a++;
a--;
veya
veya
artrma iin
azaltma iin
++a;
--a;
MOVLW 03
MOVWF 0F
INCF 0F,F
MOVF 0F,W
MOVWF 0E
;
;
;
a = 4
ann deerini w yazmacna ykle
w yazmacn jye kaydet
j = a++;
000C:
000D:
000E:
MOVF 0F,W
INCF 0F,F
MOVWF 0E
;
;
;
NOT:
Aadaki biimi kullanmayn:
a = a++;
0E,W
0E,F
50
www.picproje.org
Paralar Birletirmek:
Yazl
toplam
toplam
toplam
toplam
lem
=
=
=
=
a+b++
a+b-a+ ++b
a+ -- b
toplam =
toplam =
b = b+1,
b = b-1,
a+b, b
a+b, b
toplam
toplam
=
=
=
=
b+1
b-1
a+b
a+b
ALITIRMALAR:
1. Aadaki programdaki arttrma ve azaltma ifadelerini yeniden yazn.
void main(void)
{
int a, b;
a = 1;
a = a+1;
b = a;
b = b-1;
printf(a=%d, b=%d\n, a,b);
}
2. Aadaki kodlar iletildiinde a ve b deikenlerinin son deeri ne olur?
a = 0;
b = 0;
a = ++a + b++;
a++;
b++;
b = -a + ++b;
Operatr
rnek
1
2
() ++ -sizeof & * + - ~ ! ++ --
(a+b)/c parantez
a=-b art/eksi/DEL/tmleme
artrma/azaltma/sizeof
3
4
5
6
* / %
+ << >>
< > <= >=
a%b arpma/blme/elde
a+b toplama/karma
a=b>>c sola veya saa kayrma
a>=b byk/kk/eit
51
www.picproje.org
7
8
9
10
11
12
13
== !=
&
^
|
&&
||
= *= /= %= += -= <<= >>=
$= ^= |=
a= =b
a=b&c bit ilem VE
a=b^c bit ilem DILAYAN VEYA(XOR)
a=b|c bit ilem VEYA
a=b&&c mantksal VE
a=b||c mantksal VEYA
a+=b atama
ALITIRMALAR:
1. Aadaki kodlar iletildiinde a ve b deikenlerinin son deeri ne olur?
int a=0,b=0;
a = 6 8+3b++;
b + = -a*2+3*4;
5.1
if deyimi
52
www.picproje.org
if deyimi bir artlandrma deyimidir. if ifadesinde yeralan kod blou bir artn
sonucuna bal olarak icra edilir. Ayrca, deer sfr deil iken doru (true),
deer sfr iken yanltr (false). En basit hali :
if (ifade)
deyim;
Bu ifade geerli bir C ifadesi olabilir. if deyimi ifadenin sonucunun doru veya
yanl olduunu deerlendirir. Eer ifade doru ise deyim altrlr. Eer ifade
yanl ise program, deyimi altrmadan devam eder. Basit bir rnek :
if(num>0)
printf(Say pozitif\n);
veya
if(TestMode ==1)
{
... yazdrlacak kodlar...
}
== y
!= y
> y
< y
<= y
>= y
&& y
|| y
x eittir y
x eit deildir y
x byktr y
x kktr y
x kk veya eit y
x byk veya eit y
mantksal AND
mantksal OR
53
www.picproje.org
int j, a =3;
0007: MOVLW 03
0008: MOVWF 0F
if (j == 2)
0009: MOVLW 02
000A: SUBWF 0E,W
000B: BTFSS 03,2
000C: GOTO 00F
{
j = a;
000D: MOVF 0F,W
000E: MOVWF 0E
}
;aya 3 ykle
;wye 2 ykle
;j ile eliini test et
;eer sfr ise atla
Altrmalar :
1.
Aadaki ifadelerin hangilerinin deerleri dorudur?
a.
b.
c.
d.
e.
0
1
1
5*5<25
1==1
2.
Saynn tek veya ift olup olmadn bulan bir fonksiyon yazn. Fonksiyon
kts 0 iken say ift, 1 iken say tek. Bu fonksiyonu 1 ve 2 saylaryla arn.
5.2
if-else deyimleri
if-else deyimi iin kod bloklar kullanma format (bir satrdan fazla) :
if (ifade)
{
.
deyim;
.
}
else
{
.
deyim;
.
}
Bir if veya else ifadesini aklda tutmak iin bir ok ifade gerekli olabilir. if veya
else iin sadece bir ifade oldugu zaman {} parantezler kullanlmayabilir.
Tek if-else deyiminin bir rnei :
54
www.picproje.org
if (num<0)
printf(Say negatif.\n);
else
printf(Say pozitif.\n);
Else deyimini eklenmek sizin iin ift ynl karar imkan salar. Fakat, eer
birka if ve else deyimini birletirip, birlikte birka karar almak isteseydiniz ne
yapardnz? Cnin en nemli salad olanak, if ve elseleri kullarak istenilen
sayda durum kontrol edilip karar verebilmesidir. Genel hali yledir :
if (ifade1)
{
.
deyim(ler)
.
}
else if(ifade2)
{
.
deyim(ler)
.
}
else
{
.
deyim(ler)
.
}
Burada kodun icrasnda arta gre seip deerlendirmek iin birka farkl
ifade olabileceini gryoruz. Bunu bir rnekle aklayalm :
if(num == 1)
printf(deger
else if(num == 2)
printf(deger
else if(num == 3)
printf(deger
else
printf(deger
1\n);
2\n);
3\n);
farkli\n);
NOT:
if deyiminin iinde kullanlan karlatrma operatrlerinin tek hali olduu gibi
ift halide bulunmaktadr (tek &, = veya | operatrleri ve ift &&, == veya ||
operatrleri gibi). Yaplan ortak hatalardan biri de; bu operatrlerden birinin
yerine dierini kullanmaktr. Bu kodlar belki hatasz derlenecektir fakat
program hatal ileyecektir.
Altrmalar :
1.
Bu kod parac iindeki hatalar nelerdir?
if (sayac>20)
printf(sayac 20 den buyuk);
sayac- ;
55
www.picproje.org
2.
Verilen saynn iinde ka tane 5, 10, 25, 50 ve 100 says bulunduunu
bulan bir program yaznz.
5.3
? operatr
56
www.picproje.org
5.4
for dngs
57
www.picproje.org
58
www.picproje.org
bir deyim var. (basit deyim). Bu deyim icra ediliyor. printf(%d\n, i) ifadesi i=0
iin iletiliyor. Yani ekrana i deikeninin deeri yazlarak imle alt satra
geiriliyor (\n den dolay alt satra geiyor).
Programn ak bu kez for parantezinin 3. ksmna geliyor ve buradaki ifade bir
deyimmi gibi icra edeiliyor, yani i deikeninin deeri 1 artrlyor. i
deikeninin deeri 1 oluyor.
2. ifade yeniden deerlendiriliyor ve i < 2 ifadesi doru olduu iin bir kez
daha dng gvdesi icra ediliyor.
Programn ak yine for parantezinin 3. ksmna geliyor ve buradaki ifade bir
deyimmi gibi icra edeiliyor, yani i deikeninin deeri 1 artrlyor. i
deikeninin deeri 2 oluyor.
Programn ak yine for parantezinin 2. ksmna geliyor ve buradaki kontrol
ifadesi tekrar sorgulanyor. i < 2 ifadesi bu kez yanl olduu iin programn
ak dng gvdesine girmiyor ve programn ak dng gvdesi dndaki ilk
deyimle devam ediyor.
Yani ekrana :
0
1
son deer = 2
yazlyor.
Aada farkl for dngleri bulunmaktadr :
for (num=100; num>0; num=num-1)
for (count=0; count<50; count+=5)
for (count=1; count<10 && error==false; count++)
;h temizle
;W kaydedicisine 10 ykle
;h dan kart
;0 m diye test et
;eer h=10, dngden k
;ay arttr
;h arttr
;0008e git (dngye devam)
Altrmalar :
1.
Aadaki for() deyimleri nasl alr?
for(i=1; ;i++)
for( ; ; )
for(num=1; num; num++)
59
www.picproje.org
2.
5.5
while dngs
Cdeki dier bir dng de while dngsdr. While dngs, ifade doru
olduu srede deyimi veya kod blounu tekrarlar. Bu nedenle ismi while dr.
Burada genel kullanm grlmektedir :
while (ifade)
deyim;
veya
while (ifade)
{
deyim;
}
fade geerli herhangi bir C ifadesidir. Her seferinde ifadenin deeri deyimden
veya kod bloundan nce kontrol edilir. Bu demek ki, eer ifade yanl (false)
ise deyim veya kod blou hi bir ekilde icra edilmez.
While dngsne bir rnek :
#include <16C74.H>
#use RS232 (Baud=9600, xmit=pin_c6, RCV=pin_c7)
void main(void)
{
char ch;
printf(q ver\n);
ch=getch();
while(ch!=q)
ch=getch();
printf(iste q!\n);
}
b.
while(i<10)
{
printf(%d ,i);
i++;
}
while(1)
printf(%d ,i++);
60
www.picproje.org
2.
Klavyeden ch=getch(); deyimi kullanarak ald verileri ekrana yazdran
ve nceden belirlenmi bir karakter ile karlatnda sonlanan bir program
yaznz.
5.6
do-while dngs
5.7
ie dngler
Bir dngnn gvdesini baka bir kontrol deyimi oluturabilir. Dng gvdesini
oluturan kontrol deyimi bir if deyimi olabilecei gibi baka bir dng
deyimide olabilir. (while, do while, for deyimleri)
int main()
{
int i = 0;
int k = 0;
while (i < 10) {
while (k < 10) {
printf("%d %d", i, k);
++k;
}
61
www.picproje.org
}
++i;
return 0;
}
Burada ikinci while dngs tek bir kontrol deyimi olarak ele alnaca iin,
bloklamaya gerek yoktur.
while dngsnn yanllkla bo deyim ile kapatlmas ok sk yaplan bir
hatadr.
int main()
{
int i = 10;
while (--i > 0);
printf("%d\n", i);
return 0;
}
Dng while parantezi ierisindeki ifadenin deeri 0 olana kadar devam eder
ve bo deyim dng gvdesi olarak icra edilir. Dngden kldnda ekrana
0 baslr.
Sonlandrc ; while parantezinden sonra konulursa herhangi bir yazm hatas
olumaz. Derleyici while dngsnn gvdesinin yalnzca bir bo deyimden
olutuu sonucunu kartr. Eer bir yanllk sonucu deil de bilinli olarak
while dngsnn gvdesinde bo deyim (null statement) bulunmas
isteniyorsa, okunabilirlik asndan, bu bo deyim while parantezinden hemen
sonra deil, alt satrda ve bir tab ieriden yazlmaldr.
5.8
Break deyimi
62
www.picproje.org
5.9
Continue deyimi
continue anahtar szc de tpk break anahtar szc gibi bir dng
ierisinde kullanlabilir. Programn ak continue anahtar szcne geldiinde
sanki dng yinelemesi bitmi gibi yeni bir yinelemeye geilir. Eer for dngs
ierisinde kullanlyorsa yeni bir yinelemeye gemeden nce dngnn 3.
ksm yaplr. rnek :
int main()
{
int i, k;
char ch;
for (i = 0; i < 100; ++i) {
if (i % 3 == 0)
continue;
printf("%d\n", i);
}
return 0;
}
63
www.picproje.org
(i
(i
(i
(i
=
=
=
=
0; i < n; ++i)
1; i <= n; ++i)
n - 1; i >= 0; --i)
n; i > 0; --i)
Bir dngden kmak iin dng deikeni ile oynamak kt bir tekniktir. Bu
programlar okunabilirlikten uzaklatrr. Bunun yerine break anahtar szc
ile dnglerden klmaldr.
64
www.picproje.org
deyim(ler);
break;
case sabitN:
deyim(ler);
break;
default:
deyim(ler);
}
Bu rnek 0 ve 6 aras saylar okuyacak. Eer girilen say bu say aral dnda
ise, Geersiz giri mesaj grntlenecektir. Girilen deer bu araln iinde ise,
say haftann gnlerine dntrlecektir.
LCD ekran zerindeki satrlarda karakter saysn tespit etmede kullanlan bir
baka rnek te u ekildedir. DIP swi ve satrdaki karakter says ayarlar okunur
65
www.picproje.org
break szc switch deyimi iinde ayn zamanda istee bal kullanlr. Bu
demek ki iki case deyimi kodun ayn parasn paylaabilirler. Bunu bir rnek
zerinde grelim :
void main(void)
{
int a=6,b=3;
char ch;
printf(T = Toplama\n);
printf(C = karma\n);
printf(P = arpma\n);
printf(B = Blme\n);
printf(Seiminizi giriniz:\n);
ch=getch();
switch (ch)
{
case C:
// *
66
www.picproje.org
b=-b;
case T:
printf(\t\t%d,a+b);
break;
case P:
printf(\t\t%d,a*b);
break;
case B:
printf(\t\t%d,a/b);
break;
default:
printf(\t\tNe dedin?);
}
}
Bu rnekte for line[i++]=0 dng ifadesi line dizisinin 10 elemann sfrlar. fade
gvdesi null olduundan ilave komutlara ihtiya yoktur.
67
www.picproje.org
c++;
return;
}
main()
{
int x;
x = GetValue();
GetNothing();
}
6.
Bu blmde dizileri ve harf dizilerinden bahsedeceiz. Bir dizi basite ayn veri
tipine sahip birbiriyle ilikili deikenler listesidir. Bir harf dizisi sfrla bitirilen ve en
ok rastlanlan bir karakter dizisidir.
Bu konudaki balklar:
Diziler
Harf dizileri
Tek boyutlu diziler
ok boyutlu diziler
Hazrlama
eklindedir.
6.1 Tek boyutlu diziler
Dizi hepsi ayn isimle adlandrlan ve ayn tipde olan deikenler listesidir.
Dizideki bamsz deiken dizi eleman diye adlandrlr. Bu ilikilendirilmi veri
gruplarn ilemek iin basit bir yoldur.
Tek boyutlu diziyi tanmlamann genel formu aadaki gibidir.
type deiken_ismi [adet];
68
www.picproje.org
1
0
2
1
3
2
4
3
5
4
6
5
7
6
8
7
9
8
10
9
Herhangi bir dizi eleman programda deiken yada sabit deer olarak
herhangi bir yerde kullanlabilir. Aadaki dier rnekte basite dizi
elemanna indisin karesini atamakta, sonrada bu elemanlar yazmaktadr.
#include <16c74.h>
void main ( void)
{
int num[10];
int i;
for ( i = 0 ; i<10 ; i++)
num[i] = i * i ;
for ( i = 0 ; i<10 ; i++)
printf ( %d , num[i] );
}
Bir dizide 10 eleman olup kazayla 11 inci elemanna bir deer atadnzda ne
olabilir? C dili dizi indis limitlerini kontrol etmez. Bu sebepten dolay dizide
belirtilmeyen bir eleman okur ya da yazabilirsiniz. Bu bir ekilde beklenmeyen
sonular dourabilir. Sk sk bu olay programn kmesine ve bazen de
bilgisayarn kmesinede sebeb verebilir. C dili bir dizinin deerini baka bir
dizine aadaki ekil ile atama yaplmasna izin vermez.
int a [ 10 ] , b [ 10 ] ;
.
.
a = b ;
Yukardaki rnek yanltr. Bir dizinin ieriini teki diziye kopyalamak isterseniz ,
her bamsz eleman birinci diziden ikinci diziye kopyalamanz gerekmektedir.
Aadaki rnek iinde 20 eleman olan a[] dizisinin b[] dizisine nasl
kopyalanacan gsterir.
for (i = 0;i < 20;i++)
b[i] = a[i];
ALITIRMA:
1.Aadaki kod parasnda ne yanltr?
69
www.picproje.org
int i;
char count [10];
for(i = 0;i < 100;i++)
count[i] = getch ( ) ;
2.
Ekrandaki harfleri okuyan vede bunlar ekrana ters srada yazabilen bir
70
www.picproje.org
program yazn.
6.3
ok boyutlu diziler
C dili tek boyutlu diziler ile snrl deildir. sterseniz iki yada daha fazla boyutda
dizi yaratabilirsiniz. rnein, 5x5 eleman olan integer dizisi yaratmak iin,
kullanmamz gereken ekil aadaki gibidir:
int number[5][5];
0
1
2
3
4
0
2
4
6
8
0
3
6
9
12
71
www.picproje.org
Deer_listesi dizi tipine uygun virgllerle ayrlm sabitler listesidir. lk sabit ilk
elemann yerine, ikinci sabit ikinci elemann yerine ve srayla btn sabitler
elemanlarn yerine yerletirilir. zleyen rnekte 5 elemanl integer dizisinin
hazrlanmasn gstermektedir.
int i[5]={1,2,3,4,5};
i[0] tanml dizi elemann deeri 1 ve i[4] tanml elemann deeri 5 olacaktr.
Harf dizisi (karakter dizisi) iki trl hazrlanabilir. Birincisi birbirinden bamsz
karakter listesi yapmak:
char str[3]={'a','b','c');
kinci tr ise ekteki rnekte grdnz gibi trnak iinde harf dizisi yaratmaktr.
char name[5]=Veli;
ALITIRMA:
1. Aadaki tanmlama dorumudur?
int count[3]=10,0,5.6,15.7;
2. Bir saynn karesini ve kbn belirten bir tablosu olan program yazn. Her
satrda say, saynn karesi ve saynn kp olmaldr. Saylarla ilgili bilgileri ieren
9X3 bir dizi yaratn.
72
www.picproje.org
Bu durum isim dizisinin 10 adet ayr 40 karakter uzunluunda (sfr dahil) ismi
ierdiini belirtir. Bu tablodan bir harf dizisine ulamak istediinizde, ilk indisi
belirtmelisiniz. rnein bu dizinin beinci isminden kt almak iin, izleyen ekli
kullanmalsnz.
printf(%s,isimler[4]);
Belirtilmi bir harf dizinine ulamak iin ilk iki boyutu kullanmanz gerekmektedir.
Mesela nc listedeki ikinci harf dizinine erimek iin, hayvanlar [2][1]
yazlmas gerekir.
Altrma:
1. 0 dan 9 kadar olan saylarn isimlerini ieren harf dizini tablosunu yazan bir
program yazn. Kullancya tek bir rakkam girmesine izin verin ve proramnz ilgili
ismi gstersin. Tablodaki indise ulamak iin girilen karakterden '0' kartn.
6.6 Harf dizini fonksiyonlar
Harf dizinleri program iersinde bir ok yolla deitirilebilir. Buna bir rnek
strcpy komutu ile kaynak dizinin hedef dizine kopyalanmasdr ki bu da sabit
harf dizinini alabilir hafzaya aktarr.
#include <string.h>
// harf dizini fonksiyonlar iin ktphane
char string[8];
// harf dizinini tanmlama
strcpy (string,Merhaba) ; // Karakterleri dizine kopyalama
PIC MCU larda sabit hafza iaretilerin geerli olmadn dikkat edin. Sabit
harf dizinlerini strlen(hi) gibi fonksiyonlara aktaramazsnz.
rnekler:
char s1[10], s2[10];
strcpy(s1,abc);
73
www.picproje.org
strcpy(s2,def);
strcat(s1,s2);
printf(%u,strlen(s1));
printf(s1);
// kan kt 6 dr
// kan kt abcdef dir
7. aretiler
Bu blm, C dilinin en nemli ve bir o kadar da kafa kartrc zellii olan
iaretiler hakknda bilgi iermektedir. Temel olarak iareti, bir nesnenin
adresidir.
Bu blmde inceleyeceimiz baz balklar;
areti temelleri,
aretiler ve diziler,
aretileri Fonksiyonlarda kullanmak
*degisken_adi;
Tip, C iin geerli olan bir veri tipidir. Sz konusu deiken adnn gsterecei
deikenlerin veri tipini belirler. Deiken adnn banda bulunan * iareti ise
tanmlanan bu deikenin bir iareti tipi deiken olduunu belirtir.
rnein u ifade bir tamsay(integer) tipi iareti deikeni tanmlar:
PICPROJE EKB EVR GRUBU
74
www.picproje.org
int *ptr;
aretiler ile ilgili iki zel karakter vardr: * ve & . Bir nesnenin adresi &
operatr ile elde edilebilir. * operatr ile ise bir hafza blgesinde bulunan
deeri getirir.
rnein;
#include <16c74.h>
void main(void)
{
int *a,b;
b=6;
a=&b;
printf ("%d",*a);
}
Not: Varsaylan olarak derleyici bir iareti iin 1 byte kullanr. Bu, sadece 0-255 aras
blgelerin gsterilebilecei (iaret edilebilecei) anlamna gelir. Daha byk hafza
adresleyebilmek iin 2 bytelk iareti (16 bit) kullanmak gerekir. 16 Bit iareti kullanabilmek
iin u komutu kullanmalsnz:
#device *=16
Ancak 16 bit aritmetik daha fazla ilem gerektirdiinden daha ok program kodu
oluturulacan gz nnde bulundurmalsnz.
100
i
3
102
j
5
104
k
-1
106
ptr
102
int i,j,k;
int *ptr;
75
www.picproje.org
NOT: PICMicrolarda her banktan kolayca ulalabilen (0x04 adresinde) fsr ve (0x04
adresinde)indf isminde iki kayt bulunur. ndf kayts fsr kayts ierisine kaydedilmi 8 bitlik
veriyi adres kabul eder ve o adresteki deeri barndrr. ndf kaytsnn ierii deitirilirse
dorudan fsr ierindeki adreste bulunan deer deitirilmi olur. 18FXXX serisi PICMicrolarda
bu fsr ve indf ilevini gren olduka yetenekli sanal kayt gruplarndan grup bulunur.
76
www.picproje.org
Mesela;
int *p;
.
p=p+200;
p=p+200 ifadesi ile P iaretisi eski deerinden 200 sonraki hafza biriminin
adresiyle yklenmitir. Hem iaretinin p kendisini, hem de gsterdii adresteki
deeri arttrmak veya azaltmak mmkndr.
Bir iareti tarafndan gsterilen bir deeri arttrrken veya azaltrken dikkatli
olmalsnz. rnein ptr deeri nce 1 iken aadaki satrdan sonra ne olur?
*p++;
77
www.picproje.org
ndekse sahip olmayan bir dizi ad iareti olduundan, o deeri bir baka
iaretiye ykleyebilirsiniz. Bu, sizin diziye iareti aritmetii ile erimenizi salar.
rnein:
int a[5]={1,2,3,4,5};
void main(void)
{
int *p,i;
p=a;
for(i=0;i<5;i++)
printf(%d,*(p+i));
}
aretiler ile dizileri kartrmak baz sama sonulara sebep olabilir. Aadaki
rnekte sorunu greceksiniz. kinci programda problem dzeltilmitir.
78
www.picproje.org
int *p;
int array[8];
p=array;
0007: MOVLW 0F ;dizinin balangcn ykle
0008: MOVWF 0E ;pointer
*p=3;
0009:
000A:
000B:
000C:
MOVF 0E,W ;
MOVWF 04 ;dolayl register gster
MOVLW 03 ;3 ykle
MOVWF 00 ;belirtilen noktaya kayt et
array[1]=4;
000D: MOVLW 04 ;4 ykle
000E: MOVWF 10 ;dizinin balangcna ykle
int *p;
int array[8];
p=array;
0007: MOVLW 0F ;dizinin balangcn ykle
0008: MOVWF 0E ;pointer
p[1]=3;
0009:
000A:
000B:
000C:
000D:
MOVLW
ADDWF
MOVWF
MOVLW
MOVWF
*(array+1) = 4;
000E:
000F:
0010:
0011:
MOVLW
MOVWF
MOVLW
MOVWF
10
04
04
00
ALITIRMA:
1. Bu blmdeki kod yazlm doru mudur ?
int count[10];
.
count = count+2;
79
www.picproje.org
Bu rnekte, p iaretisi harf dizisinin ilk karakteri olan M ye iaret eder. While
(*p) ifadesi de dizinin sonundaki nullu kontrol eder. Dngnn her bir
aamasnda, iareti tarafndan iaret edilen karakter yazdrlr ve sonra
dizideki bir sonraki karakteri gstermesi iin p bir arttrlr.
aretinin fonksiyona gemesiyle ilgili bir baka rnek de:
void IncBy10(int *n)
{
*n += 10;
}
void main(void)
{
int i=0;
IncBy10(i);
}
Yukardaki rnek, bir referans parametre tarafndan arlan zel tipteki bir
iareti parametresinin kullanlmasyla daha okunur bir ekilde yeniden
yazlabilir. rnek:
void Incby10(int &n)
{
n += 10;
}
void main(void)
80
www.picproje.org
{
int i=0;
Incby10(i);
}
Yukardaki her iki rnek de bir fonksiyondan parametre listesiyle nasl deer
dndrleceini gsterir.
Altrma:
1. Bir float sayy fonksiyona geiren bir program yazn. Fonksiyonun ierisinde
fonksiyon parametresi olarak -1 atansn. Fonksiyon maine dndkten sonra
float deikenin deerini yazn.
2. fl iaretisini bir fonksiyona geiren bir program yazn. Fonksiyonun ierisinde
deikene -1 deerini atayn. Fonksiyon maine dndkten sonra float
deikenin deerini yazsn.
8.Yaplar ve Birlikler
Yaplar ve birleimler C dilinin en nemli kullanc tanml tiplerini temsil ederler.
Yaplar deiik veri tiplerine sahip olabilen birbirleriyle ilikili deiken gruplardr.
Birlikler ayn hafza alann paylaan deikenler grubudur.
Bu blmde ele alacamz konular:
Yap esaslar
aretilerden Yaplara
ie gemi Yaplar
Birlik Esaslar
aretilerden Birlikler
8.1 Yaplara Giri
Bir yap, ortak bir ad zerinden eriilebilen ve birbirleriyle ilikili olan paralarn
grubudur. Yapnn iinde bulunan her para birbirlerinden farkl olabilen veri
tiplerine sahiptir.
C Yaplar aadaki ekilde tanmlanr:
struct etiket_adi
{
type element1;
type element2;
.
type elementn;
} deiken_listesi;
81
www.picproje.org
40 byte
40 byte
40 byte
2 byte
1 byte
Eer kart yapsnn tarih yesinin adresini almak istiyorsak &kart.tarih ifadesini
kullanmalyz. Eer yayncnn ismini yazdrmak istersek
printf(%s,kart.yayinci);
ifadesini kullanmalyz. Eer baslik dizisinin 3. eleman gibi belirli bir elemana
ulamak istiyorsanz ne yapmalsnz? Tabi ki kart.baslik[2] kullanmalsnz.
Basliin birinci eleman 0 , ikinci eleman 1 ve ncs 2.
82
www.picproje.org
Her hangi bir yap tanmlam iseniz , program ierisinde her hangi bir yerde
daha fazla yap deikeni oluturabilirsiniz. Bunun iin;
struct yap_ismi deiken_listesi;
Mesela, katalog yaps daha nce program ierisinde tanmlanm ise , iki adet
deikeni daha u ekilde tanmlayabilirsiniz;
struct katalog book,list;
C dili size dier veri tipleri gibi yaplar da bir dizi eklinde bildirmenize izin verir.
rneimiz katalog yapsnn 50 elemanl bir dizisini bildirmektedir.
struct katalog big[50];
Bu kod paras yapy uyguladnda var2 deikeni var1 deikeni ile ayn
ierie sahip olacaktr.
Aada bir yapya ilk deer verilmesine dair bir rnek verilmektedir:
struct ornek
{
char kim[50];
char karakter;
int i;
} var1[2]={Rodger,Y,27,Jack,N,30};
Not alnmas gereken nemli bir nokta: Bir yapy fonksiyona aktardnzda, tm yap bir
deer tarafndan arlma metodu ile aktarlr. Bu nedenle fonksiyon iindeki yapda
yaplacak modifikasyonlar arma rutini iinde bulunan yapnn deerini etkilemeyecektir.
Yap iindeki elemanlarn says yapnn fonksiyona aktarl biiminden etkilenmezler.
83
www.picproje.org
struct cont_pins
{
boolean en1; //tm dispaylere izin vermek iin
boolean en2; //40x4 displaylere izin vermek iin
boolean rs; //kaydedici seimi
int data:4;
}
cont;
#byte cont = 8;
Bu kod paras cont_pins iin yapy set eder ve program ile birlikte alr.
NOT: Kod iinde data iin yazlm :4 notasyonu bu nesne iin 4 bitin ayrlacan bildirir. Bu
durumda D0 en1 ve D3-6 data olacaktr.
void LcdSendNibble(byte n)
{
cont.data=n; //present data
delay_cycles(1); //delay
cont.en1=1; //set en1 line high
delay_us(2); //delay
cont.en1=0; //set en1 line low
}
ALITIRMA
1. inde bir karakter ve 40 adet karaktere sahip dizisi olan bir yap ieren
program yaznz. Keyboardtan bir karakter okuyunuz ve bu karakteri getch()
kullanarak karakter iine kaydediniz. Bir dizi okuyunuz ve gets() kullanarak dizi
iine kaydediniz. Sonra yelerin deerlerini print ediniz.
2. Bu kod parasndaki yanl nedir?
struct type
{
int i;
long l;
char str[50];
} s;
.
.
i = 10;
84
www.picproje.org
struct temp
{
int i;
char ch;
} p,*q;
Bu iaretin asl *q.i gibidir. Ancak grsel adan daha anlalr olmas iin ->
kullanm tercih edilmitir. Ok operatrnn eksi iaretini takip eden byktr
iareti olduuna ve arada boluk bulunmadna dikkat ediniz.
Bu ifade p deikeninin i elemanna 1 deerini atar.
C tm yapy fonksiyona geirdiinden beri, geni yaplar byk data transferi
yapmasndan dolay program iletim hzn yavalatabiliyorlard. Bu nedenden
dolay bir iaretinin bir yapya, bir fonksiyona geirilmesi daha kolaydr.
Not alnmas gereken nemli bir ey: Bir yap yesine yap deikeni kullanarak eriirken
noktay kullann. Bir yap yesine eriim iin iaretiden yapya kullanlyorsa ok operatrn
kullanmalsnz.
85
www.picproje.org
2. long uzunluunda bir yap dizilimi oluturan bir program yaznz. Yaplar
yklemek iin PIC16C5X, PIC16CXX ve PIC17CXX ihtiyacnz olacaktr.
Kullanc klavyenin 1,2 ve 3 girilerini kullanarak yazdrmak istedii yapy
seecektir. Yapnn biimi:
struct PIC
{
char name[20];
unsigned char progmem;
unsigned char datamem;
char feature[80];
};
8.3 e Yaplar
u ana kadar bir yap yelerinin yalnzca C dili data tipi olduunu grdnz.
Fakat yap yeleri baka bir yap olabilirler. Buna i ie yaplar denir. rnein;
#define NUM_OF_PICS 25
struct PIC
{
char name[40];
unsigned char progmem;
unsigned char datamem;
char feature[80];
};
struct urun
{
struct PIC aygitlar[NUM_OF_PICS];
char paket_tipi[40];
float maliyet;
} list1;
urun yapsnn eleman vardr: aygitlar adyla PIC yap dizisi, paket_tipi
adyla karakter dizisi ve maliyet adyla gerek say tipinde 4 baytlk deiken.
Bu elemanlara list1 deikeni kullanlarak eriilebilir. rnein list1 yapsnn
ihtiva ettii aygitlar yapsnn 10. elemannn progmem deerine erimek iin
list1.aygitlar[9].progmem ifadesi kullanlmaldr.
8.4 Birliklere Giri
PICPROJE EKB EVR GRUBU
86
www.picproje.org
Bir birlik iki veya daha fazla deiken tarafndan paylalan bir hafza
blgesidir. Hafza blgesini paylaan deikenler deiik veri tiplerinden
olabilirler. Fakat her defasnda yalnzca bir deiken kullanabilirsiniz. Bir birlik bir
yapya ok benzemektedir. Birliin genel yaps yledir;
union etiket_ad
{
type eleman1;
type eleman2;
.
.
type elemanN;
} deiken_listesi;
Birliin hafzadaki ekli aada gsterilmitir. Biz yapy anlatmak iin bir nceki
rnei kullanacaz. nteger iki byte, karakter dizisi 3 byte ve double 4 byte
kullanr.
<------------- double ------------->
<--c[2]--><--c[1]--><--c[0]-->
<-----integer------>
Bir birliin yelerine erimek iin yaplarda olduu gibi nokta kullanlr. temp.i
ifadesi temp birliinin iki baytlk integer tipindeki i yesine ve temp.d drt
baytlk double tipindeki d ye eriir. Eer bir iareti zerinden bir birlie
erieceksiniz yaplarda olduu gibi ok operatrn (->) kullanmalsnz.
Not alnmas gereken nemli bir nokta, bir birliin complier daki boyutu birlik iindeki en
byk boyutlu yeye bal olarak sabitlenir. Double tipinde olanlarnn boyutlar 4 byte
uzunluunda olduunu varsayarsak, temp birlii 4 byte uzunluunda olacaktr.
Birlik kullanmann gzel bir rnei, seri portuna harici 12-bit ADC bal olan 8bit mikrokontrolr uygulamasnda verilebilir. Mikrokontrolr A/Dyi iki baytta
okur. yleyse biz iki unsigned chars ve bir signed short tipinde yelere sahip bir
birlik oluturmalyz.
87
www.picproje.org
union sample
{
unsigned char baytlar[2];
signed short word;
}
A/D okumak istediinizde , A/D den iki byte okur ve bunlar baytlar dizilimi
iinde saklayabilirsiniz. Daha sonra 12-bitlik rnei kullanmak isterseniz , 12-bit
sayya ulamak iin word u kullanmalsnz. Yani ayn adreste saklana bilgilere
hem baytlar dizisi ile hem de word deikeni ile ulaabilirsiniz.
88
www.picproje.org