CCS-C ile PIC Programlama, Temel C Bilgisi – 2
Değişkenler, Veri Yapıları ve Operatörler
Malumunuz derslerimiz biraz yavaş gidiyor.:) Konuyla ilgili yayınladığım yazılar hep işin teori yönündeydi. Bu yazımızdan sonra Temel C ile ilgili bir kaç konu anlatımı içeren bir adet yazı daha yayınladıktan sonra, işin zevkli kısmına geçeceğiz. PIC, CCS-C ve Proteus üçlüsüyle çok güzel çalışmalar yapacağız inşallah.
Değişkenler
Değişkenler programların olmazsa olmazlarıdır, belirli tipte verileri tutmak amacıyla programcı tarafından tanımlanırlar. Teknik olarak değişkenler, RAM’deki adres bölgeleri için verilen isimlerdir diyebiliriz. Örneğin long x_degeri; şeklinde bir tanımlama yaptığımızda, x_degeri adında 2 byte uzunluğunda bir değişken kullanacağımızı derleyiciye bildirmiş oluyoruz. Derleyici programı derlerken, x_degeri değişkeni için RAM’de 2 Byte (16 Bit) uzunluğunda bir adres bölgesini x_degeri değişkenine atar.
Aşağıdaki kodda x_degeri değişkenine 12345 değeri atanıyor.
x_degeri = 12345;
Bu komut işletildiğinde hafızada x_degeri değişkeni için ayrılan alana 12345 değeri yazılmış olur.
CCS-C Derleyicisinde tanımlanabilecek değişken türleri ve alabilecekleri değerlerlere bir göz atalalım.

int1 veri tipi 1 bitlik değerleri tutmak için kullanılır. Alacağı değer 1 veye 0 olabilir. int1 anahtar kelimesi yerine boolean da kullanılabilir.
int1 x; = boolean x;
int8 veri tipi 1 byte’lık değerleri tutmak için kullanılır. Alacağı değer işaretli veya işaretsiz oluşuna göre değişir. int8 anahtar kelimesi yerine int kullanılablir.
değişken tanımlamalarından önce işaret tipi belirtilmezse ön tanımlı olarak işaretsiz olarak kabul edilir.
int x; // x değişkeni işaretsiz 1 byte tam sayı, 0 ile 255 arasında bir değer alabilir.
signed int x; //x değişkeni 1 byte işaretli tam sayı, -128 ile +128 arasında bir değer alabilir
int x; = int8 x;
int16 2 byte lık değerleri tutmak için kullanılır. int16 kelimesi yerine long kullanılabilir
long x; = unsigned long x; // x değişkeni 2 byte işaretsiz tam sayı. 0 ile 65535 arasında bir değer alabilir
signed long x; // x değikeni 2 byte işaretli tam sayı, -32768 ile +32767 arasında bir değer alabilir.
int32 4 byte’lık tam sayı değişkenleri tutmak için kullanılır,.
int32 x; = unsigned int32 x; // x değişkeni 4 byte tam sayı, -2147483648 ile + 2147483647 arasında bir değer alabilir.
float32 Virgüllü sayıları tutmak için kullanılır -1.5xe45 ile 3.4xe38 arasında bir değer alabilir, float32 kelimesi yerine float kullanılabilir.
Toplu Örnek
#include <16f628A.h>
int1 durum,role; // durum ve role değişkenleri 1 Bit uzunluğunda
boolean anahtar; // anahtar değişkeni 1 Bit uzunluğunda
int8 x,y,z; // x,y,z değişkenleri 1 Byte uzunluğunda
int k,l; // k,l değişkenleri 1 Byte uzunluğunda
int16 sayac1; // sayac1 adlı değişken 2 Byte uzunluğunda
long sayac2; // sayac2 adlı değişken 2 Byte uzunluğunda
int32 deger; // deger adlı değişken 4 byte uzunluğunda
float bolum; // bolum adlı değişken reel sayı türünde veriler tutacak
main()
{
durum = 1;
anahtar = 0;
x = 15;
k = 200;
sayac1 = 12368;
sayac2 = 57600;
deger = 1254365;
bolum = 25,6789;
}
char veri tipi: Karakter verileri tutmak için kullanılır, 1 byte uzunluğundadır.
char ch; ch = 'a'; // bu şekilde atama yapılabilir ch = 97; // bu şekilde de atama yapılabilir (97 = a karakterinin ascii değeri)
CCS-C derleyicisinde 1 byte’lık değişkenleri tanımlarken int ve int8 kelimelerini klulanacağınız gibi byte anahtar kelimesini de kullanabilirsiniz.
byte x; // x değeri 1 byte uzunluğunda
Değişkenler tanımlanırken başlangıç değeri atanabilir.
int x=50,y,z=23; // 1 Byte'lık x,y,z değişkenleri tanımlanıyor ve // başlangıç değeri olarak x = 50, z = 23 yapılıyor.
Aşağıdaki örnekte görüldüğü gibi, tek satırda bir çok değişkene değer ataması yapılabilir
int x,y,z; x=0; y=0; z=0; Yerine x=y=z=0; //bu şekilde atama yapılabilir
Dizi Değişkenler
C’de diziler şu şekilde tanımlanır.
tip isim[boyut];
Örnek
int dizi[10]; // dizi adlı dizimiz 10 elemanlı ve her bir elemanı int cinsinden yani 1 byte;
Dizinin elemanlarına değer atama.
dizi[0] = 5; // dizinin birinci elemanına 5 değerini atadık
dizi[9] = 56; // dizinin 10. elemanına 56 değerini atadık
dizi[10] = 5; // böyle bir atama yapılamaz çünkü dizimiz 10 elemanlı 0….9
başka örnekler
char yazi[30];
long degerler[20];
Dizilere başlangıç değeri verme
char mesaj[] =”Merhaba Okuyucu”;
int kume[5] = { 12,45,23,68,72 };
char dizi[7] = {‘m’,'e’,'r’,'h’,'a’,'b’,'a’};
Dizilerin kullanımında Kod örneklerimize geçtiğimizde daha ayrıntılı bakacağız.
Veri Yapıları
struct veri yapısı
sutruct veri yapısı istediğiniz tarzda değişken tanımlamanıza ve tanımladığınız değişkene kısmen veya tamamem erişmenize izin verir. Aşağıdaki basit struct örneğini inceleyelim
struct koordinat {
int x_eksen;
int y_eksen;
int z_eksen;
boolean durum;
};
Yukarıdaki örnekte koordinat isminde 3 adet 1 Byte’lık tamsayı değişken içeren bir veri yapısı tanımlamış olduk. Veri yapımızı oluşturduğumuza göre artık bu yapı türünden değişkenler oluşturup kullanabiliriz.
struct koordinat gps; //gps değişkenimiz koordinat veri yapısı cinsinden; gps = 0; //gps değişkenine ait x_eksen, y_eksen, z_eksen ve durum değerlerini sıfırla gps.x_eksen = 200; //gps değişkenine ait z_eksen değeri = 200 gps.y_eksen = 125; // y_eksen değeri 125 gps.durum = 1; // durum = 1
Görüldüğü gibi yapının bir elemanına ulaşmak için yapı adından sonra nokta konulup elean adı yazılıyor. Yapı tanımlanırken farklı türden elemanlar aynı yapı içerisinde bulunabiliyor.
Struct yapısında bir değişken tanımlanırken de ilk değer ataması yapılabilir.
struct koordinat gps = {200,125,0,1}; //gibi
Union Yapısı
Bu yapıda birden fazla değişken aynı adres bloğunu paylaşır. Tanımlaması struct gibidir, daha anlaşılır olması için şöyle bir örnek verelim
union deger {
int x;
long y;
};
Gördüğünüz gibi yapı içerisinde farklı uzunlukta iki değişken tnaımladık. CCS-C derleyicisi için int 1 byte long ise 2 byte uzunluğundadır. Union yapısı için bellekte en uzun eleman kadar yer ayrılacağından. Tanımladığımız deger adlı union yapı bellekte 2 Byte uzunlukta olacaktır. Union elemanlarına struct yapısındaki gibi ulaşılır. Aşağıdaki örneği inceleyin
union deger sayi; sayi.y = 0x1125; // y = 0x1125 hex degerini atadık.
yukarıdaki atama yapıldıktan sonra. sayi.x = 0×11; olur. İşte unionun farkı burada bir elemana yazılan değer diğerinide etkiliyor, nedeni ise ikisininde aynı adresten başlıyor olması
#define
#define direktifi program için sabit değerler tanımlamanızı sağlar.
#define KONTROL_SURESI 1000
main()
{
long x;
x = KONTOL_SURESI // x = 1000 olur
}
Program içerisinde 1000 değerini bir çok yerde kullandığımızı düşünelim. Her yere elle yazmak yerine bir isim vererek tanımlayıp, bu ismi kullanmak hem programın okunabilirliği açısından faydalı olacaktır hemde size hız kazandıracaktır. Diyelimki KONTROL_SURESIi 1000 denediniz ama olmadı ve 1500 denemek istiyorsunuz.
Tek yapmanız gereken #define KONTROL_SURESI 1500 olarak değiştirmek. Tanımlama yapmamış olsaydınız kod içerisindeki tüm 1000 değerlerini değiştirmek zorunda kalacaktınız.
typedef
typedef direktifini kullanarak int,long,char gibi değişken tipi adlarını değiştirebilirsiniz, şöyleki;
typedef int birbyte; // "int" kelimesi yerine "birbyte" kelimesini kulanmak istiyoruz birbyte data; // data 1 byte int tipinde değişken olur
Operatörler
Karşılaştırma operatörleri
Eşitlik
== // Eşit mi? manasına gelir
Kontrol yapılarına bir sonraki derste bakacağız ama operatörlerin anlaşılması için birkaç örnek verelim şimdiden
if(x==5) // x degeri 5'e eşit mi?
{
x = 0; //x 5'e eşit x=0 yap
}
Yukarıdaki kod
da x değerinin 5 sayısına eşit olup olmadığına bakılıyor. eşit ise { } süslü parantezler arasındaki kod çalışır yani x = 0;
Büyük
> operatörü büyüklük kontrolü için kullanılır
if(x > 5) // x'5 ten büyük mü?
Büyük Eşit
>= operatörü eşit veya daha büyük kontrolü için kullanılır
if(x >= 5) // x 5'e eşit veya daha büyük mü?
Küçük
< operatörü küçüklük kontrolü için kullanılır
if(x < 5) // x 5'ten küçük mü?
Küçük Eşit
<= operatörü eşit veya daha küçük kontrolü için kuullanılır
if(x <= 5) // x 5'e eşit veya daha küçük mü?
Büyük eşit ve Küçük eşit operatörlerinde “=” sağda olmasına dikkat edin.
Aritmetik Operatörler
+ Toplama
- Çıkarma
* çarpma
/ bölme
% kalanlı bölme
Operatörleridir.
Örnek
int a,b; long sonuc sonuc = a * b; sonuc = a - b; sonuc = (a*b) + (a-b) sonuc = (a/b) + (b/a) % operatörü bir sayının diğerine bölümünden kalan sonucu verir. aşağıdaki örneği inceleyelim
int a; a = 10; // a değişkenine 10 değerini ata a = 10 % 2; // a = 10 sayısının 2 ye bölümünden kalan, a = 0 olur 10 = 5*2 a = 10 % 3; // a = 10 sayısının 3'e bölümünden kalan, a = 1 olur. 10 = (3 *3) + 1
Artırma ve Azaltma Operatörleri
++ operatörü değişken değerini bir artırma , — operatörü ise bir azaltma işlemleri için kullanılır.
int a; a = 10; ++a; // a'yı 1 artır. a = 11 olur --a; // a'yı bir azalt; a++; a--; şeklinde de kullanılabilsede ben birinciyi kullanmaya alışın derim.
Lojik Operatörler
Lojik operatörler istenilen durumların oluşup oluşmadığının tespiti için kullanılırlar.
&& AND, Yani her iki durum da doğrumu manasında
|| OR, Yani iki durumdan herhangi biri doğru mu manasında
! NOR, Belirtilen durumdan farklı ise
int x,y,z; x = 5; y = 10; z = 15; if((x > y) && (x > z)) // x değeri y den ve z den büyük mü? if((x != 0) || (y > z)) // x değeri sıfırdan farklı veya y değeri z değerinden büyük mü. Burada x sıfırdan büyük ama y z'den büyük değil. Koşul sağlanmış olur. if(!(x==0)) // x sıfıra eşit değilse
Bit Seviyesinde İşlem Operatörleri
>> Sağa kaydırma
<< sola kaydırma
& AND (Ve)
| OR (Veya)
^ EXOR (Özel Veya)
~ Inverse (Ters Çevirme)
Şimdi bu operatörleri örnekler vererek açıklayalım.
int a; a = 12; 12 sayısının bit olarak gösterilişi. 00001100 şeklindedir. Hex olarak ise 0x0C a>>2 ; // a'yı 2 bit sağa kaydır 00000011. anın yeni değeri = 3 olur. 0x03 Hex a = 12; a<<1; // a'yı bir bit sola kaydır. 00011000 = 24, 0x18 hex
Demekki bir sayıyı bir bit sola kaydırmak 2 ile çarpmak manasına geliyor
a = 12; // 00001100 b = 48; // 00110000 a & b = 00000000 = 00001100 'olur. Bitler alt alta birbirleriyle And'lenir sonucun bir olması için her iki bit'in de 1 olması gerekir
a = 12; // 12 = 00001100 b = 56; // 56 = 00111000 a & b = 00001000 = 8 a | b = 00111100 = 60 a ^ b = 00110100 = 52 // 1^1 = 0, 1^0=1, 0^1 = 1, 0^0 = 0 ~a = 11110011 olur. (1 ler 0, 0'lar 1 yapılır)
Faydalı Bilgiler
İşlemlerin Kısa yazılması
a = a + b; yerine a += b; yazılabilir, bu ifade a = a + b manasına gelir a -= b; // a = a -b; a &= b; // a = a & b;
Şeklinde örnekleri çoğaltabiliriz.
Değişkenlere Değer atama
CCS-C derleyicisinde değişkenlere decimal, binary veya hex şeklinde değer atayabilirsiniz.
Örneğin bir değişkene 12 değerini atamak istiyorsak
int a; a = 12; // decimal a = 0x0c; // Hex a = 0b00001100; // Binary
Bu üç yöntemi de kullanabiliriz.
Bu yazımızda açıklamaya çalıştığımız konularla ilgili olarak internet üzerinden bir çok kaynağa ulaşabileceğinizi unutmayın. Anlatamadığımız, yetersiz kaldığımız kısımları başka kaynaklardan telafi ediniz.
“CCS-C ile PIC Programlama, Temel C Bilgisi – 2” yazısı için 29 Yorum yapıldı
Gerçekten bilmediğim bir kaç şeyi öğrendim.
Devamını bekliyorum…
Faydalı bir yazı olmuş, elinize sağlık…
@ferdem,@FxDev
Eyvallah…
Birilerinin faydalandığını bilmek benim için büyük mutluluk.
@Emrah AYDIN
Arkadaşım yazında bi dolu hatalar var
Bu hataları
“CCS-C Dersleri Genel C Anlatımı Ders-2 Hataları Bölüm-1″
“CCS-C Dersleri Genel C Anlatımı Ders-2 Hataları Bölüm-2″
..
..
şeklinde sıralayacam
“CCS-C Dersleri Genel C Anlatımı Ders-2 Hataları Bölüm-1″
Verdiğin ilk tabloda, int8 için işaretli sayı sınırları :
-128 _ +127
olması gerekir. Aynı durum yazının ilerleyen kısımlarında bir kez daha tekrar edilmiştir…
Bkz.
“//x değişkeni 1 byte işaretli tam sayı, -128 ile +128 arasında bir değer alabilir”
@deli kadir
Aman ne büyük hata
Sende gecenin bi körü yazı yazarsan sende bole hatalar yaparsın meraklanma
Nerelerdesin sen hic sesin soluğun çıkmıyor. Hala sizin ordaki kursa götüreceksin beni diye bekliyorum
Ben sana bole deli saçması yorumlar yazma bu siteye demedim mi
Yorumlarım devam edecek abi
Bu arada daha çarpıcı hatalar da var
Çalışıyorum ve yoğunum abi, siz ne alemdesiniz?
Galiba haftasonu gelecem sizin o taraflara doğru…
“CCS-C Dersleri Genel C Anlatımı Ders-2 Hataları Bölüm-3″
Belki de yazıdaki en çarpıcı hata bu. Kodu herhangi bir derleyicide denerseniz o bile “HATA” diye bangır bangır bağıracaktır
“struct koordinat gps;
..
gps = 0;”
Bu ifadede gps adlı değişken, yapı türündendir ve tek başına bir atamaya tabi tutulamaz…
Sanırım bugünlük bu kadar yeter

Yazıdaki hatalatı ifşa etmeye devam edecem
Fakat artık işe dönmem gerekiyor…
Görüşelim bi ara deli kadir.
Ressamın biri şehrin ortasına bi resim koymuş yanınada kırmızı bir kalem bırakıp şöyle bir not iliştirmiş. “Bu resimde gördüğünüz hataları işaretleyin”, resim bir günde kıp kırmızı olmuş. Onlarca kişi resmi işaretlemiş. Ertesi gün ressam ikinci bir not bırakmış, “Gördüğünüz Hhataları Düzeltin”. Bir Allahın kulu dokunmamış resme
struct koordinat gps;
Ram Symbol Map
029-02B gps (görüldüğü gibi gps 29,2a,2b adreslerinde toplam 3 byte)
İşte C/ASM List
……………….. gps = 0;
*
050D: CLRF 2B
050E: CLRF 2A
050F: CLRF 29
Buyur burdan yak…
Abi, sen o kodu derle, koddaki
gps = 0;
ifadesi de gerçekten senin istediğin işi yapsın, ben de bi daha yorum yazmam
Hadi bakalım
Bu arada bana bi yetki ver siteyi düzeltmekle ilgili, gör bakalım ben kırmızı kalemi kullanıyor muyum, kullanmıyor muyum
kadirciğim yukarıdaki satırlar derlenmiş koddan alınma. gördüğin gibi derleiyci gps değişkeni için 29,2a,2b adreslerini kullanmış. ve ben gps = 0; kodunu yazdığımda derleyici bu koda karşılık
050D: CLRF 2B
050E: CLRF 2A
050F: CLRF 29
yukarıdaki satırlari üretimiş, yani gps’in 3 elamanının değerini sıfırlamış.
E ozaman kurtulduk senin yorumlarından oyle mi
Abi bu CCS’in aşırı anlayışlı bi tarafı var demek
Standartlara göre bu ifade yanlış. Hatta benim elimdeki başka bir derleyici bu kodu, haklı olarak, hatalı olarak gösteriyor.
Sözümüz söz. Bundan sonra yorum yok. Ama bilinsin ki bu CCS’in ayıbıdır
CCS-C Tam olarak Ansi C uyumlu değil, sonuçta PIC’lere özel bir derleyici. Normal Karşılamak lazım.
deli kadir’den kurtuldugunuza sevindim dediginiz gibi
bos laf uretmektense tas ustune tas koyan yok anca elestirelim nezaman birseyler uretecegiz bilmiyotum
yazılarınızı lgiyle ve meerakla takip ediyorum kolay gelsin
Eyvallah Hüseyin
Deli kadirden kurtulduk çok şükür
Emrah Hocam eline sağlık uzun süredir erteliyordum pic’i şimdi seninle başladık..
benden de biraz katkı olsun
c programlamaya tamamlayıcı olarak :
http://www.elektrotekno.com/about47795.html
Kocaeli Üniversitesi C programlama notları
sevgili hocam ccs de bıldimiz asm deki gibi komut dizini var sizden bu ccs c dilinde pıc program yazabilmem icin bu komutların tamamını sitenizde yayınlasanız ve nerede nasıl kullandıgımızı anlatıyorsununu cok verimli oluyor dersler ve ccsc kac adet komut var belki garip gelecek ama ben bu işte baya yeniyim şimdiden teşekkür edrim derlerindevamını arz ederiz allaha emanet olun ..
@mejnun
CCS-C’nin yardım dosyasında ccs-c’ye özel hazır kullanılan fonksiyonların (setup_timer, input(PIN), get_adc() vb.) listesini bulabilirsin.. “built in functions” diye geçer…
Sayın hocam ben lcd ekranında arttır ve azalt butonlarıyla bar kontrolü yapmak istiyorum bu konuda bir örnek verebilirmisiniz. Teşekkür ederim.
@mustafa
Hiç bir şey yapmadan yardım isteyenlere cevap vermiyorum, sen netten iyicene araştırıp bir şeyler yapmaya çalış, yapamazsan yardımcı oluruz…
Sayın hocam netten çok araştırdım c dilinde bir örnek bulamadım. Ben c dilini öğrenmeye çalışıyorum. bcd çıkışları ile Bas Tizz kontrolü üzerinde çalışıyorum. Lcd ekranında sayısal değeri arttırıp azaltıyorum. Bunun yanına bar çubuğu yada xxxxx karekter ilave etmek istedim. Ama başaramadım. Yardımcı olursanız sevinirim. Kolay gelsin.
selam bir program yazıyorum alarm programı. c# 205 te & yazdığım zaman hata veriyor amp yerimne ne yazmam gerekiyo acil yardım
@elif
sitedeki problem nedeniyle kod o şekilde görünüyordu. Yazı içerisindeki hatalı yerleri düzelttim.
@mustafa
karakter lcd ekranlarda yazay bir şekilde bar oluşturabilirsin.
█ █ █ █ gibi mesela…
kodunu gönderirsen yardımcı olurum..
Sayın hocam bu örnekte A0 butona basılınca *** karekter eklesin A1 butonuyla da eksiltsin istedim ama
printf(lcd_veri,”*”) ; satırında hata veriyor.Sonuç olarak başaramadım. Butona her basmada karekter nasıl ekleyebilirim.
char veri;
void main ( )
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_a(0×01);
while(1)
if(input(PIN_A0)==1)
{
delay_ms(100);
veri=veri+veri;
printf(lcd_veri,”*”) ;
delay_ms(100);
}
if(input(PIN_A1)==1)
{
delay_ms(100);
veri=veri-veri;
printf(lcd_veri,”*”) ;
delay_ms(100);
}
}
Emrah Bey herhalde bakmaya zamanınız olmadı. Yardımlarınızı bekliyorum. Selamlar.