Está en la página 1de 89

PICPROJE EK B EV R GRUBU

www.picproje.org

TEEKKRLER..

Bu kitap PICPROJE Ekibi tarafndan eitime katk amacyla yaplmtr. Emei geen arkadalarmz.. (Alfabetik)
Grup Moderatr

CokuN Bunalmis CaFFeiNe Gsever Kurumahmut Macera Microcozmoz Otm Oyhan Petek Picusta Respected SpeedyX Timpati Ziya

www.picproje.org
TRK YEN N ELEKTRON K PLATFORMU

PICPROJE EK B EV R GRUBU

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

PICPROJE EK B EV R GRUBU

www.picproje.org

Program Kontrol fadeleri


if if-else ? for dngs while dngs do-while dngs Program Kontrol fadelerinin ie Kullanm Break Continue Null Return

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

PICPROJE EK B EV R GRUBU

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.

PICPROJE EK B EV R GRUBU

www.picproje.org

PC ye kar PICmicro MCU tabanl program gelitirme


Mhendisler temel donanmnn (klavye, ilemci, hafza, G/, yazc ve ekran gibi) hazr olmasndan dolay PC tabanl birimlerle rn gelitirmeye balamlardr. rn gelitirme yazlm hazrlamaktan ve hatalarn gidermekten oluuyordu. PIC tabanl rn gelitirmek, MCUnun d dnya ile iletiiminin giri k donanmlar eklinde oluturulmasyla balar. Bir PC programcs Merhaba Dnya yazan bir program derleyip altrdnda ekranda mesaj hemen grr. PIC programcs mesaj grebilmek iin RS232 arabirimini yapmak, PIC ierisinde iletiim portunu ayarlamak ve gelitirme kartn PC zerindeki iletiim portuna balamak zorundadr. Bu kadar zahmete gerek varm? dediinizi duyar gibiyim. Eer tm PC yi (monitr ve klavye ile birlikte) 40 bacakl bir entegre klfnda edinebilseydik onu kullanrdk: bu gnk imkanlarla henz buna sahip deiliz. Bunun iin dk maliyet ve tanabilir uygulamalar iin PIC veya benzeri mikrodenetleyiciler kullanmaya devam edeceiz. PIC tabanl sistemler iin gelitirme aralar grafik ktphaneler haricinde PC tabanl sistemlerdeki gibi gelitiriciye baz temel kolaylatrc seenekler sunar.

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!

PICPROJE EK B EV R GRUBU

www.picproje.org

Eer ilk projenizse O ZAMAN BAS T 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.

Simlatr MPLAB gelitirme ortam mikrodenetleyicinin dahili ilemlerine eriebilmeyi salayan kendi simlatrne sahiptir. Olaylarn ne zaman meydana geleceinin biliyorsanz bu tasarmnz test etmeniz iin iyi bir yoldur.

PICPROJE EK B EV R GRUBU

www.picproje.org

In Circuit Emlatr PC ile mikrodenetleyicinin takld sokete balanan ok kullanl bir ekipmandr. Yazlmn PC zerinde altrlmasn fakat devre kartnda mikrodenetleyici tarafndan altrlyor gibi grnmesini salar. ICE program adm adm altrabilmenizi ve mikrodenetleyici ksmnda neler olduunu d dnya ile nasl iletiime getiini izlemenizi salar. Programlayc program mikrodenetleyici hafzasna yklemeye yarayan ve ICE yardm olmadan alabilmesini salayan nitedir. Deiik ekillerde, boyutlarda ve fiyatlarda olabilir. Microchip in PICSTART PLUS ve PROMATE II modelleri seri porta balanr. Kaynak dosyas anlayabileceiniz ekilde assembly dili ile yazlm programdr. Kaynak dosyasnn mikrodenetleyicinin anlamas iin ilemden geirilmesi gerekir. Assembler / Derleyici kaynak dosyasn obje dosyasna eviren yazlm paketidir. Hata kontrol zellii vardr ve assembly ilemi esnasnda oluan hatalar bildirir. MPASM Microchip in tm PIC leri destekleyen en son assembler yazlmdr. Obje dosyas Assembler / Derleyici tarafndan retilen ve programlayc, simlatr yada ICE nin anlayabilecei formdaki dosyadr. Dosya uzants assembler direktifine bal olarak .OBJ veya .HEX olabilir. Liste dosyas Assembler / Derleyici tarafndan retilen kaynak dosyasndaki tm komutlar bunlarn hexadesimal karlklarn ve yazdnz aklamalar ieren dosyadr. Dosya uzants .LST dir. Dier dosyalar .ERR uzantl dosyalar hatalar ieren hata dosyalardr. .COD dosyalar emlatr tarafndan kullanlr. Hatalar sizin tarafnzdan yaplan yanllardr. Basit yazm hatalarndan programlama dilinin yanl kullanmna kadar eitli sebepleri vardr. Byk bir ounluu derleyici tarafndan yakalanr ve .LST dosyasnda gsterilir. Mikroilemci bir mikroilemci veya dijital bilgisayar temel birimden oluur. M B (CPU), G/ ve hafza ile dier destek devreleri

PICPROJE EK B EV R GRUBU

www.picproje.org

T P K B R M KRO LEMC S STEM Giri/k (G/) d dnya ile iletiimi salayan dijital, analog ve zel fonksiyonlardan oluan birimdir. Merkezi ilem birimi (M B) hesaplama ve veri ileme ilemlerini yapan 4, 8 yada 16 bit veri formatlar ile alabilen ve sistemin kalbi saylan birimdir. Hafza RAM, ROM, EPROM, EEPROM veya bunlarn bir kombinasyonu eklinde olabilir ve program ve verileri depolamaya yarar. Osilatr mikroilemcinin alabilmesi iin gerekli saat frekansn salar. Osilatr deiik bileenlerle oluturulabilir veya hazr modl olarak elde edilebilir. Mikroilemci ile balantl dier devreler watchdog zamanlaycs sistemin kitlenmesini nler , adres ve veri yollar iin tampon devreleridir ayn yol zerinde birden ok ipin birbirine zarar vermeden alabilmesini salar. Mikroilemci denildiinde esas olarak M B den bahsedildii anlalr. G/ ve hafza ayr iplerden oluur ve dzgn bir ekilde alabilmek iin adres ve veriyollar ile adres zme devrelerine ihtiya duyarlar. Mikrodenetleyiciler PICmicro MCU ve dier mikrodenetleyiciler tek ip ierisinde M B (CPU), hafza, osilatr, watchdog ve G/ birimlerini barndrrlar. Bunun sonucunda

PICPROJE EK B EV R GRUBU

www.picproje.org

yerden tasarruf, tasarm zamannn azalmas ve harici birimlerle ilgili uyumluluk sorunlarnn azalmas salanr fakat baz durumlarda sabit hafza boyutu ve snrl G/ kapasitesi nedeniyle tasarmn snrlarn daraltr. PIC mikrodenetleyici ailesi gelitiricilere en ok ihtiya duyacaklar geni bir aralkta G/, hafza ve zel fonksiyonlar sunar. Neden PIC kullanrz Kod verimlilii PIC Harvard mimarisini esas alan 8 bit bir mikrodenetleyicidir. bunun anlam ierisinde hafza ve veri iin farkl yollar bulunur. Program ve veri hafzasna ayn anda eriebildiinden dolay hz yksektir. Geleneksel mikrodenetleyicilerde program ve veri hafzas ayn veriyolunu kullanr. Bu PICmicro ile karlatrldnda hz en az 2 kat drr. Emniyet tm komutlar 12 veya 14bit geniliindeki program hafzasna sar. Bu yzden programn VER blgesine atlayp VER yi program komutlar gibi altrmas gibi bir ihtimal yoktur. Bu Harvard mimarisinde olmayan 8bit program adres yollar kullanan mikrodenetleyicilerde oluabilir. Komut seti 16C5X ailesi ve 14bit genilikteki 16CXX ailesi iin program yazabilmek iin renmeniz gereken sadece 33 komut vardr. CALL, GOTO ve bit test amal komutlar haricindeki (BTFSS, INCFSZ vs.) komutlar tek komut admnda iletilirler. Hz PIC osilatr ile dahili saat yolu arasnda 4e blc bir devre ierir. Bu zellikle 4Mhz kristal kullanldnda komut zamannn hesaplanmasn kolaylatrr. Bu durumda her bir komut adm (evrimi) 1uS (yani 1s) tutar. PIC 20Mhz gibi bir kristal kullanldnda saniyede 5 milyon komut iletebilen olduka hzl bir ilemcidir. hemen hemen 386SX33n iki kat! Statik iletim PIC tamamen statik bir mikrodenetleyicidir; dier bir deyile saat frekansn durdurursanz tm yazma ierikleri olduu gibi kalr. Pratikte tam olarak bunu yapmazsnz, PICi uyku moduna geirirsiniz bu saat frekansn durdurur ve PIC in uyku modundan nce hangi durumda olduunu bilebilmesi iin baz bayraklar ayarlar. Uyku modunda iken PIC 1uAden az akm eker. k srme yetenei PIC yksek k srme kapasitesine sahiptir ve LED triyak vs. direk srebilir. Herhangi bir G/ pininden 25mA kadar veya tm ipten 100mA-200mA akm ekilebilir. Seenekler neredeyse tm ihtiyalarnza cevap verebilecek ekilde hz, scaklk, klf, G/ hatlar, zamanlayc fonksiyonlar, A/D ve hafza seenekleri mevcuttur.

PICPROJE EK B EV R GRUBU

www.picproje.org

ok ynllk PIC yksek adetlerde dk maliyetli ve ok ynl bir mikrodenetleyicidir. zellikle yerin nemli olduu uygulamalarda birka mantk kapsnn yerine bile kullanlabilir.

PIC16F84A (14BIT) BLOK D YAGRAMI Gvenlik PICmicro MCU endstrideki en gvenli kod koruma zelliklerinden birine sahiptir. Koruma biti birkez programlandnda program hafzas okunamaz. Gelitirme PIC gelitirme iin pencereli veya FLASH yapda, retim iin ise OTP (birkez programlanabilir) yapda bulunabilir. Gelitirme aralar ev kullanclar iin kolayca ve uygun fiyatl olarak temin edilebilir.

PICPROJE EK B EV R GRUBU

10

www.picproje.org

Kodu deneme ve test etme


Cyi kavramak iin balang masraflar olarak C derleyicisi, in circuit emlatr ve gerekli donanm edinmek projenin deerlendirme safhasnda insann gzn korkutabilir. C derleyicisi diskte verilir ve internetten salanabilir.

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.

PICPROJE EK B EV R GRUBU

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.

PICPROJE EK B EV R GRUBU

12

www.picproje.org

PC ile C kullandnzda, akas ekran, klavye ve ilemcinin tm birbirine baldr. Yapmanz gereken programlarla programlar ve evrebirimlerini birbirine balamaktr. PICmicro MCU veya dier mikroilemci/mikrodenetleyici sistemleri iin program gelitirdiiniz zaman ise program yazmaktan baka mikroyu d dnyaya balamak iin fiziksel donanm da oluturmanz gerekir. Buna benzer bir sistem aada grlmektedir.

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

derlendiinde kod u hale gelir:

PICPROJE EK B EV R GRUBU

13

www.picproje.org

main() { set_tris_b(0x00); while(true) { if(input(PIN_A0))

0007 0008

MOVLW TRIS BTFSS GOTO BSF GOTO BCF GOTO

00 6 05,0 00D 06,0 00E 06,0 009

0009 000A output_high(PIN_B0); 000B 000C else output_low(PIN_B0); 000D 000E

} }

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.

PICPROJE EK B EV R GRUBU

14

www.picproje.org

1. C Esaslar
PICPROJE EK B EV R GRUBU

15

www.picproje.org

Bu blmde C programlamann baz temel ynlerinden bahsedilecektir. Ama size temel C bilgilerini vermek ve ilerki blmlerdeki altrmalar anlamanz salamaktr. Ele alnacak balklar unlardr: Program yaps Bir C programnn bileenleri #pragma main #include direktifi printf deyimi Deikenler Sabitler Yorumlar Fonksiyonlar C komutlar

1.1

C Programnn Yaps

Tm C programlar nilemci direktifleri, bildirimler, tanmlamalar, ifadeler, durum ifadeleri ve fonksiyonlar ierir. nilemci direktifi nilemci direktifi C nilemcisine gnderilen bir komuttur (program derlenirken ilk adm oluturur). En ok kullanlan iki nilemci direktiflerinden #define, zel bir tanmlaycnn yerine geen bir metin belirtmek iin ve #include ise program ierisine harici bir dosyadan tanmlama ya da program paralar dahil etmek iin kullanlr. Bildirimler Bildirimlerle programda kullanlan deikenler, fonksiyonlar ve tiplerin nitelikleri ve isimleri ayarlanr. Global deikenler fonksiyonlarn dnda tanmlanr ve tanmlandklar yerden itibaren dosyann sonuna kadar geerlidirler. Local deikenler ise fonksiyonlarn iinde tanmlanr ve tanmlandklar yerden itibaren fonksiyonun sonuna kadar geerlidirler. Tanmlamalar Tanmlamalarla bir deiken veya fonksiyonun ierii ayarlanr. Ayrca deikenler ve fonksiyonlar iin gerekli hafza ayrlr. fadeler fade tek bir deer reten ileler ve ilenenler kombinasyonudur.

Durum fadeleri

PICPROJE EK B EV R GRUBU

16

www.picproje.org

Durum ifadeleri bir C programnda program aknn kontroln salarlar. Fonksiyonlar Fonksiyonlar zel bir ilem yapan bildirimler, tanmlamalar, ifadeler ve durum ifadeleri btndr. Parantezler fonksiyonun gvdesini kapsar. Fonksiyonlar C de bulunmak zorunda deildir. main Fonksiyonu Tm C programlar main isimli bir fonksiyon iermek zorundadr ve program buradan balar. main fonksiyonunu kapsayan parantezler programn balang ve biti noktalarn belirler. rnek: Genel C program yaps
#include <stdio.h> #define PI 3.142 float area; int square(int r); /* /* /* /* 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

Bir C programnn bileenleri

Tm C programlar ifadeler ve fonksiyonlar gibi gerekli bileenler ierir. fadeler aslnda programn ilemleri gerekletiren ksmlardr. Btn C programlar bir veya daha fazla fonksiyon ierir. Fonksiyonlar bir veya daha fazla ifadeden oluan altprogramlardr ve programn dier ksmlar tarafndan arlrlar. Programlar yazarken tablar, bo satrlar ve aklamalar okunurluluu arttrr sadece ileriki tarihlerde sizin iin deil, ayn zamanda programnz inceleyen bakalar iinde. Aadaki rnek bir C programnn gerekli bileenlerini gstermektedir.
#include <stdio.h> /* lk C programm */ main() {

PICPROJE EK B EV R GRUBU

17

www.picproje.org

printf(Merhaba Dnya); } #include <stdio.h>

ifadesi derleyiciye stdio.h dosyasnn programa dahil

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 */

Btn C programlarnda main()fonksiyonu bulunmak zorundadr. Bu programa giri noktasdr. Btn fonksiyonlar ayn formata sahiptir.
FunctionName() { code }

Fonksiyon ierisindeki ifadeler srayla iletilirler. Ssl parantezler { ve } Cde kod bloklarnn balangcn ve bitiini gsterirler. Son olarak printf(Merhaba Dnya); ifadesi tipik bir C ifadesidir. Hemen hemen tm C ifadeleri noktal virgl (;) ile biter. Satr sonu karakteri (CR+LF) C tarafndan satr sonlandrc olarak tannmaz. Bu sebepten dolay ifadelerin bir satra smas gibi bir zorunluluk yoktur ve bir satrda birka ifade bulunabilir. Btn ifadelerin sonunda, derleyiciye ifadenin sonuna gelindiini bildiren noktal virgl (;) bulunur ve ayn zamanda ifadeyi dier ifadeden ayrr. Noktal virgl unutulursa bir sonraki satrda hata oluur. if ifadesi bileik bir ifadedir ve noktal virgln bileik ifadelerin sonuna konmas gerekir.
if (BuDoruysa) BunuYap();

1.3

#pragma

Pragma komutu derleyiciye derleme zamannda zel bir ilem yapmasn bildirir mesela hangi PICmicro MCU nun kullanldn bildirmek gibi
#pragma device PIC16C54

PICPROJE EK B EV R GRUBU

18

www.picproje.org

CCS C de pragma komutu zorunlu deildir ve aadaki yazmda kabul edilir


#device PIC16C54

1.4

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

Her programda sadece birtane main fonksiyonu olmak zorundadr. Balk dosyas, (*.h uzantsyla belirtilen) fonksiyonlarn ald argmanlar, fonksiyonlarn dndrdkleri deerler ve belirli bir PIC modelinin kaydedicilerinin adresleri gibi bilgileri barndrr.
#include <16C54.H>

Bu bilgi derleyici tarafndan btn donanmla ilgili tanmlarn ve kaynak programlarn balanmas srasnda kullanlr.
#include <16c71.h> #include <ctype.h> #use rs232(baud=9600,xmit=PIN_B0,rcv=PIN_B1) main() { printf(Enter characters:); while(TRUE) putc(toupper(getc())); }

PIN_B0 ve PIN_B1 tanmlamalar 16C71.H adl balk dosyasnda bulunur. toupper fonksiyonu da CTYPE.H balk dosyasnda belirtilmitir. Her iki balk dosyas da derleyicinin kullanlan fonksiyonlar hakknda bilgi sahibi olmas iin kullanlmaldr. Ayrca birok C derleyicisi printf ve putc gibi G/ fonksiyonlar iin balk dosyalarn kullanmna ihtiya duyar.Bu fonksiyonlar programlara #use rs232 direktifi ile eklenirler ve harici bir balk dosyasna ihtiya duymazlar.
#include <dosya1.h>

nilemciye dosya1 adl balk dosyasnn balk dosyalar klasrnde bulunduunu belirtir. ift trnak ierisindeki balk dosyas ismi ise derleyiciye kaynak kodun bulunduu klasre bakmasn syler.

PICPROJE EK B EV R GRUBU

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.

1.6 printf Fonksiyonu


printf fonksiyonu yazlabilir bilginin gnderilmesini salayan ve standart ktphanede bulunan bir fonksiyondur. printf() iin genel biim u ekildedir:
printf(kontrol karakterleri dizisi, argument_list);

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

ile birlikte kullanlr

NOT: % karakterinden sonra kullanlan 0(sfr)larn says, say dizilerinde ka adet sfrn gsterileceini belirler. 0lar takip eden say da, ka hanenin gsterileceini belirler.
printf( 12nin onaltlk karl %02x\n,12);

Bu program satrnn kts: 12nin onaltlk (hexadesimal) karl olan 0c dir. Ters bl karakter sabitleri(Escape Sequences):
\n yenisatr

PICPROJE EK B EV R GRUBU

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

Format belirteleri %[bayraklar][genilik][.hassasiyet], eklinde de kullanlabilir.


printf(Alan %6.4f birim karedir\n,alan);

alan deikeni 6 haneli ve 4 ondalk hane kullanlarak yazlacaktr. Varsaylan olarak printfin kts en son tanmlanm RS232 portuna gnderilir. ktlar herhangi bir fonksiyon yoluyla baka bir yere de ynlendirilebilir. rnein:
void lcd_putc(char c) { // Insert code to output one // character to the LCD here } printf(lcd_putc, value is %u, value);

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

PICPROJE EK B EV R GRUBU

21

www.picproje.org

noktal sabitler de olabilir. Karakter sabitler tek trnak ierisinde gsterilirler: A veya & gibi. Derleyici programnzda bir sabit ile karlatnda bu sabitin tr hakknda karar vermesi gerekir. C derleyicisi varsaylan olarak verinin yerletirilebilecei en ufak veri tipini kullanacaktr. rnein 15 says bir int , 64000 iaretsiz long tiptir. Sabitler ayrca #define ifadesi ile de belirtilebilinir:
#define etiket deer

Derleyici program derlerken etiket ksmnda yazl olan isimle her karlatnda bunun yerine belirtilen deeri koyacaktr. #define TRUE 1 #define pi 3.14159265359 C sabitleri 16l veya 8lik tabanda yazmanza olanak verir: Onaltlk tabandaki sabitler 0x neki ile balamaldr. rnein 0xA4 geerli bir onaltl sabittir. Saysal sabitlerin yannda C dizge sabitlerini de destekler. Dizge sabitleri ift trnak arasnda yazlan karakter takmlardr. #define ifadesi ile tanmlanan sabitler aslnda derlenmeden nceki aamada yaplan yaznsal deiimlerdir. # iareti ile balayan satrlar n-ilemci direktifleridir. #define szcyle herhangi bir metni tanmlayabilirsiniz. rnein:
#define YASLI_DEGIL (YAS<65) . . . . . f YASLI_DEGIL printf(GENC);

#define verisi bellekte saklanmaz. Derlenme annda ilenir. Sabitleri ROMa kaydetmek iin const szcn kullanmalsnz. rnein:
char const id[5]={1234};

Buradaki diziyi bellekte saklamak iin 5 adet bellek blgesi kullanlr. nk dizinin sonuna boluk karakteri (\0) eklenmektedir.

1.9 Yorumlar

PICPROJE EK B EV R GRUBU

22

www.picproje.org

Yorumlar kaynak kodda yaplan ilemleri anlatmak ve almasn gstermek iin kullanlr. Yorumlar derleyici tarafndan gz ard edilir. Yorumlar bir C anahtar kelimesinin, fonksiyon veya deiken isminin ortas dnda herhangi bir yerde bulunabilirler. Yorumlar birok satrdan oluabilirler ve bazen kodlarn geici olarak kaldrlmas iin de kullanlabilirler. Yorumlar satrlarca uzunlukta olabilirler ve bazen de bir kod satrnn geici olarak kaldrlmas iin kullanlabilirler. Yorumlar i ie gmlemezler. Yorumlarn iki tr kullanm biimleri vardr. lk biim btn C derleyicileri tarafndan desteklenmektedir.
/* Bu bir yorumdur*/

kinci format ise birok derleyici tarafndan desteklenmektedir.


// Bu bir yorumdur

Altrma: Aadaki yorum biimlerinden hangileri geerli,hangileri geersizdir?


/* Ksa bir yorum */ /* ok ok ok ok ok ok ok ok bir yorum */ ok ok ok ok ok ok ok ok uzun

/* Bu yorum /* geerli */ deildir */

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() { } }

main() program altrldnda arlan ilk fonksiyondur. Dier fonksiyon1() ve fonksiyon2() programn herhangi bir yerinde arlabilirler. Geleneksel olarak main() fonksiyonu baka bir fonksiyon tarafndan arlmaz, ancak Cde kstlamalar yoktur. Aada iki C fonksiyonu grlmektedir:
main() {

PICPROJE EK B EV R GRUBU

23

www.picproje.org

printf(Cyi); fonksiyon1(); printf(cok); } fonkisyon1() { printf( seviyorum ); }

Bir fonksiyonda en son paranteze ( } )gelince program tekrar fonksiyonun arlm olduu satrdan itibaren iletilmeye devam eder. Blm 3.1e baknz.

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;

Aadaki rnek de ksa bir fonksiyon tanmlanmaktadr:


#define MAX(A,B) (A>B)?A:B) z = MAX(x,y); // z ,x ve y deerlerinin en by olacaktr

1.12 Durumsal Derleme


Cde baz derleme esnasnda kodun belirli blmlerinin derlemeye dahil edilmesi veya karlmas iin n-ilemci direktifleri bulunur. Aadaki rnei inceleyelim:
#define HW_VERSION 5 #if HW_VERSION>3 output_high(PIN_B0); #else output_low (PIN_B0); #endif

Yukardaki programda HW_VERSION deerine bal olarak sadece bir satr derlenecektir. Ayn kodda onlarca #if ifadesi bulunabilir ve ayn kod deiik
PICPROJE EK B EV R GRUBU

24

www.picproje.org

donanmlar iin derlenebilir. #if ifadeleri, normal if ifadelerinden farkl olarak kod derlenirken deerlendirilirler. #ifdef ifadesi herhangi bir kimlik ifadesinin daha nce tanmlanp tanmlanmadn belirlemede kullanlr. rnek:
#define TANIM #ifdef TANIM printf(X Fonksiyonu altrlyor); #endif

Bu rnekte #define TANIM satr kaldrldnda printf fonksiyonunun bulunduu satr derleyici tarafndan gz ard edilecektir (yani derlenmeyecektir).

1.13 Donanm Uyumluluu


Derleyici kodun dzgn derlenebilmesi iin donanm hakknda bilgiye ihtiya duyar. Tipik bir program u ekilde balar:
#include <16c74.h> #fuses hs,nowdt #use delay(clock=800000)

lk satr kullanlan ilemcinin pinlerine ait define direktiflerini ieren dosyann programa eklenmesini salar. kinci satrda PICmicroMCUnun ayar deerleri atanr. Bu rnekte yksek hzl osilatr kullanlmakta ve watchdog timer devre d braklmaktadr. Son satr da osilatrn hz belirtilmektedir. Aada baka bir rnek grlmektedir:
#use rs232(buad=9600,xmit=PIN_C6,rcv=PIN_C7) #use i2c(master,scl=PIN_B6,sda=PIN_B7)

Bu kitaptaki rneklerde yukarda grlen donanm tanmlayan satrlar gsterilmemitir. Buna ilave olarak, C deikenleri tanmlanp donanm kontrol kaytlarna (registers) ynlendirilebilirler. Bu deikenler bayt veya bitler eklinde olabilirler. Tanmlandktan sonra programda dier normal deikenler gibi kullanlabilirler. rnek olarak
#bit carry=3.0 ; STATUS registerindeki carry flagi deiken tanmland #byte portb=6 ; PortB dorudan deikenmi gibi tanmland #byte intcon=11; INTCON kayts deiken olarak tanmland

1.14 C Anahtar Kelimeleri


ANSI C standard 32 adet C anahtar kelimesi tanmlar. Cde belirli kelimeler derleyici tarafndan veri tiplerinin tanmlanmasnda veya dnglerde kullanlrlar. Btn C anahtar kelimeleri kk harfle yazlmaldr. Genellikle, C derleyicileri ilemcinin zelliklerinden faydalanabilmek iin fazladan anahtar

PICPROJE EK B EV R GRUBU

25

www.picproje.org

kelimeler tanmlarlar. Aada C anahtar kelimelerinin listesi bulunmaktadr. Kullanlan deikenlere verilecek isimler anahtar kelimelerle ayn olamaz.
Auto break case char const continue default do 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.

PICPROJE EK B EV R GRUBU

26

www.picproje.org

Bu blmde tartlacak olan balklar unlardr: veri tipleri bildirimler atamalar veri tipi aralklar tip dnmleri

2.1 Veri Tipleri


C Dili be temel veri tipini ve 4 tr deitiriciyi destekler. Aadaki tablo temel veri tiplerinin ve tip deitiricilerinin anlamlarn gstermektedir. Tip Anlam Anahtar Kelimeler
char int float double void signed unsigned long short

Karakter karakter verisi Tam saylar iaretsiz tam saylar Float kayan noktal saylar Double ift duyarlkta kayan noktal saylar Bo deersiz aretli pozitif veya negatif saylar aretsiz sadece pozitif saylar Uzun geni aralktaki saylar Ksa dar aralktaki saylar

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
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

short short int int char unsigned unsigned int signed signed int long long int signed long float

NOT: Asl veri tipleri ve nmerik aralklar iin kullandnz C derleyicisinin klavuzlarna baknz. C, unsigned int, short int ve long int veri tiplerinin ksa gsterimine olanak verir. int kullanmakszn kolayca, unsigned, short, ya da long eklinde yazlabilir. Aritmetik ilemlerin ilemci iin daha kolay olmas bakmndan, Cdeki tm negatif saylar 2nin tmleyeni biiminde gsterilir. Bir saynn 2nin tmleyeni edeerini bulmak iin nce saynn tm bitleri evirilir ve sayya 1 eklenir.

PICPROJE EK B EV R GRUBU

27

www.picproje.org

rnein, +29u 2nin tmleyini edeerine evirmek iin:


00011101 11100010 1 11100011 = = 29 tm bitleri evir 1 ekle -29

Aada 12000 deerinin a deikenine atanmas rnei verilmitir. 12000in 16lk say sistemindeki karl 2EE0dr. Verilen kod, saynn dk deerli ksmn 11h yazmacna, yksek deerli ksmn 12h yazmacna atar.
long a main() { 0007: 0008: 0009: 000A: } = 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); }

2.2 Deiken Bildirimleri


Deikenler iki temel yerde bildirilebilirler: fonksiyonun iinde ya da fonksiyonlarn dnda. Bunlar, srasyla yerel ve global isimlerini alrlar. Deikenler aadaki biimde bildirilirler: tip degiken_adi;

PICPROJE EK B EV R GRUBU

28

www.picproje.org

Burada, tip geerli bir C veri tipi ve degisken_adi da bildirilen deikenin ismidir. Yerel deikenler (fonksiyonlarn iinde bildirilenler) sadece bildirildikleri fonksiyonlarn iindeki ifadelerde kullanlabilir. Yerel deikenin deerine, bildirildii fonksiyon dndaki fonksiyonlar tarafndan eriilemez. Yerel deikenler hakknda hatrlanmas gereken en nemli ey, onlarn fonksiyona giri esnasnda yaratlp, fonksiyondan kld zaman yok edilmesidir. Ayrca yerel deikenler, fonksiyonun balangcnda dier ifadelerden nce bildirilmelidir. Farkl fonksiyonlarda, ayn isimli yerel deikenlerin bildirilmesi geerli bir bildirimdir. Aadaki rnei gz nnde tutacak olursak:
void f2(void) { int sayac; for (sayac = 0 ; sayac < 10 ; sayac++) print(%d \n, sayac); } f1() { int sayac; for (sayac=0; sayac<10; sayac++) f2(); } main() { f1(); return 0; }

Bu program 0dan 9a kadar olan saylar ekrana 10 defa yazdracaktr. Programn ileyii her iki fonksiyonda da yer alan sayac deikeninden etkilenmez. Dier taraftan global deikenler bir ok farkl fonksiyon tarafndan kullanlabilir. Global deikenler herhangi bir fonksiyon tarafndan arlmadan nce bildirilmelidirler. Daha nemlisi, global deikenler programn ileyii tamamlanmadka, arldklar fonksiyondan ktklar zaman yok edilmezler. Aadaki rnek global deikenlerin nasl kullanlacan gstermektedir.
int max; f1() { int i; for(i=0; i<max;i++) printf(%d ,i); }

PICPROJE EK B EV R GRUBU

29

www.picproje.org

main() { max=10; f1(); return0; }

Bu rnekte; main() ve f1() fonksiyonu max deikenine referans gstermektedir. main() fonksiyonu max deikenine deer atamakta ve f1() fonksiyonu for dngsn kontrol etmek iin maxn bu deerini kullanmaktadr. ALITIRMALAR: 1. Yerel ve global deikenler arasndaki temel farkllklar nelerdir? 2. Cde yerel ve global deikenler ayn ismi paylaabilirler. Aadaki program yaznz.
int sayac; f1() { int sayac; sayac =100; printf(f1() deki sayac : %d\n, sayac); } main() { sayac=10; f1(); printf(main() deki sayac: %d\n, sayac); return 0; }

main()in ierisinde sayaca referans global deiken biimindedir. f1() fonksiyonundaki yerel sayac deikeni global deikenin deerini geersiz klar.

2.3 Deiken Atamas


u ana kadar deikenlere ilk deer atamasn es geip, sadece deiken bildirimlerinin nasl yaplaca zerine tarttk. Deikenlere deer atanmas aada gsterildii gibi basite gerekletirilir:
degisken_adi = deger;

Deiken atamas bir ifade olduundan tr, ifadenin sonuna noktal virgl konulur. rnek olarak 100 deerini sayac tam say deikenine atamak iin:

PICPROJE EK B EV R GRUBU

30

www.picproje.org

sayac = 100;

Burada 100 deeri bir sabittir. Deikenler bildirildii anda bunlara ilk deer atamas yaplabilir. Bu ekilde deikenlerinize bilinen deerlerle atama yaplmas programnz kolaylatrp daha gvenli hale getirir. rnek olarak:
int a = 10, b = 0, c = 0x23;

Cde pek ok deiik tipte sabitler mevcuttur. Bir karakter sabiti M rneindeki gibi bir karakter sabiti, karakterin tek trnak iinde yazm ile belirtilir. int tiplere deer atarken tam saylar kullanlr. Kayar noktal saylar, ondalk noktal gsterimi kullanmaldr. rnein 100 saysnn kayar noktal bir say olduunu Cde gstermek iin 100.0 gsterimi kullanlr. Ayrca, bir deiken baka bir deikene atanabilir. Aadaki kod paras bu atamay gsterir.
main() { int i; int j; i=0; j=i; }

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

PICPROJE EK B EV R GRUBU

31

www.picproje.org

Cde tam say sabitlerinin listesini yapmak mmkndr. Bu bildirim numaralandrma ismini alr. Numaralandrlarak oluturulan sabitler listesi, tam say tiplerinin kullanld her yerde kullanlabilir. Numaralandrma oluturmann genel ekli yledir:
enum isim {numaralandrma listesi} deiken(ler);

Deiken listesi numaralandrmann seime bal parasdr. Numaralandrma deikenleri sadece numaralandrma listesinde tanmlanm deerleri kullanabilir. rnein u ifadede:
enum renk_tipi {kirmizi, yesil, sari} renk;

renk deikenine sadece kirmizi, yesil ve sari deerleri atanabilir. (r., renk = kirmizi;). Derleyici, ilk girdi 0a eit olmak zere numaralandrma listesine tam say deerleri atar. Her bir girdi bir ncekinden bir byktr. Buna gre, yukardaki rnekte kirmizi 0, yesil 1 ve sari 2 deerlerini alr. Bu durum, sabit iin bir deer atanarak nlenebilir. Aada bu durum rneklendirilmitir:
enum renk_tipi {kirmizi, yesil=9, sari} renk;

Bu ifade kirmiziya 0, yesile 9 ve sariya 10 deerlerini atar. Numaralandrma bir kez tanmlandnda, bu isim, programn farkl noktalarnda ilave deikenler yaratmak iin kullanlabilir. rnein, rengim deikeni renk_tipi numaralandrmas ile u ekilde yaratlr:
enum renk_tipi rengim;

Deiken baka bir deikenle snanabilir:


if (renk==meyve) // bir eyler yap

Aslnda, numaralandrma belgelendirmeye yardmc olur. Bir deikene deer atamak yerine, deerinin daha ak anlalmas iin numaralandrma kullanlabilir. ALITIRMALAR: 1. PIC17CXX ailesinin numaralandrlmasn oluturunuz. 2. En dkten en yksek deere paranzn numaralandrma listesini oluturunuz. 3. Aadaki kod paras doru mudur? Aklaynz.
enum {PIC16C51,PIC16C52,PIC16C53} aygit; aygit = PIC16C52; printf( lk PIC %s d.\n, aygit);

PICPROJE EK B EV R GRUBU

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;

Program 32-bitlik bilgisayarlar iin derlemeden nce typedef ifadesi u ekilde deitirilebilirdi:
typedef short int tamsayim;

Yani tamsayim tipinde bildirilmi tm deikenler 16-bit genilie sahip olur. typedef ifadelerini kullanmann dier nedeni, programn okunabilirliini arttrmasndandr. Eer kodunuz, saya benzeri pek ok deiken ieriyorsa, tm sayac deikenlerinizi bildirmek iin typedef ifadesini kullanabilirsiniz. typedef int sayac; Kodunuzu okuyan birisi, sayac tipinde bildirmi olduunuz deikenlerinizin sayc amal kullandnz fark edecektir.

PICPROJE EK B EV R GRUBU

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;

2.6 Tip Dnmleri


C, farkl veri tiplerinin bir ifadede kartrlmasna izin verir. rnein verilen kod paras geerli bir yazmdr:
char ch = 0; int i = 15; float f = 25.6; double sonuc = ch*i/f;

Veri tiplerinin kartrlmas, derleyicinin farkllklar nasl zmleyeceini bildiren sk dnm kurallar ile ynetilir. Kurallar kmesinin ilk ksm tip terfisidir. C derleyicisi, ifade altrldnda char veya short int tipini otomatik olarak int tipine dntrr. Tip terfisi sadece ifadenin altrld zaman geerlidir; deiken fiziksel olarak daha byk olamaz. Otomatik tip dnmleri tamamlad zaman, C derleyicisi tm deikenleri en geni tipli deikenin tipine evirir. Bu ilem adm adm ilerleme temeline gre gerekletirilir. Aadaki algoritma tip dnmlerinin nasl yaplacan gstermektedir. EER bir operand long double ise dieri long double tipine evrilir EER bir operand double ise dieri double tipine evrilir EER bir operand float ise dieri float tipine evrilir EER bir operand unsigned long ise dieri unsigned long tipine evrilir EER bir operand long ise dieri long tipine evrilir EER bir operand unsigned ise dieri unsigned tipine evrilir nceki rnekte ne trden terfiler ve dnmler olduunu inceleyelim. lk olarak, ch int tipine terfi ettirilir. lk ilem ch ile inin arpmdr. Her iki
PICPROJE EK B EV R GRUBU

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);

Bu kod altrldktan sonra ekrana 100 says yazdrlr. ki 8-bit tam say arpldnda sonu 8-bit uzunlukta olacaktr. Sonu deeri long tipinde bir deikene atanacak olursa, aritmetik ilem yeni deikene atanma ileminden nce gerekletirildiinden sonu hala 8-bitlik bir tam say olacaktr.
int a = 250, b = 10; long c; c = a * b;

Sonu 196 olacaktr. long tipinde sonuca ihtiyacnz varsa, bir deiken iin aka tip dnm yapmanz gerekmektedir.
c = (long) a * b;

a long tipine aka dntrldnden long tipinde arpm gerekletirilmitir ve sonu beklenildii gibi 2500 olacaktr.

2.7 Deiken Depolama Snf


Cdeki her bir deiken ve fonksiyonun iki zellii vardr: tip ve depolama snf. Tip kavram daha nce aklanmt. Otomatik, harici, duraan ve yazma olmak zere drt deiik depolama snf vardr. Bunlar Cde aadaki anahtar kelimeler ile gsterilirler: auto extern static register Auto
PICPROJE EK B EV R GRUBU

35

www.picproje.org

Fonksiyonun ierisinde bildirilen deikenler varsaylan olarak auto snfndandr.


{ char c; int a, b, e; }

ile aadaki gsterim ayndr.


{ auto char c; auto int a, b, e; }

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.

PICPROJE EK B EV R GRUBU

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

PICPROJE EK B EV R GRUBU

37

www.picproje.org

3.1 Fonksiyonlar
nceki blmlerde,ana programdan arlan birok fonksiyon rnei grmtk.rnein:
main(){ f1(); } int f1(){return 1;}

Gerekte, bu programn hata yada en azndan uyar vermesi gerekir. nk f1() fonksiyonu, deikenlerde olduu gibi, kullanmndan nce bildirilmeli veya tanmlanmaldr. Eer standart C fonksiyonu kullanyorsanz, programnzn banda #include deyimiyle programnza eklediiniz balk dosyas derleyiciye fonksiyonu zaten tantmtr. Eer kendi fonksiyonlarnzdan birini kullanyorsanz bu hatay gidermenin iki yolu vardr: lk yol, ikinci blmde aklanacak olan, fonksiyon prototipi kullanmaktr. Dieri ise programnz u ekilde organize etmektir:
int f1() { return 1; } main() { f1(); }

Bir hata olumayacaktr nk f1() fonksiyonu main() iinde arlmadan nce tanmlanmtr.

3.2 Fonksiyon Prototipleri


Derleyiciye bir fonksiyonun dndrecei deeri bildirmenin iki yolu vardr. Genel biim udur:
tip fonksiyon_ismi();

rnein, topla() iindeki ifade derleyiciye topla()nn bir tamsay deeri dndreceini bildirebilir. Derleyiciye dndrlen deeri bildirmek iin ikinci bir yol da fonksiyon prototipi kullanmaktr. Fonksiyon prototipi sadece fonksiyonun dndrecei deeri belirtmekle kalmaz, ayn zamanda fonksiyonun kabul ettii argman says ve tiplerini de bildirir. Prototip fonksiyon bildirimi ile rtmek zorundadr. Prototipler, fonksiyonlara iletilen argmanlarla, fonksiyon bildirimindeki argman tipleri arasndaki hatal tip dnmlerini gstererek programcya program hatalarn bulmasnda yardmc olur. Ayrca fonksiyona iletilen argman saysnn, fonksiyon bildirimindeki ile ayn olmadn da raporlar.

PICPROJE EK B EV R GRUBU

38

www.picproje.org

Fonksiyon prototipleri iin genel biim u ekildedir:


tip fonksiyon_ismi(tip degisken1,tip degisken2,tip deisken3);

Yukardaki rnekte, her bir deikenin tipi farkl olabilir. Bir fonksiyon prototipi rnei aadaki programda gsterilmitir. Fonksiyon uzunluk, genilik ve ykseklik deerlerinden hacmi hesaplamaktadr.

int hacim(int s1, int s2, int s3); void main() { int hcm; hcm= hacim(5,7,12); printf(hacim: %d\n,hcm); } int hacim(int s1, int s2, int s3) { return s1*s2*s3; }

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:

PICPROJE EK B EV R GRUBU

39

www.picproje.org

void hic(void) rnek olarak:


double pi(void) { //hibir parametre almadan // fonksiyon tanmlanyor //ancak fonksiyon pi deeri dndryor

return 3.1415926536; } main() { double pi_degeri; pi_degeri = pi(); //pi fonksiyonuyla pi deeri alnyor printf(%d\n,pi_degeri); }

3.4 Fonksiyon Argmanlarnn Kullanm


Fonksiyon argman fonksiyon arlrken, fonksiyona aktarlan deerdir. C fonksiyona birok argmann aktarlmasna izin vermektedir. Bir fonksiyonun kabul edebilecei argman says derleyiciye bal olmakla birlikte, ANSI C standardna gre bir fonksiyon en az 31 argman kabul edebilmelidir. Bir fonksiyon tanmlandnda, parametreleri alacak zel deikenlerin bildirimi yaplmaldr. Bu zel deikenler formal parametrelerdir. Parametreler fonksiyonun isminden sonra parantez iinde belirtilirler. rnein, aadaki fonksiyon arld zaman kendisine iletilen iki tam saynn toplamn hesaplar ekrana yazar:
void topla(int a, int b) { printf(%d\n,a+b); }

Bu fonksyonun bir programda arlmasna dair bir rnek:


void topla(int a, int b); main() { topla(1,10); topla(15,6); topla(100,25); } void topla(int a, int b) { printf(%d\n,a+b); } //Fonksiyon prototipi

topla() arldnda derleyici her bir argmann deerini a ve b deikenlerine kopyalayacaktr. Unutmamak gerekir ki fonksiyona iletilen deerlere (1,10,15,6,100,25) argman, a ve b deikenlerine formal parametre ad verilmektedir.
PICPROJE EK B EV R GRUBU

40

www.picproje.org

Fonksiyonlara argmanlar iki ekilde iletilebilir. lk yola deerle arma denilmektedir. Bu metod, argmanlarn deerini fonksiyonun formal parametrelerine kopyalar. Formal parametrede yaplan herhangi bir deiiklik argman deerini etkilemez. kinci metodun ad referans ile armadr. Bu metotta argmann adresi fonksiyondaki formal parametreye kopyalanr. Bu fonksiyon iinde formal parametre, arld yerdeki gerek deikene eriim iin kullanlr. Bu, formal parametre kullanlarak deikenin deerinin deitirilebilecei anlamna gelmektedir. Bunu iaretiler konusunda ayrntl olarak inceleyeceiz. imdilik, fonksiyonlara argmanlarn iletilmesinde sadece deerle arma yntemini kullanacaz. ALITIRMALAR: 1. Bir tam say deeri alan ve bunu ekrana yazdran fonksiyonu yazn. 2. Bu programda yanl olan ne?
yazdir(int sayi) { printf(%d\n,sayi); } main() { yazdir(156.7); }

3.5 Deer Dndrmek iin Fonksiyonlarn Kullanm


C dilinde herhangi bir fonksiyon arld yere bir deer dndrebilir. Tipik olarak, fonksiyon eittir (=) iaretinin sa tarafna konulur. Dndrlen deerin illa bir atama deyiminde kullanlmas gerekmez, ayrca bir printf() ifadesinde de kullanlabilir. Derleyiciye fonksiyonun bir deer dndreceini belirtmek iin kullanlan genel biim:
tip fonksiyon_ismi(formal parametreler) { <ifadeler> return deger; }

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;

PICPROJE EK B EV R GRUBU

41

www.picproje.org

sonuc = sqrt(16.0); printf(%f\n,sonuc); }

Bu program kayar noktal say deeri dndren sqrt() fonksiyonunu armaktadr. Bu say deeri sonuc deikenine atanmaktadr. math.h balk dosyasnn kullanldna dikkat edin. Bu dosya saylarn karekkn alan sqrt() fonksiyonu hakkndaki bilgileri tamaktadr. Fonksiyonun dndrecei deerin veri tipi ile bu dndrlen deerin atanaca deikenin veri tipinin ayn olmasna dikkat etmelisiniz. Ayn ey fonksiyona gndereceiniz argmanlar iin de geerli. yleyse, bir fonksiyondan nasl deer dndreceiz? Genel biim u ekildedir:
return degisken_ismi;

degisken_ismi bir sabit, deiken veya dndrlen deerin veri tipindeki herhangi geerli bir C ifadesi olabilir. Aadaki rnekte her iki tipte fonksiyona ait rnek vardr:
fonk(); topla(int a, int b); main() { int sayi; sayi = fonk(); printf(%d\n, sayi); sayi = topla(5,127); printf(%d\n,sayi); } fonk(){return 6;} topla(int a, int b) { int sonuc; sonuc= a + b; return sonuc; }

Dikkat edilmesi gereken bir nokta, return ifadesine gelindiinde fonksiyonun arld yere dnlddr. return ifadesinden sonraki ifadeler iletilmeyecektir. Bir fonksiyonun dndrd deerin bir deikene aktarlmas veya bir ifadede kullanlmas her zaman gerekli deildir. Ancak bu durumda dndrlen deer kaybolacaktr. ALITIRMALAR: 1. 1 ve 100 arasnda tam say deerlerini kabul eden ve bu saynn karekkn dndren fonksiyonu yaznz. 2. Bu fonksiyonda yanl olan ne?
main() { double sonuc; sonuc = f1();

PICPROJE EK B EV R GRUBU

42

www.picproje.org

printf(%f\n,sonuc); } int f1() { return 60; }

3.6 Klasik ve Modern Fonksiyon Bildirimleri


Cnin orijinal versiyonunda formal parametrelerin bildirimlerinde farkl bir metod kullanlmtr. Aada gsterilen bu biim, imdi klasik biim olarak adlandrlyor.
tip tip tip . tip { } function_name(deg1,deg2,...degn) deg1; deg2; degn; <ifadeler>

Bildirimin iki blmden olutuuna dikkat edin. Parantez iinde yalnzca parametrelerin isimleri bulunmaktadr. Parantezlerin dnda veri tipleri ve formal parametrelerin isimleri belirtilmitir. nceki rnekte inceledeimiz modern biim ise u ekildedir:
tip fonksiyon_ismi(tip deg 1,...tip var n)

Bu fonksiyon bildiriminde, veri tipleri ve formal parametre isimleri parantez iinde belirtilmitir. ANSI C standard her iki fonksiyon bildirimine de izin vermektedir. Buradaki ama, milyarlarca satr olan eski C programlaryla uyumluluu salamaktr. Eer bir kodda klasik biimi grrseniz endielenmeyin: C derleyiciniz bu durumla baa kabilmelidir. Ancak yeni programlarnzda modern biimi tercih etmelisiniz. ALITIRMALAR: 1. Fonksiyon prototipi nedir ve bunu kullanmann faydalar nelerdir? 2. Aadaki program klasik fonksiyon biimini kullanarak, modern biime evirin.
void main(void) { printf(alan = %d\n, alan(10,15)); } alan(1,w) int 1,w { return 1*w; }

PICPROJE EK B EV R GRUBU

43

www.picproje.org

3.7 Dizge(string) Sabitlerin Fonksiyonlara letilmesi


PICmicro Mikrodenetleyicileri ROM eriiminde baz kstlamalara sahip olduundan, dizge(string) sabitleri fonksiyonlara normal yoldan iletilemezler. CCS C derleyicisi bu sorunu standart d bir ekilde amaktadr: Eer dizge sabiti sadece bir karakter parametresine sahip fonksiyona iletilecekse, dizgedeki her bir karakter iin ayr ayr arlr. rnein:
void lcd_yaz(char c) { ..... } lcd_yaz(abcd);

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

PICPROJE EK B EV R GRUBU

44

www.picproje.org

Artrma ve Azaltma Operatrleri Opertrlerin ncelik Sralamas

4.1 Aritmetik Operatrler


C dili toplama, karma, arpma, blme ve mod ilemi olmak zere 5 aritmetik ilem operatr tanmlar:
+ * / % toplama karma arpma blme kalan

+, -, * ve / operatrleri herhangi bir veri tipiyle kullanlabilir. %, operatr yalnzca tamsaylarla birlikte kullanlabilir. Kalan operatr tamsayl blmede kalan verir. Dolaysyla bu operatr kayar noktal say ilemlerinde anlam ifade etmez. Operatr iki ekilde kullanlabilir: karma operatr olarak ve ikinci olarak da bir saynn iaretini deitirmek iin kullanlabilir. Aadaki rneklerde bu iki kullanm gsteriliyor:
a a = = a b ;karma -a ;ann iaretinin deitirilmesi

Aritmetik operatrler her hangi bir sabit kombinasyonu ve/veya deikenlerle kullanlabilir. rnein, aadaki geerli bir C ifadesidir:
sonuc = sayac 163;

C ayrca aritmetik ilem operatrlerinin kullanmyla ilgili baz ksayollarn kullanmna olanak verir. nceki rneklerdeki, a = a b; ifadesi a -=b; eklinde de yazlabilir. Bu metod +, -, *, ve / operatrleri iin de geerlidir. Aada bu ksa yollarla ilgili rnekler grlmektedir:
a*=b a/=b a+=b a-=b a%=b a<<=b a>>=b a&=b a|=b a^=b edeerdir 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

C kodunu ve derlenmi assembly kodunu karlatrarak aritmetik ilemlerin PIC ile nasl gerekletirildiini grelim:
int a,b,c;

PICPROJE EK B EV R GRUBU

45

www.picproje.org

a = b + c;

ifadeleri u ekle dnr:


0007: 0008: 0009: a = b - c; MOVF ADDWF MOVWF 0F,W 10,W 0E ; byi ykle ; cyi bye ekle ;sonucu aya kaydet

ifadeleri u ekle dnr:


0007: 0008: 0009: 000A: MOVF MOVWF MOVF SUBWF 0F,W 0E 10,W 0E,F ; ; ; ; byi ykle aya kaydet cyi ykle adan kar

Derleyicinin rettii kodu anlamann nemi problemlerle urarken ortaya kmaktadr. Birok zaman derleyici liste dosyasna bakmak (.LST) birok C hatasnn bulunmasn salar. En ok yaplan hatalardan biri = ve == operatrlerinin kullanmndadr.
a = b;

ifadesi u ekle dnr:


0007: 0008: 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

lk rnekte a bye eitlenmektedir. kinci de ise a nn bye eit olup olmad test edilmektedir. ALITIRMALAR: 1. 5/5, 5/4, 5/3, 5/2, ve 5/1 ilemlerinde kalan hesaplayan program yaznz. 2. Bir yl iindeki saniye saysn hesaplayan program yaznz.

4.2 likisel Operatrler


Cdeki ilikisel operatrler iki deeri karlatrr ve sonuta doru ya da yanl gibi bir sonu dndrr. likisel operatrler unlardr:

PICPROJE EK B EV R GRUBU

46

www.picproje.org

> >= < <= == !=

byktr byktr ya da eittir kktr kk ya da eittir eittir eit deildir

likisel opetarlerde dndrlen sonu her zaman ya 0 ya da 1dir. Ancak C her hangi sfr-olmayan bir deeri doru (1) olarak deerlendirir. Yanl deer her zaman 0 olarak tanmldr. Aada ilikisel operatrlerin kullanld baz ifadeler grlmektedir.
sayi > 15 ; eer sayi 15e eit ya da 15ten kkse sonu 0dr. (yanl) sayi != 15; eer sayi 15ten byk ya da 15ten kkse sonu 1dir. (doru)

ALITIRMALAR: 1. Aadaki ifadeyi farkl bir ilikisel operatr kullanara yeniden yazn!
sayac != 0

2. Aadaki ifade ne zaman doru ya da yanltr? Neden?


sayac>= 35

4.3 Mantksal Operatrler


Mantksal operatrler VE(AND),VEYA(OR) ve DE L(NOT) gibi temel lojik ilemleri desteklerler. Bu operatrler de sonu olarak yanl iin 0, doru iin 1 deerini dndrrler. Lojik operatrler ve doruluk tablolar aada verilmitir.
p 0 0 1 1 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

Mantksal ve ilikisel operatrler birarada kullanlarak ifadeler oluturulabilir. Buna bir rnek verecek olursak:
sayac>maks || !(maks==57) && deg>=0

Cde ilikisel ve mantksal operatrlerin program kontrol ifadelerinde kullanmn bir sonraki blmde greceiz. ALITIRMALAR: 1. Aadaki ifadeleri herhangi ilikisel ve mantksal operatr bileimlerini kullanarak yeniden yazn.
sayac == 0 sonuc <= 5

PICPROJE EK B EV R GRUBU

47

www.picproje.org

2. C de zel VEYA (XOR) ilemi iin bir operatr bulunmadndan, aadaki doruluk tablosuna gre bir XOR fonksiyonu yazn.
p 0 0 1 1 q 0 1 0 1 XOR 0 1 1 0

4.4 Bit lem Operatrleri


Cde bitler zerinde ilem yapabilmek zere 6 zel operatr bulunmaktadr. Bu operatrler yalnzca tamsay ve karakter veri tipleriyle birlikte kullanlabilirler. Bit ilem operatleri:
& | ^ ~ >> << bit ilem AND bit ilem OR bit ilem XOR 1e tmleyeni saa kaydrma sola kaydrma

Kaydrma operatrlerinin genel kullanm biimi:


degisken<< ifade degisken >> ifade

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 M Bnin alma sisteminden dolay aritmetik ilemlerden daha hzldrlar. Aada btn bit ilem operatrlerine ilikin rnekler verilmitir:

&

AND 00000101 00000110 - - - - 00000100

(5) (6) - - - - - - - (4)

OR 00000101 (5) 00000110 (6) - - - - - - - - - - - - - 00000111 (7) NOT (1e tmleme) 00000101 (5) - - - - - - - - - - - - - 11111010 (250)

XOR 00000101 (5) ^ 00000110 (6) - - - - - - - - - - - - - - - 00000011 (3)

PICPROJE EK B EV R GRUBU

48

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: a = b & c; MOVF 0F,W IORWF 10,W MOVWF 0E ; byi ykle ; c ile veya ilemine sok ; sonucu aya kaydet

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: j = ~a; 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

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.

4.5 Artrma ve Azaltma Operatrleri


Bir deikenin deerini nasl bir arttrr veya azaltrsnz? Muhtemelen aklnza u ifadeler gelmektedir:

PICPROJE EK B EV R GRUBU

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

++a; --a;

artrma iin azaltma iin

++ veya -- iaretleri deikenlerin nnde yer aldnda, deikenin deeri nce bir artrlr veya azaltlr ardndan ifadede kullanlr. ++ veya -- iaretleri deikenlerin sonunda yer aldnda ise, deikenin deeri nce ifadede kullanlr ardndan bir artrlr veya azaltlr.
int j, a = 3; 0007: 0008: j = ++a; 0009: 000A: 000B: j = a++; 000C: 000D: 000E: MOVLW 03 MOVWF 0F INCF 0F,F MOVF 0F,W MOVWF 0E MOVF 0F,W INCF 0F,F MOVWF 0E ; ; ; ; ; ; ; ann deeri yazmaca atand a = 4 ann deerini w yazmacna ykle w yazmacn jye kaydet ann deerini w yazmacna ykle a = 5 j = 4

NOT: Aadaki biimi kullanmayn:


a = a++;

nk bu kod u ekle dntrlr:


MOVF INCF MOVWF 0E 0E,W 0E,F ; ann deeri wye yklendi ; adaki deer 1 artrld ; artmdan nceki deer tekrar adaki deerin ; zerine yklendi

Aadaki rnekte her iki kullanm biimi de gsterilmektedir:


void main(void) { int i,j; i = 10; j = i++; printf(i = %d, j = %d\n,i,j); i = 10; j = ++i; printf(i = %d, j = %d\n,i,j); }

PICPROJE EK B EV R GRUBU

50

www.picproje.org

lk printf() ifadesi i iin 11 ve j iin 10 yazdracaktr. kinci printf() ifadesi ise i ve j iin 11 yazdracaktr.

Paralar Birletirmek:
Yazl
toplam toplam toplam toplam = = = = a+b++ a+b-a+ ++b a+ -- b

lem
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;

4.6 Operatrlerin ncelik Sralamas


ncelik, operatlerin C derleyicisi tarafndan ilenme sralamasn belirtmektedir. rnein, programnzda a+b*c ifadesi ile karlaldnda hangi ilem ilk olarak gerekletirilecektir? Toplama m arpma m? Aada C derleyicisinin operatrler iin takip ettii ncelik sralamas grlmektedir:
ncelik 1 2 3 4 5 6 Operatr () ++ -sizeof & * + - ~ ! ++ -* / % + << >> < > <= >= rnek (a+b)/c parantez a=-b art/eksi/DE L/tmleme artrma/azaltma/sizeof a%b arpma/blme/elde a+b toplama/karma a=b>>c sola veya saa kayrma a>=b byk/kk/eit

PICPROJE EK B EV R GRUBU

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

Bu operatrlerin bir ksmn henz grmedik. Ancak endielenmeyin ileriki blmlerde greceiz. Parantez kullanlarak ilemlerin sralamas belirtilebilir. Parantez kullanarak ifadelerin nceliinin deitirilmesine dair birka rnek daha:
10-2*5 = 0 (10-2)*5 = 40 sayac*toplam+88/deg-19%sayac (sayac*toplam) + (88/deg) (19%sayac)

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;

Program kontrol deyimleri

Bu blmde Cde programnzn akn kontrol etmeyi reneceksiniz. Ayrca ilikisel ve mantksal kontrol operatrlerinin bu kontrol deyimleriyle nasl kullanlacan ve buna ek olarak nasl kontrol dngleri kurulacan reneceksiniz. Bu blm ierisinde ele alnacak kontrol deyimleri :
if if-else for while do-while iie dngler break continue switch null return

5.1

if deyimi

PICPROJE EK B EV R GRUBU

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; NOT: ifadeden sonra ; kullanlmaz.

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);

Bu rnek, ilikisel operatrlerin program kontrol deyimleriyle nasl kullanldn gsterir. f deyimi ayrca kod bloklarnn altrlmasnn kontrolnde de kullanlabilir. Genel format yledir :
if (ifade) { . deyim; . }

Kod blou { ve } sembollerinin ierisine yerletirilir. Bu, derleyiciye, ifade doru ise parantezler arasndaki kodlarn altrlacan anlatr. if ve kod blouna bir rnek :
if (count <0 ) { count =0; printf(Count down\n); }

veya
if(TestMode ==1) { ... yazdrlacak kodlar... }

if deyiminde kullanlan dier karlatrma operatrleri :


x x x x x x x x == 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

Herhangi bir fonskiyonun assembly diline evirilmi bir rnei :

PICPROJE EK B EV R GRUBU

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

;eer sfr ise ;jye ay ykle

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

Eer ifadenin sonucuna gre altrlacak iki kod blounuz varsa ne yapardnz? Eer ifade doru ise ilk kod blou altrlacak, eer ifade yanl ise ikinci kod blou altrlacak. Muhtemelen if deyimi ile else deyimini birlikte kullanacaktnz. f-else deyiminin genel format yledir :
if (ifade) deyim1; else deyim2;

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 :

PICPROJE EK B EV R GRUBU

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- ;

PICPROJE EK B EV R GRUBU

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

Koul operatr (conditional operator) C dilinin 3 ileneni alan tek operatrdr. (ternary operator) Koul operatrnn 3 ileneni, ifade tanmna uygun herhangi bir ifade olabilir. Koul operatrnn genel yazm aadaki gibidir:
ifade1 ? ifade2 : ifade3

Koul operatr yukardaki biimden de grld gibi birbirinden ayrlm iki iaretten olumaktadr. ? ve : iareteri operatrn 3 ileneni birbirinden ayrr. Derleyici bir koul operatr ile karlatn ? iaretinden anlar ve ? iaretinin solundaki ifadenin (ifade1) saysal deerini hesaplar. Eer ifade1in deeri 0 d bir saysal deerse, bu durum koul operatr tarafndan doru olarak deerlendirilir ve bu durumda yalnzca ifade2nin saysal deeri hesaplanr. Eer ifade1in deeri 0 ise bu durum koul operatr tarafndan yanl olarak deerlendirilir ve bu durumda yalnzca ifade3n saysal deeri hesaplanr. Dier operatrlerde olduu gibi koul operatr de bir deer retir. Koul operatrnn rettii deer ifade1 doru ise (0 d bir deer ise) ifade2nin deeri, ifade1 yanl ise ifade3n deeridir. rnek:
m = x > 3 ? y + 5 : y 5;

Burada nce x > 3 ifadesinin saysal deeri hesaplanacaktr. Bu ifade 0 d bir deerse (yani doru ise) koul operatr y + 5 deerini retecektir. x > 3 ifadesinin deeri 0 ise (yani yanl ise) koul operatr y 5 deerini retecektir. Bu durumda m deikenine x > 3 ifadesinin doru ya da yanl olmasna gre y + 5 ya da y 5 deeri atanacaktr. Ayn ilem if deyimi ile de yaplabilir :
if (x > 3) m = y + 5; else m = y 5;

Koul operatr Operatr ncelik Tablosunun 13. ncelik seviyesindedir. Bu seviye atama operatrnn hemen stdr. Aadaki ifadeyi ele alalm:
x > 3 ? y + 5 : y 5 = m;

PICPROJE EK B EV R GRUBU

56

www.picproje.org

Koul operatrnn ncelii atama operatrnden daha yksek olduu iin, nce koul operatr ele alnr. x > 3 ifadesinin DORU olduunu ve operatrn y + 5 deerini rettiini dnelim. Toplam ifadenin deerlendirilmesinde kalan ifade
y + 5 = m

olacak ve bu da derleme zaman hatasna yol aacaktr. nk y + 5 ifadesi sol taraf deeri deildir, nesne gstermez. (Lvalue required hatas verecektir). Koul operatrnn birinci ksmn (ifade1) parantez iine almak gerekmez. Ancak, okunabilirlik asndan genellikle parantez iine alnmas tercih edilir.
(x >= y + 3) ? a * a : b;

Koul operatrnn nc operand (ifade3) konusunda dikkatli olmak gerekir. rnein :


m = a > b ? 20 : 50 + 5;

a > b ifadesinin doru olup olmamasna gre koul operatr 20 ya da 55 deerini retecek ve son olarak da m deikenine koul operatrnn rettii deer atanacaktr. Ancak m deikenine a > b ? 20 : 50 ifadesinin deerinin 5 fazlas atanmak isteniyorsa bu durumda ifade aadaki gibi dzenlenmelidir:
m = (a > b ? 20 : 50) + 5;

Koul operatrnn 3 ileneni de bir fonksiyon arma ifadesi olabilir, ama arlan fonksiyonlarn geri dn deeri reten fonksiyonlar olmas (void olmayan) gerekmektedir. ilenenden biri geri dn deeri void olan bir fonksiyona ilikin fonksiyon arma ifadesi olursa koul operatr deer retmeyeceinden bu durum derleme zamannda hata olumasna neden olacaktr.

5.4

for dngs

For dngleri yalnzca C dilinin deil, belki de tm programlama dillerinin en gl dng yaplardr. for dnglerinin genel biimi u ekildedir:
for (ifade1; ifade2; ifade3) deyim1; for (ifade1; ifade2; ifade3) { deyim1; deyim2; ... }

Derleyici for anahtar szcnden sonra bir parantez almasn ve parantez ierisinde iki noktal virgl bulunmasn bekler. Bu iki noktal virgl for parantezini

PICPROJE EK B EV R GRUBU

57

www.picproje.org

ksma ayrr. Bu ksmlar yukarda ifade1 ifade2 ve ifade 3 olarak gsterilmitir. for parantezi iinde mutlaka 2 noktal virgl bulunmaldr. for parantezi iinin bo braklmas, ya da for parantezi ierisinde 1, 3 ya da daha fazla noktal virgln bulunmas derleme zamannda hata olumasna yol aacaktr. for parantezinin kapanmasndan sonra gelen ilk deyim dng gvdesini oluturur. Dng gvdesi basit bir deyimden oluabilecei gibi, bileik deyimden de yani blok iine alnm birden fazla deyimden de oluabilir. Dng gndesi tek bir ifadeden oluacaksa ifadenin { } arasna alnmasna gerek yoktur. for parantezi ierisindeki her ksmn da ayr ayr ilevleri vardr. for parantezinin 2. ksmn oluturan ifadeye kontrol ifadesi denir. Tpk while parantezi iindeki ifade gibi, dngnn devam konusunda bu ifade sz sahibidir. Bu ifadenin deeri 0 d bir deer ise, yani mantksal olarak doru ise, dng devam eder. Dng gvdesindeki deyim(ler) icra edilir. Kontrol ifadesinin deeri 0 ise programn ak for dngsnn dndaki ilk deyimle devam edecektir. for dngsnn 3. ksm dng gvdesindeki deyim ya da deyimler icra edildikten sonra, dnte altrlr. Ve ounlukla dng deikeninin artrlmas ya da azaltlmas amacyla kullanlr. (Byle bir zorunluluk yok.)
for (ilk deer; koul; ilem) { ... ... ... } int main() { int i; for (i = 0; i < 2; ++i) printf(%d\n, i); printf(son deer = %d\n, i); return 0; }

Yukardaki program inceleyelim: Programn ak for deyimine gelince, nce for parantezi iindeki 1. ifade icra ediliyor. Yani i dng deikenine 0 deeri atanyor. imdi programn ak for parantezinin 2. ksmna yani kontrol ifadesine geliyor ve i < 2 koulu sorgulanyor. Kontrol ifadesinin deeri 0 d bir deer olduu iin, ifade mantksal olarak doru kabul ediliyor ve programn ak dng gvdesine geiyor. Dng gvdesi bloklanmad iin, dng gvdesinde tek

PICPROJE EK B EV R GRUBU

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++)

Bir rnei assemblye dntrp nasl olacan grelim :


int h,a; for (h=0;h!=10;h++) 0007: CLRF 0E 0008: MOVLW 0A 0009: SUBWF 0E,W 000A: BTFSC 03,2 000B: GOTO 00F a++; 000C: INCF 0F,F h++; 000D: INCF 0E,F 000E: GOTO 008

;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++)

PICPROJE EK B EV R GRUBU

59

www.picproje.org

2.

Saynn tm arpanlarn grntleyen bir program yaznz.

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); }

Klavyeden istenilen karakteri alnca uyarlacaksnz. yleyse ifade deerlendirildi. chnin deeri q olmad srece program klavyeden baka bir deer almaya devam edecektir. lk q alndnda prinf altrlr ve program sonlanr. Altrmalar : 1. Aadaki while deyimleri nasl iler? a.
while(i<10) { printf(%d ,i); i++; } while(1) printf(%d ,i++);

b.

PICPROJE EK B EV R GRUBU

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

Cdeki son dng do dngsdr. Burada do ve while birletiriyoruz :


do { deyimler } while(ifade)

Bu ekilde herzaman deyimler, ifade deerlendirilmeden nce icra edilecektir. ifade belki geerli bir C ifadesidir. do-while iin basit bir rnek :
#include <16C74.H> #use RS232 (Baud=9600, xmit-pin_c6, RCV=pin_c7) void main(void) { char ch; do { ch = getch(); while(ch != q); printf(iste q!\n); } }

Bu program 5.5inci ksmdaki program ile ayn ii yapmaktadr. Altrmalar : 1. 5.5inci ksmdaki Altrma 1in hem a hemde b ksmn do-while kullanarak tekrar yaznz. 2. 5.5inci ksmdaki Altrma 2yi do-while kullanarak tekrar yaznz.

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; }

PICPROJE EK B EV R GRUBU

61

www.picproje.org

} ++i; return 0; }

ie dnglerde ierideki dngde break deyimi kullanldnda yalnzca ierideki dngden klr, her iki dngden birden kmak iin goto deyimi kullanlmaldr. (ileride greceiz) while dngs bir btn olarak tek deyim iinde ele alnr. rnek:
while (1) while (1) { ..... ..... ..... }

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; }

/* burada bir bo deyim var */

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

Break anahtar szc ile bir dng sonlandrlabilir. Kullanm break;

PICPROJE EK B EV R GRUBU

62

www.picproje.org

eklindedir. Programn ak break anahtar szcn grdnde, dng krlarak dngnn ak dng gvdesi dndaki ilk deyim ile devam eder. Yani koulsuz olarak dngden klr.
void main(void) { int i; for(i=0;i<50;i++) { printf(%d ,i); if(i==15) break; } }

Bu program ekrana 0-15 aras saylar yazar. Break deyimi tm C dnglerinde alr.

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; }

break anahtar szc bir dngy sonlandrmak iin, continue anahtar szc de bir dngnn o anda iinde bulunulan yinelemesini sonlandrmak iin kullanlr. continue anahtar szc zellikle, dng ierisinde uzun if deyimlerini varsa, okunabilirlii artrmak amacyla kullanlr.
for (i = 0; i < n; ++i) { ch = getch(); if (!isspace(ch)) { ... ... ... } }

PICPROJE EK B EV R GRUBU

63

www.picproje.org

Yukardaki kod parasnda dng iinde, klavyeden getch fonksiyonu ile deer atanan ch deikeni boluk karakteri deilse, bir takm deyimlerin icras istenmi. Yukardaki durum continue anahtar szcyle daha okunabilir hale getirilebilir :
for (i = 0; i < n; ++i) { ch = getch(); if (isspace(ch)) continue; ... }

n kere dnen for deyimi kalplar


for for for for (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.

5.10 Sonsuz dnglerden k


1. break anahtar szc ile. Bu durumda programn ak dng gvdesi dndaki ilk deyime ynlenecektir. (eer i ie dng varsa break anahtar szc ile yalnzca iteki dngden klacaktr.) 2. return anahtar szc ile bu durumda fonksiyonun (main de olabilir) icras sona erecektir. 3. goto anahtar szcyle. ie birden fazla dng varsa en iteki dng iinden en dtaki dngnn dna kadar kabiliriz. (goto anahtar szcnn ok az saydaki faydal kullanmndan biri budur.) 4. exit fonksiyonu ile.

5.11 Switch deyimi if deyimi birka seenek arasndan seim yapmak iin iyi bir deyimdir, fakat
ortada birka seenek var iken ok biimsiz durmaktadr. switch deyimi birka if-else deyimi ile ayn anlamdadr. Genel hali u ekildedir :
switch (degisken) { case sabit1: deyim(ler); break; case sabit2:

PICPROJE EK B EV R GRUBU

64

www.picproje.org

deyim(ler); break; case sabitN: deyim(ler); break; default: deyim(ler); }

Degisken, integer veya karakter sabitlerinin listesi iinde srayla test edilmektedir. Bir e deere rastland zaman, bu sabite ait deyimlerin btn break; szcne rastlanana kadar icra edilir. Eer hi bir e deere rastlanamadysa default blm altndaki deyimler icra edilir. Default blm istee bal olarak kullanlabilir. Switche bir rnek :
main() { char ch; for(;;) { ch = getch(); if(ch==x) return 0; switch(ch) { case 0: printf(Pazar\n); break; case 1: printf(Pazartesi\n); break; case 2: printf(Sal\n); break; case 3: printf(aramba\n); break; case 4: printf(Perembe\n); break; case 5: printf(Cuma\n); break; case 6: printf(Cumartesi\n); break; default: printf(Geersiz giri\n); } } }

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

PICPROJE EK B EV R GRUBU

65

www.picproje.org

sonra dier bitlerinden ayrtrlr (maskeleme) ve bu bilgi ile fonksiyonun arld yere uygun bir deer dndrlr.
byte cp1_sw_get() //characters per line { byte cp1; cp1=portd & 0b01110000; //maskele switch(cp1) //imdi decode edilmi veriyi ile { case 0x00: cp1 = 8; break; case 0x10: cp1 = 16; break; case 0x20: cp1 = 20; break; case 0x30: cp1 = 28; break; default: cp1 = 40; break; } return(cp1); //arldn yere veri dndr }

ANSI Standartlarndaki bir C derleyicisi en az 257 case deyimini desteklemelidir. Ayn switch iinde ayn iki tane case deeri olamaz. Ayrca, switch deyimleri iie de olabilirler. Bir ANSI derleyicisi en az 15 iie switch deyimini desteklemelidir. Aada iie bir switch rnei bulunmaktadr :
switch (a) { case 1: switch (b) { case 0: printf(b yanl); break; case 1: printf(b doru); break; } break; case 2: . .

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: // *

PICPROJE EK B EV R GRUBU

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?); } }

Yukardaki programckta * iaretli ksmda break szc olmad iin programda karma seildiinde, program b=-b yaptktan sonra bir alttaki case blm olan toplama blmne geecektir.

5.12 Null deyimi


null deyimi sadece bir noktal virglden (;) oluur. Bir ifadenin bulunabilecei her hangi bir yerde bulunabilir. Assembly programlarnda bir komut evrimi beklemeye neden olan nop deyimi gibi null ifadesi iletildiinde hi bir ilem yaplmaz. do, for, if ve while ifadelerin, ifade gvdelerinde, herhangi bir iletilebilir ifadenin bulunmas gerekir. null ifadesi bu durumlarda gerekli yazm gerekletirir.
for (i=0;i<10;i++) ;

Bu rnekte for line[i++]=0 dng ifadesi line dizisinin 10 elemann sfrlar. fade gvdesi null olduundan ilave komutlara ihtiya yoktur.

5.13 return deyimi


return ifadesi bir fonksiyonun almasn sonlandrr ve program en son fonksiyonun arld yere dnerek almasna devam eder. Fonksiyonlardan bir deer dndrlebilir. Deer dndrlmeyecekse fonksiyon prototipinde fonksiyonun dndrecei deer void olarak tanmlanr.
GetValue(c) int c; { c++; return c; } void GetNothing(c) int c; {

PICPROJE EK B EV R GRUBU

67

www.picproje.org

c++; return; } main() { int x; x = GetValue(); GetNothing(); }

6.

Diziler ve harf dizileri

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];

Type geerli bir C verisidir, deiken_ismi dizinin ismi ve adette dizide ka eleman olacan belirtir. rnein 50 eleman olan bir dizi aadaki gibi ifade edilmelidir.
int ykseklik [50] ;

Bir dizi belirtildii zaman, C ilk elemann 0 nc indiste (srada) olduunu varsayar. Eer dizinin 50 eleman varsa en sondaki elemann indisi 49 dur. Yukardaki rnei kullanarak diyelim ki ykseklik dizisinin 25 inci elemanna 60 deeri atanmtr. Aadaki rnekte bunun nasl yaplaca gsterilmitir.
ykseklik[24] = 60 ;

PICPROJE EK B EV R GRUBU

68

www.picproje.org

C tek boyutlu dizileri boluksuz olarak hafza konumlarna yerletirir. lk eleman en dk adrestedir. Aadaki kodu altrdmz zaman ..
int num[10]; int i; for (i=0;i<10;i++) num[i] = i;

dizinin hafzadaki grnts aadaki gibi olacaktr. Eleman 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?

PICPROJE EK B EV R GRUBU

69

www.picproje.org

int i; char count [10]; for(i = 0;i < 100;i++) count[i] = getch ( ) ;

2. getch() fonksiyonunu kulanarak klavyeden girilen ilk 10 karakteri okuyabilecek bir program yazn. Bu program bu karakterlerden uyan kt zaman bir uyarda bulunsun. 6.2 Harf dizileri En ok rastlanlan tek boyutlu diziler harf dizileridir. C dilinde harf dizisi ile ilgili bir veri ekli yoktur. Onun yerine tek boyutlu karakter dizilerini kullanr. Bir harf dizini 0 (sfr) olarak gsterilir. Eer her harf dizini sfr ile sonlandrlacaksa, diziyi bir fazlas eleman ile tanmlamak gerekmektedir. Bu fazla eleman ierii sfr olacaktr. C dilindeki btn harf dizi sabitleri otomatik olarak sfr ile sonlandrlr. Klavyeyi kullanarak programdaki bir harf dizisine nasl giri yapabiliriz? gets(str) fonksiyonu satr ba dmesine baslana kadar klavyeden baslan karakterleri okur. Okunan karakter dizisi tanmlanan str dizisine kaydedilir. Str dizisinin uzunluunun girilen karakter saysndan dizinin sfrla sonlandrlacandan en az bir fazla olmas gerekmektedir. Gets() fonksiyonun nasl kullanlacan bir rnekle gsterelim.
void main ( void ) { char star[80] ; int i ; printf(Bir cumle gir ( < 80 karakter) :\n); gets(str); for(i=0;str[i];i++) printf (%c,str[i]); printf(\n%s,str); }

Burda harf dizisinin nasl baslacan iki ekilde grmekteyiz : %c yi kullanarak karakter dizisi eklinde yada %s yi kullanarak harf dizisi eklinde. ALITIRMA: 1.Bu programdaki hata nerde? Strcpy() fonksiyonu ikinci argmenti birinciye kopyalyor.
#include <string.h> void main ( void ) { char str [16] ; strcpy (str,PicProje nerede?); printf (str) ; }

2.

Ekrandaki harfleri okuyan vede bunlar ekrana ters srada yazabilen bir

PICPROJE EK B EV R GRUBU

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]; //25 hafza yeri

Ek boyutlar basite keli parantez setini ekliyerek oaltabiliriz. Biz burda basitlik olsun diye iki boyutlu dizileri konuacaz. ki boyutlu dizi en iyi satr stun eklinde anlatlabilir. Bunun iin iki boyutlu diziler soldan saa ksa zamanda ulalabilir. zleyen rnekte 5x5 dizinin grafiksel gsterimini gsterir. ki boyutlu diziler tek boyutlu diziler gibi kullanlabilir. rnein aadaki program 5x4 lk diziyi indislerin arpm ile doldurur sonrada dizi ieriini stun satr eklinde gsterir.
void main ( void ) { int array [5] [4] ; int i , j ; for ( i = 0 ; i < 5 ; i++ ) for ( j = 0 ; j < 4 ; j++ ) array [i] [j] = i * j ; for ( i = 0 ; i < 5 ; i++) { for (j = 0 ; j < 4 ; j++ ) printf (%d , array [i] [j] ) ; printf (\n); } }

Programn kts bu ekilde olmaldr:


0 0 0 0 0 0 1 2 3 4 0 2 4 6 8 0 3 6 9 12

Grdnz gibi, ok boyutlu dizileri kullandnzda bamsz deikenlerin says artmaktadr. Gnmzde kullanlan PIC MCU larn hafzalar olduka genitir. ALITIRMA: 1. 3x3x3 lk bir diziyi tanmlayan vede 1 den 27 e kadar olan saylar bu diziyi atayan bir program yazn. Ekrana da kty yazdrn. 2. Birinci program kullanarak her stunun vede satrn toplamnn ktsn aln.

PICPROJE EK B EV R GRUBU

71

www.picproje.org

6.4 Dizileri hazrlama imdiye kadar bamsz dizi elemanlarna deerler atanm olarak grdk. C dili dizilere bir deikenmi gibi deer atanmasna imkan verecek metoda sahiptir. Tek boyutlu dizilerin genel ekli aadaki gibidir.
type dizi_ismi[adet] = {deer_listesi};

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;

Kuyruklu parantezlerle harf dizinini kapatmadmz dikkatinizi ekmitir. Bu tip hazrlamada bunlar kullanlmaz nk C dilinde harf dizinleri sfrla bitmek zorundadr. Derleyici Veli nin sonuna otomatikman bir sfr ekler. ok boyutlu diziler tek boyutlu diziler gibi hazrlanr. ki boyutlu dizileri hazrlarken stun satr eklinde hazrlanmas daha kolaydr. zleyen rnekde 3x3 dizinin hazrlanmasn gsterelim.
nt num[3][3]={1,2,3, 4,5,6, 7,8,9};

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.

PICPROJE EK B EV R GRUBU

72

www.picproje.org

Scanf(%d,&num);

rutinini kullanarak kulancdan say girmesini isteyin. Sonrada bu saynn, karesinin ve kbnn ktsn aln. 6.5 Katar ( harf dizileri ) dizileri

Katar dizinleri C dilinde ok rastlanr. teki diziler gibi tanmlanr ve hazrlanr. Kullanma ekilleri dier dizilere gre biraz daha deiiktir. rnein, izleyen tanmlama ne ifade eder?
char isim[10][40];

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]);

ki boyutdan byk diziler iinde aynsn yapmalsnz. rnein hayvanlar dizisi aadaki gibi tanmlandrlmaldr.
char hayvanlar[5][4][80];

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);

PICPROJE EK B EV R GRUBU

73

www.picproje.org

strcpy(s2,def); strcat(s1,s2); printf(%u,strlen(s1)); printf(s1);

// kan kt 6 dr // kan kt abcdef dir

if (strcmp(s1,s2)!=0)printf( Ayns deildir);

Dier harf dizin fonksiyonlar aadadr:


strcat strchr strrchr strcmp strncmp stricmp strncpy strlen strlwr strpbrk strstr ki harf dizisini birletirir lk karaktere bakar Son karaktere bakar ki harf dizisini karlatrr ki dizindeki karakter saysn karlatrr Byk kk harflere dikkat etmeden iki dizini karlatrr Bir dizindeki belli bir saydaki karakterleri teki dizine kopyalar Bir dizinin uzunluunu verir Byk harfleri kk harflerle deitirir ki dizideki ilk uyan karakteri bulur Bir harf dizisindeki ilk belirtilen karakter srasn bulur

Deitirlecek harf dizisindeki byklklerin uymasna dikkat edin.

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

7.1 aretilere giri


Bir iareti, bir hafza blgesinin adresini ierisinde barndran bir hafza blgesi deikenidir. rnein; a deikeni b deikeninin adresini barndryorsa; a, b'yi gsteriyor (iaret ediyor) demektir. Eer b deikeninin hafzadaki bulunduu adres 100 ise, a deikeninin deeri 100 olacaktr. Bir iareti deikeni tanmlamann genel format u ekildedir:
Tip *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 EK B EV R 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.

lk komut 2 deiken tanmlar: integer tipi pointer trndeki a deikeni ve integer tipinde b deikeni. Bir sonraki satr b deikenine 6 deerini ykler. Sonraki satrda ise b deikeninin adresi (&b) a deikenine (iaretisine) yklenir. Bu satr u ekilde okunabilir: a deikenine b deikeninin adresini ykle. Son olarak da b deikeninin deeri *a komutuyla ekranda grntlenir. Bu satr u anlama gelmektedir: a iaretisinde bulunan adresteki deeri yaz. Bu gibi bir deerden referans alnan bilgilere erime ilemine indirection denilir. Bir grsel gsterim ekli yle olabilir:
Adres: deiken: ierik: 100 i 3 102 j 5 104 k -1 106 ptr 102

int i,j,k; int *ptr;

Balangta, i deeri 3 ve &i deeri 100 dr (i deikeninin hafzadaki yeri). ptr iareti deikeni 102 deeri barndrdndan *ptr 102 nolu adresteki deer olan 5 e iaret edecektir yani *ptr 5 olarak deerlendirilecektir.

PICPROJE EK B EV R GRUBU

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.

Bir hafza blgesinde iareti kullanarak deer yazmak ta mmkndr. Mesela bir nceki program byle bir ilem yapabilecek ekilde bir daha yaplandralm:
#include <16c74.h> void main(void) { int *a,b; a=&b; *a=6; printf("%d",b); }

Bu programda, nce a iaretisine b deikeninin adresini yklyoruz. Sonra *a=6 diyerek a iaretisinde bulunan adrese 6 deerini yaz diyoruz. Bu son iki programdaki iaretiler gereksiz yere kullanlmlardr. Burada sadece iareti kullanmna rnek olmas iin verilmilerdir. Altrma: FOR dngsyle 0'dan 9'a kadar sayan ve ekrana saylar iareti kullanarak gsteren bir program yazn. 7.2. aretilerin kullanmyla ilgili kstlamalar Genel olarak iareti tipi deikenler dier tiplerdeki deikenler gibi ilem grebilir. Ancak iaretilere (pointerlara) zg bir ka zel durum ve kstlama vardr. * ve & operatrleine ilaveten pointerlar ile birlikte sadece u drt operatr kullanabilirsiniz: +, ++, -, --. Ayrca iaretilerden yalnzca tamsay (integer) tipi deerleri karabilir veya ekleyebilirsiniz. Bir pointer deeri arttrldnda, bir sonraki hafza birimini gsterir. Mesela P pointerinde 100 numaral hafza biriminin adres deeri olduunu dnelim. areti p eer int16 tipinde tanmlanm ise p++ ifadesinden sonra p pointerinin deeri 102 olacaktr. (int16 tipi veriler hafzada 2 byte yer kapladndan dolay). Eer p bir gerek say (reel say, float) olsayd bu durumda p pointerinin deeri 104 olacakt (nk float tipi veriler 4 byte uzunluundadr). Yalnzca char tipi veriler iin beklenen sonu gelir. Char tipi veriler hafzada 1 byte kapladndan, balangta deeri 100 olan p iaretisinin yeni deeri p++ ileminden sonra 101 olacaktr. Bir iaretiden/ile dilediiniz tamsay deeri kartabilir/toplayabilirsiniz.

PICPROJE EK B EV R GRUBU

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++;

bu sadece p iaretisinde kaytl adresin deerini (o adreste saklanan verinin deil) 1 arttrr. Ancak eer biz iaretideki adreste bulunan bilgiyi bir arttrmak istiyorsak yle yazmalyz:
(*p)++;

Parantez sayesinde iaretiyi deil de iareti iinde bulunan adresteki deeri arttrmak istediimizi belirtmi oluruz. aretiler ilikisel ilemlerde de kullanlabilir. Ancak eer iaretiler birbirleri ile bir ilikidelerse bu ancak anlaml olur aksi takdirde hi bir mana ifade etmez. 18FXXX mikrodenetleyicilerinden nceki PIC Mikrodenetleyicileri iin iaretiler program alanna (ROM'da) oluturulamazlar.
char const name[5] = JOHN; ptr=&name[0];

bu program, const kullanlmadan (yani dizi ROM iinde tanmlanmadnda) geerli bir koddur. 18FXXX ailesinde donanma eklenmi tablo okuma yazma zellikleri ile program alanna iareti atamak mmkn hale getirilmitir. Altrma: u deikenleri tanmlayn ve adreslerini bir pointer tipi deikene yklein. Her bir pointer deikeninin deerini %p kullanarak yazdrn. Sonrasnda her bir pointeri bir arttrn ve ve tekrar yazdrn. Her bir veri tipinin uzunluu ne kadardr sizin makinenizde?
char *cp,ch; int *ip,i; float *fp,f; double *dp,d;

2. Aadaki anlatmda yanllk nerdedir?


int *p,i; p = &i; p = p/2;

PICPROJE EK B EV R GRUBU

77

www.picproje.org

7.3 Pointerlar ve diziler C dilinde, iaretiler ve diziler birbirleri ile ok i iedir. Bu iielik, C dilinin gcn daha da n plana karmaktadr. Bir diziyi indekssiz olarak kullanrsanz, kesinlikle diziye erimek iin bir iareti kullanyorsunuz demektir. Geen blmde bir metnin sadece ismini ieren gets() fonksiyonunu kullanmtk.
nemli not: Bir dizi bir fonksiyona getiinde yalnzca ilk eleman gsteren bir iareti kullanlabilir. Fonksiyona dizi gnderirken 7.2nin en sonunda yaplan aklamay hatrlayn.

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)); }

Bu, kusursuz bir C programdr. printf() komutunda *(p+i) kullandmz fark etmisinizdir. i dizinin indeksidir. Belki aracaksnz ama bir iaretiyi de sanki bir diziymi gibi indeksleyebilirsiniz. u program da geerli bir programdr:
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]); } Hatrlanmas gereken bir nokta vardr ki: bir iareti, ancak bir diziyi gsterdiinde indekslenebilir. Dizileri gsteren iaretiler sadece ilk elemann yerini gsterdiinden, iaretiyi p++ ile arttrmak geersiz bir ilem olacaktr. Dolaysyla nceki programda kullanlacak bir p++; ifadesi geersiz olacaktr. 18FXXX mikrodenetleyicilerinde p[i] deerini otomatik getiren

aretiler ile dizileri kartrmak baz sama sonulara sebep olabilir. Aadaki rnekte sorunu greceksiniz. kinci programda problem dzeltilmitir.

PICPROJE EK B EV R GRUBU

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 01 ;dizinin pozisyonunu ykle 0E,W ;Dizinin balang pozisyonuna ekle 04 ;dizi pointerinin iine ykle 03 ;e ykle 00 ;belirtilen lokasyona sakla

*(array+1) = 4; 000E: 000F: 0010: 0011: MOVLW MOVWF MOVLW MOVWF 10 04 04 00 ;dizi pozisyonuna ykle ;ona iaret et ;4 ykle ;Belirtilen lokasyona kayt et

ALITIRMA: 1. Bu blmdeki kod yazlm doru mudur ?


int count[10]; . count = count+2;

2. Bu segmentteki kod hangi deeri gsterir ?


int value[5]=(5,10,15,20,25); int *p; p = value; printf(%d,*p+3);

PICPROJE EK B EV R GRUBU

79

www.picproje.org

7.4 aretileri Fonksiyonlarda Kullanmak


3. Blmde fonksiyonlar armakla ilgili olarak kullanlabilen iki yntemden bahsettik: Deerle arma ve referansla arma. Birinci yntemi o blmde anlatmtk. kinci yntemde ilenenlerin adresi fonksiyona tanr; bir baka deyile iareti fonksiyondan geer. Bu noktada, iareti kullanarak deiken zerinde yaplan herhangi bir deiiklik, arma rutinindeki deikenin deerini deitirir. aretiler, tpk dier deikenler gibi fonksiyonlarda geer. Aadaki rnek bir harf dizisinin(string) iareti kullanan bir fonksiyona nasl getiini gsterir.
#include <16c74.h> void puts(char *p); void main(void) { puts(Microchip is great!); } void puts(char *p) { while(*p) { printf(%c,*p); p++; } printf(\n); }

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)

PICPROJE EK B EV R GRUBU

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;

PICPROJE EK B EV R GRUBU

81

www.picproje.org

Struct szc derleyiciye bir yapnn tanmlanacan belirtir. Yap iindeki her tip bir veri tipidir. Bu tiplerin birbirleri ile ayn olmas gerekmez. etiket_ad yapnn ismidir. deiken_listesi opsiyoneldir. Yap iindeki paralardan genelde alanlar veya yeler olarak bahsedilir. Biz paralardan ye olarak bahsedeceiz. Genel olarak yap iindeki bilgiler mantksal olarak birbirleriyle ilikilidirler. rnek olarak; Bir yapy tm mterilerinizin isim, adres ve telefon bilgilerini tutmas iin kullanabilirsiniz. Aadaki rnek bir ktphane takip kart iindir.
struct katalog { char yazar[40]; char baslik[40]; char yayinci[40]; unsigned int tarih; unsigned char rev; } kart;

Bu rnekte yapmzn ad katalogdur. katalog herhangi bir deikenin ismi olmayp yalnzca yapmzn ismidir. kart deikeni, katalog tipinin yaps olarak bildirilmitir. Yapnn her hangi bir yesine eriim iin, deikenin ismini ve yenin ismini belirtmeniz gerekir. Bu isimler nokta ile bir birlerinden ayrlmtr. rnek olarak katalog yaps iindeki revision yesine erimek iin, kart. rev=a kullanmalsnz. Burada kart deiken ismi ve revde yesidir. Yapnn yelerine eriim iin operatr kullanlmtr. katalog yapsnn yazar yesini yazdrmak iin unu yazmalsnz;
printf(Yazar is %s\n,kart.yazar);

imdi biz bir yapnn nasl tanmlanacan, bildirileceini ve eriileceini biliyoruz. Peki, katalog yapmzn hafzay kullanm ekli nasldr?
yazar baslik yayinci tarih rev 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.

PICPROJE EK B EV R GRUBU

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];

Eer dizi iindeki yaplara erimek istiyorsanz, yap deikenini indekslemelisiniz. rnein bir yap dizisi olan bigin 10. elemannn baslik yesine nasl eriirdiniz? Tabi ki big[9].baslik ifadesi ile. Yaplar fonksiyonlara aktarlabilir. Bir fonksiyon herhangi bir veri tipini bize geri dndrd gibi bir yapy da geri dndrebilir. Bir yapnn deerlerini dier bir yapya basit bir atamayla atayabilirsiniz. Aada bulunan kod paras
struct temp { int a; float b; char c; } var1,var2; var1.a=37; var1.b=53.65; var2 = var1;

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.

Bunun Piclerde bir LCD yi set etme rneindeki ekli;

PICPROJE EK B EV R GRUBU

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; //portd den kontrol (lcd portd ye balanm)

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;

8.2 aretilerden Yaplara Bazen bir iareti zerinden bir yapya ulamak ok kullanl olmaktadr. aretilerden yaplara bildirim bir iaretinin dier veri tiplerinde olduu gibidir. rnein, takip eden kod paras yap tipi temp olan, yap deikeni p ve yap iareti deikeni q olan yapy bildirir.

PICPROJE EK B EV R GRUBU

84

www.picproje.org

struct temp { int i; char ch; } p,*q;

temp yapsnn bu ekilde tanmlanmas kullanldnda q=&p deyimi geerlidir. u anda q pyi iaret eder. aretinin gsterdii yapnn elemanlarna (rnein i) ulamak iin -> iareti kullanlr. ok operatrn (->) aada gsterildii ekilde kullanmalsnz;
q->i=1;

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.

Bu rnek iaretiden yapya nasl kullanldn gsterir.


#include <16c74.h> #include <string.h> struct s_type { int i; char str[80]; } s,*p; void main(void) { p=&s; s.i=10; p->i=10; strcpy(p->str,struct olayini seviyorum); printf(%d %d %s,s.i,p->i,p->str); }

Bu iki satr s.i=10 ve p->i=10 eittirler. ALITIRMA:


PICPROJE EK B EV R GRUBU

85

www.picproje.org

1. Bu kod paras dorumudur?


struct s_type { int a; int b; } s,*p; void main(void) { p=&s; p.a=100; }

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 EK B EV R 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;

Yine etiket_ad tanmlanan birliin ad ve deiken_listesi etiket_ad tipinde bir birlii olan deikenlerdir. Birlikler ve yaplar arasndaki fark, birliklerin her yesinin ayn bilgi alann paylamasdr. rnein, takip eden birlik adet ye ierir: bir integer, bir karakter dizisi ve bir double
union u_type { int i; char c[3]; double d; } temp;

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.

PICPROJE EK B EV R GRUBU

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.

PICPROJE EK B EV R GRUBU

88

www.picproje.org

También podría gustarte