Bir değişken displaye nasıl yazdırılır?

Başlatan findux, 09 Ekim 2007, 06:26:33

findux

arkadaslar lcd kullanımı oldukca yaygın ,alternatif olarak bazen display li devreler ucuz ve daha kullanışlı oluyor.
benim problemim, bir değişken var .diyelimki 3 basamaklı (örn. 123 )sayısı .bu sayıyı 3 adet displaye tarama yöntemiyle yazdırmak istiyorum.fakat sizinde anlayacağınız gibi displaylere bu basamakları sırasıyla göndermek gerekiyor.
peki bu değişkeni ben nasıl basamaklarına ayıra bilirim?lcd kullanımı gibi bir kütüphanesi varmı.yoksa matematiksel işlemler kullanarak kendimiz mi basamaklara ayrıştırmamız gerekiyor?eğer matemtiksel işlemlerle yapmaya kalkarsak program hafızası büyüyecek.
evet ustalar bunun c de caresi ne olabilir?

Cetinal

mikroC nin examles klasörü icerisinde 7 segment tarama örnekleri mevcut
1 den 4 displaya kadar olması lazım

findux

microchip firmasının örneklerindemi? mikroC?anlayamadım mümkünse dosyayı gönderebilirmisin romeo123 kardeş .Eğer biliyorsanız buradada açıklayabilirseniz cok iyi olacağı kanaatindeyim..
iyi calışmalar ...

titanium

Ben birara aceleyle böyle bir fonksiyon yazmıştım. Yalnız benimki sayıyı lcd ye yazdırmak içindi. Kendi programına uyarlayabileceğini düşünüyorum.

Link:

http://www.dosyaupload.net/download.php?file=183794

Cetinal

mikroelektronika firmasının MikroC derleyicisini yükleyin
içerisinde  A dan Z ye herşey için Örnek kod vardır çıklamaları da var
Sizin için faydalı olur

arslan74

Alıntı yapılan: "findux"arkadaslar lcd kullanımı oldukca yaygın ,alternatif olarak bazen display li devreler ucuz ve daha kullanışlı oluyor.
benim problemim, bir değişken var .diyelimki 3 basamaklı (örn. 123 )sayısı .bu sayıyı 3 adet displaye tarama yöntemiyle yazdırmak istiyorum.fakat sizinde anlayacağınız gibi displaylere bu basamakları sırasıyla göndermek gerekiyor.
peki bu değişkeni ben nasıl basamaklarına ayıra bilirim?lcd kullanımı gibi bir kütüphanesi varmı.yoksa matematiksel işlemler kullanarak kendimiz mi basamaklara ayrıştırmamız gerekiyor?eğer matemtiksel işlemlerle yapmaya kalkarsak program hafızası büyüyecek.
evet ustalar bunun c de caresi ne olabilir?

Bu iş matematiksel işllemle yapılır.

unsigned char deger[5] = {0};	// 		Saklanan değerler.

void
itoa(unsigned int value){

	
	deger[0]=value/10000;
	
	value = value -(deger[0]*10000);

	deger[1]=value/1000;

	value = value -(deger[1]*1000);

	deger[2]=value/100;

	value = value -(deger[2]*100);

	deger[3]=value/10;

	value = value -(deger[3]*10);

	deger[4]=value;
		
}


yada böyle

unsigned char deger[5] = {0};	// 		Saklanan değerler.


void
itoa(unsigned int value){

	
	deger[4]=value%10;
	value /= 10;
	deger[3]=value%10;
	value /= 10;
	deger[2]=value%10;
	value /= 10;
	deger[1]=value%10;
	value /= 10;
	deger[0]=value;
		
}



Selamlar

findux

yorumlarınız ve cözümleriniz coook teşekkur ederim.picprojeye de bu yakışır.
üstadlar bu kodları kütüphane yazmaya kalksak nasıl olur.veya soruyu şöyle soruyim nasıl kütüphane yazılır?

zafzaf82

int dijit[4];

display(int x) //4 display icin
{
unsigned char i;
      sprintf(dijit,"%04u",x);

      for(i=0; i<4; i++)
      dijit[i]-='0';
}
Mikroişlemci bi araçtır, amaç değil.....

arslan74

Merhaba,

Verilen değişik örnek kodları derledim. Sonucları.

zafzaf82 verdiği örnek kod:

#include <pic18.h>
#include <stdio.h>



int dijit[4]; 

display(int x) //4 display icin 
{ 
unsigned char i; 
      sprintf(dijit,"%04u",x); // line 11

      for(i=0; i<4; i++) 
      dijit[i]-='0'; 
}



void
main(void)
{

display(65500);  // line 23

while (1);


}


alınan uyarı mesajları:
Alıntı Yap
Warning[000] C:\Proje\Denemeler\Covert_dijit\test.c 11 : illegal conversion between pointer types
Warning[000] C:\Proje\Denemeler\Covert_dijit\test.c 23 : arithmetic overflow in constant expression

Derlenen kodun uzunluğu:

Alıntı Yap
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Proje\Denemeler\Covert_dijit\test.cce".
Clean: Done.
Executing: "C:\HTSOFT\PIC18\BIN\PICC18.EXE" -C -E"test.cce" "test.c" -O"test.obj" -Zg9 -O -ASMLIST -Q -MPLAB -18F452
Executing: "C:\HTSOFT\PIC18\BIN\PICC18.EXE" -E"convert_dijit.lde" "C:\Proje\Denemeler\Covert_dijit\test.obj" -M"convert_dijit.map" -O"convert_dijit.cof" -O"convert_dijit.hex" -Q -MPLAB -18F452

Memory Usage Map:

Program ROM   $000000 - $000003  $000004 (       4) bytes
Program ROM   $000006 - $000581  $00057C (    1404) bytes
                                $000580 (    1408) bytes total Program ROM

RAM data      $0000E1 - $0000FF  $00001F (      31) bytes total RAM data    
Near RAM      $000000 - $000006  $000007 (       7) bytes total Near RAM    
ROM data      $000600 - $000604  $000005 (       5) bytes total ROM data    


Program statistics:

Total ROM used     1413 bytes (4.3%)
Total RAM used       38 bytes (2.5%)   Near RAM used        7 bytes (5.5%)

Loaded C:\Proje\Denemeler\Covert_dijit\convert_dijit.cof.
BUILD SUCCEEDED: Wed Oct 10 05:48:18 2007


arslan74

arslan74 verdiği örnek kodlar:

#include <pic18.h>
#include <stdio.h>


 unsigned char deger[5] = {0};   //       Saklanan değerler. 


void 
itoa(unsigned int value){ 

    
   deger[4]=value%10; 
   value /= 10; 
   deger[3]=value%10; 
   value /= 10; 
   deger[2]=value%10; 
   value /= 10; 
   deger[1]=value%10; 
   value /= 10; 
   deger[0]=value; 
       
} 


void
main(void)
{

itoa(65500);

while (1);


}


Alınan uyarı mesajı yok.

Derlenen kodun uzunluğu:

Alıntı Yap
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Proje\Denemeler\Covert_dijit\test.obj".
Clean: Deleted file "C:\Proje\Denemeler\Covert_dijit\test.cce".
Clean: Deleted file "convert_dijit.cof".
Clean: Done.
Executing: "C:\HTSOFT\PIC18\BIN\PICC18.EXE" -C -E"test.cce" "test.c" -O"test.obj" -Zg9 -O -ASMLIST -Q -MPLAB -18F452
Executing: "C:\HTSOFT\PIC18\BIN\PICC18.EXE" -E"convert_dijit.lde" "C:\Proje\Denemeler\Covert_dijit\test.obj" -M"convert_dijit.map" -O"convert_dijit.cof" -O"convert_dijit.hex" -Q -MPLAB -18F452

Memory Usage Map:

Program ROM   $000000 - $000003  $000004 (       4) bytes
Program ROM   $000018 - $000191  $00017A (     378) bytes
                                $00017E (     382) bytes total Program ROM

RAM data      $0000FE - $0000FF  $000002 (       2) bytes
RAM data      $0005FB - $0005FF  $000005 (       5) bytes
                                $000007 (       7) bytes total RAM data    

Near RAM      $000000 - $000006  $000007 (       7) bytes total Near RAM    
ROM data      $000013 - $000017  $000005 (       5) bytes total ROM data    


Program statistics:

Total ROM used      387 bytes (1.2%)
Total RAM used       14 bytes (0.9%)   Near RAM used        7 bytes (5.5%)

Loaded C:\Proje\Denemeler\Covert_dijit\convert_dijit.cof.
BUILD SUCCEEDED: Wed Oct 10 06:05:27 2007


arslan74

arslan74 verdiği örnek kodlar:

#include <pic18.h>
#include <stdio.h>


 unsigned char deger[5] = {0};   //       Saklanan değerler. 


void 
itoa(unsigned int value){ 

    
   deger[0]=value/10000; 
    
   value = value -(deger[0]*10000); 

   deger[1]=value/1000; 

   value = value -(deger[1]*1000); 

   deger[2]=value/100; 

   value = value -(deger[2]*100); 

   deger[3]=value/10; 

   value = value -(deger[3]*10); 

   deger[4]=value; 
       
} 


void
main(void)
{

itoa(65500);

while (1);


}



Alınan uyarı mesajı yok.

Derlenen kodun uzunuğu.

Alıntı Yap
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Proje\Denemeler\Covert_dijit\test.obj".
Clean: Deleted file "C:\Proje\Denemeler\Covert_dijit\test.cce".
Clean: Deleted file "convert_dijit.cof".
Clean: Done.
Executing: "C:\HTSOFT\PIC18\BIN\PICC18.EXE" -C -E"test.cce" "test.c" -O"test.obj" -Zg9 -O -ASMLIST -Q -MPLAB -18F452
Executing: "C:\HTSOFT\PIC18\BIN\PICC18.EXE" -E"convert_dijit.lde" "C:\Proje\Denemeler\Covert_dijit\test.obj" -M"convert_dijit.map" -O"convert_dijit.cof" -O"convert_dijit.hex" -Q -MPLAB -18F452

Memory Usage Map:

Program ROM   $000000 - $000003  $000004 (       4) bytes
Program ROM   $000018 - $00019D  $000186 (     390) bytes
                                $00018A (     394) bytes total Program ROM

RAM data      $0000FE - $0000FF  $000002 (       2) bytes
RAM data      $0005FB - $0005FF  $000005 (       5) bytes
                                $000007 (       7) bytes total RAM data    

Near RAM      $000000 - $000006  $000007 (       7) bytes total Near RAM    
ROM data      $000013 - $000017  $000005 (       5) bytes total ROM data    


Program statistics:

Total ROM used      399 bytes (1.2%)
Total RAM used       14 bytes (0.9%)   Near RAM used        7 bytes (5.5%)

Loaded C:\Proje\Denemeler\Covert_dijit\convert_dijit.cof.
BUILD SUCCEEDED: Wed Oct 10 06:10:34 2007


arslan74

Sonuc olarak;

zafzaf82 arkadaşımızın yazdığı örnek kod, cok fazla alan işgal ediyor

Alıntı Yap
Total ROM used 1413 bytes (4.3%)
Total RAM used 38 bytes (2.5%) Near RAM used 7 bytes (5.5%)

Ayrıca verdiği kod da hata var.
Yazı dizileri int türü değişkenle tanımlanmaz.
"int" türü değişken 16 bit dir. Buda en fazla 65535 değeri anlamına gelir. Bu değeri bir dizide gösterebilmek için en az 5 byte uzunluğunda olmalı. Ayrıca sprintf komutunu kullandığı için 1 byte sonlandırmaya gerek var, yani toplamda en az 6 byte uzunluğunda olmalı.

Sonuc olarak sprintf komutu böyle basit işlemlerde kullanmak gereksiz yere programı şişiriyor ve hantallaştırıyor.

arslan74 verdiği örnek kodlarda biri nin uzunluğu:

Alıntı Yap
Total ROM used 399 bytes (1.2%)
Total RAM used 14 bytes (0.9%) Near RAM used 7 bytes (5.5%)

diğerinin uzunluğu:

Alıntı Yap
Total ROM used 387 bytes (1.2%)
Total RAM used 14 bytes (0.9%) Near RAM used 7 bytes (5.5%)

Aşağı yukarı birbirlerine yakın değerlerdir. ama okunabilirlik, yazma uzunluğu  ve en az yer kaplan kod acısından.

unsigned char deger[5] = {0};   //       Saklanan değerler. 


void 
itoa(unsigned int value){ 

    
   deger[4]=value%10; 
   value /= 10; 
   deger[3]=value%10; 
   value /= 10; 
   deger[2]=value%10; 
   value /= 10; 
   deger[1]=value%10; 
   value /= 10; 
   deger[0]=value; 
        
}


bu kodu kullanmayı önereceğim.

Selamlar.

titanium

Programın boyutu anladığım kadarıyla sizin için önemli. Bu yüzden benim yazdığım fonksiyon size göre değil sanırım. Esnek bir kod değilde sadece işinizi görecek bir fonksiyon istiyorsanız arslan74 arkadaşın verdiği veya buna benzer bir kod daha uygun olacaktır.

findux

ilginize cok teşekkür ederim.display.c diye bir kütühane oluştursak iyi olur kanaatindeyim. mesela kac display süreceğimizi önceden girelim daha sonra printf gibi bir fonksiyon ile displaye istediğimiz sayıyı (değişkeni) yazdırlım.acaba böyle bir kütüphane nasıl oluştruluyor?

arslan74

Alıntı yapılan: "findux"ilginize cok teşekkür ederim.display.c diye bir kütühane oluştursak iyi olur kanaatindeyim. mesela kac display süreceğimizi önceden girelim daha sonra printf gibi bir fonksiyon ile displaye istediğimiz sayıyı (değişkeni) yazdırlım.acaba böyle bir kütüphane nasıl oluştruluyor?

Eğer 7 segment display için tarama mantığı ile kullanacaksan. bu durumda bir tane timer interruptu bu iş için tahsis etmelisin. İnterrupt kullandığı için bunu ancak interrupt koduna dahil edebilirsin. bunun için ayrı kütüphane yazamassın.

Ama karakter göstermeli LCD ekranlar için istiyor isen bunu verdiğim kodlar ile cok basit şekilde yapabilirsin. Verdiğim örnek kodu yada sprintf fonksiyonunu kullanabilirsin.

Selamlar