Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

c ile ilgili genel bir soru

Başlatan mcan, 18 Ekim 2005, 21:56:24

mcan

#include <16f84a.h>
#fuses Hs,NOWDT,NOPROTECT
#use delay(clock=4000000)
#define use_portb_lcd
#include <lcd.c>
#byte  PORTA = 5


   main(void)
{
unsigned char z=1;

use_portb_lcd;
lcd_init();
lcd_putc("\f");
lcd_putc("deger");

goto dongu;

dongu:
{
lcd_putc("\n");
for(;;)
      {
      lcd_putc(z);
delay_ms(750);
      if(z==10) z=1;
      else
      z=z+1;
      }
}

}


bu kodda üst satırda deger ,alt satırda  z değişkeninin değerini yazdırmak istiyorum,,z sürekli değişmeli 10 dan sonra geri 1 e dönmeli ,z=z+1 yerine z++ yazdığımda da olmuyor....nasıl çözebilirim,,aslında ccs ile alaksı yok ama yazacak başka yer bulamadım

Erol YILMAZ

Bence CCS ile direkt alakasi var :)
lcd_putc() tek karakter gonderir. Printf ise icindeki fonksiyona karakterleri duzenleyerek tek tek gonderir.
#include <16f84a.h> 
#fuses Hs,NOWDT,NOPROTECT 
#use delay(clock=4000000) 
#byte PORTA = 5 

#define use_portb_lcd 
#include <lcd.c> 

void main()
{ 
unsigned char z=1; 

use_portb_lcd; 
lcd_init(); 

printf(lcd_putc,"\fDeger");

while(TRUE)
   { 
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%d ",z);
      delay_ms(750); 

      z++;
      if(z==10) z=1; 
   } 

}



mcan

hocam   %d    ,ne işe yarıyor ? ,deneme yaparken exampleda da benzer bişi gördüm,   %s     yazmış ...  
%  Modules operator     diye tanımlanmış,,ikilik onaltılık sitemde yazmayı belirtiyormuş ama , s ve d nedir onu anlayamadım

kod güzel çalışıyor fakat 128 den sonra hem geri olarak hemde - olarak saymaya devam ediyor yani ...127   128  -128   -127...  UNSİGNED CHAR  0 ile 255 arası değerleri kapsamıyormu benimki neden - oluyor sizce?

Erol YILMAZ

Bunlar C'yi kullanmak icin temel olarak bilinmesi gereken seyler.
%d   integer sayi icin kullanilir. Derleyiciye simdi bakacagin sayi isaretli sayi der.

Isaretli 8 bitlik sayilarda 7. bit isaret biti oldugundan %d kullanirsan 7. bitin 1 oldugu durumda yani sayi 128 ve daha buyukse - isareti gorunur.

%u kullanirsan gelecek olan sayi "unsigned" yani isaretsiz sayi demis olursun. 128 ve ustu sayilarda - isareti gorunmez. Duz olarak ilerler.

Tavsiyem Temel C bilgilerini ogrenebileceginiz bir kitaptan bu bilgileri almaniz olacaktir.

Erol YILMAZ

Burada aslinda bir hata yapmisik. Dogrusu,

- Degisken eger isaretli sayi  ise int olarak tanimlanir ve %d ile isaret edilir.
- Degisken eger isaretsiz sayi  ise unsigned int olarak tanimlanir ve %u ile isaret edilir.

Bize lazim olan unsigned int oldugundan dogrusu asagidaki gibi olacak.
Simdi bakarsan 1 den 255 e kadar normal olarak sayacak.


#include <16f84a.h> 
#fuses Hs,NOWDT,NOPROTECT 
#use delay(clock=4000000) 
#byte PORTA = 5 

#define use_portb_lcd 
#include <lcd.c> 

void main() 
{ 
unsigned int z=1; 

use_portb_lcd; 
lcd_init(); 

printf(lcd_putc,"\fDeger"); 

while(TRUE) 
   { 
      lcd_gotoxy(1,2); 
      printf(lcd_putc,"%u  ",z); 
      delay_ms(20); 

      z++; 
//      if(z==10) z=1; 
   } 

}

mcan

temel bir olaymı bilmiyorum ama
     for(;;)
      {
      
      lcd_gotoxy(1,2); 
      printf(lcd_putc,"%u ",z); 
      delay_ms(20); 
      z++; 
      if(z==250) z=1;

      }


bu sonsuz döngünün sizinkinden ne farkı var? çünki sizinki doğru çalışırken bunda 250 den sonra tekrar başa dönünce
10 a kadar şöle sayıyor

1 9
2 9
3 9
. 
.
.
vede 10 dan sorna normal saymaya devam ediyor,ilk dokuz sayı ve sabit dokuz arasında da boşluk var  simule edip bir göz atarmısınız lütfen yoksa mantıken böyle olması doğal mı?

Erol YILMAZ

Ben buradaki gecikmeyi 20 ms yaptım cunku 250x750 ms beklemek istemiyordum. Sonucu gormek istedim.

Proteus bunları işleyip ekrana aktarırken yavaş kalıyor problem çıkartıyor. Onun için oyle goruyorsun 200 ms yap problem kalmayacak.

for(;;)  işlev olarak bana nedense hiçbirşey ifade etmiyor. Üstü çok kapalı bir ifade. Bu yuzden while(TRUE) kullanımını tercih ederim.

Erkan Gench

orada 9 görünmesinin sebebi en son görünen 249 sayısının son rakamının silinmemesi. printf(lcd_putc,"%u  ",z); dersenin olur (%u dan sonra iki boşluk var).
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

Erol YILMAZ

Alıntı yapılan: "Erkan Gench"orada 9 görünmesinin sebebi en son görünen 249 sayısının son rakamının silinmemesi. printf(lcd_putc,"%u  ",z); dersenin olur (%u dan sonra iki boşluk var).

+1 :)

alikorkmaz_88

mrb . peki ben merhaba yı bi değişkene atıp lcd göstermek istiyorum bunu nasıl yapıcam ?

DumrulBey

Alıntı yapılan: "alikorkmaz_88"mrb. peki ben merhaba yı bi değişkene atıp lcd göstermek istiyorum bunu nasıl yapıcam ?
Önce değişkeni şu şekilde tanımlıyoruz:
char xMetin [20];

Tabii bu değişken 20 karakter genişliğinde bir string!

Ardından sprintf komutu ile değişken içerisine bilgi giriyoruz:
sprintf (xMetin, "Bu bir deneme");

Sonrası nerede kullanmak istiyorsanız kurallara uygun bir şekilde fonksiyona aktarırız. Mesela lcd_putc için:
printf(lcd_putc, "%s%c",xMetin,"\n");

Yukarıdaki %c operatörü ile tanımladığım karakter alt satıra geçmesi için. Aslında bunu değişken tanımlarken de yapabilirdik. Ancak her değişken için fazla bir tane daha karakter eklemek (20 + 1) gerekecekti. Üstelik kullanım yerine göre farklı uygulamalar söz konusu olabileceğinden bence böylesi çok daha iyi.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

ground

DumrulBey özlemişiz seni  ;)
⌒╮'╭⌒╮⌒╮.
╱◥██◣                  
| 田︱田田|              
╬╬╬╬╬╬╬╬╬

Picproje - Sözde değil özde paylaşım..

CaFFeiNe

yeni başlık açmayım boşuna dedim çünkü soracağım soru tam başlığa göre

cikis = !cikis;

bu ifadeyi daha kısa yazmanın bir yolu varmı (mesela !=cikis; gibi atıyorum) yoksa en kısası bumudur?

ise

! işlemi sadece sayının 0dan büyük olup olmadığına bakar. büyükse sonuç 0 dır değilse 1 dir. bit işlemleri için kullanılır (true , false gibi). cikistaki tüm bitleri terslemek istiyorsan ~ bu işlemi  kullanmalısın
cikis=0xf0;
cikis=!cikis;   // bu işlemde çıkış 0x0 olarak değişir.
cikis!=cikis;  // çıkış değeri değişmez.
cikis=0xf0;
cikis=~cikis;  // bu işlemde çıkış 0x0f olarak değişir;
cikis~=cikis;  //geçersizdir.

koordinat

bende şu while(TRUE)  olayını başlık açmadan sorayım dedim.TRUE değeri yani '1' nerede tanımlı?niye c de yok bu olay?