C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04


Mucit23

#406
128x64 Grafik LCD de bölgesel resim basmaya çalışıyorum. Bu iş için bir fonksiyon yazayım dedim ama kafam durdu.

void ks0108_pixelimage(u8 x,u8 y,const unsigned char img[], u16 size){
	
	u16 i=0;
	u8 z=0,yz=0,temp=0,data=0;
	u8 ux=0,uy=0;
	for (yz=0;yz<size/8;yz++)  // Yatay Tarama Yapiliyor..
	{
  	for (i=0;i<size/2;i++)   //Dikey Tarama Yapiliyor
  	{  
		 data=img[i];
	   for (z=0;z<8;z++)
		 {
			  temp=(data>>z)&0x01;
			  ks0108_pixel(ux,uy,temp); 
     }
    }
  }

}


Şimdilik yazdıklarım bunlar.

Kafamdaki düşünce şöyle, 8x8, 16x16, 32x32 gibi boyutlarda hazırlanmış resimlerim var. Bu resimleri ekranın istediğim bir kordinatına basmak istiyorum.

Fonksiyondaki Size Parametresi Resmin boyutunu belirliyor. Normalde 16X16 bir resim için 16*2 den 32 byte eder, Yani Size parametresi 32 gönderilmesi gerekir.

Bu Gönderilen resmin boyutuna ve kordinatlarına göre ekrana uygun şekilde basacağım

Bunu optimize bir şekilde nasıl yaparım.


Edit;


Tamam Hallettim

void ks0108_pixelimage(u8 x,u8 y,const unsigned char img[], u16 size){
	
	u16 i=0;
	u8 z=0,ux=0,uy=0;
	for (i=0;i<size;i++)
	{ 
    if(i==((size/2)))
    {
       uy=uy+8;
       ux=0;
    }
		for (z=0;z<8;z++)
		 {
			  ks0108_pixel(x+ux,y+uy+z,((img[i]>>z)&0x01)); 
                 }
		ux++;
    }

}

fatih6761

#407
@Mucit23 hocam pixel basarken ux uy kullanmışsınız. Bunlar değerlere ilk başta offset olan x ve y eklenmeli. Sonrasında taramanın her adımında ux ve uy bir arttırılmalı. Bunların üstüne tarama sırasındaki x y koordinatlarını da eklemelisiniz. İki boyutlu bir resmin Genişlik ve yükseklik olmak üzere iki ölçüsü vardır. Fonksiyona bir parametre eklemek birşey kaybettirmez. Fonksiyonu:
void ks0108_pixelimage(u8 x,u8 y,const unsigned char img[], u8 width, u8 height)

olarak tanımlarsanız daha kolay olur.
void ks0108_pixelimage(u8 x,u8 y,const unsigned char img[], u8 width, u8 height) {
	u8 ix, iy, i;
	u8 data_byte, data_bit;
	
	for(iy = 0; iy < (height / 8); iy++){
		for(ix = 0; ix < width; ix++){
			/* (satır) x (bir satır uzunluğu) + sütun */
			data_byte = img[iy * width + ix];
			
			for(i = 0; i < 8; i++){
				data_bit = (data_byte >> i) & 0x1;
				ks0108_pixel(x + ix, y + iy + i, data_bit);
			}
		}
	}
}

Şimdilik böyle birşey yazdım. Resmin diziye nasıl atıldığını da açıklarsanız ona göre yazabiliriz.
İyi çalışmalar...

Mucit23

#408
Hocam Sanırım üst üste yazdık. Ben şu şekilde hallettim.

void ks0108_pixelimage(u8 x,u8 y,const unsigned char img[], u16 size){
	
	u16 i=0;
	u8 z=0,ux=0,uy=0;
	for (i=0;i<size;i++)
	{ 
    if(i==((size/2)))
		{
     uy=uy+8;
		 ux=0;
    }
		for (z=0;z<8;z++)
		 {
			  ks0108_pixel(x+ux,y+uy+z,((img[i]>>z)&0x01)); 
     }
		ux++;
  }

}

İlk yazdığım zaman sağlıklı düşünemiyordum sanırım. Şu haliyle çalışıyor. Belki daha optimize bir şekilde yazılabilir.
----
Sizin yazdığınızıda deneyeyim. Sanırım sizinkinde resmin illa 8x8 ve katı şeklinde olması gerekmiyor. 8*32 gibi bir değerde olabiliyor. İnceleyelim bakalım

fatih6761

Hallettiyseniz tamamdır hocam. Şunu fark ettim ki benim yazdığımda küçük bir hata var. Neyse siz kendinizinkini kullanın ben onu düzelteyim.

Mucit23

Hocam mutlaka bir sebebi vardır, Ama eğer kullandığım değişkenler 8 bit dışına çıkmayacaksa dediğiniz şekilde yapmak boş yere ram tüketim miktarını arttırmazmı?

Mucit23

Anladım Hocam. Verdiğiniz bilgi için teşekkürler..

Mucit23

arkadaşlar merhaba,

Bir tabloda char karakterler tutmak istiyorum. Bunu nasıl yaparım
Örneğin şöyle birşey yapmaya çalıştım..

const *char_data[]={"PicProje\n\r"};


Ben bu tablodan aldığım karakterleri usart ile göndereceğim. Amacım örneğin char_data[0] dediğim zaman bana tablo içerisindeki 0 karakter yani P harfini versin. Yukarıdaki gibi bir kullanıma müsade etmiyor keil. Doğrusu nasıl olmalı

Tabloda çok fazla karaker olacak.

CoşkuN

Alıntı yapılan: Mucit23 - 26 Şubat 2013, 10:49:36
arkadaşlar merhaba,

Bir tabloda char karakterler tutmak istiyorum. Bunu nasıl yaparım
Örneğin şöyle birşey yapmaya çalıştım..

const *char_data[]={"PicProje\n\r"};


Ben bu tablodan aldığım karakterleri usart ile göndereceğim. Amacım örneğin char_data[0] dediğim zaman bana tablo içerisindeki 0 karakter yani P harfini versin. Yukarıdaki gibi bir kullanıma müsade etmiyor keil. Doğrusu nasıl olmalı

Tabloda çok fazla karaker olacak.

const char data[]={"PicProje\n\r"};
olarak dener misin? Sonra da data[0] olarak çağıracaksın...

Mucit23

#414
evet hocam sanırım dizi türünü belirtmediğim için hata alıyormuşum. Bu şekilde çalışıyor

mesaj birleştirme:: 26 Şubat 2013, 12:43:18

Hocam bir problem var fakat

Dizi içerisine satır başı alt satıra geçmek için kullandığım \n\r karakterleri alınamıyor herhalde

normalde şöyle birşey yapmaya çalışıyorum.

const char char_data[]={"/*************************************************************************************************************************************************/\n\r"};

  while(1){
    for (x=0;x<151;x++)
    {
         Send_Data(char_data[x]);
    }
  }


Burada yanlış saymadıysam dizi içerisinde 0 dahil olmak üzere 150 karakter var bende 150 döngü oluşturup diziden alıp usarta gönderiyorum. Bilgisayarda terminalde baktığımda datalar geliyor fakat düzenli bir şekilde gelmiyor. Normalde \n\r karakterleri terminale gttiği zaman alt tan satır başı yapması lazım ama bu haliyle çorbaya dönüyor program..

GreeN

#415
const char data[]={"PicProje\n\r"};


şeklinde yaptıysan tanımı

Send_Data(data[x]);


kullanmalısın.

"zzz" problem bu değilmiş. pardon .

mesaj birleştirme:: 26 Şubat 2013, 13:50:03

enter komutu göndersen satır başı için. 13 dü galiba .
Terörü Lanetliyoruz.

Mucit23

#416
Hocam Teşekkür ederim o kısmıda hallettim sayenizde. şuan seri iletişimde sıkıntı yok, Satır başı felan güzel çalışıyor.
Yanlız tablo yapamıyorum, Const Char şeklinde bir karakter tablosu oluşturabilirmiyim. Dizi içerisinde tahminimce 2000,3000 eleman olur.
const char char_data[]={"/***********************************************/\n\r
/***********************************************/\n\r
/***********************************************/\n\r};


Şöyle birşey yapmak istiyorum. Bunu acaba iki boyutlu dizi olarakmı tanımlamak gerekir böyle bir tabloyu nasıl oluştururum

fatih6761

#417
Alıntı yapılan: Mucit23 - 26 Şubat 2013, 14:02:39
Hocam Teşekkür ederim o kısmıda hallettim sayenizde. şuan seri iletişimde sıkıntı yok, Satır başı felan güzel çalışıyor.
Yanlız tablo yapamıyorum, Const Char şeklinde bir karakter tablosu oluşturabilirmiyim. Dizi içerisinde tahminimce 2000,3000 eleman olur.
const char char_data[]={"/***********************************************/\n\r
/***********************************************/\n\r
/***********************************************/\n\r};


Şöyle birşey yapmak istiyorum. Bunu acaba iki boyutlu dizi olarakmı tanımlamak gerekir böyle bir tabloyu nasıl oluştururum
Hocam tablodan kastınız string'lerden oluşan bir dizi ise iki boyutlu dizi gerekiyor. Ama sadece birkaç satırdan oluşan bir string ise alt satıra tekrar çift tırnak koyarak devam edebilirsiniz.
const char *text =
  "Bu uzun bir metin ama"
  "cok satirda parcalanabilir. "
  "Her satira tirnak koymayi unutmayin.";

veya
const char *text2 =
"Bu ise diger yontem\
Her satiri tamamen ele alinacagindan
bosluklara, tab'lara dikkat edin";

İkinci yöntemde her satırın tamamı alındığından satırlar sol yana bitişik şekilde yazılacak. Örneği satırları tab ile kaydırmak istediğinizde yazılacak olan metne de tab eklenir.
İyi çalışmalar.

Klein

const char srv_globalmenu_title[][22]={
			               "İlk  satır         \n\r\0",
			               "İkinci  satır     \n\r\0",
			               "Üçüncü  satır  \n\r\0",
			               "Dördüncü satır\n\r\0",
			               "Beşinci satır    \n\r\0"
}

armsistem

Alıntı yapılan: Klein - 26 Şubat 2013, 18:00:59
const char srv_globalmenu_title[][22]={
			               "İlk  satır         \n\r\0",
			               "İkinci  satır     \n\r\0",
			               "Üçüncü  satır  \n\r\0",
			               "Dördüncü satır\n\r\0",
			               "Beşinci satır    \n\r\0"
}


Prof.