Haberler:

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

Ana Menü

ili9325 stm32f100

Başlatan muhittin_kaplan, 21 Mart 2013, 10:36:25

muhittin_kaplan

Yok ben oturup kendi font programımı yazacağım. kimisi yatay taramış kimisinin ne yaptığını anlamadım bile.

@bocek hocam programda nasıl bir mantık kullanmış tarama nasıl yapılmış ?

bocek

#31
Alıntı yapılan: muhittin_kaplan - 23 Mart 2013, 17:27:56
@bocek hocam programda nasıl bir mantık kullanmış tarama nasıl yapılmış ?
Programın oluşturduğu header dosyasında gerekli açıklamalar mevcut ama ben Türkçe'sini yazayım.

const unsigned char __attribute__ ((progmem)) sifir[] = {
    0x00, 0x11, // uint16_t   font datasının toplam hacmi 
	0x06,       // uint8_t    font karakter genişliği (piksel)
	0x0D,		// uint8_t   font karakter yüksekliği (piksel)
	0x01,		// uint8_t    her bir piksel için ayrılan bit adeti(bit-per-pixel)
	0x30,		// uint8_t    fontun başlangıç karakterinin ASCII kodu
	0x30, 		// uint8_t    fontun bitiş karakterinin ASCII kodu
    0x05, 		// uint8_t    font karakter genişlikleri (her bir karakter için ayrı ayrı);
    0xF8, 0x83, 0x80, 0x10, 0x10, 0x02, 0x82, 0x3F, 0x00 //uint8_t    font_data[];
};

Yukarıdaki kodda sadece 0 (sıfır) karakteri için bir font dosyası oluşturdum. 13px yüksekliğinde 5px genişliğindeki 0 karakterinin bellek görünümü temsilen aşağıdaki gibi.
00000
00000
01110
10001
10001
10001
10001
10001
10001
10001
01110
00000
00000

font_data[] için sol-üst köşeden başlanıp aşağı doğru sırayla bitler yerleştiriliyor
örneğin ilk byte için 0. kolondan 8-bit : 11111000 = 0xF8 oluyor.
ikinci byte için ilk kolondan kalan 5-bit ve 1. kolondan 3 bit daha 00011 (+) 100 = 10000011 = 0x83
böyle böyle gidiyor.

Açıkçası:
0. kolon 0. satır, font_data[0]'ın 0. biti oluyor.
0. kolon 1. satır, font_data[0]'ın 1. biti oluyor
...
0. kolon 7. satır, font_data[0]'ın 7. biti oluyor.
0. kolon 8. satır, font_data[1]'in 0. biti
...
0. kolon 13. satır, font_data[1]'in 4. biti (burada satır bitiyor)
1. kolon  0. satır, font_data[1]'in  5. biti
...

1 ya da 0. işte 'bit'ün mesele..

muhittin_kaplan

Hocam Dikey tarıyor Anladım.
Ya Oturup yatay Tarayan Bir program yazacağız, Yada Buna Göre fonksiyon.

bocek

yatay taramanın avantajı nedir?
1 ya da 0. işte 'bit'ün mesele..

muhittin_kaplan

Hocam avantajı şu, Cihazın CGRAm adresi muhtemelen (kesin bilgi değil)
        00-240
0   --------------- 
0   ---------------
-    ---------------
3   ---------------
2   ---------------
0   ---------------

şeklinde, eğer  dikey tararsak herseferinde pixel e gitmemiz gerekiyor diğerinde her yazmaya sonrakine yazıyor.

void LCD_write_english_string(unsigned char startX, unsigned int startY,unsigned char *s,unsigned int color,unsigned int xcolor)
{
  unsigned char avl,i,n; //Değişkenleri tanıt
 
   LCD_CS(0);
   
 while (*s) //s pointer ettiği kadar aşağıdakileri yap
  {
/*
 * Aşağıdaki kod ile TFT lerin çalışması "alan aç yazmaya başla" sistemi
 * için gerekli olan bölgeyi açıyor.
 */
 	 LCD_Set_Window(startX,startY,startX+7,startY+15);
	 LCD_WR_REG8(0x22);

   for(i=0;i<16;i++) 		//aşağıdaki kodları 16 kez yap
  { 
    avl=english[*s-32][i];	//karakteri bulmak için s in değerini 32 ile çıkartıyoruz. "i" ile tanımlanan tablo bilgisini alıyor ve avl ye atıyor.
	for(n=0;n<8;n++)		//aşağıdaki kodları 8 kez yap
	   {
		/*
		 * Eğer avl nin MSB biti 1 se Color değişkenini yukarıda açılan bölgeye SIRAYLA nokta koyuyor.
		 * Eğer avl nin MSB biti 1 değilse ARKA PLAN rengi basılıyor.
		 */
	    if(avl&0x80) LCD_WR_DATA16(color);
        else LCD_WR_DATA16(xcolor);   
	    
	    avl<<=1; //avl sola kaydırılıyor bu işlem 8 kez yapılıyor ve BIR karakterin tüm taraması çıktığında sonraki karaktere geçiyor.

	   }
	}
     startX=startX+8;//sonraki karakter için başlangıç noktası ayarlanıyor. (alan açılıyor)
     s++; //Sonraki karaktere geçiliyor.
  }
  LCD_CS(1);
} 


dikkat edersen hiç koordinat belirmiyor. Sadece Pencere Açılıyor ve basmaya başlıyor.

iyildirim

Alıntı yapılan: muhittin_kaplan - 24 Mart 2013, 22:54:43
Hocam avantajı şu, Cihazın CGRAm adresi muhtemelen (kesin bilgi değil)
        00-240
0   --------------- 
0   ---------------
-    ---------------
3   ---------------
2   ---------------
0   ---------------

şeklinde, eğer  dikey tararsak herseferinde pixel e gitmemiz gerekiyor diğerinde her yazmaya sonrakine yazıyor.


Muhittin hocam dediğiniz doğru ama GRAM'ın update direction'ının horizontal veya vertical olması Entry mode registeri (03h) ile ayarlanabiliyor. Başka bir şey varmı bilmem ama sadece bunun için driver yazmak gerekmez.
Ben 9326 ile biraz uğraşmıştım. Şimdi baktım da 9325'de de aynı şekilde imiş. 

http://www.rockbox.org/wiki/pub/Main/SansaFuzePlus/ILI9325.pdf   sf. 55,56.

muhittin_kaplan

hocam
#if   ID_AM==0      
	     LCD_WR_REG(0x03,0x1000);//?????? TFM=0,TRI=0,SWAP=1,16 bits system interface  swap RGB to BRG,??ORG?HWM ?0
#elif ID_AM==1        
	     LCD_WR_REG(0x03,0x1008);      
#elif ID_AM==2  
	     LCD_WR_REG(0x03,0x1010);        
#elif ID_AM==3
	     LCD_WR_REG(0x03,0x1018);
#elif ID_AM==4  
	     LCD_WR_REG(0x03,0x1020);      
#elif ID_AM==5  
	     LCD_WR_REG(0x03,0x1028);      
#elif ID_AM==6  
	     LCD_WR_REG(0x03,0x1030);      
#elif ID_AM==7  
	     LCD_WR_REG(0x03,0x1038);
#endif


şeklinde geçiyor. ve kütüphanede burası "6" değerine set edilmiş.

iyildirim

Registerin 3.biti (AM) hor. veya ver. olduğunu belirliyor. 4 bit (ID:0)Hor. artım var-yok.  5bit (ID:1) Ver. artım var-yok.

Font yapısını bilmiyorum ama tahminen ilgili bitlere sırasıyla 101 yazmak işinizi görebilir. Buda verdiğiniz örnek koda göre ID_AM = 5 oluyor.
Bu arada BGR biti de 1 olmuş oluyor. Yani RGB değilde BGR data gönderiliyor kabul ediliyor. Renk değerlerinin de buna göre gönderilmesi lazım.



muhittin_kaplan

Neden Fontların hepsi Aynı genişlikte ? Hadi Yüksekliği Anladım ama "I" ile "%" neden aynı genişlikte kullanıyoruz ? Tüm karakterlere aynı büyüklükte Array Tanımlanmış.
Alıntı Yap{0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/

örneğin Yukardaki " işareti. 9byte boşuna eklenmiş

onun yerine nasıl bir çalışma yapabiliriz ?

const unsigned char english[][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00},/*"#",3*/
{0x00,0x00,0x18,0x18,0x3C,0x66,0x60,0x30,0x18,0x0C,0x06,0x66,0x3C,0x18,0x18,0x00},/*"$",4*/
{0x00,0x00,0x00,0x70,0xD8,0xDA,0x76,0x0C,0x18,0x30,0x6E,0x5B,0x1B,0x0E,0x00,0x00},/*"%",5*/
{0x00,0x00,0x00,0x00,0x38,0x6C,0x6C,0x38,0x60,0x6F,0x66,0x66,0x3B,0x00,0x00,0x00},/*"&",6*/
{0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x00},/*"(",8*/

yukardaki tabloda elaman sayıları eşit 16. bunu değişken yapsak  array içerisindeki eleman sayısını alabilirmiyiz ?
Yoksa Hamallık mı Yapıyorum ?

bocek

Alıntı yapılan: muhittin_kaplan - 25 Mart 2013, 22:56:59
yukardaki tabloda elaman sayıları eşit 16. bunu değişken yapsak  array içerisindeki eleman sayısını alabilirmiyiz ?
Alamayız hocam. Malumunuz array tanımlarken süslü parantezi biraz fazla kullanmak bir şey değiştirmiyor ki. Sonuçta bellekte 101011100.. şeklinde peşpeşe yerleşiyor datalar. Her karakterin genişliğini farklı yapabilmek için, genişlikleri ayrı bir tabloda tutmak gerekiyor ki hangi karakter bellekte nerde başlıyor nerde bitiyor bilebilelim.
1 ya da 0. işte 'bit'ün mesele..

muhittin_kaplan

#40
Alıntı Yapconst unsigned char english[][]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x00},/*"!",1*/
{0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00},/*""",2*/
{0x00,0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00},/*"#",3*/
{0x00,0x00,0x18,0x18,0x3C,0x66,0x60,0x30,0x18,0x0C,0x06,0x66,0x3C,0x18,0x18,0x00},/*"$",4*/
{0x00,0x00,0x00,0x70,0xD8,0xDA,0x76,0x0C,0x18,0x30,0x6E,0x5B,0x1B,0x0E,0x00},/*"%",5*/
{0x00,0x00,0x00,0x00,0x38,0x6C,0x6C,0x38,0x60,0x6F,0x66,0x66,0x3B,0x00},/*"&",6*/
{0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x00},/*"(",8*/

hocam yukardaki gibi bir tabloda

Alıntı Yap{0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00},/*""",2*/
nın yani english[2][] nin eleman sayısını örenemezmiyim ?

mesaj birleştirme:: 26 Mart 2013, 00:39:09

sizeof la çift derinlikliarray kullanamazmıyım ?


mesaj birleştirme:: 26 Mart 2013, 00:42:43

Alıntı yapılan: bocek - 25 Mart 2013, 23:33:04
Alamayız hocam. Malumunuz array tanımlarken süslü parantezi biraz fazla kullanmak bir şey değiştirmiyor ki. Sonuçta bellekte 101011100.. şeklinde peşpeşe yerleşiyor datalar. Her karakterin genişliğini farklı yapabilmek için, genişlikleri ayrı bir tabloda tutmak gerekiyor ki hangi karakter bellekte nerde başlıyor nerde bitiyor bilebilelim.
Hocam yukardaki tabloda nerede başlayıp nerede bittiği belli
array[][]={{},{},{}} şeklinde tanımlandığından
eğer
array[][1] in boyutunu alabilirsem döngüyü ve dolayısıyla lcd ye göndereceğim bilgiyi ayarlamış olurum.

mesaj birleştirme:: 26 Mart 2013, 00:49:11

EVET HAMALLIKMIŞ

array[][16]falan filan dersem

boş kalan yerler 00 la dolduruluyor. yani sonuçta 16 ya tamamlanıyor.

Burak B

#41
Bir struct oluşturup her bir karakterin en, boy ve bitmap bilgilerini belirtirseniz hem daha az yer kaplar hemde daha basit olmazmı. Sonrada bu struct ile bir array oluşturup font için karakter tablosu elde edersiniz. Ama bunun da bir bedeli var. String oluştururken ve GUI tasarlamaya başlarsanız bunu anlayacaksınız. Unutmadan 2 boyutlu dizi ile uğraşmayın nasılsa bitmap verisini pencere içine boca edebiliyorsunuz.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

bocek

Alıntı yapılan: ByteMaster - 26 Mart 2013, 02:35:48
Bir struct oluşturup her bir karakterin en, boy ve bitmap bilgilerini belirtirseniz hem daha az yer kaplar hemde daha basit olmazmı. Sonrada bu struct ile bir array oluşturup font için karakter tablosu elde edersiniz. ...
Yukarda linkini verdiğim H.Reddemann adlı şahsın yazdığı font editörü bunu yapıyor. struct olarak değil de font datasının içine yazıyor genişlikleri. Ancak Muhittin Hocam bunu kullanmak istemiyor çünkü o kütüphanenin fontu ekrana basma rutininin yavaş olduğunu söylüyor.
Alıntı yapılan: ByteMaster - 26 Mart 2013, 02:35:48
... Ama bunun da bir bedeli var. String oluştururken ve GUI tasarlamaya başlarsanız bunu anlayacaksınız. Unutmadan 2 boyutlu dizi ile uğraşmayın nasılsa bitmap verisini pencere içine boca edebiliyorsunuz.
Genişlikler farklı olduğunda ekrandaki bir karakterin üzerine başka bir karakter basıldığında, sonradan basılan karakterin genişliği öncekinden az ise kenarlarda eski karakterin pikselleri kalıyor. Özellikle rakam karakterleri için genişlikleri sabit, yazılar için genişlikleri değişken tutmak, yazı basarken toplam genişliği hesaplayıp, kalan pikselleri zemin rengine boyamak bir çözüm olabiliyor.
Ya da önce yazılacak zemini temizleyip sonra yazıyı basmak ta başka bir çözüm.
1 ya da 0. işte 'bit'ün mesele..

Burak B

@bocek doğru. :) Şahsi bilgi ve deneyimlerime dayanarak kullanacağınız fontu mono space seçmenizi öneririm. Özellikle arayüz tasarımında. Her seferinde yeniden hesaplamaktansa bir kere öğrenmek ve unutmamak iyidir. Aslında bu yaklaşımların biri hız diğeri boyut optmizasyonuyla alakalı. Ha şunuda belirteyim tüm fontunuz sabit genişlikte olsa da bir struct ile tanımlamanız daha iyidir. Yapısaldır ve modülerdir.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

muhittin_kaplan

#44


mesaj birleştirme:: 27 Mart 2013, 19:53:11

Tırmalattı Ama Ekranıda öğrendik.