You are on page 1of 119

PICmicro MCU C

CCS Cde PIC Microchip


Programlamaya Giri

Yazar : Nigel Gardner

1
indekiler

Giri

Gemi
Neden C kullanlr?
PC Tabanl vs. PICmicroMCU Tabanl Program Gelitirme
rn Gelitirme
Terminoloji
Deneme and Test Kodu
C Kodlama Standartlar
Temeller

1 C Esaslar

C Programnn Yaps
Bir C Programnn Bileenleri
#pragma
main()
#include
printf Fonksiyonu
Deikenler
Sabitler
Yorumlar
Fonksiyonlar
C Anahtar Szckleri

2 Deikenler

Veri Tipler
Deiken Tanmlama
Deiken Atama
Numaralama
typedef
Tip Dnmleri

3 Fonksiyonlar

Fonksiyonlar
Fonksiyon Prototipleri
Fonksiyon Argmanlar Kullanm
Geri Dnme Deerleri Fonksiyonlar Kullanma
Klasik ve Modern Fonksiyon Bildirimleri

4 leler

Aritmetik

2
Karlatrma
Mantksal
Bit Bit
Arttrma ve Azaltma
lem ncelii

5 Program Kontrol fadeleri

If
If-else
? lei
for Dngs
while Dngs
do-while Dngs
Yuvalanm Program Kontrol fadeleri
Break
Continue
Null
Return

6 Diziler / Stringler

Tek Boyutlu Diziler


Stringler
okboyutlu Diziler
Balatma Dizileri
Stringlerin Dizileri

7 aretiler

areti Temelleri
aretiler ve Diziler
Fonksiyonlara areti Geme

8 Yaplar / Bileimler

Yap Temelleri
Yaplarn aretileri
Yuvalanm Yaplar
Bileimleri Temeli
Bileimlerin Yaplar

9 PICmicroMCUya zel C

Giriler ve klar
C ve Assembler Kartrma
Gelimi BIT Manipulasyonu

3
Zamanlayclar
A/D Dnm
Veri letiimleri
I2C letiimleri
SPI letiimleri
PWM
LCD Src
Kesmeler
Include Ktphaneleri
Ek Bilgi

4
Giri

Neden C kullanlr?

C dili Dennis Ritchie ve Brian Kernighan tarafndan 1970lerde Bell laboratuarlarnda


gelitirilmitir. Uygulama iin kullanlan ilk platform bir Unix sistemi altnda ileyen Pd11dir.

C dilinin tantmndan beri geliti ve bilgisayar endstrisinde gelitirme dili haline geldi. PC
C++ ve dier ANSI standartlarn kullanarak ekonomik gelitirme platformu haline geldi.

C dili ile yazlm programlar bir PCden dierine tamak iin ok az bir modifikasyon
gerekir. Yani C dili tanabilirdir. Bu, PCler ve anabilgisayarlar ile alrken kolaydr. Ancak
mikrodenetleyiciler ve mikroilemciler farkl kaynaklardan gelmektedirler. eitli setup ve evre
kontrolleri mikrospesifik olurken anaprogram ak deimeden kalr. Bunun bir rnei
PICmicroMCU zerindeki port ynlendirme kaydedicileridir.

Mikrodenetleyici uygulamalarnda Cnin kullanmna; geni program, geni RAM hafzalar


ve daha byk ilem hzlarna gereksinim duyan reticiler nayak olmutur.

Bana iletilen bir rnek stopclock fonksiyonu iin Cde 2/3 gn gerekirken Assemblerda bu
srenin 2 hafta olduudur.

Hemen bir C derleyicisi almalym dediinizi duyuyorum - Neden Assemblerda yazalm?


Bu konu kod etkinliini gndeme yeni getiriyor Assemblerda yazlan bir program C
versiyonun %80i byklndedir. Byk program hafzasna sahip bilgisayarlar iin sorun
yok.Ancak daha kk cihazlar iin ok etkin deil. Paray ver ve PICi al.

PC Tabanl vs. PICmicroMCU Tabanl Program


Gelitirme

PC tabanl rnlerde gelitirme almalar yapan mhendisler temel pre-wired donanm


(mesela klavye, ilemci, hafza, I/O, yazc ve grsel ekran (monitr)) lksne sahiptirler. rn
gelitirme bundan sonra yazlm oluturmaya ve hatalar ayklamaya kalr.

PIC tabanl tasarmla ilgilenenler girdi ve kt donanm formunda d dnyaya tm


arayzleri yapmak durumundadrlar. Bir PIC programcs Merhaba Dnya mesajn yazabilir
ve derlemeden sonra gsterebilir. Mesajn ekranda grlebilmesi iin PIC programcs komutu
uygulamak iin PIC iinde bir RS232 arayz yapmak zorundadr ve gelitirme kartn PCdeki
bir COM portuna balamak zorundadr.

Niye Assembler kullanmakta tereddt edelim dediinizi duyuyorum.Bende yle diyorum.


Bu son rnn tanabilirlii problemine dayanyor. Btn bir PCyi 40 pinli bir DIL paketinde
elde edebilseydik onu kullanrdk. Ancak bugnn minyatrletirme endstrisi henz bu
boyutlara ulamad. PIC gibi mikrodenetleyicileri dk maliyet ve tanabilir uygulamalarndan

5
dolay kullanmaya devam edeceiz. PIC tabanl tasarmlar iin gelitirme aralar gelitirmeciye
grafik ktphaneleri hari PC tabanl gelitirme ile ayn olanaklar sunar.

rn Gelitirme

rn gelitirme ans ve tecrbenin bir kombinasyonudur. ok basit grevlerin bazlar tm


rne gre kyaslandnda gelitirme iin ok fazla zaman gerektirir (Yani zaman kstlamas
olduu durumlarda dikkatli olun). Bir rnn tasarlayacak kii unlara gereksinim duyar; zaman,
huzur, sessizlik, mantk ve hepsinden nemlisi gereksinimleri anlamay gerektirir. Herhangi bir
gelitirmenin en kolay yolunu buldum; temiz bir kat ve fikir veya spesifikasyon ile balamak.

Olas zmleri oluturmak ile bala; en basitini ve en gvenilirini bulmak iin dene. Bu
aamada dier fikirleri de bir kenara atma. nk onlarn arasnda gzel dnceler olabilir.

lk nce ak diyagramn, blok diyagramn, giri-k balant plann veya dier uygun
zmleri yap. Btn I/Olar konfigre edilmi bir bordu taklit edecek prototip kart veya
donanm olutur. I/O pinlerinin plann daha basitletirmek iin ileride yerlerini
deitirebileceini unutma - genellikle yazlm da ok kk konfigrasyon ile.

Daha sonra kodu yazmaya bala test edilebilir bloklar halinde ve aama aama program
olutur. Bu bir seferde 200 satrlk kodu debug etmek zorunda kalmanz nler.

Bu ilk projeniz ise Ozaman basit tutun Dev bir projeye balamadan nce konuyu daha iyi
anlamak iin bir ledi bir butonla ap kapayan bir devre deneyin.

Basit aamalar halinde program olutur ilerledike test et ak diyagramn gncel tutmak
iin ak diyagram zerinde tekrar aln.

Fikir

Bir fikir sizin tarafnzdan EUREKA tarznda yada bakalar tarafndan bir projenin
gereksinimi olarak oluturulabilir. Ana tema ayndr.

Tasarm aamasna balamadan nce temel terminolojinin anlalmas gerekir yeni bir dil
renmek gibi yani PICmicroMCU PIC dili mikrodenetleyicisi tasarm balamadan tam
olarak anlalmaldr.

imdi genel terimlerle balayalm; PIC dili ve mikroilemci ,mikrodenetleyici temelli


sistemler arasndaki farkla.

Terminoloji

Baz basit terimlerle balayalm.

Mikrodenetleyici ; plastik bir para, metal ve artlm ksmlar ki bunlar yazlmsz


hibireye yaramazlar. Yazlm bir mikrodenetleyiciyi kontrol etmeye baladnda nerdeyse
snrsz uygulama alanna sahip olur.

6
I/O ; Girdi veya kt olarak konfigre edilebilen d dnyaya balant pinidir.
Mikrodenetleyiciye iletiim kontrol ve bilgi okumak iin bir ok durumda gereklidir.

Yazlm ; Mikrodenetleyicinin ilemesi iin gerekli bilgidir. Baarl bir rn yada uygulama
iin yazlmn hatasz ve bugsz (bug : bir program zerinde yazm hatasndan kaynaklanan
sistem a) olmas gerekir. Yazlm C, Pascal veya Assembler gibi eitli dillerde yazlabilir.

Donanm ; Mikrodenetleyici, hafza, arayz bileenleri, g kayna, iaret koullandrma


devreleri ve kendisinden almasn ve d dnyaya balant kurmasn salayan tm bileenler.

Donanma bir baka bak olarak zellikle almadnda atabildiimiz eydir yaklam
getirilebilir.

Simulatr ; MPLAB gelitirmeortamnn, dahili operasyonunun bazsna eriime izin veren


kendinde gml simlatr vardr. Eer siz olaylarn, ne zaman olduunu bilirseniz bu, test
etme dizaynlarnz uzun yoludur. Eer bir olay oras hakknda bazyerler olursa, siz simulator
kstlaycy bulabilirsiniz. Tm iz , adm ve kusurlar giderme tesisleri, bununla beraber ,
msaittir. 16C5x gelimi iin baka bir rn SIM ICEdir - ICE zelliklerinin bir donanm
simulatr teklif bazs fakat mal olunmuun bir kesimindedir.

Devre Benzeticisi (Emilatr); (ICEPIC yada PICmicroMCU MASTER) Donatmn ok


yararl bir paras, Microcontrollerin nerede oturduu soket ve PC iniz arasna baland. O, PC
devam eden yazlma olmak iin imkan verir fakat devre tahtas sonunda bir Microcontroller'e
benzer. ICE, o dnyann dyla nasl haberletiinin, mikronun iinde ve ne olduunu gsterir,
bir programa adm atmanza izin verir.

Programlayc ; Bir ICEnin yardmsz almas iin ona izin veren mikrokontrollerin
belleinin dolabilmesine, programa imkan salayan birimdir. Onlar, tm biimlere ve
byklklere ve deiemlere girerler. Mikrochipten PICSTART PLUS and
PROMATE II her ikisi de seri porta balanr.

Kaynak Dosya ; Bir dilde yazlm bir program Assembler ve siz anlarsnz.
Mikrodenetleyici onu anlamadan nce, Kaynak dosyas ilenmi olmal.

Assembler / Derleyici ; Bir nesne dosyas iindeki kaynak dosyay eviren bir yazlm
paketidir.Hatala kontrol dahilir, assembly ilemi yaparkenki oluan hata bayraklar gibi bir
program hatalarn ayklama zellii kullanlr. MPASM en son assemblerdr.

Nesne Dosyas ; Bu, Assembler / Derleyici tarafndan retilen bir dosyadr ve fonksiyonlarn
gerekletirebilmeyi anlayan ICE yada simulatr yada programlaycnn formundadr. Dosya
uzants assemler direktifinde .OBJ yada .HEX tanmlanr.

Liste Dosyas ; Bu, Assembler / Derleyici tarafndan retilen bir dosyadr ve yazdnz
yorumlat ve heksadesimal deerleri ile birlikte kaynak dosyasndan tm ierikleri kapsar. Bu, ne
zaman program kusurlarn gidermek iin yorucu kaynak dosyas kayddan yazlmn iinde ne

7
olduu sizin takip edenin bir daha muhteem ans varolduu gibi incelemek iin en yararl
dosyadr. Dosya uzants .LSTdir.

Dier Dosya ; Hata dosyas bir hata listesi ierir fakat balanglar gibi hibir bildirim
vermez. .COD dosyas emlatr tarafndan kullanlr.

Buglar ; Hatalar sizin tarafnzdan doldurulan boluklar yaratr. simpel typin


errusdaki bu alanlar yazlm dili yazm hatalar kullanm iindir. Bu buglarn ou derleyici
tarafndan bulunacaktr ve .LST dosyasnda grlecektir, dierleri arnm ve deneme yanlma ile
dzeltilmitir.

Mikroilemci

Bir mikroilemci yada dijital bilgisayar temel blmn oluumudur: CPU, I/O ve Hafza
baz destek devre ilavesi ile.

Her bir blm tm slklar ve ziller temelindeki karmaklkta deiebilir.

TPK MKROLEMC SSTEM

Her bir dnm alalm:

Giri ve k (I/O) dijital, analog ve zel fonksiyonlar kapsar ve d dnya ile balant
kurmamz salayan blmdr.

8
Merkez ilemci birimi (CPU) sistemin kalbidir ve veri manipulasyonu ve hesaplamalar
gerekletirirken 4,8,16 bit veri fotmatnda alabilirler.

Hafza RAM, ROM,EPROM, EEPROM yada bunlarn kombinasyonu olabilir ve veri ve


program saklamada kullanlr.

Bir osilatr mikroilemciyi srmek iin gerekmektedir. Onun fonksiyonu CPU iindekileri ve
veri zamanlama, klar hesaplama ve bu bilgi k vermeden ncedir. Osilatr farkl
bileenlerden yaplm olabilir yada hazr yaplm bir modl olabilir.

Mikro ilemci ile ilgili bulunan dier devre watch dog timerdr sistem anahtarlamaya
yardm etmeyi, ayn hat zerinde bal devrelerin birisinin I/O sunu semeyi, chip numaralarn
semek ve balant kurmak iin veri hatlar ve adresler iin bufferlamay salar.

Bir Mikroilemciden sistemin balca alan CPU olan bir rn gibi sz etmek normaldir. I/O
ve hafza ayn chiplerden dzenlenebilir ve doru ilem yapabilmek iin bir veri hatt, adres hatt
ve adres zmleme gerekmektedir.

Mikrodenetleyiciler

The PICmicroMCU, dier taraftan, bir Mikrodenetleyicidir ve ayn chipte birlemi tm


CPU, hafza, osilatr, watchdog ve I/O ya sahiptir. Bu, boluu, dizayn zaman ve d evresel
zamanlamas ve uyumluluk problemlerini kapsar fakat baz hallerde, bir takm bellei
byklne dizayn ve I/O kabiliyetleri snrlayabilir.

Mikrodenetleyicilerin PIC ailesi geni bir I/O aral, hafza ve gelitirme mhendisliinin
enok karlalan gerekli zel fonksiyonlarn sunar.

Bilgisayarlarn, mikroilemcilerin ve mikrodenetleyicilerin dizaynnn ktphane


aratrmasnda birok genel kitap bulacaksnz, yleyse konu temel farkllklarn aklamasndan
dolay geniletilmi veya buraya kopyalamas olmayacaktr.

Neden PIC kullanlr?

Kod Verimi ; PIC Harvard mimarisini temel alan 8 bit bir mikrodenetleyicidir veri ve
hafza iin ayr dahili hatlar bulunan anlamnda. retilen i oran, her ikisi veriye ezamanl
eriim nedeniyle ve program bellei o yzden artlr. Genel mikrodenetleyicilere baktmzda,
her ikisi veri ve programa ele alyor ve bir dahili hatt var. Bu PICmicroMCU 'a karlatrnca,
2 'nin hi olmazsa bir faktr tarafndan dolay ilem yavalar.

Gvenlik ; Tm talimatlar 12 bitlik veya 14 bitlik program bellei kelimesine gre olur.
Yazlmn olas talimatlar gibi, bir programn veri ksmnn iine ve yorumcu veriyi altrmak
iin atlama yoktur. Bu 8 bitlik hat kullanan bir Harvard mimarisine sahip mikrodenetleyicide
ortaya kabilir.

9
Komut Seti ; 16C5x ailesi ve 16Cxx ailesinde yazlm dzenlemek iin 33 komut
renmemiz gerekir.Her komut (CALL, GOTO ve bit set komutlar -BTFSS, INCFSZ -
haricinde) bir sayklda kullanlr.

Hz ; PIC, osilatr ve dahili saat yolu arasndaki 4 balant tarafndan ayrlr. Bu komut
zamann hesaplanmasn kolaylatrr. zellikle eer 4 MHzlik kristal kullanyorsanz. Bylece
her komut dngs 1usde alr.PIC 20MHz kristal adm saniyede 5 milyon komut ile
altran hzl bir mikrodur - Neredeyse 386SX 33! in hznn 2 kat.

Statik lem ; PIC tam bir statik ilemcidir.Baka bir deyile eer saati durdurursanz btn
kaydedici ierikleri korunur. Pratikte yapmak yerine PICi uyku moduna alrdnz. Bu saati
durdurur ve PIC iindeki eitli bayraklar kurar. Bylece uykudan nce hangi durumda olduunu
renebilirseniz. Uyku modundayken PIC sadece bekleme akm eker ki bu bir mikro
Amperden daha az olabilir.
Srme Yetenei ; PIC yksek bir kt srme yeteneine sahiptir ve LEDleri ve triyaklar
direk olarak srebilirler. Herhangi bir I/O pini tm cihaz iin 25mA yada 100mA ekebilir.

Seenekler ; Bir dizi hz, scaklk, paket I/O hatlar, zamanlama fonksiyonlar, seri COMlar,
A/D ve hafza kapasiteleri tm ihtiyalarn karlamak iin PIC ailesi tarafndan karlanr.

ok Ynllk ; PIC ok ynl bir mikrodur ve hacim olarak alann nemli olduu
durumlarda birka lojik kapnn yerini alabilecek kadar hacim bakmndan ekonomiktir.

PIC FONKSYON BLOK DYAGRAMI

10
PIC16F84A(14Bit) BLOK DYAGRAMI

Gizlilik ; PICmicroMCU endstride ki en iyi kod koruma olanaklarndan birine sahiptir.


Bir kere koruma biti programlandnda program hafzasnn ierii program kodunun tekrar ina
edilebilecek ekilde okunamaz.

Gelitirme ; PIC gelitirme ve retim iin OTP iin pencereli ekilde (grsel anlamda)
kullanma sunulur.Gelitirme iin ki aralar okunabilir ekilde ve uratrc ekildedirler.

Kod Deneme ve Test Etme

C ile ayrntlara inen bir programlama zorlayc bir durumdur. Devre emilatr ve PIC iin
gerekli donanm projenin gelitirme aamasnda engelleyicidir. Bu diskte sunulan C derleyicisi
internetten alnmtr ve kod renimi iin bir test ara olarak bu kitaba dahil edilmitir. I/O
klarn kontrol edebilen PICe zel C derleyicilerine balamadan nce temel kod rnekleri ve
fonksiyonlar denenebilir, test edilebilir ve grlebilirler.

C Kodlama Standartlar

11
Program yazma ev ina etmek gibidir. Eer temeli gvenli ise geri kalan zerine ina
edilebilir (klabilir). Eer temel zayf ise kod daha sonraki bir aamada ker. Aadaki
tavsiyeler C++ standart dkmanndan alnm ve PIC iin uyarlanmtr.

simler Fonksiyonlarna Uydur

simler programlamann zdr.


Bu nedenle ilevine ve program iinde ne yaptna uygun bir isim bul.
Okunabilirlii arttrmak iin birleik isimler kullan.

ErrorCheck , ERRORCHECKden daha kolaydr.

simleri okunabilirlii arttrmak iin tr belirten kk harf ile birletir.

g Global gLog;
r Reference rStatus();
s Static sValueIn;

Parantezler {}

Parantezler veya keli parantezler klasik Unix tarznda ;

if (koul) {
.
}

yada okunmas iin daha kolay bir yntemle kullanlabilir :

if (koul)
{
.
}

Sekmeler ve Girintili Yazma

Sekme yerine boluk kullan nk 8lik ayarlanm tablolar sayfa geniliini tketir. Sadece
yazlmn okunabilirlii iin ieriden bala, ayrca sekme ayarlarnn bir editrden dierine
farkllk gstermesi kodun tanabilirliini azaltr.

Satr Uzunluu

Monitrler ve yazclar arasndaki uyumluluk iin satr uzunluunu 78 karakter tut.

LC Format

12
nceki ifin karlamad koullar yakalamak iin else kullan:

if (koul)
{}
else if (koul)
{}
else
{
.. /* Kapsanan bir ey deil, baka yakalamaz */
}

Koul Format

Derleyicinin izin verdii durumlarda her zaman bir eitlik eitsizlik karlatrlmasnn sol
tarafnda sabit kullan. Eer bir = atlrsa derleyici sizin iin hatay bulur. Ayn zamanda deer
ncelikli bir yere sahiptir.

if ( 6 == ErrorNum)

Tm Deikenlere ilk deer ver

Btn deikenleri kayan yada rasgele koullardan korumak iin bilinen bir deer ata.

int a=6, b=0;

Yorumlar

Yorumlar yazdnz hikayenin dier ksmn oluturur. Siz bugn programnzn nasl
altn biliyorsunuz ancak 2 ay yada 2 yl sonra siz yada bakas bunu hatrlayacak m? Daha
fazla almann gerektii, gelimelerin gerektii yada debuglarnn gerektii yerlerde yorum
kullan.

Temeller

Her bir program bir balangc vardr. Microdenetleyicilerde bu balang reset vektrdr. 14
bit coreda (16Cxx ailesi) reset 00h dr. 12 bit coreda (PIC 16Cx ve 12C50x) reset hafzada daha
yksek noktadadr. 1FFh, 3FFh, 7FFh.

Bitme noktas program eer bir kere altrlrsa durdurulaca noktadr. letiimi ayarlayan
rutin baud orandr. Trafik gibi dier programlar baa dnecektir.Basi C gibi yksek
seviyeli programlarda kullanlan en yaygn rneklerden biri ekrana Merhaba Dnya
yazdrmaktr.

13
Eer klavye,ilemci,ekran bir PCde balysa C ve PC kullanmak kolaydr. Hook program avre
cihazlarna balamak iin temel hooklarn yerletirilmesi gerekir. PICmicroMCU veya herhangi
bir mikroilemci /mikrodanetleyici, C sistem iin bir program gelitirirken sadece yazlm
hooklarna deil mikroyu d dnyaya balamak iin fiziksel donanmada ihtiya duyulur. Byle
bir sistem aada gsterilmektedir.

Byle bir Layout kullanmak temel I/Olarn, COMlarn gelitirilmesi,test edilmesi ve debog
edilmesine olanak salar. ICEn kullanm (gerekli olmasa bile) gelitirme maliyetlerini ve
mhendislerin ba arsn artrr. Bir projenin balangcndaki yatrm fazla grnebilir. Ancak
gelitirmede kazanlan zaman ve debug daha sonra bunu telafi eder.

Bir tasarm gelitirmek iin kullanlan donanm el yapm PCB, protoboard veya hazr
gelitirme kart (bizim sunduumuz PICmicroMCU milenyum boardn kapsad gibi)
olabilir.Milenyum boardn balang iin gerekli tm temel donanmlara sahip iken ilk outlayi
minimumda tutar.

Aagdaki donanm hangi formatta istiyorsanz toplayn. Size bir PIC programlaycs
gerekecektir. C derleyicisine ek olarak minimal outlaydaki PIC Start Plus gibi.

Mhendisler PIC retirken kullando basit bir programdmeye bas LEDi yakmaktr.
Basit bir kodla bala 2000 satrlk bir eyle deil.

Assemblerde bir rnek

main btfss porta,switch ;test for switch closure


got main ;loop until pressed
bsf portb,led ;turn on led
lp1 btfsc porta,switch ;test for switch open

14
goto lp1 ;loop until released
bcf portb,led ;turn off led
goto main ;loop back to start

Bunu Cde yazalm

main()
{
set_tris_b(0x00); //set port b as outputs
while(true)
{
if (input(PIN_A0)) //test for switch closure
output_high(PIN_B0); //if closed turn on led
else
output_low(PIN_B0); //if open turn off led
}
}

Assemble olduunda buna benzer.

main()
{
set_tris_b(0x00); 0007 MOVLW 00
0008 TRIS 6
while(true)
{
if (input(PIN_A0)) 0009 BTFSS 05,0
000A GOTO 00D
output_high(PIN_B0);
000B BSF 06,0
else
000C GOTO 00E
output_low(PIN_B0);
000D BCF 06,0
}
000E GOTO 009
}

15
Grebileceimiz gibi derlenmi versiyon hafzada daha ok kelimeye sahiptir. C de 14
Assemlede 9 , bu kodda adil bir rnek deil ama program bydke C kodu daha etkin olur.

16
C ESASLARI

Bu blm C programlama dilinin ana ynlerinin bazlarn takdim etmektedir.Bu ynlerinin her
birinin hzl bir bak verilecektir. Amac ; ileriki blmlerdeki rnekleri anlayabilir bir temel C
bilgisi vermektir.

Ele alnan konular;

Program yaps
Bir C programnn paralar
#pragma
main
#inculude direktifi
printf ifadesi
Degikenler
Deimeyenler
Yorumlar
Fonksiyonlar
C ana kelimeleri

17
1.1 C PROGRAMLARININ YAPISI

Tm C program n ilemci direktifleri, bildirileri, tanmlar, ifadeleri, deimleri ve


fonksiyonlar iermektedir.

nilemci Direktifi
Bir nilemci direktifi C n ilemcisinde bir komuttur(bir program derlerken ki ilk adm
otomatik aran komut).ki en ok ortak nilemci direktifleri #define direktifi, belirlenmi
tantc iin metni deitiren, ve #include direktifi, bir program iinde harici bir dosya metnini
ierir.

Bildiri
Bir bildiri deikenlerin znitelikleri ve isimleri, fonksiyonlar, ve programda kullanlan
metinleri saptar. Genel deikenler d fonksiyonlar bildirir ve dosyann sonundaki bildirinin
sonundan grlrler. Bir yerel deiken bir fonksiyon ierisinde bildirilir ve fonksiyonun
sonundaki bildirinin sonundan grlebilir.

Tanm
Bir tanm bir fonksiyon veya deikenin ieriklerini tanmlar. Bir tanm ayn zaman da
fonksiyonlar ve deikenler iin gerekli yeri ayrr.

fade
Bir ifade tek bir deer veren operatrler ve ilelerin bir kombinasyonudur.

Deyim
Deyimler bir C programnda program iletiminin dzenini yada akn kontrol eder.

Fonksiyon
Bir fonksiyon bildirilerin, tanmlarn, ifadelerin ve spesifik grevi gerekletiren deyimlerin bir
toplamdr. Fonksiyonlar C de yuvalanm olmayabilir.

main Fonksiyonu
Tm C programlar program iletiminin balad yerde main fonksiyonunu iermelidir. Main
fonksiyonunun kapsam programn balang ve biti noktasn tanmlamaktr.

rnek: Genel C program yaps

#include <stdio.h> /* nilemci direktifi */


#define PI 3.142 /* C balk dosyasn ierir */
float area; /* genel bildiri*/
int square (int r); /* protatip bildiri*/
main()
{ /* ana fonksiyonun balangc */
int radius_squared; /* yerel bildiri */
int radius = 3; /* bildiri ve balang durumuna getirme */
radius_squared = square (radius);

18
/* fonksiyona bir deer atama */
area = PI * radius_squared;
/* atama deimi */
printf(Area is %6.4f square units\n,area);
} /* ana fonksiyon ve programn sonu */
square(int r) /* fonksiyon ba */
{
int r_squared; /* buradaki bilinen bildiriler*/
/* sadece kareye */
r_squared = r * r;
return(r_squared); /* deyim arma deerine dn */
}

1.2 BR C PROGRAMININ PARALARI

Tm C programlar fonksiyonlar ve deyimler gibi esas paralar kapsar. Deyimler ilemleri


gerekletiren programn paralardr. Tm C programlar bir veya daha fazla fonksiyon ierir.
Fonksiyonlar alt programlar, bir yada daha fazla deim ierenlerin her biri ve programn dier
paralardr. Programlar yazarken girintili yazma boluk brakma yorumlar okunabilir ekilde
olmaldr. Bir sonra ki rnek C programnn gerekli paralarnn bazlarn gsterir.

#include <stdio.h>
/* ilk C program */
main()
{
printf(Merhaba Dnya!);
}
#include <stdio.h > deyimi program iinde ki stdio.h kaynak dosyasndan derledii anlamna
gelir. Uzants .h olanlar header dosyasdr. Bir balk dosyas programda kullanlan standart
fonksiyonlar hakknda bilgi ierir. Balk dosyas olan stdio.h dosyas STandarD Input and
Output anlamna gelir ve giri ve k fonksiyonlarnn ounu ierir.

/* ilk C programm / Cde bir yorumdur. Yorumlar /* dan ncegelir ve */ ile sonlanr. Yeni sitil
yorumlar // ile balar ve satr sonuna kadar gider. Yorumlar derleyici tarafndan yok saylrlar ve
bu yzden derlene kodun uzunluu veya hzna etki etmezler.

Tm C programlar bir main() fonksiyonuna sahip olmaldr. Bu program ierisindeki giri


noktasdr. Tm fonksiyonlar aadaki biimde olmaldr.

Fonksiyon isim()
{
kod
}

Bir fonksiyondaki deimler srasyla yrtlrler. { ile balar } ile sonlandrlrlar.

{ ve }iaretleri srasyla C deki kod bloklarnn balangcn ve bitiini gsterir.

19
Son olarak printf(Merhaba dnya!); deyimi; mevcut tipik bir C deimidir. Neredeyse tm
C deyimleri bir noktal virgl (;) ile sonlanr.

Bu yzden bir satrdaki deyimlerin numaralarnda veya bir hat iinde deyimlerin durumlarna
etki etmez.

Tm deyimlerin sonlarndaki noktal virgl (;) derleyiciye deyimin sonuna ulat ve bir
sonraki deyimden ayrlmasn bildirir. Baarszlk genellikle sonraki bir satrdaki bir hata ile
oluur. if deyimi birleik bir deyimdir ve birleik deyimin sonunda ; olmas gerekir.

if (Bu doru)
Bu fonksiyonu yap();

1.3 #PRAGMA
Pragma komutu derleme anndaki paral bir ilemi gerekletirmeyi derleyiciye okutur. Dosya
format yaratrken yada PICmicroMUC kullanmnda belirtildii gibi

#pragma device PIC16C54

CCS Cde pragma semelidir byle kabul edilir.

1.4 main()

Her program sadece bir kez kullanlan bir main programna sahip olmaldr. Hibir parametre
takip eden () iinde bulunmamaldr. Void anahtar szc parametrelerin olmad (ve) arasnda
grlebilir. main gibi snflanm bir fonksiyondur, tm ikili arasnda olmas gereken kodlardr.
main()
{
program yaps
}

1.5 #include

Balk dosyas (bir .h uzantsnda belirtilen) zel bir PIC iin PICmicroMUC hafzalarnn
yeri yada fonksiyon dnlerinin ve fonksiyon kabullerinin ne anlamda olduunu ieren
ktphane fonksiyonlar hakknda bilgi ierir.

#include <16C54H>

Bu bilgi derleyici tarafndan tm donanm zellikleri ve kaynak programlarla birlikte balant


kurma da kullanlr.

#include <16c71.h>
#include <ctype.h>
#use rs232(baud=9600,xmit=PIN_B0,rcv=PIN_B1)
main()

20
{
printf(Karakter giriniz:);
while(DORU)
putc(toupper(getc()));
}

PIN_B0 ve PIN_B1 tanmlar 16C71.H balk dosyasnda bulunmaktadr. Toupper fonksiyonu


CTYPE.H balk dosyasnda bulunmaktadr. Bu balk dosyalarnn ikisi de programda
kullanlmak zorundadr.

Kullandmz fonksiyonlar hakknda derleyicinin gerekli bilgiyi derleyicinin sahip olmasn


salar. printf ve putc. Gibi giri k fonksiyonlar iin balk dosyalar ou C derleyicilerine
gereken nottur. Bunlar bir ayrc balk dosyas gerektirmeyen ve #use rs232 yolu ile ekilen
PICmicroMUC iin yaratc fonksiyonlardr.

#include <thisfile.h>

Dosya iin dosya yneticilerini ieriine baklmasn n ilemciye anlatr.

#include thatfile.h

Muhtemelen #include direktifinin sonunda noktal virgl (;) yoktur. Bunun sebebi #include
direktifinin bir C deyimi olmamasdr, fakat onun yerine derleyiciye bir n ilemci direktifi
denilebilir. include dosyasnn tm derleme aamasnda kaynak dosyasnn ierisine
konulmutur.

1.6 printf Fonksiyonu

Printf fonksiyonu programcya yazlabilir bilgi gndermeye izin veren standart bir ktphane
fonksiyonudur. Bir printf deyiminin genel biimi;

printf(control_string, argument_list);

Bir control_string ; her son da ift alntl bir stringdir. Bu string iinde, zel sembollerin
belirteleri bir % iareti ile belirtilir. control_string her zaman printf() fonksiyonu iinde
olmaldr. Biim stringin de biim belirteleri yoksa bir argument-list gerekmeyebilir. argument-
list deikenlerin ve sabitlerin bileimi olabilirler. Sonraki iki rnek printf() deyimlerinin bir
sabit ve bir deiken sonras kullanmn gsterir.

printf(Mrehaba dnya!);
printf(Microchip is #%d!,1);

Biim belirteleri (%d) veri gsteriminin tipine baldr. Aadaki tabloda Cdeki biim
belirtelerinin tamam gsterilmektedir.

Biim belirteleri printf()


%c single character

21
%d signed decimal interger
%f floating point (decimal notation must include)
%e floating point (exponential or scientific notation)
%u unsigned decimal integer
%x unsigned hexadecimal integer (lower case)
%X unsigned hexadecimal integer (upper case)
l prefix used with %d, %u, %x to specify long integer

NOT: Bir O dan sonra, bir biim stringe iindeki %a karakteri bataki sfrlarn yazlmas
mecburdur. Numarann ardndan kalp alannn genilii belirtilir.

printf(The Hex of decimal 12 is %02x\n,12);

Bu ekilde de gsterilir.
Ondalk 12 nin on altlk deeri OCdir.

Boluk dizisi

\n yeni satr \t yatay boluk


\r satr bana dn \f biimleme
\ tek alnt \ ift alnt
\\ ters slash %% yzde iareti
\? Soru iareti \b geri boluk
\0 nurasgele karakter \v dikey boluk
\xhhh heks kodu hhh koyar

Biim belirtmeleri % [bayraklar] [genilik] [ksurat], bir nceki rnekteki satr ;

printf(Area is %6.4f square units\n,area);

Farkl ekilde k portunda da gsterilebilir. k bununla birlikte kendi k fonksiyonunu


tanmladn hibir eye etki etmez.
rnein;

void lcd_putc(char c)
{
// ka bir kod ver
// karakteri LCD ye gnder
}
printf(lcd_putc, deer %u dur, deer);

1.7 Deikenler

Bir deiken belli bir hafza yeri iin bir isimdir. Bu hafza yeri deikenin nasl bilindiine
gre deien eitli deerler tutabilir. C de tm deikenler kullanlmadan nce belirtilmek
zorundadr. Bir deyiken bildirimi derleyicinin ne tip deiken kullandn anlatr. Tm deyiken
bildirimleri C de deyimdirler ve bu yzden (;) notal virgl ile sonlandrlmaldrlar.

22
C nin destekledii baz temel veri tipleri char, int, float, ve long dur. Bu deiken belirtimi iin
genel biim;

tip deiken_isim;

Deiken belirtimine bir rnek char ch; dir Derleyici bu deyimi ch deikeninin bir
char(karakter) gibi belirtildii eklinde yorumlar.

1.8 Constants

Sabitler program tarafndan deitirilemeyen sabit deerlerdir. rnein 25 bir sabittir. Tam say
sabitleri kesirli paral olmayacak ekilde belirtilir. -100 yada 40 gibi. Tam say olmayan sabitler
rakamn ksuratn ayrmak iin ondalk nokta gerekir.465,75 says bir noktal sabittir. Karakter
sabitleri A veya & gibi tek ayralar iine konulurlar.

Derleyici programnzda bir sabit ile karlatn da, ne eit sabit olduuna karar vermek
zorundadr. C derleyicisi, tutaca en kk badaabilir veri tipinin iine sabit uydurur. 15 bir
int ve 64000 bir unsigned (iaretsiz) dir. Bir sabit #define deyimi kullanlarak belirtilebilir.

#define <etiket> deer

<etiket> programnzn bandan sonuna kadar kullanacanz isim tanmlar, value (etiket)
atadmz deerdir.

#define DORU 1
#define pi 3.14159265359

C size heksedesimal ve oktal biimleri belirtmeye izin verir. Heksedesimal sabitler ox n eki
almak orundadrlar. rnein 0xA4 geerli bir heksedesimal sabittir. Nmerik sabitlere ek olarak,
C, string sabitleri destekler. String sabitleri ift trnak iine konulan karakterler dizisidir.

Sabitler n ilemci olarak adlandrlan ksmda kod derlenmeden nce metin ksmlarn
gerekletiren #define ile tanmlanr.

# ile balayan direktifler n ilemci direktifleri olarak adlandrlr. rnein;

#define YALI_DEL (YA<65)


.
.
.
.
.
if YALI_DEL
printf(GEN);

23
#define verisi hafzada saklanmaz, derleme annda zlr. ROM da sakl sabitler, deiken
bildiriminde const anahtar szcn kullanr.

char const id[5]={1234};

Biz string tutmaya 5 yer kullanrz, nk string (10) karakter ile sonlandrlr.

1.9 Comments

Yorumlar, kaynak kodun ilevini ve anlamn belgelemeye kullanlrlar. Tm yorumlar


derleyici tarafndan yok saylrlar.Bir yorum, bir C anahtar szc ortas, fonksiyon isim yada
deiken ismi iin hari programn hibir yerinde bulunmaz. Yorumlar ok uzun satrlar olabilir
ve geici olarak kodun bir satrn kopyalayacak ekilde kullanlabilir.

Yorumlar iki biime sahiptir. lk biimi tm C derleyicileri tarafndan kullanlr ve ;

/* Bu bir yorumdur */

kinci biim ise ou C derleyicisi tarafndan desteklenmektedir ve ;

// Bu bir yorumdur

ALITIRMA : Aadaki yorumlarn hangisi geerlidir?

/* Benim yorumum ok ksa */

/* Benim yorumum ok ok ok ok ok ok ok ok ok ok uzun ve geerlidir*/

/* Bu yorum /* tam */ grnyor fakat geerli deil */

1.10 Fonksiyonlar

Fonksiyonlar bir C programnn temel yap talardr. Tm C programlar en azndan bir


fonksiyon ierir, main(). Yazacanz ou fonksiyonlar bir ok fonksiyon ierecektir. Bir ok
fonksiyonu bulunan C program iin biim;

main()
{
fonksiyon1()
{
}
fonksiyon2()
{
}
}

24
main(), program ilerken arlan ilk fonksiyondur. Dier fonksiyonlar function1() ve
function2(), programdaki hibir fonksiyon ile arlmazlar.

Genel main() dier hibir fonksiyon tarafndan arlmaz, bununla birlikte, Cde hi snrlama
yoktur.
Aadaki C iki fonksiyonlu bir rnektir.

main()
{
printf(I );
fonksiyon1();
printf(c.);
}
function1()
{
printf(benzer );
}

Kendi fonksiyonlarnz yazarken, bir fonksiyon { ile kapatldysa bu fonksiyonun bitimi iin
bir hatrlatcdr, fonksiyon asl arld noktadan sonra program bir satr kodu ilemeye
balayacaktr. 3.1 de grebilirsiniz.

1.11 Makrolar

#define nceki blm rneklerle aklayacak kadar gl bir direktiftir. C daha gl ekilde
parametreler retmeyi tanmlamaya izin verir. Parametreler kullanldnda bir makro gibi
arlr. Makrolar okunabilirlii artrmak yada yazmay korumada kullanlr. rnek bir makro :

#define var(x,v) unsigned int x=v;


var(a,1)
var(b,2)
var(c,3)

benzer ekilde :

unsigned int a=1;


unsigned int b=2;
unsigned int c=3;

fadeler blmn okuduktan sonra daha anlalabilir bir dier rnek :

#define MAX(A,B) (A>B)?A:B)


z=MAX(,y); // z daha byk x veya y deeri ierecek

1.12 Koul derleme

25
C, derleme zaman ayarlar tabanl derlemelerden dolana veya ieren kod blmlerine izin
veren baz zel n ilemci direktiflerine sahiptir. Aadaki rnei dnelim ;

#define HW_VERSION 5
#if HW_VERSION>3
output_high(PIN_B0);
#else
output_high(PIN_B0);
#endif

Yukarda HW_VERSYONUnun ayarlarna bal olan sadece tek satr derlenecektir. Bir
dosyada #if in dzinelercesi olabilir ve bir sabit deitirirerek farkl donanm versiyonu iin
benzer kod derlenebilir. Kod, program alrken deer bien normal #if den farkl derlendii
zaman #if deer bier ve bitirir.

Bir ID #defined ise #ifdef tmyle grmeyi kontrol eder.


rnek :

#define DEBUG
#ifdef DEBUG
printf(ENTERING FUCT X);
#endif

Bu rnekte ; bir satrnda karma yada yorumlama ile programdaki tm debug satrlar
derlemeden elenebilir.

1.13 Donanm Uyumluluu

Derleyici donanm hakknda bilgi sahibi olmas gerekmektedir ki kodu doru bir ekilde
derleyebilsin. Tipik bir program balangc aadaki gibidir.

#include <16c74.h>
#fuses hs,nowdt
#use delay(clock=8000000)

lk satr, pin adlar gibi zel #define aralar iermektedir. kinci satr PICmicroMCU
sigortalarn set eder. Mesela yksek hzl osilatr (hs) ve bekleme zamanlaycs kapal (nowdt)
dir. Son satr derleyiciye osilatr hznn ne olduunu anlatr. Aada baz dier rnek satrlar
vardr :

#use rs232(buad=9600,xmit=PIN_C6,rcv=PIN_C7)
#use i2c(master,scl=PIN_B6,sda=PIN_B7)

Bu kitaptaki rnek program donanm tanmlama satrlarn gstermez. Bunlar derlemeyi ve bu


programlar RCW yapmay gerektirir.

26
Ek olarak, C deikenleri donanm kaydedicilerine haritalanabilir ve oluturulabilir. Bu
deikenler bitler yada baytlar olabilir. Onlar tanmlandktan sonra programda dier hibir
deiken ile kullanlmaz. rnekler :

#bit carry=3.0
#byte portb=6
#byte intcon=11

1.14 C Anahtar Szckleri

ANSI C standard C dilinde kullanmak iin 32 anahtar szck tanmlanr. Cde, belirli
kelimeler dnglerde kullanlmak iin yada veri tiplerini tanmlamay derleyici tarafndan
kullanmak iin saklanmtr. Tm C anahtar szckleri, onlar derleyici tanmas iin lowercase
iinde olmaldr. Tipik olarak, ou C derleyicileri ilemci mimarisinin avantajn kullanan birka
anahtar szck ekleyecektir.

Aada deiken isimleri olarak kullanlan, rezerve edilmi anahtar szcklerin bir listesi
vardr.

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

ALITIRMA:

1-) sminizi ekrana yazan bir program yaznz.


2-) Yl olarak adlandrlan bir tam say belirten bir program yaznz. Bu deikene imdiki yln
deeri verilsin ve sonra, bir printf() deimi kullanlarak, ekrana yln deerini gstersin. Program
sonunda bunu grmelisiniz: Bu yl 1998 dir.

27
Deikenler

C dilinin nemli bir noktas da veriyi nasl depoladdr. Bu konuda C dilinin veri
depolanmasnda deikenleri nasl kullandn daha yakndan inceleyeceiz.

Bu konuda tartlacak konular

veri tipleri
bildirimler
atamalar
veri tiplerinin snrlar
tip dnmleri

28
2.1 Veri Tipleri

C programlama dili be temel veri tipini ve drt tip dntrcsn desteklemektedir. Aadaki
tablo temel veri tiplerinin ve tip dntrclerinin anlamlarn aklamaktadr.

Tip Aklamas Kullanm ekli


karakter karakter verisi char
tam say iaretsiz tam saylar int
reel say reel saylar float
ift doruluklu say ift doruluk deerindeki saylar double
bo deer yok void
iaretli pozitif ya da negatif say signed
iaretsiz sadece pozitif saylar unsigned
uzun saylar daha geni bir aralktaki saylar long
ksa saylar daha dar bir aralktaki saylar short

Her bir veri tipi kullanlan dntrcye de bal olmak zere belirli bir deer araln ifade
etmektedir. Aadaki bir sonraki tablo ise temel veri tipleri ile dntrclerin olas tm
kombinasyonlar iin oluabilecek deer aralklarn gstermektedir.

Tip Bit uzunluu Deer aral


short 1 0 veya 1
short int 1 0 veya 1
int 8 0 ile 255 aras
char 8 0 ile 255 aras
unsigned 8 0 ile 255 aras
unsigned int 8 0 ile 255 aras
signed 8 -128 ile 127 aras
signed int 8 -128 ile 127 aras
long 16 0 ile 65536 aras
long int 16 0 ile 65536 aras
signed long 16 -32768 ile 32767 aras
float 32 3.4E-38 ile 3.4E+38 aras

NOT: Veri tipleri ve deer aralklar iin farkl C derleyici belgelerini okuyunuz.

C dili unsigned int, short int ve long int veri tipleri iin ksa yazml bir notasyonu da
desteklemektedir. Bu ifadeler yerine int ibaresi hi kullanlmadan, ksaca unsigned, short ve long
ifadeleri kullanlabilir. CPUnun aritmetik ilemleri daha kolay yapabilmesini salamak iin C
dili negatif deerleri 2ye tmleyen biiminde saklar. Bir saynn 2ye tmleyenini bulmak iin
her biti tersleyip sonuca 1 eklemek yeterlidir. rnein, iaretli 29 saysnn 2ye tmleyenini
bulmak iin:
00011101 = 29

29
11100010 tm bitleri tersle
1 = 1 ekle
11100011 -29

Yine bir rnek olarak uzun say tipinde olan 12000 deerini a deikenine atayalm. 12000in
onaltlk sistemdeki karl 2EE0 deeridir. Aadaki kod blou dk deerlikli kelimeyi
(E0), 11h yazmacna, yksek deerlikli kelimeyi (2E) ise 12h yazmacna yazacaktr.

long a = 12000;
main()
{
0007: MOVLW E0
0008: MOVWF 11
0009: MOVLW 2E
000A: MOVWF 12
}

ALITIRMA:

1. Aadaki ifadeyi farkl bir ekilde yazn

long int i;

2. aretli bir say ile iaretsiz bir saynn farkn anlamk iin aadaki program yazn. aretsiz
bir tamsay olan 35000 deeri iaretli tamsay formatnda -30536 eklinde yazlmaktadr.

main()
{
int i; /* iaretli tamsay */
unsigned int u; /* iaretsiz tamsay */
u=35000;
i=u;
printf(%d %u\n,i,u);
}

2.2 Deiken bildirimi

Deikenler temel olarak iki yerde bildirilebilirler: fonksiyonun iinde ya da dnda ve


tanmlandklar yere gre de srasyla yerel ya da global deiken adn alrlar. Deikenler
aada gsterildii gibi tanmlanrlar:

tip deiken_ad

Bu ifadede tip C dili tarafndan geerli bir veri tipi, deiken_ad ise deikene vereceimiz ad
temsil etmektedir.

30
Yerel deikenler (fonksiyonun iinde bildirilenler) sadece tanmladklar fonksiyon blou
ierisinde yer alan ifadelerce kullanlabilirler.

Yerel bir deikenin deerine bildirildikleri fonksiyonun dndaki fonksiyonlar iinde yer alan
ifadelerce eriilemez. Burada hatrlanmas gereken en nemli konu yerel deikenlerin bellekte
fonksiyon balatlrken yaratlp, fonksiyon sonlandnda silindikleridir. Ayn zamanda yerel
deikenlerin bildirimi fonksiyonun balangcnda, ifadelerden nce yaplmaldr.

Farkl fonksiyon bloklarnn ierisinde yer alan yerel deikenlerin ayn ismi almasna izin
verilmektedir. Aadaki rnei ele alalm:

void f2 (void)
{
int count;
for (count=0; count<10;count++)
printf(%d \n,count);
}

f1()
{
int count;
for (count=0;count<10;count++)
f2();
}

main()
{
f1();
return 0;
}

Bu program 0da 9a kadar olan saylar ekrana on kez yazdracaktr. Programn ileyii her iki
fonksiyonun iinde yer alan count deiken adndan etkilenmeyecektir.

te yandan global deikenler pek ok fonksiyon tarafndan kullanlabilirler. Global


deikenlerin kullanlacaklar tm fonksiyonlardan nce bildirilmeleri gerekmektedir. En
nemlisi, programn ileyii sona eresiye kadar bellekteki yerlerinden silinmezler.

Aadaki rnek global deikenlerin nasl kullanldna rnektir:

int max;
f1()
{
int i;
for (i=0;i<max;i++)
printf(%d \n,i);
}

31
main()
{
max=10;
f1();
return 0;
}

Bu rnekte hem main() hem de f1(), max deikenine referans vermektedir. main() fonksiyonu
max deikenine deer atamakta ve f1() fonksiyonu da max deerini for dngsnde
kullanmaktadr.

ALITIRMA:

1. Yerel ve global deiken arasndaki ana farkllklar nelerdir?


2. Hem yerel hem de global deikenler C dili ierisinde ayn ismi alabilirler. Aadaki program
yazn.

int count;

f1()
{
int count;
count=100;
printf(f1() fonksiyonundaki count degeri: %d\n, count);
}

main()
{
count=10;
f1();
printf(main() fonksiyonundaki count degeri: %d\n,count);
return 0;

main() ierisinde count deikenine yaplan referans global bir deikeni belirtmektedir. f1()
ierisinde ise count yerel deikeni global deiken deerini nne geerek kendi deerini
kullandrtmaktadr.
2.3 Deikene deer atanmas

u ana kadar sadece deikenlerin nasl bildirildiini grdk, fakat hi gerekten deer atamadk.
Deikenlere deer atanmas ilemi aslnda olduka basittir:

deiken_ad = deer;

32
Deikene deer atanmas da bir C dili ifadesi olduundan sonuna noktal virgl konmaldr. 100
deerinin bir tamsay deikenine atanmasna dair rnek aada verilmitir:

count = 100;

Burada 100 deerine sabit ad verilmektedir.

Deiken deerleri bildirimin yapld yerde atanabilir. Bu yntem zellikle programda


kullandnz deikenlerin ilk deerlerinin bilinmesi iin gvenli ve basit bir metoddur. rnein:

int a=10, b=0, c=0x23;

C dili pek ok farkl tipte sabit iermektedir. Karakter tipi bir sabit M rneinde olduu gibi
harfin trnak iareti iine yazlmas ile yazlr.

Tamsay tipinde bir deikene atama yaplrken tam saylar yazlr. Reel say tipindeki bir
deikene ise mutlaka ondalk iareti olan nokta kullanlarak atama yaplmaldr. rnein C
dilinde 100 deerinin reel bir say olduunu belirtmek iin 100.0 yazlmaldr.

Bir deiken ayn zamanda baka bir deikenin deerini de alabilir. Aadaki program bu
kullanm rneklemektedir:

main()
{
int i;
int j;
i=0;
j=i;
}

ALITIRMA:

1. count adnda bir tamsay deikenin tanmland bir program yazn. count deikenine 100
deerini atayn ve printf() komutu ile deeri ekrana yazdrn. Programn kts aadaki gibi
olmaldr:

count degiskeninin degeri : 100


2. Deiken adlar ch, f ve d olmak zere srasyla char, float ve double tipinde deikenin
tanmland bir program yaznz. Karakter tipindeki deikene R deerini, reel say tipindeki
deikene 50.5 deerini ve ift doruluklu say tipindeki deikene de 156.007 deerini atayn.
Bu deikenlerin deerlerini srasyla ekrana yazdrn. Programn ekrandaki grnts aadaki
gibi olmaldr:

ch degeri: R
f degeri: 50.5
d degeri: 156.007

33
2.4 Sral listeler (Enumeration)

C dilinde adlandrlm tamsay sabitleriyle yaratlm listeler kullanmak mmkndr. Bu


bildirime sralama ad verilir. Sralama ile yaratlm sabitler tamsaylarn kullanlmasna ihtiya
duyulan her yerde kullanlabilirler. Bir sralama bildiriminin genel yaps aadaki gibidir:

enum ad {sral liste} deiken(ler);

Deiken listesi sralamann seeneksel bir elemandr. Sralama deikenleri sadece sral listede
belirtilmi olan deerleri kullanabilirler. rnein aadaki ifadede:

enum renk_tipi {kirmizi, yesil, sari} renk;

renk deikenine program ierisinde sadece kirmizi, yesil ya da sari deeri atanabilir. (rnek:
renk=kirmizi;)

Derleyici ilk giriin deeri 0 olmak zere sral listedeki her elemana tamsay deerler
atayacaktr. Her bir elemann deeri bir nceki elemandan bir byktr. Bu durumda yukardaki
rnek iin kirmizinin deeri 0, yesilin deeri 1 ve sarinin deeri 2 olacaktr.Varsaylan deer
olarak atanan bu deerlerin zerine istenildii taktirde baka deerler de atanabilir. Bu rnekte de
bu yntem gsterilmitir:

enum renk_tipi {kirmizi, yesil=9, sari} renk;

Bu durumda ise kirmiziya 0, yesile 9, sariya ise 10 deeri atanr.

Sral liste bir kez tanmland taktirde listenin ad programn ilerleyen noktalarnda yeni
deikenler yaratmak zere kullanlabilir. rnein benim_rengim deikeni renk_tipi sral listesi
ile aadaki ekilde tanmlanr.

enum renk_tipi benim_rengim;

Bir deiken ayn zamanda baka bir deerle de snanabilir:

if (renk==meyve)
// yapilacak islemler

Aslnda en temelde sral listeler kodun yazmn kolaylatrr. Bir deeri bir deikene atamak
yerine deerin anlamn aklamak iin sral listeler kullanlabilir.

ALITIRMA:

1. PIC17CXX ailesi iin bir sral liste yaratn.


2. Banknot halinde bulunan paralara ait bir sral liste yaratn.
3. Aadaki kod paras doru mudur? Neden?

enum {PIC16C51, PIC16C52, PIC16C53} cihaz;

34
cihaz=PIC16C52;
printf(Ilk bulunan PIC cihazi: %s\n,cihaz);

2.5 typedef komutu

typedef ifadesi ile varolan tipler aracl ile yeni tipler yaratlarak tanmlanr. Yaps aadaki
gibidir:

typedef eski_isim yeni_isim

Bu noktadan sonra yeni yaratlan adla deiken bildirimi yaplabilir. rnein, aadaki program
blou iaretli char tipi deiken yerine yeni yaratlm olan smallint tipi bir deiken
kullanmaktadr.

typedef signed char smallint;


main()
{
smallint i;
for (i=0;i<10;i++)
printf(%d \n,i);
}

typedef ifadesini kullanrken iki nokta akldan kmamaldr. lki, typedef ifadesi varolan orijinal
ismi ya da tipi yok etmez; nceki rnekte signed char tipi hala daha geerli ve var olan bir tiptir.
kincisi ise birden fazla typedef ifadesi ile ayn orijinal tipi temel alarak ok sayda yeni adda tip
yaratlabilir.

typedef ifadesi genellikle iki sebepten dolay kullanlr. Birincisi tanabilir programlar yazmak.
Eer yazdnz program hem 16-bitlik hem de 32-bitlik tamsay tipini kullanan makinelerde
alacaksa sadece 16-bitlik tamsay tipinin kullanldndan emin olmak istersiniz. Program 16-
bitlik bir makine iin yazlrken

typedef int myint;

eklinde yazlan ifade ile tm tamsaylar 16-bitlik myint tipinde tanmlanm olur. Bundan sonra
32-bitlik ilemciler iin program derlemeden nce yukardaki satr aadaki hale evrilmelidir.
typedef short int myint;
Bu sayede myint olarak bildirilen tm deikenler 16-bitlik olmu olur.

typedef ifadesinin kullanlmasnn ikinci nedeni ise koddaki okunabilirlii arttrmaktr. Eer
kodunuz sayma ilemi iin pek ok deiken kullanyorsa typedef ifadesi kullanlarak btn
deikenlerin ayn tipten bildirilmesini salayabilirsiniz.

typedef int sayac;

Bu sayede sizin yazdnz kodu okuyan baka bir kii sayac olarak bildirilen deikenin program
ierisinde saya olarak kullanldn anlayabilir.

35
ALITIRMA:

1. unsigned long tipi deiken iin UL adnda yeni bir tip yaratn. Bir program ierisinde bu
tanm gerekletirdikten sonra bu yeni tipe ait bildirimler yapn ve bu deerleri ekrana yazdrn.
2. Aadaki kod paras geerli ve doru mudur?

typedef int yukseklik;


typedef yukseklik uzunluk;
typedef uzunluk derinlik;
derinlik d;

2.6 Tip dnmleri

C dili programcya farkl veri tiplerini bir ifade ierisinde hep beraber kullanabilme olana
sunar. rnek olarak aadaki kod blounu inceleyin:

char ch=0;
int i=15;
float f=25.6;
double sonuc;

sonuc=ch*i/f;

Farkl veri tiplerinin idaresi, derleyiciye aradaki farklar ayrt edebilmesi iin ok kat kurallar
eliinde verilmitir. Kurallarn ilk ksm tip ykseltmesidir. C derleyicisi bir ifadeyi iletirken
char ya da short int tipindeki bir deikeni otomatik olarak int tipi deikene evirir. Tip
ykseltmesi sadece ifade iletilirken geerli olup deikenin kendisi aslnda bellekte daha fazla
yer kaplamaz.

Otomatik olarak yaplan tip ykseltmelerine deindiimize gre artk biliyoruz ki C derleyicisi
program iletirken tm deikenleri olas en yksek deiken tipine ykseltir. Bu ilem belirli bir
sistem erevesinde gereklemektedir. Aadaki algoritma tip dnmlerini gstermektedir:

EER ilk ifade long double tipinde ise


BU DURUMDA ikinci ifade de long double tipine evrilir
EER ilk ifade double tipinde ise
BU DURUMDA ikinci ifade de double tipine evrilir
EER ilk ifade float tipinde ise
BU DURUMDA ikinci ifade de float tipine evrilir
EER ilk ifade unsigned long tipinde ise
BU DURUMDA ikinci ifade de unsigned long tipine evrilir
EER ilk ifade long tipinde ise
BU DURUMDA ikinci ifade de long tipine evrilir
EER ilk ifade unsigned tipinde ise
BU DURUMDA ikinci ifade de unsigned tipine evrilir

36
u koullar altnda bir nceki rnee dnerek ne tr ykseltmeler ve dnmler yapldn
grelim. lk olarak ch deikeni int tipine ykseltilir. Yaplan ilk ilem ch*i ilemi olduundan ve
halihazrda ch, int tipine ykseltildiinden yeni bir dnm yaplmaz ve deer hesaplanr. Bir
sonraki ilem ch*i arpmnn f deikenine blmdr. Algoritmaya gre eer bir ifade float
tipinde ise dier ifade de float tipine evrilmelidir. Bu nedenle ch*i arpmndan elde edilen
deer float tipie evrilir ve elde edilen sonu f deikenine blnr. Son olarak float tipinde elde
edilen ch*i/f deeri double tipinde olan sonuc deikeninde saklanabilmek zere double tipine
dntrlr.

Baz durumlarda derleyicinin yapaca tip dnmlerine gvenmek yerine kendiniz aada
belirtilen ekilde tip dnm yapabilirsiniz:

(tip) deger

Bu ileme tip dnm denir ve deikende geici bir deiiklie yol aar. Bu ifadede type
geerli bir C dili tipi ve deger deikeni de geerli bir sabit ya da deiken olmaldr. Aadaki
kod paras reel bir saynn tamsay ksmnn nasl yazdrlabileceini gstermektedir:

float f;
f=100.2;
printf(%d \n,(int)f);

Yukardaki kod paras iletildiine ekrana 100 deeri yazlacaktr. Eer 8-bitlik iki tamsaynn
arpm yine 8-bitlik bir deikende saklanacak ve bu arpm deeri long tipinde bir deikene
atanmadan hemen ncesine kadar yine 8-bit olarak saklanacaktr.

int a=250, b=10;


long c;
c=a*b;

Yukardaki ilemin sonucu yanl bir ekilde 196 olarak hesaplanacaktr. Zira sonucu doru
alabilmek iin uzun say tipinde bir deikene ihtiyacmz vardr. Bu yzden en azndan bir
deerin ilemden nce long olarak tanmlanmas ya da tip dnm yaplmas gerekmektedir.

c=(long) a*b;

Yukardaki ilemin sonucu ise bize doru sonu olan 2500 verecektir nk ilem yaplmadan
nce daha geni bir deer aralna sahip olan long tipine dnm yaplmtr.

2.7 Deiken saklama snf

C dilinde her deiken ve fonksiyonun tip ve saklama snf olmak zere iki nitelii vardr. Tip
dediimiz ey daha nce belirttiimiz char, int vb. yaplardr. Bunun yannda automatic
(otomatik), external (harici), static (duraan), ve register (yazma) olmak zere drt adet de
saklama snf mevcuttur. Bu snflarn C dilinde yazmlar aadaki gibidir:

auto extern static register

37
Auto

Herhangi bir fonksiyon ierisinde bildirilen deikenler varsaylan nitelik olarak auto alrlar. Bu
yzden

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

ifadesi

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

ifadesi ile ayn anlam tamaktadr.

Ne zaman bir kod blou yazlsa derleyici kod dahilinde belirtilen deienler iin hafza
(RAM)de belirli yer ayrr. Bu yerel kod blou iin kullanlan RAM adresleri baka kod bloklar
tarafndan da kullanlabilir.

main()
{
char c=0;
int a=1, b=3, c=5;
0007: CLRF 0E-0Eh yazmac c deerine ayrlr
0008: MOVLW 01-wye 1 ykle
0009: MOVWF 0F-a deikenine atanan yazmac w deeri ile ykle
000A: MOVLW 03-wye 3 ykle
000B: MOVWF 10-b deikenine atanan yazmac w deeri ile ykle
000C: MOVLW 05-wye 5 ykle
000D: MOVWF 11-c deikenine atanan yazmac w deeri ile ykle
}

Extern

extern anahtar kelimesi harici bir balants sz konusu olan bir deiken ya da fonksiyon
tanmlar. Bunun anlam fonksiyon ya da deikenin tanmland dosya dndaki dosyalar iin de
grlebilir olmasdr. CCS C dili ierisinde herhangi bir fonksiyonu yoktur.

Static

static deiken snf aksi belirtilmedii mddete global olarak eriilebilen ve ilk deer olarak 0
deeri atanm olan aktif deikenler yaratr.

38
void test()
{
char x, y, z;
static int sayac=4;
printf(sayac= %d \n,++count);
}

Yukardaki rnekte sayac deikeni bir kere tanmlanmakta ve sfrlanmakta olup fonksiyonun
her armnda deeri artarak ekrana yazdrlmaktadr.

Register

register deiken snf, sklkla kullanlan deikenlerin yksek hzda alan bellek birimlerinde
saklanmasnn avantaj getirdii byk lekli sistemler iin gelitirilen yazlmlar iin
yaratlmtr. Sadece derleyiciye bilgi amal kullanlabilir. CCS C dilinde etkin bir kullanm
yoktur.

39
Fonksiyonlar
Fonksiyonlar, C dilin temel yap bloklardr. Tm ifadeler, fonksiyonlarn iinde olmal. Bir
fonksiyondan bir tartmay nasl alnaca nasl fonksiyonlara gei tartmalar verecei biz
diskler olduu bu ksmda.
Bu ksmda tartlan konular:

Fonksiyonlara tartmalar geme


Fonksiyonlardan tartmalar geri dnme
Prototstringleri ileyin
Klasik ve modern fonksiyon tanmlar

3.1 Fonksiyonlar

nceki ksmlarda , biz, ana bir programdan arlm olan fonksiyonlarn ok rneini grdk.
rnein

main()
{
f1();
}
int f1()
{
return 1;
}

Realitede , bu program, bir hata veya , , bir uyary en azndan retmelidir.Sebep, o fonksiyon
f1()dir. fade edilmi olmal veya o kullanlan fonksiyon nce, tanmladr. sadece,
deikenlerden oluur.

Siz, zaten standart bir C fonksiyonu kullanyorsanzn, fonksiyon hakknda derleyici


bilgilendirilen programnzn banda balk dosyas bulunmaldr. Eer siz bir veya da ha fazla
fonksiyon kullanyorsanz bu hatay dzeltmek iin iki yol, vardr. Birisi, sonraki ksmda
anlatlan fonksiyon prototstringlerini kullanmaktr. Dieri, bu gibi programnz yeniden
dzenlemektir:

int f1()
{
return 1;
}
main()
{
f1();
}

Bir hata, olumutur. nk fonksiyon f1() olmayacaktr. nk main()da arlan komuttan


nce, tanmlanmaldr.

40
3.2 Fonksiyon zellikleri
Fonksiyonda dndrlen ne tstring deer olduunu derleyiceye uyarlanmasnda kullanlan iki
metot vardr.
Genel formu:

type function_name();

rnein , ifade sum() derleyicisi o fonksiyonu syleyecektir. sum()da dnler bir tam say
olur. Bir fonksiyonun dn deeri hakknda derleyiciyi bilgilendirmek iin gereken yol,
fonksiyon prototibidir.Bir fonksiyon prototibin deerini deil yalnzca, fonksiyonun dn
deerini verir , fakat, fonksiyonun, kabul ettii numara ve tartmalarn tstringini tanmlar.
Prototstring, fonksiyon yapsyla tam uyumaldr.

Prototstringler, bir fonksiyona ve fonksiyon tanm geen bilgisayar programcsna argman


arasnda herhangi bir talimata aykr tstring dnmeleri bildirme tarafndan programda buglar
tanmlamak iin yardm eder. Eer fonksiyon tanmnda belirttii gibi bir fonksiyona gnderilen
argman numaras olursa o hatta raporlar Ayn deildir.

Bir fonksiyon prototibi iin genel format, burada gsterilir:

type function_name(type var1, type var2, type var3);

rnek zerinde her bir deikenin tstringi farkl olabilir. Bir fonksiyon prototibinin bir rnei,
bu program iine alr. Fonksiyon, uzunluk tarafndan , genilik ve ykseklik tanmlanan hacimi
hesaplar.

int volume(int s1, int s2, int s3);


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

Dnn, bir sabidin yerine bir deyim veya deikeni kulland, farkna varn.

Prototstringlerin nemi, bizim, imdiye kadar kullandmz kk programlar ile anlalamaz.


Bununla beraber hatalarn gidermedeki prototstringlerin nemi programlarn bykl
izgilerin ok binine birka izgiden byd gibi, aktr.

Altrma
1.) Hatalar fonksiyon hacimine drt parametreyi gndermek iin derleyici tarafndan ,
programn zerinde deimeyi nasl yakalad gstermek:

41
vol = volume(5,7,12,15)

2.) Aadaki program dorumu? Niin deil?

double myfunc(void)

void main()
{
printf(%f\n,myfunc(10.2));
}
double myfunc(double num)
{
return num/2.0;
}

3.3 Void
Bir istisna bir fonksiyonun veya d gecen herhangi bir parametreleri yok deilken, Bu fonksiyon
iln edilen olur:
void nothing (void)

Bunun bir rnei;

double pi(void) //fonksiyonun tanmlanmas


{ //atamadan ge
return 3.1415926536; //fakat pi ile dndr
}
main()
{
double pi_val;
pi_val = pi(); //pi deerini ar
printf(%d\n,pi_val);
}

3.4 Fonksiyon Argmanlarnn Kullanm

Bir fonksiyon argman fonsiyon arldnda fonksiyona atanan bir deerdir.Fonksiyonlara


atanan baz argmanlar sfrdan izin verir.Bir fonksiyonun argman saylar derleyiciiye bal
kabul edilebilir,fakat bir fonksiyonun ANSI Standartlar en az 31 argman kabul edilebilir.

Bir fonksiyon tanmlandnda, zel deikenler parametreleri almay tanmlamaldr.Bu zel


deikenler biimsel parametreler gibi tanmlanr.Parametreler fonksiyon isimini takip eden
parantezler arasnda tanmlanr.rnein, fonksiyon arldnda fonksiyona gnderilen iki
tamsaynn toplamn aada hesaplar ve gsterir.

42
void sum(int a, int b)
{
printf(%d\n,a+b);
}
Bir programda fonksiyonu nasl arabileceimize bir rnek;

void sum(int a, int b); //This is a function prototype


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

sum() fonksiyonu arldnda, derleyici a ve b deikenleri iindeki herbir argman


kopyalar.Bu ,a ve b biimsel parametre deikenleri ve argmanlarn (1,10,15,6,100,25) aran
fonksiyona deer atamay hatrlatmak nemlidir.

Fonksiyonlar iki yolla argman atayabilirler.Birinci yol deer ile arma denebilir.Bu metod
fonksiyonun biimsel parametresi iindeki bir argmann deerini kopyalayabilir.Herhangi bir
deime arma rutinin asl deerine etki etmeyen biimsel parametreleri oluturmaz.kinci yol
referans ile arma denebilir.Bu metod da, argmann adresi fonksiyonun biimsel parametresi
iine kopyalanr.Bu fonksiyon iinde,biimsel parametreler arma rutinindeki aktif
deikenlere ulalmasnda kullanlr.Bu deiikliklerin anlam biimsel parametre kullanm ile
deienlere etki edebilir.eratiler blmnde bu konuyu tartacaz.imdilik, bir fonksiyona
argman atadmzda sadece deer tarafndan arlmay kullanacaz.

Altrma:

1. Bir deer argmann alan ve ekrana bir deer yazdran bir program yaznz.
2. Bu programdaki yanllk nedir?

print_it(int num)
{
printf(%d\n,num);
}

main()
{

43
print_it(156.7);
}

3.5 Deerleri Dndren Fonksiyonlarn Kullanm

Cdeki herhangi bir fonksiyon arma rutinine bir deer dndrtebilir.Tipik olarak,fonksiyon bir
eitliin sa tarafna (=) iareti koyulur.dnen deer daha nceki ifadelerde kullanldndan
tekrar gerek duyulmaz,fakat bir printf() deyiminde kullanlabilir.Bir deeri dndren bir
fonksiyonu derleyiciye anlatmak iin genel format:

fonksiyonismi_tipi(biimsel parametreler)
{
<deyimler>
dnen deer;
}

type, fonksiyonun dnen deerinin veri tipini zellikle belirttii yerlerdir.bir fonksiyon bir diziyi
ayran herhengi bir veri tipini dndrebilir.Eer veri tipi belirtilmemise, C derleyicisi
fonksiyonun bir tamsay evirdiini varsayar. Fonksiyonun bir deer dndrmyorsa,ANSI C
standard voide dnen fonksiyonu belirtir. Bu ak bir ekilde fonksiyonun bir deer
dndrmediini derleyiciye anlatr.Bu rnek deer dndren bir fonksiyonun kullanld tipik
bir rnektir:

#include <math.h>

main()
{
double result;
result = sqrt(16.0);
printf(%f\n,result);
}

Bu fonksiyon kayan bir sayy dndren sqrt() fonksiyonunu arr. Bu say result deikenine
atand.Balk dosyas math.hnin ierdiine dikkat edin nk derleyici tarafndan kullanldna
dair bilgi iermektedir.

Atayabilecei deiken veri tipi ile fonksiyonun dndrd veri tipini uyuturmak
nemlidir.Benzeri fonksiyonlara gnderdiiniz argmanlar iin de geerlidir.

yleyse, Bir fonksiyondan bir deere nasl dnebilirsiniz? Genel formu:

return deiken_ismi;

deiken_ismi bir sabit, deiken veya herhangi bir deere dnme gibi veri tipine sahip geerli C
deyimidir. Aadaki rnek fonksiyonlarn tiplerini gstermektedir:

func();

44
sum(int a, int b);
main()
{
int num;
num = func();
printf(%d\n, num);
num = sum(5,127);
printf(%d\n,num);
}
func()
{
return 6;
}
sum(int a, int b)
{
int result;
result = a + b;
return result;
}

Not alnacak nemli birey de, bir dnme deyimi ile kar karya gelme,fonksiyon acilen
arma rutinine dner.Dnme ileminin olmamasndan sonra herhengi bir deyim yoktur.Bir
fonksiyonun dn deeri bir deyimde kullanma veya bir deiken atamay gerektirmez,bununla
birlikte,eer kaybedilen deer deil ise.

Altrma :

1. 1 ile 100 arasnda bir tamsay kabul eden ve karesini dndren bir fonksiyon yazn.
2. Aadaki fonksiyonun yanl nedir?

main()
{
double result;
result = f1();
printf(%f\n,result);
}
int f1()
{
return 60;
}

3.6 Klasik ve modern fonksiyon tanmlar

45
C 'n orijinal versiyonu, resmi parametre tanmnn farkl bir yntemini kulland. Bu klasik form
aada gsterilir:

type function_name(var1,var2,...varn)
type var1;
type var2;
.
type varn;
{
<statements>
}

Tanmn , iki ayr ekilde tanml olduunun farkna varn. Parametrelerin yalnzca adlar, i
parantezi ierilir. Parantez verisi tstringlerinin dnda ve resmi parametre adlar, belirtilir.

Modern form , , bizim, nceki rneklerde kullanyor olduumuz, formu verir.

type function_name(type var 1,...type var n)

Fonksiyon tanmnn bu tstringinde , her iki veri tstringleri ve resmi parametre adlar, parantez
arasnda belirtilir. ANSI C standart, fonksiyon tanmlarnn her ikisinide hesaba katar.

Ama, daha eski C programlaryla uyumluluu srdrmektir. Harfi harfine var. Eer siz kodun
bir parasnda klasik formu grrseniz, endielenme; C derleyiciniz, onu ele alan, yapabilen
olur. lerleme yaz kodu iken, modern formu kullanmalsnz.

Altrma:
1. Bir fonksiyon prototibi ve, onu kullanyor olan yararlar nedir?
2. Modern forma fonksiyon tanmlar iin klasik bir formu kullanyor olan bu programa evirir.

void main(void)
{
printf(area = %d\n, area(10,15));
}
area(1,w)
int 1,w
{
return 1*w;
}

46
3.7 Sabit String Atama

nk PICmicroMCU'un, ROM eriimde snrlamalar var , sabit stringleri, olaan tavrda


ilemeden gecilen olmaz. CCS C derleyici, standart d bir tavrda bu duruma ele alr.

O zaman eer bir sabit stringi gecilen olsaydnn, stringte her karakter iin arlan yalnzca bir
karakter parametresi fonksiyonu izin veren bir fonksiyona. rnein:

void lcd_putc(char c)
{
.....
}
lcd_putc(abcd);

Ayn ekilde;

lcd_putc(a);
lcd_putc(b);
lcd_putc(c);
lcd_putc(d);

4.1 Aritmetik Operatrler

C dili toplama,karma,arpma,blme,modl aritetik operatrlerini tayin eder.

+ toplama
- kartma
* arpma
/ blme
% modl
+, -, * ve / operatrleri herhangi bir veri tipiyle kullanlm olabilir.Modl operatr sadece
integer larda kullanlr.Modl operatr blmden elde edilen kalan verir.
Bu operatrn virglden sonraki saylarda bi anlam yoktur.
Bu operatr iki yol kullanr,birincisi bir kartma operatr olur,ikincisi bir numarann iretine
ters evirir.
Aagdaki rnekler bu iki yolu aklar.
a = a b ; kartma
a = -a ; ay tersleme
Aritmetik operatrler baz sabitlerin birleimi ve/veya deiiminde kullanlrlar.
rnein;
result = count 163;
C aritmetik operatrlerini kullanyor olunca, size baz ksayollar verir.
nceki rneklerin birisi olan; a = a b; a -=b; eklinde yazlm olabilr.Bu metod +,-.* ve /
operatrlerinde kullanlr.

a*=b eiti a=a*b dir.


a/=b a=a/b

47
a+=b a=a+b
a-=b a=a-b
a%=b a=a%b
a<<=b a=a<<b
a>>=b a=a>>b
a&=b a=a&b
a|=b a=a|b
a^=b a=a^b
C kodunu ve assemble kodunu aritmetik ilemleri karlatracak olursak;
int a,b,c,;

a = b + c;

0007: MOVF 0F,W ; b yi ykle


0008: ADDWF 10,W ; cye byi ekle
0009: MOVWF 0E ; ann iine kaydet

0007: MOVF 0F,W ; b yi ykle


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

Problemlerin zm iin assemblern anlaslr biimde olmas nemlidir.

a = b;

0007: MOVF 0F,W ; byi ykle


0008: MOVWF 0E ; ann iine kaydet
eer
a==b;

0007: MOVF 0F,W ; byi ykle


0008: SUBWF 0E,F ; adan kar
0009: BTFSC 03,2 ; sfrm test et
000A: GOTO 00D ;

4.2 likisel Operatrler


likisel operatrler iki deer arasnda karlatrma yapan operatrlerdir.bu nedenle bu
operatrlere karlatrma operatrleride denir.

> byktr operatr


>= byktr veya eittir operatr
< kktr operatr

48
<= kktr veya eittir operatr
== eit eittir operatr
!= eit deildir operatr

likisel operatrler hakknda dikkat edilecek ey, bir kyasn o sonucu


Her zaman 0 mi veya 1 mi dir.
Aadaki rnekler ilikisel operatrlerle baz deyimleri gsterir.
var > 15; eer var 15 ten kk veya eitse, sonu 0 dr.
(yanl)
var != 15; eer var 15 ten byk veya kkse,sonu 1 dir.
(doru)

RNEKLER:

1)Aagdaki rnege benzer deiik ilikisel operatrler yazn.

count != 0
2)Aagdaki ifade ne zaman dogru yada yanl olur? Niin?

4.3 Mantksal Operatrler


Mantksal operatrler, temel mantksal operasyonlar ve , veya , ve deili destekler.
Tekrar bu operatrler operandlarn dogru(true) ya da yanl(false) olarak yorumladktan sonra
ileme sokarlar.

VE VEYA DEL

p q p&&q p||q !p

0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0
Mantksal ve ilikisel operatrlerin ileme soktuklar operandlarn ve ilem sonunda rettikleri
deerler int trnden 1(dogru) ya da 0(yanl) saylardr.
Aagdaki rnekte bu iki operatrn birleimi grlmektedir:

count>max || ! (max==57) && var>=0

liskisel ve mantksal operatrler farkl C blmnde kullanlmaktadr.

RNEKLER:

1)likisel ve mantksal operatrn birlikte kullanldg ifadeler yaznz.


count == 0

resutl <= 5

49
4.4 Kaydrma Operatrleri

C numaralarda bit bit ilem yapan alt zel operatr ierir.Bu kaydrma operatrleri sadece int ve
char data tipinde kullanlr.

Bu kaydrma operatrleri:

& Bit VE operatr


| Bit VEYA operatr
^ Bit zel veya operatr
~ Bit deil operatr
>> Saa teleme operatr
<< Sola teleme operatr

Kaydrma operatlerinin genel format adadr:

Deiken << teleme says (sola kaydrma)

Deiken >> teleme says (saa kaydrma)

Cde sola ve saa teleme yapmak iin iki ayr bit operatr bulunur.teleme ilemleri zellikle
bitlerin say ierisindeki pozisyonlarn deitirmek amacyla kullanlmaktadr.Cdeki iki
teleleme operatr de iki operand alr.Dier bit ilemlerinde olduu gibi teleme ilemlerinde
ileme giren operandlar deimez,ilem sonucunu baka bir deikene atanmas gerekir.

Sola teleme ileminde btn bitler teleme says kadar sola kaydrlr.Kaydrma ilemi sonunda
en sadaki bit srekli sfrla beslenir,en soldaki bit ise kaybolur.
Kaydrma operatr ile ilgili rnekler:

AND OR
00000101 (5) 00000101 (5)
& 00000110 (6) | 00000110 (6)
---------------- ----------------
00000100 (4) 00000111 (7)

XOR NOT (ones compliment)


00000101 (5) ~ 00000101 (5)
^ 00000110 (6) ----------------
---------------- 11111010 (250)
00000011 (3)

LEFT SHIFT RIGHT SHIFT

50
00000101 (5) ~ 00000101 (5)
<< 2 >> 2
---------------- ----------------
= 00010100 (20) 00000001 (1)

a = b | c;
Basla
0007: MOVF 0F,W ; byi ykle
0008: IORWF 10,W ; inclusive or with c
0009: MOVWF 0E ; ann iine kaydet

a = b & c;
Basla
0007: MOVF 0F,W ; byi ykle
0008: ANDWF 10,W ; fonksiyonu c ile VE le
0009: MOVWF 0E ; ann iine kaydet

a = b >> 3;
Basla
0007: MOVF 0F,W ; byi ykle
0008: MOVWF 0E ; ann iine ykle
0009: RRF 0E,F ; ierii ters evir
000A: RRF 0E,F ; saa
000B: RRF 0E,F ; kez
000C: MOVLW 1F ; ierii maskele
000D: ANDWF 0E,F ; a ile fi VE le

j = ~a;
Basla
0007: MOVF 0F,W ; b!yi ykle
0008: MOVWF 0E ; jnin iine kaydet
0009: COMF 0E,F ; jyi tersle
RNEKLER:

1) MSB bitini tersleyen program yaznz.

2) Char tipinde verileri ekranda binary olarak gsteren program yaznz.

4.5 Arttrma ve Azaltma Operatrleri

51
Artrma ve azaltma operatrleri Cnin en ok kullanlan operandlardr.Tek operand alrlar;nek
ya da sonek durumunda bulunabilirler.Artrma operatr deikenin ieriini 1 artrmak
iin,eksiltme operatrde 1 azaltmak iin kullanlr.

a = a+1; veya a = a-1;

a++; veya ++a; ikiside birbirinin tamamen aynsdr.Her ikiside a=a+1;anlamna gelir.

a--; veya --a; ikiside birbirinin tamamen aynsdr.Her ikiside a=a-1;anlamna gelir.

int j, a = 3;
0007: MOVLW 03
0008: MOVWF 0F ; register a tahsis et

j = ++a;
0009: INCF 0F,F ; a=4
000A: MOVF 0F,W ; wnn iine ykle
000B: MOVWF 0E ; wy jnin iine depola

j = a++;
000C: MOVF 0F,W ; a deikenini wnn iine ykle
000D: INCF 0F,F ; a=5
000E: MOVWF 0E ; j=4

NOT:
Bu format kullanmayn

a = a++;

MOVF 0E,W ; degikeni wnn iine ykle


INCF 0E,F ; deikeni artr
MOVWF 0E; artrlm degeri nceki degere geri ykle

Aagadaki rnek iki kullanmda aklamaktadr.


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

52
i = 10;
j = ++i;
printf(i = %d, j = %d\n,i,j);
}

Birinci printf() ifadesinde iye 11 jye 10 yazlr.ikinci printf() ifadesinde i ve jye 11 yazlr.

Hepsinin karm

sum = a+b++ sum = a+b b = b+1


sum = a+b-- sum = a+b b = b-1
sum = a+ ++b b = b+1 sum = a+b
sum = a+ -b b = b-1 sum = a+b

RNEK:
1)
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)Programn sonunda a ve b degerleri ne olur?

a = 0;
b = 0;
a = ++a + b++;
a++;
b++;
b = -a + ++b;

4.6 Operatrlerde stnlk

C derleyicisinde hangi operatrn ilem yapma stnl olduguna baklr.rnein programda


a+b*c eklinde bir ifadeye rastladnz,hangi operatr ilk olacak?

Operatrlerde ncelik rnek

1 () ++ -- (a+b)/c parantez

2 & * + - ~ ! ++ -- a=-b art/eksi/deil/artma/azaltma

53
3 * / % a%b arpma/blme/mod

4 + - a+b toplama/ckarma

5 << >> a=b>>c saga ve sola kaydrma

6 <> <= >= a>=b byk/kk/eittir

7 == != a= =b

8 & a=b&c Bit ve

9 ^ a=b^c Bit zel veya

10 | a=b|c Bit veya

11 && a=b&&c LOjik ve

12 || a=b||c Lojik veya

13 = *= /= %= += -= <<= >>= a+=b atamalar

$= ^= |=

Bu operatrler bazen iimize yetmeyebilir ama zlmeyin, sonradan yetecek.

RNEKLER:

1.) Kodun sonunda a ve b degerleri ne olur?

int a=0,b=0;
a = 6 8+3b++;
b += -a*2+3*4;

54
BLM 5

5.1 if Komutu

if komutu koullu bir komuttur.if dizisini oluturan if koulu gerekleince sonu olarak koulun
belirttii ilem gerekleir.Eer sfr deilse deer doru ama sfrsa deer yanltr. Basit
format:

if (koul) NOT: if koulundan sonra ; kullanlmaz.


ifade;

fade mantkl bir C ifadesi olmaldr. if , ifadeyi deerlendirir eer doruysa koulu
gerekletirir , doru deilse program koulsuz devam eder. if ile ilgili basit bir rnek verelim:

if(num>0)
printf(Numara positif\n);

Bu rnek ilikili oparatrlerin program kontrol eden koullarla nasl kullanldn


gstermektedir.if koulu kod dizilerini yrtmek iinde kullanlr.
Genel format:

if (koul)
{
.
ifade;
.
}

Balar kod dizinsini kuatmak iin kullanlr.Eer ifade doru ise kodu balarn arasnda
gerekletirir. if ve kod dizisine rnek verelim;

if (sayi<0)
{
sayi= 0;
printf(sayi dustu\n);
}
or if (TestMode ==1)
{
.. parametreler yazlr
}

Dier if komutu iinde kullanlan karlatrclar;

x == y x ile y eit
x != y x ile y eit deil
x > y x byktr yden

55
x< y x kktr yden
x <= y x kk eittir yye
x >= y x byk eittir yye
x && y lojik AND
x||y lojik OR

Assemblera deitirilmi fonksiyon rnei;

int j, a=3;
0007: MOVLW 03 ; a y 3e ykle
0008: MOVLF 0F
if (j ==2)
0009: MOWLW 02 ; wy 2ye ykle
000A: SUBWF 0E,W ; j ile test et
000B: BTFSS 03,2 ; sfrsa atla
000C: GOTO 00F
{
j = a;
000D: MOVF 0F,W ;sfrsa o zaman
000E: MOVWF 0E ;jnin iine ay ykle
}

ALITIRMA:

1. Bu ifadele sonularndan hangisi doru deerdir?

a. 0
b. 1
c. -1
d. 5*5<25
e. 1==1

2. yle bir fonksiyon yazn ki girilen saynn tek mi ift mi olduunu seebilsin.Eer say
ift ise 0 sonucunu versin ama say tek ise 1 sonucunu versin.

5.2 if else Komutu

Eer iki dizi komutunuz varsa ve koula gre birini yrtmek istiyorsanz bunu nasl yapardnz?
te cevab if- else komutudur. Eer koul doru ise ilk ifade gerekleir, eer koul yanl ise
ikinci ifade gerekleir.if komutu genelde else ile birlikte kullanlr.if- else nin genel kullanm;

if (koul)

ifade1;

56
else

ifade2;

Kod dizilerinde if-else format yledir;

if (koul)
{
.
ifade;
.
}

else
{
.
ifade;
.
}

Kark sistemlerde yani birok ifadenin bulunduu sistemlerde if else seici olarak tek bir ifadeyi
gerekletirebilir.Aada kk bir rnek bulunmaktadr;

if (num<0)
printf(Numara negatif.\n);

else
printf(Numara pozitif.\n);

Else ilave etmek bize iki ynde karar yolu salamaktadr.if- else ayn zamanda birden ok
koullarda da kolaylk salamakta ve uygunluk gstermektedir. Bunun genel kullanm;

if (koul1)

{
.
ifade(s)
.
}

else if(koul2)
{
.
ifade(s)

57
.
}

else
{
.
ifade(s)
.
}

Burada farkl koullar deerlendirilir ve hangi koul salanyorsa, o koulun kod dizisi
seilir.Bunu daha iyi aklamak iin aada basit bir rnek verelim;

if (num ==1)
printf ( 1 says\n);

else if (num ==2)


printf(2 says\n);

else if (num==3);
printf(3 says\n);
else
printf(say yok\n);
NOT: if koulunda tek ift kyaslamalara dikkat edilmelidir. Koul iinde ift kyaslama
kullanlr (&& , == ,|| ). Eer bu komutlarda tek kyaslama kullanlrsa fonksiyon bunu
reddedebilir. Bu genel olarak yaplan bir hatadr ve compile ederken anlalmayabilir ama
operasyon baarsz olur.

ALITIRMA:

1.Aadaki kod paralar doru yazlm mdr?

if (sayi>20)

printf (sayi 20den buyuktur);


sayi- ;
}

2.yle bir program yazn ki her iki lira da, 5lira da, 10lira da, 20lira da, 50 lira da
yazdrsn.Sadece geerli deiken deerleri 1,5,10,25,50 ve 100.

5.3 ? Oparatr

58
? komutu genellikle if else yapsnda kullanlr.u ekilde;

(ifade1) ? (ifade2) : (ifade3) ;

ifade? geerli C dizisidir. lk olarak ifade1 deerlendirilir ve eer sonu doru ise sonra ifade2
deerlendirilir. Eer sonu yanl ise ifade3 deerlendirilir. Alttaki bununla ilgili rnek
bulunmaktadr;

int i,j;
i = j;
i ? j=0 : j=1; or j=i ? 0:1;

i sfrdan farkl veya 1 olana kadar j=0 koulu gerekleir. Bundan farkl if koulunda ? oparatr
deere dndrr.rnek olarak;

i = (i<20) ? i+1 : 10;

20 ve st deilse artacam sonra 10 olarak belirlenecek.

5.4 for Dngs

Cde kullanlan dng eidinden biri for dngsdr. Eer tekrarlanmas gereken komut
yada komutlar varsa bunu for dngsyle kolayca yapabiliriz. Kullandmz bu for dngs
dier programlama dillerinde kullanlan (BASIC veya Pascal gibi ) for dngsyle benzerlik
gstermektedir.Genel kullanm yledir;

for (kurulum deeri ; test ; art )

Kurulum deeri sayc deikenin ilk deeridir. Bu sayc deikeni for dngsnden nce
tanmlanmaldr ve bu ksm for dngsnde balangta ve sadece bir kere kullanlr.Test
blmnde ncelikli her uygulama deerlendirilir.Bu blm daha ok dng sayc deerinin
doru yada yanl olma durumunu test eder. Eer test yanl karsa dng biter ve normal
programa devam edilir.Art blm ise sayc deerinin art durumunu gsterir.

For dngsne bir rnek;

void main(void)
{
int i;
for(i=0; i<10 ; i++)
printf( %d ,i)
printf(bitti);
}

59
Bu program 0dan 9a kadar olan saylar ekrana yazdrmaktadr. lk olarak sayc deeri olan
iye sfr deeri atanmaktadr. Daha sonra bu deer bir artar ve test blmnde doru mu yanl
m olduuna baklr yani 10dan kk olup olmama durumuna baklr.Eer doruysa bu deer
ekrana yazdrlr.Her ekrana yazdrmadan sonra sayc deeri bir arttrlr ve bu 10a kadar devam
eder.Sayc deeri 10a geldii anda dngden klr ve ekranda bitti yazs grnr.
nceki durumda grdk ki her dng bir arta balyd ve bu yzden test yanl karsa dng
uygulanamamaktayd. For dngsnde sadece art ile snfl deiliz.Aada eitli tiplerde for
dngleri mevcuttur;

for (sayi=100; sayi>0 ; sayi=sayi -1)


for (sayi=0 ; sayi<50 ; sayi+=5 )
for (sayi=1; sayi <10 && error == false ; sayi ++)

rneimiz assemblera evirince neler olduuna bakalm;

int h,a;
for (h=0 ; h!=10 ; h++ )

0007: CLRF 0E ; hyi temizle


0008: MOVLW 0A ; 10u ykle
0009: SUBWF 0E,W ; hden kar
000A: BTFSC 03,2 ; o iin test et
000B: GOTO 00F ; eer i=10sa dngden k
a++ ;
000C: INCF 0F,F ; ay arttr
000D: INCF 0E,F ; hyi arttr
000E: GOTO 008 ; tekrar dng

ALITIRMA:

1. Aada belirtilen for dngleri neler yapar?

for(i=1; ; i++)
for(sayi=1; sayi ; sayi ++)

2. Girilen btn saylarn faktrn alabilen bir program yaznz.

5.5 while Dngs

Cdeki bir dier dng while dngsdr.fade doru iken yani koul salandnda while
dngs komut dizinini tekrarlar.Aada while dng formatn grmektesiniz;

60
while (koul)
ifade;

veya

while(koul)
{
ifade;
}

Burada koul mantkl bir C ifadesi olmaldr.Koul deeri ncelikle tm kod dizininde kontrol
edilir.Bunun anlam eer koul salanmyorsa koul doru olduunda yaplmas gereken kod
dizini gereklememektedir.While dngsne bir rnek;

#include <16C74.H>
#use RS232 (Baud=9600, xmit-pit_c6, RCV=pin_c7)

void main(void)
{

char ch;
printf(Give me a q\n);
ch=getch();
while(ch!=q)
ch= getch ();
printf(got a q!\n);
}

Yukarda ki kod dizinine baktmzda ilk ifade de klavyeden harf girilir ve klavyeden girilen bu
harf program tarafndan okunarak deerlendirilir. Girilen karakter deeri q deilse program
klavyeden dier karakter bekler.Bir kere klavyeden q alnd zaman printf ileme girer ve
program sonlanr.

ALITIRMA:

1. Aadaki while kod dizileri nasl almaktadr? Aklaynz.

a. while(i<10)
{
printf(%d , i );
i++;

b. while(1)
printf(%d, i++);

61
2.yle bir program yazn ki ch=getch; komutunu kullansn ve klavyeden girilen deerleri ekrana
yazdrsn.Dn ile karlaldnda program sonlansn.

5.6 do-while Dngs

C dilindeki son dngmz do dngsdr. Burada do ve while beraber kullanltr. rnek


olarak;

do
{
ifadeler
}

while(koul)

Bu durumda koul doru olduu srece ifadeler gerekleecektir. Burada koul yine makul bir C
ifadesi olmaldr. Bir rnekle do while dngsn gsterelim;

#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(Got a q!\n);
}

ALITIRMA:

1. 5.5 blmndeki 1. altrmadaki a ve b klarn do-while dngsn kullanarak yaznz.


2. Ayn ekilde 2. altrmadaki program do-while dngsn kullanarak yaznz.

5.7 Program Kontrol fadelerinin


e Oluturulmas

ie farkl dngler oluturulabilmektedir.ANSI C standartlar bize 15e kadar ii ie dng


kullanmamz salamaktadr.Aada bununla ilgili bir rnek grebilirsiniz;

i=0;

62
while(i < 10)
{
for(j=0; j<10; j++)
printf(%d, i*10+j);
i++;
}

Bu rutin 00dan 99a kadar olan saylar ekrana yazdrr.

ALITIRMA:

1. yle bir program yazn ki klavyeden girilen karakterlerin (getch();) ASCII karlklarn ekrana
yazdrsn.Mesela D harfi girildiinde D harfinin ASCII karl olan 68 ekranda grnsn.Q
harfi girildiinde ise program sonlansn.

5.8 break Komutu

break komutu dng iinde herhangi bir noktada dngden klmasn salar.Break komutu ile
devam edilen komut dizisi atlanabilir.Dng break komutu ile karlat zaman program
dngden sonraki komut dizisine atlar.
rnek olarak:

void main(void)
{
int i;
for(i=0;i<50 ; i++)
{
printf(%d ,i );
if (i==15)
break;
} }
Bu program 0 15 arasndaki saylar ekrana yazdrr.Break komutu btn C dnglerinde
kullanlabilir.

ALITIRMA:

1. Aadaki dng nasl alr?

for(i=0;1;i++)
{
printf(Microchip is great!);
if (getch ( ) ==q)
break;
}

63
2. tane program yazn ve her biri birer C dngs iersin.Sayc devam etsin ama anahtara
basldnda dngden klsn.Anahtar fonksiyonu olarak kbhit() kullanlabilir.khbit() anahtara
basldnda 1, ekildiinde 0 vermektdir. khbit()
header dosyas olarak conio.h kullanmaktadr.

5.9 continue Komutu

Farzedelim ki dng iinde belirli bir durum meydana geliyor ve dng bitmeden dng sonuna
atlamak istiyorsun. C bunu continue komutu ile salamaktadr. Program bu komutla karlanca,
btn komutlar atlayarak dngnn koulunu kontrol eder. rnek olarak:

#include <16C74.H>
void main(void)
{
int i;
for (i=0; i<100;i++)
{
continue;
printf(%d ,i);
}
}

Bu programda printf komutu hi uygulanamaz. Program printf i atlayarak i<100 deerlendirir


ve ayn zamanda iyi arttrr.
Continue komutu while ve do-while dngleri iin program direkt olarak deikenin test
edildii yani koul satrna gtrr.Continue komutu dng uygulama blmnde art salar ve
artl koul salanr.

5.10 switch Komutu

if komutu iki alternatif arasnda seim yapmak iin iyi bir seimdi ama alternatif fazla olduu
zaman kullansz bir komut olmaktadr. Bu durumu switch komutunu kullanarak zebiliriz.
Switch ok saydaki if- else ile edeerdir.
Switch komutunun genel kullanm yledir:

switch ( degisken)
{
case sabit1:
ifade (s);
break;

case sabit2:
ifade (s);
break;

64
case sabitN:
ifade (s);
break;
default:
ifade(s);
}

fade ard ardna tamsay veya karakterlere gre kontrol edilir.Eer benzer bulunursa komut
gvdesi breaka kadar gerekletirilir.Eer benzer bulunamazsa ifade default ile
gerekletirilir.default istee bal bir komuttur.
Switch komutuna bir rnek verelim:

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(Sali\n);
break;
case 3 :
printf(Carsamba\n);
break;
case 4:
printf(Persembe\n);
break;
case 5 :
printf(Cuma\n);
break;
case 6:
printf(Cumartesi\n);
break;
default:
printf(Gecersiz Giris\n);

65
}
}
}

Bu rnekte 1den 7ye kadar numaralar okunacaktr.Eer bu numaralarn dnda bir numara
girilirse Gecersiz Giris ifadesi grlr.Bu deerlerden biri girilirse karl olan gn ekranda
grlecektir.

Dier bir rnekde karakterlere numaralar verilmekte ve bunlar LCD de grnmektedirler.DIP


switch ve her yoldaki ayarlar okunur, sonra dier bitlerden ayrlr daha sonra arlan rutine
ayrlr.

byte cp1_sw_get() //her yoldaki karakterler


{
byte cp1;
cp1=portd & 0b01110000; //bilinmeyen deer maskelenir
switch(cp1) //imdi deer zlr
{
case 0x00: cp1 = 8; break;
case 0x10: cp1 = 16; break;
case 0x20: cp1 = 20; break;
case 0x30: cp1 = 28; break;
default: cp1 = 40; break;
76
}
return(cp1); //nceki deere git ve rutini ar
}

ANSI standartlarna gre bu C derleyicisi en az 257 olaya kadar desteklemektedir.ki olay ayn
switchlerde ayn deerleri alamaz.switchler i ie olabilirler. ve d switchler uyumazlk
gstermezler.ANSI derleyicisi en az 15 blme kadar switch komutunu desteklemektedir.
Aada i ie switch komutlar grlmektedir.

switch (a)
{
case 1:
switch (b)
{
case 0:
printf(b yanlis);
break;
case 1:

66
printf(b dogru);
break;
}
break;
case 2:
.
.

break komutu switch ifadesinin iinde istee bal olarak kullanlabilir. Bunun anlam iki
ifadenin ayn kodlar paylamasdr.Bunu bir rnekle aklarsak.

void main(void)
{
int a=6,b=3;
char ch;
printf(A = ilave\n);
printf(S = eksiltme\n);
printf(M = carpm\n);
printf(D = bolme\n);
printf(secimi gir:\n);
ch=getch();
switch (ch)
{
case S:
b=-b;
case A:
printf(\t\t%d,a+b);

break;
case M:
printf(\t\t%d,a*b);
break;
case D:
printf(\t\t%d,a/b);
break;
default:
printf(\t\tSay ne?);
}
}

ALITIRMA:

1. Aadaki kod dizisinde yanl bulunuz.


float f;
switch(f)
{

67
case 10.05:
.
.

2. switch komutunu kullanarak para deerini yazdrn.Para deeri para deikenin iinde
tutulsun.
3. switch komutunu kullanmann if elsee gre avantajlar nelerdir.

5.11 null Komutu

null komutu sadece noktal virgl komutu iermektedir. Gerekli olan yerlerde kullanlr ve null
uygulamaya geince hibir ey olmaz sadece bir saykllk gecikme salar.

do, for, if ve while gibi komutlar program gvdesinde grebileceimiz ve program uygulayan
komutlardr. null komutu bu programlarda rahatlama salamaktadr.

for(i=0;i<10;i++)
;

Dng ifadesinin for [i++]=0 sras 10 say unsurunun 0. srasdr. fadenin gvdesi bir nulldur ta
ki ilave komutlar gerekli olana kadar.

5.12 return Komutu

return komutu fonksiyonda uygulamaya son verir ve arlan rutine dndrr. Gerekli ise deer
arlan fonksiyonu dndrebilir. Eer bir atlandysa dnlen deer tanmsz olur.Eer arlan
fonksiyon dn iermiyorsa kontrol hala nceki fonksiyondadr.Eer dn deeri gerekli
deilse ,fonksiyon void dn tipine bildirir.

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

68
Diziler ve Stringler

Bu blmde diziler ve stringleri ele alacaz. Bir dizi, ayn veri trndeki deikenlerle ilgili
basit bir listedir.

Bir string bolukla sonlandrlm bir karakter dizisi olarak tanmlanr ve ayrca en ok
kullanlan bir boyutlu dizi olarak bilinir.

Bu blmde tartlacak konular:

Diziler
Stringler
Bir boyutlu diziler
ok boyutlu diziler
Oluturma

6.1 Bir Boyutlu Diziler

Bir dizi benzer tipten bir takm deikenleri bir grup altnda toplamak iin kullanlr. Dizideki
tekil bir deiken dizi eleman olarak isimlendirilir. Bu ilikili veri gruplarn tutmann basit bir
yoludur.

Bir boyutlu dizileri tanmlamann genel formu:

type var_name [size] ;

eklindedir.

Burada type C veri tipindendir, var_name dizinin ismi ve size de dizinin ka elemanl olacan
belirtir. rnek olarak, eer 50 elemanl bir dizi tanmlayacaksak aadaki ifadeyi kullanacaz.

int height[50] ;

Bir dizi tanmlandnda, eer dizi 50 elemanl ise son eleman 49. indekstedir. Yukardaki
rnei kullanarak, height dizisinin 25. elemanna 60 deerini vermek istiyoruz diyelim. Aada
bunun nasl yapld grlyor:

height[24] = 60 ;

C bir boyutlu dizileri bitiik hafza blgelerinde tutar. Birinci eleman en dk adrestedir.
Eer takip eden kod ksm altrlrsa

int num[10] ;
int i ;

69
for(i=0 ; i<10 ; i++)
0007 : CLRF 18 ; i yi sil
0008 : MOVLW 0A
0009 : SUBWF 18 , W ; 10 dan kkse test et
000A : BTFSC 03 , 0
000B : GOTO 013
num[i] = i ;
000C : MOVLW 0E ; num ksmn yklemeye balar
000D : ADDWF 18 , W
000E : MOVWF 04
000F : MOVF 18 , W
0010 : MOVWF 00
0011 : INCF 18 , F
0012 : GOTO 008

i dizisi hafzada aadaki ekilde grnr.

Eleman 1 2 3 4 5 6 7 8 9 10

0 1 2 3 4 5 6 7 8 9

Herhangi bir dizi elemann bir sabit veya deiken olarak her yerde kullanabilirsiniz. Aadaki
rnek basit ekilde indeks karesini dizi elemanna atar ve sonra elemanlar ekrana yazar.

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

Eer elinizde 10 elemanl bir dizi varsa ve kazara 11. elemana kadar yazarsanz ne olur? C
nin dizi indeksleri iin snr kontrolleri yoktur. Bu yzden dizide belirtmeden bir elemana okuma,
yazma yapabilirsiniz. Bununla birlikte, bu genelde feci sonular douracaktr. ou kez
programn dzgn almamasna ve bazen de bilgisayarn dzgn almamasna sebep
olacaktr.

70
C aada grlen ekilde olduu gibi bir dizi deerini baka bir diziye atamaya izin vermez:

int a[10] , b[10] ;


.
.
a=b ;

Yukardaki rnek doru deildir. Eer bir dizinin ieriini dier bir diziye kopyalamak
istiyorsanz, bunu birinci dizideki elemanlar teker teker ikinci diziye kopyalayarak yapmalsnz.
Aadaki rnekte her bir dizinin 20 elemanl olduu farz edilip, a[ ] dizisinin ieriinin b[ ]
dizisine nasl kopyalanaca gsteriliyor.

for(i=0 ; i<20 ; i++)


b[i] = a[i] ;

UYGULAMA:

1. Belirtilen kod parasnda yanl olan nedir?

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

2. getch( ) kullanarak klavyeden girilen ilk on karakteri okuyan program yaznz. Program
karakterlerin eleip elemediini rapor olarak verecek.

6.2 Stringler

En ok rastlanan bir boyutlu dizi stringtir. C string veri tipinde bir yapya sahip deildir.
Onun yerine stringlerin bir boyutlu dizi eklinde kullanmn destekler. Bir string bir sfr
olarak tanmlanmtr.Btn string trleri bolukla sonland iin fazladan bir tane boluk
eleman eklemek gerekir. Bu son eleman boluu tutacaktr. Tm string sabitleri otomatik
olarak C derleyicisi tarafndan bolukla sonlandrlr.

Klavye kullanarak programnzn ierisine bir stringi nasl dahil edersiniz?


gets (str) fonksiyonu satr ba ile karlaana kadar klavyeden karakter okuyacaktr.
Okuduu string karakterlerini str ile belirtilen dizide saklayacak. Str dizisinin uzunluunu,
klavyeden girilen karakter saysn ve boluk elemann da dikkate alarak, bu sayya eit veya
daha byk olacak ekilde tanmlamay unutmamalsnz.

71
gets( ) fonksiyonunun nasl kullanldn bir rnekle aklamaya alalm.

void main(void)
{
char star[80] ;
int i ;
printf(Bir string giriniz (80 karakterden az) : \n) ;
gets(str) ;
for(i=0 ; str[i] ; i++)
printf(%c , str[i]) ;
printf(\n%s , str) ;
}

Burada gryoruz ki string iki ekilde ekrana yazdrlabilir: %c yi kullanarak bir dizinin
karakterleri olarak veya %s i kullanarak bir string eklinde.

UYGULAMA:

1. Bu programda yanl olan nedir? (strcpy fonksiyonu ikinci argman birinci argmann
iine kopyalar.)

#include <string.h>
void main(void)
{
char str[10] ;
strcpy(str, Motorola who?) ;
printf(str) ;
}

2. yle bir program yazn ki ekrandan string karakterlerini okusun ve onlar ters evrilmi
dzende ekrana yazsn.

6.3 ok Boyutlu Diziler

C bir boyutlu dizilerle snrl deildir. C de iki veya daha ok boyutlu dizi tanmlanabilir.
rnein 5x5 elemanl number isimli bir tamsay dizisini tanmlayp kullanacaksanz:

int number[5][5] ; ; 25 Ram blgesi kullanr.

eklinde bir tanmlama yapmanz gerekir.

Kme parantezleri setiyle ek boyutlar kolayca eklenebilir.Biz basit olmas asndan iki boyutlu
dizileri ele alacaz. Bir iki boyutlu dizinin en iyi gsterim ekli satr/stun formatdr. Bundan

72
dolay iki boyutlu diziler soldan saa doru okunur. Aadaki ekilde 5x5lik bir dizinin grafik
gsterimi veriliyor.
ki boyutlu dizileri bir boyutlu dizilere benzer ekilde kullanabiliriz. rnek olarak, bir sonraki
programda indeks arpmlar 5x4lk diziye yklenir ve daha sonra dizi ierii satr ve stun
formatnda ekranda gsterilir.

void main(void)
{
int array[5][4] ;
int i , j ;

for(i=0 ; i<5 ; i++)


for(j=0 ; j<5 ; i++)
array[i][3] = i * j ;

for(i=0 ; i<4 ; i++)


{
for(j=0 ; j<4 ; j++)
printf(%d ,array[i][j]) ;
printf(\n) ;
}
}

Bu programn kts aadaki gibi olacaktr:

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

Grdnz gibi ok boyutlu diziler kullanlrken her bir elemana erimek iin gerekli
deiken says artyor. PICmicro MCUnun hafza haritasna bal olarak 100 veya 10 x10
luk diziler oluturmak mmkn deildir. Buna ramen 2 tane 50 elemanl dizi oluturulabilir.

UYGULAMA:

1. yle bir program yazn ki 3x3x3 bir diziye 1 den 27 ye kadar olan saylar yklesin ve sonra
bu diziyi ekrana yazsn.

2. Birinci rnekteki program kullanarak her bir satr ve stunun toplamn yazdrn.

73
6.4 Dizileri Oluturma

Yani grdnz ki sadece tekil dizi elemanlar deerleri tutabilir. C iinde bir metot vardr. Bu
metot bir diziye bir deikende olduu gibi ilk deerini verir. Bir boyutlu dizilerin genel formu
gsterilecek olursa:

type array_name[size] = { value_list } ;

value_list virglle ayrlan sabitler listesidir. Bunlar dizi tipiyle uyumludur. Burada birinci sabit
birinci elemann iinde, ikinci sabit ikinci elemann iinde olacak ve dier sabitler de bu ekilde
dier elemanlara yerleecek. Aadaki rnekte 5 elemanl tamsay dizisi tanm grlyor.

int i[5] = {1 , 2 , 3 , 4 , 5 } ;

i[0] eleman 1 ve i[4] eleman 5 deerine sahip olacak.


Bir string iki metotla tanmlanabilir. lki, her biri tekil karakterlerden oluan bir liste eklindedir.
Bu tanma uygun aadaki rnek verilebilir:

char str[3] ( a , b , c ) ;

kinci metot aada grld gibi bir string aktarma eklindedir:

char name [5] = John ;

Stringte kme parantezi olmad gz nnde bulundurulmaldr, stringler bu oluturulan


tiplerin iinde kullanlmad, nk stringler C de bir bolukla sonlanmaldr. Derleyici otomatik
olarak John un sonuna bir boluk ekler.

ok boyutlu diziler bir boyutlu dizilerle ayn yntemlerle tanmlanr.


rnekte 3x3 lk bir dizi tanm grlyor.

int num[3][3] = { 1,2,3,


4,5,6,
7,8,9 } ;

UYGULAMA:

1. Aadaki belirtim doru mudur?

int count [3] = 10, 0 , 5.6 , 15.7 ;

2. Bir saynn karesi ve kp iin bir evrim tablosuna sahip program yaz. Her bir satrda
saynn kendisi, karesi ve kp bulunacak. 1den 9a kadar olan saylarn bilgisini tutmak

74
iin 9x3lk bir dizi oluturun. scanf(%d, &num) ; ifadesi kullancdan bir say
girmesini bekler. Sonra o sayy, karesini ve kpn ekrana yazar.

6.5 String Dizileri

String dizilere C de ok rastlanr. Onlar dier diziler gibi belirtilir ve tanmlanr. String
dizilerinin kullanm ekli dier dizilerden biraz farkldr. Mesela aadaki ifade neyi tanmlar?

char name[10][40] ;

Bu ifade name dizisinin 40 karakterlik 10 isim tuttuunu belirtir. Bu tablodan bir stringe ulamak
iin, sadece ilk indeks kullanlr. rnek olarak, bu dizideki 5. ismi yazdrmak iin aadaki ifade
kullanlr.

printf (%s , names[4] ) ;

ki boyutludan daha byk boyutlu diziler iin gsterim ayndr. Buna rnek olarak animal dizisi
verilirse:

char animals [5][4][80] ;

Belirli bir stringe ulamak iin ilk iki boyutu kullanabilirsiniz. rnek olarak animal[2][1] ifadesi
ile 3. listedeki ikinci stringe eriilir.

UYGULAMA:

1. yle bir program yazn ki 0 dan 9a kadar olan rakamlarda harfleri tutacak ekilde bir
string tablosu olutursun. Kullanc bir rakam girdiinde program da o rakama karlk
gelen harfi gstersin.

6.6 String Fonksiyonlar

Stringler programn ierisinde birka yntemle kullanlabilir. Strcpy komutu


kullanlarak bir karakter bir kaynaktan bir hedefe kopyalanabilir. Bunun sayesinde sabit
bir string RAM e yerletirilebilir.

#include <string.h> //string ktphanesi


functions
char string[10] ; //string dizisi tanmland
strcpy (string, Hi There) ; // stringe karakterleri yerletirir.

PICmicro MCUda iaretiler ROM u gstermez bu yzden string fonksiyonlarnn iine


sabit bir string girilemez. Mesela strlen(hi) ifadesi doru deildir.

75
Dier rnekler:

char s1[10] , s2[10] ;

strcpy(s1,abc) ;
strcpy(s2,def) ;
strcat(s1,s2) ;
printf(%u, strlen(s1)) ; //ekranda 6 grnecek
printf(s1) ; //abcdef yazacak

if(strcmp(s1,s2)!=0)
printf(Eleme yok) ;

Kullanlabilir dier string fonksiyonlar aadadr:

strcat ki stringi birletirir.


strchr Bir karakterin stringte ilk kullanld yere bakar.
strrchr Bir karekterin stringte en son getii yeri bulur.
strcmp ki stringi karlatrr.
strcmp Karakterlerin kk byk olma durumunu gz nnde bulundurmadan iki stringi
karlatrr.
strncpy Bir stringten dierine belirli bir sayda karakter kopyalar.
strlen Bir stringin uzunluunu hesaplar.
strlwr . Byk harfleri kk harflere evirir.
strpbrk ki stringin ilk e karakterinin yerini bulur.
strstr Bir string parasnn stringin iinde ilk getii yeri bulur.

Tanmlayacanz string dizilerinin boyutunun, kullanacanz stringlerin boyutuna eit veya


daha byk olduundan emin olunuz.

76
7-Pointerlar
Bu bolm Cnin ok zahmetli ve ok nemli bir zelliini olan pointerlar
kapsamaktadr.Bir Pointer en temelde bir nesnenin adresidir.Bu blmde greceimiz baz
balklar:
Pointer temelleri
Pointerlar ve Dzenleyiciler
Fonksiyonlarda Geen Pointerlar

7.1 Pointerlarla Tanma


Bir pointer,bir hafza yerinin adresini tutan bir hafza yeridir.rnein,eer bir pointern
deeri a ve bu a, bnin tutulduu yerin adresi ise, a byi iaret ediyordur.Yani b deerinin
hafzada tutulduu yerin adresi 100 ise, a deeri 100 demektir.
Bir pointer deikeni genel olarak yle tanmlanr:

type *var_name;

type,C dilinde bir pointer atama komutudur.Bu komut, var_name ile belirtilen deikenin
tipini tayin eder.var_nameden nce gelen bir * iareti vardr.Bu iaret program derlenirken
var_name deikenini bir pointer olarak belirler.Bir pointer tamsay deikeni olarakta atanabilir.

int *ptr;

Pointerlerda * ve & olmak zere iki zel operatr bulunur.Bir deikenin bulunduu
yerin adresi & operatr ile atanr. * operatr ise deeri tekrar geri armak istediimizde
kullanlr.rnein;

#include <16c74.h>
void main(void)
{
int *a,b;
b=6;
a=&b;
printf(%d,*a);
}

NOT:
Bir deiiklik yaplmad takdirde derleyici pointerlara 1 bytelk yer ayrr.Bunun
anlam pointer 0-255 aras deer alabilir.Eer geni hafza olarak atanrsa,pointera 2 byte(16-
bit)lik yer ayrlr.16 bit pointer semek iin komut satrna,

#device *=16

yazlmaldr.

ROM kodlar genelde 16-bit ile haberleir.

77
lk ifade iki deer ile belirlenir.a bir tamsay pointer, bde bir tamsaydr.Sonraki ifade de
bye 6 deeri atanmtr.Sonra bnin adresi(&b) pointer deikeni olan aya atanmtr.Bu satr
bnin tutulduu adresi aya okur.Son olarak bnin deeri * operatr kullanlarak a pointerndan
arlp,ekrana yazdrlmtr.Bu satr, ann iaret ettii adresteki deeri ekrana yazar.Bu metotta,
dolayl yoldan pointern tuttuu adresten deer arlmtr.Bir grafik rnei aada
grlmektedir.

Address: 100 102 104 106


Variable: i j k ptr
Content: 3 5 -1 102
int i, j, k;
int *ptr;

lk olarak, i 3 ve &i 100(inin yeri)dr.ptr 102 deerini ierir, *ptr ise 5(102 adresinin
iindeki deer)dir.
Bu ekilde bir pointer kullanarak, bir hafza yerinin deerini atamak mmkndr. rnek
olarak, nceden yaplan program bu yntemle yapalm.

#include <16c74.h>
void main(void)
{
int *a,b;
a = &b;
*a=6;
printf(%d,b);
}

Bu programda, ilk olarak b deerinin adresini aya atadk,sonra ay kullanarak bye 6


deerini atadk.Bu satr (*a=6), ann iaret ettii hafza yerine 6 deerini okudu. nceki iki
rnekte pointer kullanmak zorunlu deildir.Fakat pointerlar kullanlarak tanmlanmtr.

EGZERSZ:
1) 0dan 9a kadar for dngsyle bir program yaznz ve numaralar ekrana
yazdrn.Bunu yaparken pointerlar kullannz.

7.2 Pointerlarda Kstlamalar


Genelde pointerlar dier deikenler gibi davranr.Bununla beraber birka kural ve
istisnay unutmamak gerekir. * ve & operatrlerine ilave olarak, drt adet operatr daha
pointerlarda kullanlabilir.+,++,-,-- .Sadece tamsay niceliklerde, pointerlar iin toplama ve
karma yaplabilir.

Bir pointern deeri 1 arttrlrsa, bu pointer bir sonraki adres gzn iaret eder. Eer p
pointerna 100 adresi atanr, sonra p++ ifadesi uygulanrsa, tamsaylar 2 byte uzunluunda
olduundan pnin yeni deeri 102 olur.Eer p bir float pointer ise 4 byte uzunluunda

78
olduundan 1 arttrldnda 104 deerini alr.Pointerlar sadece aritmetik olarak
belirlenebilir.nk char tipi 1 bytelktr.
Pointerlar tamsaylarla kartlabilir yada toplanabilir.Aada bir rnek gsterilmitir.

int *p;
.
p = p+200;

Burada hedef, pnin nceden iaret ettii yerin 200 adres sonrasn iaret etmesini
salamaktr.
Pointerlarda kendi aralarnda toplama ve karma ilemine tabi tutulabilir.Yalnz nesnenin
yerini iaret eden pointerlarla karma veya toplama yaparken ok dikkat edilmelidir.ptrnin
nceki deeri 1 ise, aadaki ifade ile ilgili ne dnyorsunuz?

*p++;

Bu ifade ile varlmak istenen nokta pnin iaret ettii yeri 1 arttrmaktr.Bunu yapmak iin
aadaki ifadeyi kullann.

(*p)++;

Buradaki parantezin amac bir arttrmadan nce pnin bir pointer olduunun belirtilmesi
iindir. * operatrnn ++ operatrnden nce yaplmas daha uygun olacaktr.Pointerlar ilikisel
operasyonda da kullanlabilirler.Bununla beraber, pointerlar kendi aralarnda haberleirken
sadece birbirleriyle anlarlar, ayn nesneye ynelirler.
Pointerlar ROMlara atanamazlar.rnein aadaki kod paras yanltr.

char const name[5] = JOHN;


.
ptr=&name[0];

Bu deer const komutuyla ROMa yerletirilmitir.

EGZERSZ:
1) Aadaki komutlar yazp atamalar yapn.%pyi kullanp her deikenin deerini
yazdrn.Tm pointerlar 1 arttrp, tekrar yazdrn.Makinenizde ki her bir bykln deeri
nedir?

char *cp,ch;
int *ip,i;
float *fp,f;
double *dp,d;

2) Aadaki kod parasnda yanl olan ne?

int *p,i;
p = &i;

79
p = p/2;

7.3 Pointerlar ve Dzenleyiciler


Cde pointerlar ve dzenleyiciler yakndan alakaldr ve birbirlerinin iinde
kullanlabilirler.Bu ikisi arasndaki iliki Cnin bir gcdr.
Bir indeks olmakszn bir dzenleyici ismi kullanyorsanz, aslnda dzenleyicinin banda
bir pointer kullanyorsunuzdur.Son blmde, sadece getiimiz dizinin ismi olan gets()
fonksiyonunu kullandk.Aslnda fonksiyonda dizinin ilk eleman bir pointer olarak geti.nemli
not : bir dzenleyici bir fonksiyonda getii zaman, sadece ilk elaman pointera geer.Bunlar sabit
dzenleyici veya yapyla birlikte yaratlamaz.
ndekssiz bir dzenleyici bir pointerdr.Baka bir pointera o deeri atayabilirsiniz.Pointer
aritmetik kullanan dzenleyici, eriim iin size izin verir.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() ifadesinde *(p+i) kullandmz fark


etmisinizdir.ndeksin bir pointer gibi oluuna arabilirsiniz.Ayrca bir pointerda
indeksleyebilirsiniz.Aadaki program doru 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]);
}

Dzenleyiciyle iaret edildiinde indekslenmi bir pointerda bir eyi hatrlamak


gerekir.Dzenleyici ile iaretlenmi pointerlar sadece ilk elaman yada temel diziyi gsterir.Byle
bir durumda pointerlarla toplama yapmak yanl olur.Bu yzden p++ ifadesi yukardaki program
iin yanl bir kullanm olurdu.

Pointerlar ve dzenleyiciler kartrlrsa tahmin edilmeyecek sonular dourabilir.


Aada bir rnek grlmektedir.Bu ikinci versiyon dzenleyicilerle pointerlar kartrmaz.

int *p;
int array[8];

80
p=array;
0007: MOVLW 0F ;dzenleyici balangcn ykle
0008: MOVWF 0E ;pointer
*p=3;
0009: MOVF 0E,W ;
000A: MOVWF 04 ;dolayl hafzay iaretle
000B: MOVLW 03 ;3 ykle
000C: MOVWF 00 ;ve iaretlenen yeri sakla
array[1]=4;
000D: MOVLW 04 ;4 ykle
000E: MOVWF 10 ;dzenleyicinin ilk komutu
int *p;
int array[8];
p=array;
0007: MOVLW 0F ;dzenleyici balangcn ykle
0008: MOVWF 0E ;pointer
p[1]=3;
0009: MOVLW 01 ;dzenleyici pozisyonunu ykle
000A: ADDWF 0E,W ;dzenleyici balang pozisyonuna ekle
000B: MOVWF 04 ;dzenleyici pointer ykle
000C: MOVLW 03 ;3 ykle
000D: MOVWF 00 ;konumu kaydet
*(array+1) = 4;
000E: MOVLW 10 ;dzenleyici pozisyonunu ykle
000F: MOVWF 04 ;iaretle
0010: MOVLW 04 ;4 ykle
0011: MOVWF 00 ;konumu kaydet

EGZERSZ:
1) Kod paras doru mu?
int count[10];
.
count = count+2;

2. Kod paras neyi gsterir?


int value[5]=(5,10,15,20,25);
int *p;
p = value;
printf(%d,*p+3);
7.4 Fonksiyonlara Geen Pointerlar
nc blmde, fonksiyonlara geilebilen iki yoldan bahsettik, deerle ama ve
referans ile arma.kinci yntem fonksiyona adresi geer yada dier kelimelerde bir pointer
fonksiyona geilir.Pointer kullanan deikene bu noktada deiimler yaplr.
Dier deikenler gibi pointerlarda fonksiyonlara geebilir.Aadaki rnekte pointer
kullanlan bir fonksiyonda bir dizi nasl geer gsterilmitir.

81
#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, pointer p,dizinin ilk elaman olan M yi iaret etmektedir.while(*p) ifadesi
dizinin sonu olan null(\0) ifadesini kontrol eder.Her dngde, pnin gsterdii karakteri
yazar.Dizide sonraki karaktere gemek iin p, 1 arttrlr.
Dier bir rnekte aadaki gibidir.

void IncBy10(int *n)


{
*n += 10;
}
void main(void)
{
int i=0;
IncBy10(i);
}
Okunabilirlii arttrmak iin pointer arlp tekrar yazlabilir.rnek:
void Incby10(int & n)
{
n += 10;
}
void main(void)
{
int i=0;
Incby10(i);
}
EGZERSZ:
1)Bir program yazn.inde float deiken geen bir fonksiyon olsun.Fonksiyonda -1
deeri fonksiyon parametrelerini belirlesin.Sonra fonksiyondan main()e dnn ve float tipi
deikenin deerini yazdrn.
2. Bir program yazn.inde float pointer geen bir fonksiyon olsun.Fonksiyonda -1
deeri deikenleri belirlesin.Sonra fonksiyondan main()e dnn ve float tipi deikenin
deerini yazdrn.

82
Yaplar ve Birleimler
Yaplar ve birleimler Cnin en nemli iki tanmlama biimidir.Yaplar deiik data tiplerine
sahip olan deiken gruplardr.

Bu nitede :

Yap Temelleri
Yaplarn aretileri
Seri Yaplar
Birleim Temelleri
Birleim aretileri

83
8.1 Yaplara Giri
Bir yap(struct) ortak bir isimle ulalabilen nesneler grubudur. Her bir nesne kendi data tiplerine
sahip olup birbirlerinden farkl olabilirler.
C yaplar aadaki yolla tanmlar:

struct tag-name
{
type element1;
type element2;
.
type elementn;
} variable-list;

struct anahtar kelimesi ile compilera bir yap tanmlanaca belirtilir.Yap boyunca her type bir
geerli data tipidir. Bu tipler ayn olmak zorunda deildir. tag_name yapnn ismidir.
Veriable_list , struct tag_name tipindeki datalarn sahip olduu deikenleri ifade eder.
Veriable_list tercihlidir. Yaplarn iindeki nesnelerin her biri alanlar veya yeler olarak
gsterir. Biz bunlara yeler diyeceiz

Genelde, yapdaki bilgi mantksal olarak ilikilidir.


rnein;siz mterilerinizin isim,adres ve telefon numaralarn saklamak iin bir yap
kullanabilirsiniz. Takip eden rnek ktphane bir kart katalou iindir.

struct catalog
{
char author[40];
char title[40];
char pub[40];
unsigned int data;
unsigned char rev;
} card;

Bu rnekte yapn ismi catalogdur. Catalog bir deikenin ismi deil yapnn ismidir. Card
deikeni catalog tipi yapnn bir yaps olarak ifade edilir.

Yapnn herhangi bir yesine ulamak iin hem deikenin ismi hemde yenin ismini
tanmlamanz gerekir. Bu isimler bir periyotla birbirinden ayrlr.
rnein; catalog yapsnn bir yesine ulamak iin card.rev=a kullanr. Burada card
deikenin ismi rev ise yenin ismidir. Yapnn elemanlarna ulamada operatr(ilemci)
kullanlr. Catalog yapsnn bir yesini yazdrmak iin :

printf(Author is %s\n,card.author);

imdi biz bir yapnn nasl tanmlanacan ifade edeceiz ve nasl ulalabileceini ve bir
yapnn hafzada nasl grleceini biliyoruz.

84
author 40 byte
title 40 byte
pub 40 byte
date 2 byte
rev 1 byte

card yapsnn bir yesinin adresini renmek istediimizde &card.date kullanlr. Eer
yazann (sunucunun) ismini yazdrmak istersen printf(%s,card.pub) . Balktaki zel elemana
ulamak iin dngdeki 3. eleman gibi

card.title[2];

Balktaki birinci eleman 0 , ikinci eleman 1 ve nc eleman 2 dir.


Yapy bir kez tanmlandnda program her yerinde deiik yap deikenleri kullanlarak
yaratlr.

struct tag-name var-list;

rnein, programda yap katalou daha nceden tanmlanm ise siz iki deiken daha aadaki
ekilde tanmlayabiliriz.

struct catalog book,list;

Cde yaplarn dizileri (array) deiik data tiplerinde gsterilebilir.Bu rnek 50 elemanl bir yap
srasn gsteren catalog rnei.

struct catalog big[50];

Eer zel bir yapya srasyla ulamak isterseniz yap deikenini indexlememiz (iaretlememiz )
gerekir big[9].title. Yapnn big srasna ulamak iin hangi isimde yeyi kullanlarak ulalr ?

big[9].title

Yap fonksiyonlarada gei yapan bir fonksiyon deiik data tiplerindeki gibi return(dn)
yapabiliriz. Bir yapya deiik deerler iareti yardmyla iaret edilir.
Takip eden yap geerlidir.

struct temp
{
int a;
float b;
char c;
} var1,var2;
var1.a=37;
var2.b=53.65;

85
var2 = var1;

Bu yap altnda var2 deikeni var1 deikeni ile ayn ierie sahip olur.
Bu bir yapy balatmann bir rneidir.

struct example
{
char who[50];
char ch;
int i;
} var1[2]={Rodger, Y,27,Jack,N,30};

Bir nemli not ; yapdan fonksiyona geerken btn yap deer arma(call by value
) metodu ile geilir.Bunla beraber fonksiyondaki yaplarn deiimi yapnn arma rutuninin
deerlerini etkilemez.Yapdaki elemanlar fonksiyona geme yntemini etkilemezler.
PICmicroda kullanlarak kurulan LCD arayz yle olabilir rnein;

struct cont_pins
{
boolean en1; //btn gstergeler iin yetkilendir
boolean en2; // 40x4 hatl gstergeler iin yetkilendir
boolean rs; //register(kaydedici) se
int data:4;
} cont;
#byte cont = 8; // d portunu control et

Bu cont_pins yapsn kurar ve program yolu ile elde edilir.


NOT:
:4 o deer iin 4 bit kullanlacan gsterir.Bu durumda D0 en1 ve D3-6 data olur.

void LcdSendNibble(byte n)
{
cont.data=n; //present data
delay_cycles(1); //gecikme
cont.en1=1; //en1i 1 yap
delay_us(2); // gecikme
cont.en1=0; //en1i 0 yap
}

RNEK:
1. Yaps bir karakterli sras (string) 40 karakterli bir program yazn.Bir karakteri
klavyeden okusun ve getch() komutunu kullanarak kaydetsin. Bir stringi ve getch()
komutu ile kaydet sonra deerleri yazdr.
2. Bu kodun hangi evresi yanltr.

struct type

86
{
int i;
long l;
char str[50];
} s;
.
.
i = 10;

8.2 Yap aretileri

Bazen bir yapya iareti yoluyla ulamak daha yararldr. Yaplara iaretiler dier data tiplerine
iaretilerle ayn yoldan gsterir. rnein takip eden blm kodu p deikeni ve q yap
iaretisini temp yapsyla gsteren bir rnektir.

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

Temp yapsn bu tanmlamas kullanarak q=&p durumu tamamen geerlidir. q pyi gsterir.
Burada gsterildii gibi ok operatr kullanlmaldr.

q->i=1;

Bu durum p deikenini ininci saysna1 deerini atar.Ok iaretinin ,ok iaretinden hemen sonra
negatif(-) iaret ve > iareti aralarnda boluk olmadan kullanldna dikkat edin.

C yapdan fonksiyona getikten sonra byk yaplar byk data geilerinden dolay program
ilemesi hzn drr bu nedenle yapdan fonksiyona iareti yoluyla geilmesi daha kolaydr.

Not edilmesi gereken nemli bir eyde :Bir yap yesine bir yap deikeni kullanlarak
ulalmaya alldnda bir periyot(dnem) kullan. Yapdaki bir yap yesine iareti ile
ulamaya altnda ok iaretini kullanmak zorundasn.
Bu rnek bir yapya bir iaretinin nasl kullanlacan gsterir.

#include <16c74.h>
#include <string.h>
struct s_type
{
int i;
char str[80];
} s,*p;
void main(void)
{
p=&s;

87
s.i=10;
p->i=10;
strcpy(p->str,I like structures);
printf(%d %d %s,s.i,p->i,p->str);
}

ki satr s.i=10 ve p->i=10 birbirine eittir.

RNEK:
1. Bu kodun yaps dorumudur?

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

2. PICmicro tipinde bir program yazarak 3. uzunlukta yap iaretisi olutrun yaplar
PIC16CXX ve PIC17CXX aletleri kullanarak ykleme ihtiyac duyacaksnz. Kullanc
klavyeden 1.2 ve 3 girilerinde yazdrmak iin hangi yapnn kullanlacan seecek.
Yapn format :

struct PIC
{
char name[20];
unsigned char progmem;
unsigned char datamem;
char feature[80];
};

8.3 Seri Yaplar

u ana kadar C data tiplerinden bir yap eidi olan yeleri sadece grdnz bunla beraber
yaplarn yeleri der yaplarda olabilir bunlara seri yaplar denir.rnein:

#define NUM_OF_PICS 25
struct PIC
{
char name[40];
unsigned char progmem;
unsigned char datamem;

88
char feature[80];
};
struct produtcs
{
struct PIC devices[NUM_OF_PICS];
char package_type[40];
float cost;
} list1;

Bu yap devices adnda PIC yap serisi paketin ismi olan bir string ve maliyeti olmak zere 3
eleman retir. Bu elemanlara list1 deikeni ile ulalabilir.

8.4 Birleimlere Giri

Bir bileim(union) 2 veya 3 deiken tarafndan paylalan tek bir hafza yeridir. Bu deikenle
ayn hafza yerinde deiik data tiplerinde olabilirler bunla beraber bir deikeni bir defa
kullanabilirsin. bir bileim bir yapya ok benzer bir birleimin genel format u ekildedir.

union tag-name
{
type element1;
type element2;
.
.
type elementn;
} variable-list;

Yine tag-name bileiin ad ve variable-list deikenleri ismi tag-name bileii oluturan


deiken tipidir. Bileimlerle yaplar arasndaki fark bileiin her yesi ayn data kullanmasdr.
rnein takip eden bileim bir integer bir character ve double ierir.

union u_type
{
int i;
char c[3];
double d;
} temp;

Bir bileimin hafzadaki grnm aada gsterilmitir.Bir nceki rnei bir bileiin deiimi
iin kullanacaz.
Integer 2 byte
Character 3 byte
Double 4 byte kullanr.

89
Bileimlerin yelerine ulamak yaplarla ayn olup periyod kullanlr. temp.i durumu i yeli 2
baytlk integera ulamada temp ve temp.d bileimi 4 baytlk double.d ye ulamada
kullanlr.Bir bileime iareti yoluyla ulamak isterseniz yaplardaki gibi ok iareti
kullanmalsnz.

Bir bileimin en byk yesine compileri taratma yapldnda bileimin byklne dikkat
etmek gerekir. Double 4 bayt uzunluunda kabul edersek temp bilekesi 4 bayt uzun
uzunluunda olmaldr.
8-bit microkontrollerun seri portuna harici 12 bit A/D dntrc(converter) balandnda
bileimi kullanmak gzel bir rnek . Microkontroller A/Dyi 2 baytda okur. yleyse bir
bileimini 2 unsignedchars olarak kurmalyz ve yeleri signed short olarak almalyz.

union sample
{
unsigned char bytes[2];
signed short word;
}

A/Dyi okumak istediinde 2 bytelk datay A/Dden oku ve onlar byte dizisinde sakla sonra 12
bitlik rnei ne zaman kullanmak istersen 12 bitlik sayya ulamak iin kelimeyi kullan.

Altrma:
1. Yapyla bileim arasndaki farklar nelerdir ? Benzerlikler nelerdir?
2. long int ye bileimli ve 4 byte karakter sras uzunluunda bir program yazn. Program
bir zaman sonra long int i her baytta ekranda gstersin.

90
9.1. GRLER VE IKILAR
PIC micro MCUdaki giri k portlar 2 registerdan meydana gelmitir.PORT VE
PORT DIRECTION ve bunlar PORT A,B,C,D,E ve TRIS A,B,C,D,E olarak
adlandrlmaktadr.Var olmalar tasarmda pic tarafndan kullanlmalarna baldr.8 bacakl bir
pic de tek gpo registeri, tek tris registeri ve 6 I/O portu bulunur.16C74 de bulunan portlar ise
PORT A,B,C,D ve E dir.33 adet I/O portu bulunur.aada PORTAnn blok diyagram
grlmektedir. B,C,D ve E PORTLARI benzerdir ama data sheette pic zellikleri iin baklmas
gerekir.

PIC eidine bal olarak Port Ann 5 veya 6 ucu bulunmaktadr.ya girilere yada
klara gre dzenlenmektedir.port directionnn dzenlenmesi Tris A registeri zerinden
yaplr. Giriler 1 ile klar 0 ile set edilir. Bacaklarn hepsi tipik olarak bacak bana 25ma
kaynak ve aka kapasitesine sahiptirler.
I/O ularna istisna ak kollektor kna sahip olan A4 bacadr.
Sonu olarak bacaktaki voltaj sevileri diren ile yksek balanmsa Port A registerindaki
biti tersler (port A.4 deki lojik 1 transistr zerinden uyarlrsa ucu sfra eker).
Assembler olarak bir rnek;

91
Veri MOVWF PORT zerinden porta gnderilir ve bitler ya BSF yada BCF ile ayr ayr
hareket ettirilebilir.Veri ya MOVFW PORTA yada BTFSS veya BTFSC ile port tarafndan
okunur.

PORT B nin BLOK DYAGRAMI

PORT C benzerdir ama port B nin pull-up ve interrupt yetenei yoktur.

Port C iin dier kullanlan I/O pinleri

C compiler sabit yollarn numaralarna gre hzl veya standart girileri ve klar
interrupt(KESME) edebilir.standart moda, PORT DRECTON registerleri tm I/O
operasyonlarndan nce kurulur. programa eklenen hatlar hz yavalatr ama kodun gvenlik
ksmn I/O hatlarnn her zaman set edildiini garanti ederek yoluna koyar.
Hzl I/O kullancya port directionu set etmesini salar ve bu oradaki kalntlar tanmlanmaz
hale getirir.
Port B nin girilerle set edilmesi ve deer iinde okunmas ile ilgili bir rnek;

92
bit maskelemesi & eklenerek kolayca yaplr ve port isminden sonra rnein maskelenmesi

b_rate = portb & 0b00000011; //mask out unwanted bits

deer b_rate iinde saklanm sonra arlan fonksiyona dnecei deere kurulmas iin
kullanlmtr. Sonra btn fonksiyon baz anahtarlarn okumas iin kullanlmtr.

byte bd_sw_get() //baud rate selection


{
byte b_rate;
b_rate = portb & 0b00000011; //mask out unwanted
bits
switch(b_rate)
{
case 0: set_uart_speed(1200);
break;
case 1: set_uart_speed(2400);
break;
case 2: set_uart_speed(4800);
break;
case 3: set_uart_speed(9600);
break;
}
}

PORT B kurulaca zaman, port direction registerdan nce port durumlarnn kurulmas
doru olur.bu portu dardan gelen kurulmadan nceki bilinmeyen durumlardan alkoyar.register
iindeki veya porttaki bit modelleri kurulaca zaman,binary olarak allr. Bu kaynak kodunu
yazmada ve okumada size kolaylk salar.I/O portlardan ve I/O portlara verinin hareket
ettirilmesi fonksiyonlardaki pek ok yapnn kullanlmasyla kolayca yaplr.burada bit seviye
grlmektedir;

bit_set(variable, bit); //used to set a bit


bit_clear(variable, bit); //used to clear a bit
bit_test(variable, bit); //used to test a bit

yukardakiler deikenlerde ve I/O da kullanlabilir.

b = input(pin); //get the state or value of a pin


output_bit(pin, value); //set a port pin to a specific
value
output_float(pin); //set a pin to input or floating
mode

93
output_high(pin); //set an output to logic 1
output_low(pin); //set an output to logic 0

PORT B zerindeki pull uplar enable veya disable edilir.

set_tris_a(value)

Verilen porta gre girilerin ve klarn kombinasyonunun set edilmesi, girilerin 1 ile
klarn 0 ile set edilmesiyle olur.
Port direction registerlar portun giri olduu her zaman dzenlenir ve nceki ilemciyi
takip etmedike unlar kullanlr;
#use fast_io(port)
#use fixed_io(port_outputs=pin, pin)
#use standard_io(port)

9.2. MXNG C AND ASSEMBLER


C programnn iinde assembler kod isteyebilir. Nedenleri olarak kod younluu,zaman
snrlamalar veya basit hale getirmektir.Aadaki rnekte program arldnda d deerinin a
ya eitini bulmaktadr.

FindParity(type d)
{
byte count;
#asm
movlw 8
movwf count
clrw
loop:
xorwf d,w
rrf d,f
decfsz count,f
goto loop
movwf _return_
#endasm
}
main()
{
byte a,d=7;
a=FindParity(d);
}

Derlendii zaman program u hale gelmektedir.

FindParity(type d)
{
byte count;
#asm

94
0005: MOVLW 8
0006: MOVWF count
0007: CLRW
0008: XORWF 27,W
0009: RRF 27,F
000A: DECFSZ 28,F
000B: GOTO 008
#endasm
000C: MOVWF 21
000E: GOTO 016
}
main()
{
0011: MOVLW 07
0012: MOVWF 26
byte a,d=7;
a=FindParity(d);
0013: MOVF 26,W
0014: MOVWF 27
0015: GOTO 005
0016: MOVF 21,W
0017: MOVWF 25
}

PC 16Cxx Ailesine Uygun Hale Getirmek iin;

Alan Tanmlama;
b: 8 bitlik file registeri iindeki bit adresi (0-7)
d: hedef seimi; d=0 sonucu Wya,d=1 ise sonucu file registerna kaydet. Assembler hedef olarak
Wve f i kullanr.
f: file register adresi (0x00-0xFF)
k: sabit veri veya etiket;
W: accumulator
i: pointer kontrol tablosu (i=0 deiiklik yok, i=1 ise komuttan sonra deeri artr)

PIC 16CXX
Sabit leyen ve Kontrol Komutlar

95
Byte Ynlendirmeli Komutlar

96
Bit Ynlendirmeli Komutlar

PIC 16C5X
Sabit leyen ve Kontrol Komutlar

97
Byte Ynlendirmeli Komutlar

Bit Ynlendirmeli Komutlar

98
PIC 16C5X / PIC 16CXX
Baz zel Komutlar
Bu tr komutlar assembler tarafndan ve programda baz komutlarn yerine kullanlr.
Makrolara benzeyen ksayollar vardr.

9.3. LER BT KULLANIMI

99
CCS C Compiler, genelde PC micro programalar iin gerek duyulan bit kullanm
fonksiyonlarnn numarasna sahiptir.
bit_set, bit_clear ve bit_test basite biti deiken iinde set edebilir ve silebilir veya tek
bitin durumunu test edebilir.Bitler dk dereceli bite gre numaralandrlrlar (ilk srada 0.bit, en
yksek deerde 7. bit bulunur).

rnein;

c=A; //c in binary is now 01000001


bit_test(c,5); //c is now 01100001 or a
if(bit_test(x,0))
printf(X is odd);
else
printf(X is even);

shift_left ve shift_right komutlar bitin numarasna gre bir bit kaydrr. Buna ek olarak
bu komutlar size bitin yerini deer olarak boaltmanza yardmc olabilir.bu komutlar deerleri 0
yada 1 ise darya kaydrldnda geri dnderirler. Not;bu komutlar hafzadaki LSB dk byte
gze alrlar. kinci parametre bytelarn numaras ve son parametre yeni bittir.

rnek:

int x[3] = {0b10010001, 0b00011100, 0b10000001};


short bb; //x msb first is: 10000001, 00011100,
10010001
bb = shift_left(x,sizeof(x),0);
// x msb first is: 00000010, 00111001,
00100010
//bb is 1
bb = shift_left(x,sizeof(x),1);
// x msb first is: 00000100, 01110010,
01000101
//bb is 0

Not:Birinci parametre pointerdr. Bu durumda x in bilinmesine kadar nceki pointerdr. Basit


deiken veya yap kullanlm ise & operatr eklenmelidir.

long y;
struct { int a,b,c} z;
shitf_left(&y,2,0);
shitf_right(&z,3,0);

rotate_left ve rotate_right komutlar da shift komutlar gibi alr. Bit dar doru
kaydrlmsa bir taraf dier tarafa kaydrr. rnein;

int x[3] = {0b10010001, 0b00011100, 0b10000001};

100
//x msb first is: 10000001, 00011100, 10010001
rotate_left(x,sizeof(x));
//x msb first is: 00000010, 00111001, 00100011

swap fonksiyonu dk 4 biti yksek 4 bitle deitirir. rnein;

int x;
x = 0b10010110
swap(x); //x is now 01101001

9.4. TIMERS

Btn piclerde 8 bit timer vardr ve baz piclerin fazladan 2 timeri vardr.

rtcc (timer0) = 8Bit

clock komutu veya harici kaynak tarafndan ykseltilir.


Pre-scaler in yava artmasn salar.
Timer 0 ,255 ten 0 a dt zaman kesme meydana gelir (16C5X hari).

timer1 = 16Bit

clock komutu veya harici kaynak tarafndan ykseltilir.


Pre-scaler in yava artmasn salar
Timer 1,65535 ten 0 a dt zaman kesme meydana gelir
Capture moda, timer 1 bacaklar deiirse dier register da kaydedilerek sayar.kesme yine
meydana gelir.
Compare moda,sayma istenen deere ulatnda bacak deiebilir ve kesme meydana gelir.
Bu timer PWM in bir ksm paras alr.

timer2 = 8Bit

clock komutu veya harici kaynak tarafndan ykseltilir.


Pre-scaler in yava artmasn salar
Timer 2,255 ten 0 a dt zaman kesme meydana gelir
Kesme post-scaler tarafndan kullanldnda yavalayacaktr bylece kesme olmadan nce
decei belli bir numaray isteyecektir.
Bu timer PWN in bir paras olarak alr.
Aadaki basit rnekte ne kadar srede high durumana geeceini gsteren rtcc verilmitir.

#include <16c74.h>
#fuses HS,NOWDT
#use delay(clock=1024000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
main() {
int time;
setup_counters(rtcc_internal, rtcc_div_256);

101
//increments 1024000/4*256 times per second
//or every millisecond
while(!input(PIN_B0)); //wait for high
set_rtcc(0);
while(!input(PIN_B0)); //wait for low
time = get_rtcc();
printf(High time = %u ms.,time);
}

Aadaki rnekte timer1 kullanlm B0 pininin high seviyeye srldkten sonra C2


pinin ne kdar srede high olduu gsterilmitir.

#include <16c74.h>
#fuses HS,NOWDT
#use delay(clock=8000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#bit capture_1 = 0x0c.2 //pir1 register
//bit 2 = capture has taken place
main()
{
long time;
setup_timer1(t1_internal | t1_div_by_2);
//Increments every 1 us
setup_ccp1(ccp_capture_re);
//configure CCP1 to capture rise
capture_1=0;
set_timer1(0);
output_high(PIN_B0);
while(!capture_1);
time = ccp_1;
printf(Reaction time = %1u us.,time);
}

102
9.5. A/D EVRM

A/D 16C7x ve 12C67xlerde 8 bitin rezolsyonundadr. Bunun anlam voltaj


lldnde 255 deer iinden biri olmas gerekmektedir.eer 5V kullanlacaksa, 5/255=19.6
mV0 dan 5V a olarak bulunur. Fakat, eer ki referans voltaj 2.55 volt ise resolusyon 10mV olur
ama dizi 0dan 2.55 e der.Dier microchip paralarnda 10,11,12 ve 16 bit resolusyon vardr.
Not:portlar iin bir varsaym, btn analog ve dijital ksmlar analog yapmaktr.analog ve diijtal
kullanmnda I/O hattnn kombinasyonu asndan bu not nemlidir.Aadaki tablolar
datasheetlerden alnmtr.

103
C de A/D nin setup ve operasyonlar hazr library programlarla basit olarak yaplr.

set_adc_channel(0-7)
a/d evrim iin kanal seimi
setup_adc(mode)
a/d dntrcy set etme
Modlar aadaki gibidir:
adc_off, adc_clock_div_2, adc_clock_div_8,
adc_clock_div_32,adc_clock_internal
setup_adc_ports(mix)
ADC bacaklarn analog,dijital veya combinasyonalr eklinde
ykler.Sabitler all_analog ve no_analog btn ipler iin
ayndr.Dier baz sabitlere rnekler;
ra0_ra1_ra2_ra3_analog/a0_ra1_analog_ra3_ref
read_adc()
Analog dijital dntrcden dijital veriyi okur.
Setup_adc ve Set_adc komutlar ou kez bu komuttan nce
arlr.

rnek:

setup_adc(ALL_ANALOG); //sets porta to all analog inputs


set_adc_channel(1); //points a/d at channel 1
delay_ms(5000); //waits 5 seconds
value = read_adc(); //reads value
printf(A/D value = %2x\n\r, value);//prints value

9.6. VER HABERLEMES /RS-232


Mhendislik hayatnda PC ler, modemler arasndaki RS-232 haberlemesi nemli bir yer
tutmaktadr.Kendi balarna yaplm rnler d dnya ile haberlemesi iin ara birimlere ihtiya
duyarlar. D konnektr zerinde bulunan 9 veya 25 pinin permtasyonu ok fazladr. En az ara
birim 3 hat ile yaplabilir. Bunlar toprak hatt, alc hatt ve verici hattdr.RS 232 ara birimi ile
balant yaplrken hangisinin veri haberleme aletleri (DCE) hangisinin veri terminal aletleri
(DTE) olduunu bilmek nemlidir.
Konnektrler;
9 Pinli D Konnektr;
Pin Fonksiyon Veri Yn
1 Elde Kontrol
2 Alnan Veri

104
3 Gnderilen Veri O
4 Veri Terminali Hazr O
5 Toprak <>
6 Veri Kmesi Hazr
7 Gnderme stei O
8 Gndermek iin Temiz
9 Zil Belirleyici

25 Pinli D Konnektr;
Pin Fonksiyon Veri Yn
1 Koruma Topra <>
2 Gnderilen Veri O
3 Alnan Veri
4 Gnderme stei O
5 Gndermek iin Temiz
6 Veri Kmesi Hazr
7 Sinyal Topra <>
20 Veri Terminali Hazr O
22 Zil Belirleyici

Dier pinler basit balant fonksiyonlarna sahip deildir.


Seri verileri uzak mesafelere gndermekte kullanlan modem, mikrodalga hatlar gibi aletlere
Data Communication Equipments (Veri Haberleme Aletleri-DCE), seri verileri gnderen ve alan
terminallere ve bilgisayarlara ise Data Terminal Equipments (Veri Terminal Aletleri-DTE) denir.
RS 232 sinyalleri iin gerilim seviyeleri u ekildedir;
Lojik 0-- +3V~ +25V
Lojik 1-- -3V~ -25V
Veri Formatlar
Balang Biti Her zaman 1 bit
Biti Biti 1 veya 2 bit
Veri Bitleri 7 veya 8 bit
Parity Biti Hata tespiti istenmiyorsa hibir bit
Hata tespiti isteniyorsa tek veya ift bitler

Asenkron Veri letimi;

MSB LSB
Stop Biti Start Biti

Asenkron Seri letiim;


Asenkron iletiim belirgin zellikleri unlardr;
-Transfer karakter baznda yaplr.
-Her bir veri transfer cihaznn(karlkl ulardaki) iletiim parametreleri benzer
olmaldr.(hz,kodlama seti vb.)
Bir asenkron karakter start biti,parity biti,veri bitleri ve stop bitlerinden oluur.

105
Parity Bit(Elik Biti);
Transfer edilen karakterin kar tarafa doru gnderilip gnderilmediini kontrol etmek
iin kullanlan bittir.Eer alc alnan parity biti ile hesaplanan parity bitinin eit olmadn tespit
ederse hata verir ve o andaki karakteri kabul etmez.Asenkron iletiimli modemlerde parity biti
eitleri ODD,EVEN,MARK,SPACE yada NONEdir.
ODD parity sisteminde tm verinin iindeki 1ler ile parity biti toplam tektir.Mesela 8 bitlik
10101100 verisinin parity biti 1 olmaldr. EVEN parity sisteminde tm verinin iindeki 1 ler
ile parity biti toplam ifttir. Mesela 8 bitlik 10101100 verisinin parity biti 0 olmaldr.
Parity sistemi hatalar dzeltmez sadece hatann olutuunu gsterir. Bylece bir hata
olutuunda verinin tekrar yollanmas iin istek yaplr. PIC micro MCUda parity testi
yazlmsal olarak oluturulmaktadr.
Baud, Bit/sn olarak ifade edilen bit iletiim hz birimidir. Analog sinyaldeki deiim
hzdr. rnein bir bitin gemesi iin gereken zaman 3.33 msn ise baud oran 1/3,33 msn veya
300 bauddur.RS232, 15 metre mesafe iin 20000 baud, 915 metre iin 2000 baud hzlaryla
alr. Ykselme ve dme zaman hzlar, karklklar nlemek asndan 30 V/sn ile
snrlandrlmtr.

106
ASCII DNM TABLOSU

ASCII SEMBOLLERNN AILIMLARI

107
RS232 BALANTI PROTOKOL

TPK MODEM BALANTISI

RS232 TEST BALANTISI

108
USART

Usart 3 moddan birinde alr. Senkron master, senkron slave ve asenkron.


Asenkron modu, en ok kullanlan moddur. Bu modlarla pclere ve modemlere arabirim
olmaktadr. Bundan baka usart A/D,D/A ve EEPROMa arabirim olmaktadr.
Usartta kabul edilen veri format 8 veya 9 veri biti, none, odd veya even paritydir. Parity
sistemi yazlmda yaplmaktadr donanm fonksiyonu deildir. Alnan veri, framing ve overrun
error olarak bilinen hatalar iin kontrol edilir. Asenkron modda usart tam duplex haberlemeyi
salar, senkron modda ise yar duplex haberlemeyi salar. nceden tanmlanan fonksiyonlar
uygulamann hzn arttrr;

CCS compiler dahili olarak bulunan pic micro MCUnun uartn kullanabilme yeteneine
sahiptir. Uart donanm olarak mevcutsa oluturulan kod donanm kullanacaktr. Donanm olarak
mevcut deilse oluturulan kod daha byk olacaktr. Alc ve vericide ki interrupt dnda kod

109
donanm uart gibi davranr. Yazlm uart ktaki veri seviyelerini terslendirme kabiliyetine
sahiptir. Harici src veya seviye kaydrcya gerek duymaz. Bu fonksiyon donanmda mevcut
deildir. Bir pic micro MCU uygulamasnn kodu baka bir uygulamaya rahatlkla aktarlabilir.

C compiler haberleme iin hazr fonksiyonlara sahiptir, rnein;

kbhit () fonksiyonu bir karakterin hazr olup olmadn saptar. Getc() fonksiyonunda
karakterin beklemesi kbhit () fonksiyonu ile salanr. Aadaki rnek bir karakter iin 1,5 sn
beklemektedir.

9.7. I2C HABERLEMES

I2C popler bir bus ile donanm arasnda iki-telli haberlemedir. I2C bus, bir master ve
herhangi bir numarada slavee sahiptir. Master herhangi bir slaveden veri alabilir veya
gnderebilir. Her slave belli bir adrese sahiptir.
I2Cnin telleri SCL ve SDA olarak adlandrlr. kisini de pull-up direnci (1-10K)
gerekmektedir. (+5 V)
lk baytn LSB biti veri transferinin ynn belirler. Veri transfer edilir ve alc her bayt
dorular. Alc SCLyi azaltarak transfer hzn azaltabilir. Aadaki rnek 10. adresteki slavee
3 bayt yollar ve sonra 1 baytn okur;

110
9.8. SPI HABERLEMES
I2C gibi, SPI 2 veya3 telli donanm veya standart aletlerindeki haberlemedir.1 tel clocku
salar dieri ise veri alr veya yollar. Eer 3. tel kullanlyorsa Enable veya Reset olarak
kullanlr. Aadaki kod 10 bitlik komut yollamaktadr. lk olarak MSB biti yollanr.

Aadaki C kodu 8 bitlik bir cevab okur.

111
Son iki rnek PC micro MCUdaki veriyi ieri ve dar kaydrr. Kolaylkla bu kodlar
baka aletler modifiye edilebilir. Yavalatc ksmlar gecikmeye ihtiya duyarlar.
Baz Piclerde SPI donanm olarak mevcuttur. Aadaki rnek donanm yazma ve
okumak iin kullanlmaktadr.

Not: Donanm ierisinde yaplanlar kstldr. Mesela yukardaki kod 10 deil 16 bit yollar. ou
SPI aletleri ilk bit gelene kadar dier bitleri reddeder.

9.9. PWM RETEC

112
PC micro MCUnun donanmdaki PWM retecinin registerleri kurulur. Daha sonra sabit
yazlm olmadan da PWM kendi bana devam edebilir.
PWM deerlerini hesaplanmas basit bir tablo ile kolayca yaplabilmektedir.
rnek:
PWM setup- frekans = 600Hz M/S oran = 1/1
n seviyelendirme deeri= ((1/PWM frekans)/ nseviyelendirme deeri*(4/OSC frekans))-1
PWM rezolsyon = (log(OSC frekans/PWM frekans))/log 2
Yukardaki rnek sonucunda, 4MHzlik OSC ve /16 n seviyelendirmeli 600 Hz lik
PWM, 103,2 PR2 registerine ykler ve rezolusyonu 12,7 bittir.

set_pwm1_duty(value)
Bu kod pwm modeline 10 bit deerini yazar
set_pwm2_duty(value)
Eer sadece 2 bit yollanrsa 2 LSB ler reddedilir.
set_ccp1(CCP_PWM), set ccp2(CCP_PWM)
bu fonksiyon pwm modelinin iinde ccpyi oluturur.

rnek:

113
Eer osilatr 4MHz olursa potansiyel rezolsyonu 11 bit frekans da 1.773KHz olur.
Aadaki rnek 2 tondan birini retmektedir.Frekans aadaki kod ile kurulur:

duty oran ise aadaki kod ile kurulur:

2 ton frekans 2.475 KHz ve 996Hzdir.Sre basit bir gecikme ile set edilir.

Not:PIC micro MCUnun PWM donanm olmadan yazlm alamaz fakat usartta alr.
rnein;

bu kod 1Khzlik kare dalga retir.


9.10. LCD DSPLAY SRC
PIC micro MCU iinde dizayn aamasnda en nemli arayzlerden bir tanesi Hitachi
kontrolre bal olan LCD displaydir. Operasyonun 2 modu vardr.4 ve 8 teller yazma/gecikme
veya yazma/kontrol ilemleri displaye veri gnderilirken yaplr.Bu onun bir avantajdr.
Tipik bir arayz devresi aada gsterildii gibidir.PIC arayzleri 4 bitlik
moddadr.Register seme(RS) display ierisindeki kontrol ve veri register banklarnn yerini
deitirir ve the Enable(E) display ierisinde strobe verisi olarak kullanlr.

Kod yledir;

114
Displaye bilginin bayt u ekilde gnderilir;

lcd_send_nibble fonksiyonu strobe fonksiyonudur.

115
LCD displaylerden bahsederken kullanlan baka bir fonksiyon scrolldur.Bu sa/sol
scroll inas deildir.Ama yazlm olarak scroll up fonksiyonu vardr.Aadaki rnekte 4 satrlk
displayin en stteki satr en son gnderilir.

116
9.11. KESMELER
Kesmeler harici kaynaklardan veya PIC micro MCU ierisindeki kaynaklardan
gelmektedir.Kesme meydana geldiinde pic u yolu izler.
DONANIM AKII YAZILIM AKII

117
Donanm ksm pic micro MCUnun kontrolndedir,yazlm ise tamamen kendi
sorumluluumuzdadr.Kesme meydana geldiinde kaynak bir tane veya daha fazla kesme isterse
ilk adm olarak test edilir ve belirlenir.
Hangi PIC eidinin dizaynda kullanlaca kesme numaras ve tipine gre
deiir.PIC16C5X serisinde kesme yoktur ve yazlm bu rne zeldir.Baz kesme kaynaklar
gsterildii gibidir.
#priority kesme prioritysini set eder.

#int_globe kendi kesme ilemimizi olutururken kullanlr.


#int_default Kesme bayraklarna bakarak yanl kesmenin olup olmadna bakar.

Bu fonksiyonlar kesme bayraklarn kendileri set veya clear ederler bylece kesmeler
program sresince meydana gelir veya gelmez.

Bu harici kesme meydana geldiinde PORT Bnin 0. bitindeki gelen polarityi seer.
Bu rnek Usart zerinden karakter almn gstermektedir.Bu fonksiyon LCD display
tarafndan meydana getirilir,karakterler elle yapldndan daha hzl ekilde alnr.

118
119

You might also like