ili9325 stm32f100

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

muhittin_kaplan

Coşkun'un yaptığı örneği Coide de gerçekleştirdim.

http://www.coskunergan.com/stm32-discovery-kit-ile-tft-ekran-uygulamasi/

ama  nedense benim stringler tersten çıkıyor. Karakter tablosunu tersten alıyor ve yerleştiriyor gibi.

Burak B

Karakter bazlı tersleme varsa tablodan bitleri ters okuyorsun. Yok tüm string ters ise init kodlarında sorun var. Bir foto eklermisin.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

muhittin_kaplan

#2
hocam problemi çözdüm. Ama Bu kütüphaneyi kullanmayacağım/ düzenleyeceğim. Cünki büyük font u beceremedim. standart kütüphaneyi inceledim. Ondada SPI ile iletişim kurmuş donanım buna müsade etmedi. parelel çalışan bir kütüphane aramaktayım.

kütüphanedeki 0x01 registerinin değerini değiştirdiğimde
LCD_WR_REG(0x01, 0x0000);
dikey düz
LCD_WR_REG(0x01, 0x0100);
dikey aynalanmış oluyor.

mesaj birleştirme:: 21 Mart 2013, 16:29:38

birde font convertor gerek bendeki fontconvertor bir türlü çalışmadı.

Burak B

Büyükfont çok hafıza ister. Çok iyi bir teknik geliştirmezsen kodun için yer kalmayabilir.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

muhittin_kaplan

Hocam hafıza problemim arka planda. Şuan lcd yi anlamaya çalışıyorum.

Mucit23

Alıntı yapılan: muhittin_kaplan - 21 Mart 2013, 16:51:19
Hocam hafıza problemim arka planda. Şuan lcd yi anlamaya çalışıyorum.

Hocam bende kod çok. En son bi deney kiti almıştım. Onun üzerindeki TFT dede ili9325 var.. Boardla birlikte gelen CD içerisinde bir sürü kod var.

Yalnız kodlar ILI9325 mi yoksa 9320 için emin değilim. Sanırım ikiside aynı. Ama hepsi 16 bit paralel haberleşiyor.

Örnek bir uygulama
https://hotfile.com/dl/199254524/eb01326/LCD_Test.rar.html

Yalnız Şu çinlilerin kodları çince oluyor. Ayıklamak zor iş. 

muhittin_kaplan

Mucit sağol deneyelim.

Mucit23

Alıntı yapılan: muhittin_kaplan - 21 Mart 2013, 18:56:02
Mucit sağol deneyelim.

Tamam Hocam. Hocam şu büyük font işini benimde çözmem gerekiyor.

muhittin_kaplan

inceledim, Coşkunun kullandığından farkı yok hatta bazı yerlerde eksiği var. Şu an coşkundan devam,

Mucit23

Alıntı yapılan: muhittin_kaplan - 21 Mart 2013, 21:20:26
inceledim, Coşkunun kullandığından farkı yok hatta bazı yerlerde eksiği var. Şu an coşkundan devam,

Anladım Hocam. Doğrudur ben incelemedim hiç. Bu aralar yine spfd5408 ile uğraşıyorum.


muhittin_kaplan

Mucit Anladığım Kadarıyla, önce yazılacak yer belirleniyor bunu  LCD_Set_Window ile yapıyoruz. Tablo 16x8 lık karakterlerle dolu ve English etiketi ile başlıyor. Anlamadığım nokta avl ye aldığı (sanırım) bilgiyi nerede 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;
 
   LCD_CS(0);
   
 while (*s) 
  {

 	 LCD_Set_Window(startX,startY,startX+7,startY+15);
	 LCD_WR_REG8(0x22);
   for(i=0;i<16;i++)
  { 
    avl=english[*s-32][i];
	for(n=0;n<8;n++)
	   {
	    if(avl&0x80) LCD_WR_DATA16(color);
        else LCD_WR_DATA16(xcolor);   
	    avl<<=1;
	    
	   }
	}
     startX=startX+8;
     s++;
  }
  LCD_CS(1);
} 


Burasıda SetWindow
void LCD_Set_Window(unsigned int startX,unsigned int startY,unsigned int endX,unsigned int endY)
{
	LCD_Set_XY(startX,startY);
	LCD_WR_REG(0x50,startX);
	LCD_WR_REG(0x52,startY);
	LCD_WR_REG(0x51,endX);
	LCD_WR_REG(0x53,endY);	
}


Mucit23

#11
Hocam ekrana görüntü pixel pixel basılıyor.

        if(avl&0x80) LCD_WR_DATA16(color);
        else LCD_WR_DATA16(xcolor);   
        avl<<=1;


Şuradan anlaşılıyor mesela.

color büyük ihtimal basılacak olan yazının rengi. xcolor dediğimiz ise arka plan rengi. Sanırım orada yapılan işlem avl ye alınan karakter bilgisinin 7. biti 1 ise yazı rengini, değilse eğer arka plan renginı basıyor. Ardından avl 1 bit sola kaydırılıyor. Bu işlem 8 defa yapılıyor. Yani alınan karakter lcd ye gönderilmiyor. Ben bunu anladım


muhittin_kaplan

#12
Mucit biraz daha açarmısın olayı, havada kalan noktalar var benim için.

pixel pixel derken byte byte yazmıyormu bu ?

mesaj birleştirme:: 21 Mart 2013, 22:32:39

şimdi anlamadığım nokta (sanki GLCD alışkanlığından yanlış düşünüyorum)

pixel pixel basılsa dahi alt satıra nasıl geçiyor ?

acaba ilk belirtilen bölgeye sıradan yazıyormu pixelleri

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;
 
   LCD_CS(0);
   
 while (*s) 
  {

 	 LCD_Set_Window(startX,startY,startX+7,startY+15); //YAZILACAK NOKTALARI BELIRLE
	 LCD_WR_REG8(0x22);
   for(i=0;i<16;i++) //AŞAĞIDAKI KODLARI 16 kez yap
  { 
    avl=english[*s-32][i];// s ile adresi verilen karakterin i ile belirtrilen bilgisini al
	for(n=0;n<8;n++) //bilgiyi bit bit yazdırmak için 
	   {
	    if(avl&0x80) LCD_WR_DATA16(color); //alınan bilginin MSB bitini kontrol et 1 se color bas
        else LCD_WR_DATA16(xcolor);   //1  değilse arka plan rengi bas
	    avl<<=1; //alınan bilgiyi sola kaydır.
	    
	   }
	}
     startX=startX+8;
     s++;
  }
  LCD_CS(1);
} 


Mucit23

Pixel pixelmi basılıyor yoksa byte byte mı bende bende karıştırdım.

color yazı rengi, xcolor arka plan rengi kesinlikle.

void LCD_WR_DATA16(unsigned int data)
{ 
	 DATA_LCD_PORT_H->ODR=data>>8;
	 LCD_RS(1);
	 DATA_LCD_PORT_L->ODR=data;   
     LCD_WR(0);   
     LCD_WR(1);
   
}


Buradan 16 bitlik renk kodu gönderiliyor.

Bu LCD lerde ekrana birşey yazmadan önce bir pencere açmak gerekiyor. Burada LCD_Set_window o işi yapıyor. Her yeni karakter göndermeden önce karakter boyutu kadar bir pencere açılıp ardından açılan pencerenin içeriği karakter bilgisiyle dolduruluyor.

while (*s) 
  {

 	 LCD_Set_Window(startX,startY,startX+7,startY+15);
	 LCD_WR_REG8(0x22);
   for(i=0;i<16;i++)
   { 
    avl=english[*s-32][i];
	  for(n=0;n<8;n++)
	   {
	    if(avl&0x80) LCD_WR_DATA16(color);
        else LCD_WR_DATA16(xcolor);   
	      avl<<=1;
	   }
	 }
     startX=startX+8;
     s++;
  }


Burayı anlamak gereçekten zor,

Satır satır gitmek gerekiyor.

İlk önce gönderilen karakter sayısı kadar döngü oluşturuluyor. while(*s)...
LCD_Set_Window(startX,startY,startX+7,startY+15);
LCD ekranda bir pencere açılıyor. Bu pencerenin başlangıc adresi bizim verdiğimizi kordinatlar yanı yazının yazılacağı kordinatlar Bitiş adresi ise başlangıc kordinatından X ekseninde 7 Y ekseninde 15 pixel fazla bir değer. Y ekseni hep sabit kalıyor yani 15 pixel genişliğinde. Ama X start değeri her yeni pencere açıldığınde 8 arttırlıyor.
Buradada sıkıntı yok.

Bende şurada takıldım. Her bir seferinde 1 karakter boyutunda pencere açılıyor. Sonra 16lık bir döngü kurulup iki boyutlu diziden sırayla karakterin bilgileri alınıyor.

ilk döngünün içerisinde 8 lik bir döngü daha kurulup bu sefer bir önceki döngüden alınan karakter bilgisi bit bit ekrana gönderiliyor. Bu karakter bilgisinin karakterin ilgili biti 1 ise ekrana yazı rengi, değilse arka plan rengi basılıyor.

%90 ekrana verdiğimiz renk bilgisi sadece 1 bit için.

Anlamadığım nokta ise 8 bitlik karakter bilgisi gönderilirken ekrana adres kordinat felan verilmiyor sadece renk gönderiliyor. O halde bir sonraki adrese nasıl geçiyor?  Burası düşündürüyor..

muhittin_kaplan

Mucit bıraktım çalışmayı yarın devam edeceğim ama açtığımız pencereye sıradan yazıyor bence