Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: muhittin_kaplan - 21 Mart 2013, 10:36:25

Başlık: ili9325 stm32f100
Gönderen: muhittin_kaplan - 21 Mart 2013, 10:36:25
Coşkun'un yaptığı örneği Coide de gerçekleştirdim.

http://www.coskunergan.com/stm32-discovery-kit-ile-tft-ekran-uygulamasi/ (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.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Burak B - 21 Mart 2013, 16:22:17
Karakter bazlı tersleme varsa tablodan bitleri ters okuyorsun. Yok tüm string ters ise init kodlarında sorun var. Bir foto eklermisin.
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 21 Mart 2013, 16:28:27
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ı.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Burak B - 21 Mart 2013, 16:38:05
Büyükfont çok hafıza ister. Çok iyi bir teknik geliştirmezsen kodun için yer kalmayabilir.
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 21 Mart 2013, 16:51:19
Hocam hafıza problemim arka planda. Şuan lcd yi anlamaya çalışıyorum.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 21 Mart 2013, 18:49:46
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ş. 
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 21 Mart 2013, 18:56:02
Mucit sağol deneyelim.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 21 Mart 2013, 21:15:39
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.
Başlık: Ynt: ili9325 stm32f100
Gönderen: 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,
Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 21 Mart 2013, 21:26:25
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.

Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 21 Mart 2013, 21:37:13
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);
}

Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 21 Mart 2013, 21:48:40
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

Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 21 Mart 2013, 21:57:40
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);

Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 21 Mart 2013, 22:38:53
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..
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 21 Mart 2013, 22:51:15
Mucit bıraktım çalışmayı yarın devam edeceğim ama açtığımız pencereye sıradan yazıyor bence
Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 21 Mart 2013, 23:58:35
Alıntı yapılan: Mucit23 - 21 Mart 2013, 22:38:53
%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..
evet ekrana verdiğimiz renk bilgisi sadece 1 bit piksel için.
ekrana 8 bitlik karakter bilgisi verilmiyor. basılacak font 16x8 olduğundan (16px satır, 8px kolon)
setwindow ile işlem yapılacak alan belirleniyor. işin püf noktası da şurada:
LCD_WR_REG8(0x22)
bu komut bazı lcd kodlardaLCD_WriteRAM_Prepare isimli bir fonksiyon içerisine alınıp öyle kullanılıyor. Şöyle:
/**
* \brief Prepare to write GRAM data.
*/
extern void LCD_WriteRAM_Prepare( void )
{
    LCD_WR_REG(0); // bu satır olmasa da oluyor.
    LCD_WR_REG(ILI9325_R22H) ; /* Write Data to GRAM (R22h)  */
}

Burdan anladığımız kadarıyla, bu komutu yazdığımız zaman lcd'ye; "GRAM'i hazırla, bundan sonra gönderdiğim renk bilgisini, ayırdığım pencere içerisine direkt ve sırayla bas" demiş oluyoruz.
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 22 Mart 2013, 16:02:28
Evet Hepimiz Aynı Noktadayız. DOğru Yorumlamışız.

Şimdi bize font hazırlayacak  bir program lazım. ben birkaç deneme ile olayın (büyük font) gerçekleştiğini gördüm.

Örneklerde rekler için aşağıdaki sistemi kullanmış.
Bunu gönderirken
mavi: 0x001F
kırmızı:0xF800
Yeşil:0x07C0 yapmış

buradan şunu Çıkarttım RRRRRGGGGG0BBBBB

Neden böyle yapılmış anlam veremedim. 18bitlik renk olması geremiyormu ?
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 22 Mart 2013, 16:48:05
Alıntı yapılan: muhittin_kaplan - 22 Mart 2013, 16:02:28
Evet Hepimiz Aynı Noktadayız. DOğru Yorumlamışız.

Şimdi bize font hazırlayacak  bir program lazım. ben birkaç deneme ile olayın (büyük font) gerçekleştiğini gördüm.

Örneklerde rekler için aşağıdaki sistemi kullanmış.
Bunu gönderirken
mavi: 0x001F
kırmızı:0xF800
Yeşil:0x07C0 yapmış

buradan şunu Çıkarttım RRRRRGGGGG0BBBBB

Neden böyle yapılmış anlam veremedim. 18bitlik renk olması geremiyormu ?

Hocam Ekranızın Driver Entegresi ile alakalı.
Ornek olarak resimdeki SSD1963 icin gecerli tablo.
Ama genel olarak hepsi boyledir diyebiliriz. Cunku SSD1289 chip setli Ekranımında renk tablosu bu şekilde.

(http://a1303.hizliresim.com/17/q/lbgcm.png) (http://bit.ly/c25MCx)
Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 22 Mart 2013, 17:32:20
Alıntı yapılan: muhittin_kaplan - 22 Mart 2013, 16:02:28
Şimdi bize font hazırlayacak  bir program lazım. ben birkaç deneme ile olayın (büyük font) gerçekleştiğini gördüm.
Fon teditörü olarak (başka bir konuda yine vermiştim) şunu öneririm:
sayfa: http://www.circuitidea.com/dev-board/BL-TFT240320PLUS-V2.html (http://www.circuitidea.com/dev-board/BL-TFT240320PLUS-V2.html)]
doğrudan link : Font editor written by H. Reddmann (http://www.circuitidea.com/images/column_1259887831/font.rar)

Çok güzel bir font editörü. Seçtiğiniz herhangi bir windows fontunu import ediyorsunuz, sonra da istemediğiniz karakterleri silip datayı ufaltıyorsunuz.
Font datasını sıkıştırma özelliği de var ama ben beceremedim.
Sayfa sahibinin yazdığı kütüphane ile, bahsedilen font editöründe hazırlanmış bir fontu ölçekleyerek ekrana basma özelliği de var. ölçekleyince font biraz bozuluyor ama kullanılabilir. Böylece aynı font datası ile farklı boyutlarda yazı yazılabiliyor ve bellekten tasarruf ediliyor.
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 22 Mart 2013, 18:39:59
file not found diyor linkte.

mesaj birleştirme:: 22 Mart 2013, 19:03:31

microelectronika nın visual tft si varmış.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 22 Mart 2013, 21:50:03
Bu TFT lerde renk kodları nasıl belirliyoruz.

mesela kullandığım kütüphanede sabit renkler tanımlanmış.

/* GLCD RGB color definitions                                                 */
#define Black           0x0000      /*   0,   0,   0 */
#define Navy            0x000F      /*   0,   0, 128 */
#define DarkGreen       0x03E0      /*   0, 128,   0 */
#define DarkCyan        0x03EF      /*   0, 128, 128 */
#define Maroon          0x7800      /* 128,   0,   0 */
#define Purple          0x780F      /* 128,   0, 128 */
#define Olive           0x7BE0      /* 128, 128,   0 */
#define LightGrey       0xC618      /* 192, 192, 192 */
#define DarkGrey        0x7BEF      /* 128, 128, 128 */
#define Blue            0x001F      /*   0,   0, 255 */
#define Green           0x07E0      /*   0, 255,   0 */
#define Cyan            0x07FF      /*   0, 255, 255 */
#define Red             0xF800      /* 255,   0,   0 */
#define Magenta         0xF81F      /* 255,   0, 255 */
#define Yellow          0xFFE0      /* 255, 255, 0   */
#define White           0xFFFF      /* 255, 255, 255 */


Ben farklı renkler oluşturacağım. Diyelim Windows un renk seçim kutusundan renk datalarını aldım. 127, 52, 200 gibi 3adet 8 bitlik renk datası var. Toplamda 24 bit eder fakat burada 16 bit var.

Renk dataları 6 bit olsa 18 bit eder. Yine 16 bite sığmaz . Buradaki mantık nasıl?

Edit;
M_B nin verdiği tabloyu yeni gördüm.

Bu 565 formatı nedir.

Ben hangi formata göre kodumu ayarlamam gerekir?

Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 22 Mart 2013, 23:48:01
Alıntı YapBu 565 formatı nedir.
Mucit23 hocam;
565 formatı demek
RRRRR GGGGGG BBBBB : 5 Bit Kırmızı 6 bit Yesil 5 Bit mavi 
Tabloya dikkatle bakarsanız gorursunuz.
Alıntı YapBen hangi formata göre kodumu ayarlamam gerekir?
Hocam bizim kullandıgımız Lcd lerin veri yolu 16 bit tir. D0 dan D15 'e kadar. Bir kerede veri gondermek için ideal. 24 bit veriyi 16 bit veri yolundan bir kerede nasıl gonderecegiz bolmeden ?

Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 22 Mart 2013, 23:56:54
Hocam Ben elimdeki renk kodlarını binarye çevirdim. Sanırım 565 kullanılmış.

Visual TFT ile uğraşıyorum.  Bu programda resim kutusu içerisine dışarıdan resim ekleyemiyorum. Acaba lisansız olduğu içinmi?
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 23 Mart 2013, 00:02:21
hocam;
gerbay hoca forumda bir dll dosyası paylaşmıştı. o dosya m.e nin visual tft programı icinde gecerli
ben denemiştim. Şu an ilgili linki hatırlamıyorum.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 23 Mart 2013, 00:04:42
Hocam var bende yaptım ama olmadı. Not registered diyor.
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 23 Mart 2013, 00:04:54
hocam ilgili link
https://www.picproje.org/index.php/topic,45065.0.html (https://www.picproje.org/index.php/topic,45065.0.html)

mesaj birleştirme:: 23 Mart 2013, 00:06:31

Alıntı yapılan: Mucit23 - 23 Mart 2013, 00:04:42
Hocam var bende yaptım ama olmadı. Not registered diyor.
Ben iş yerinde denemiştim olmuştu.  Ama programı detaylı kullanmadım.
Hatta diot hoca demişti. Visual TFT de de işe yarıyor.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Burak B - 23 Mart 2013, 08:18:27
RGB565 (31,63,31) 16bitte max değerleriniz bunlar olacak şekilde seçtiğiniz herhangi bir rengi dönüştürebilirsiniz. Bu iş için makro kullanabilirsiniz.

RGB->RGB565

#define RGB16(r,g,b) (uint16_t)((((r * 31) / 255) << 11) | (((g * 63) / 255) << 5) | ((b * 31) / 255))


18Bitlik kullanımda aynı veri yoluna iki kez veri yazmanız gerekir. 16+8 bit olarak.

Bigfont olayı öncede söylediğim gibi çok bellek isteyen bir durum. Bir pencere açıp oluşturduğunuz bitmap bilgisini içine boşaltmanız yeterli. Pencere boyu ile bigfontunuzun ebatları aynı sayıda pixel içeriyorsa hiçbir sorun çıkmadan ekranda görüntülenecektir. Aksi halde bir sorun varsa fontunuz ekranda düzgün çizilmez. Basitçe şunu söylemek gerek bitmap basarsanız fontta basarsınız.

Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 23 Mart 2013, 09:49:24
Hocam İnceledim. Mantık AYnı Ha BMP ha Font. Aynı Yöntemi kullanağız.

şimdi hesap kısmındayız.

240x320x16=1228800 bit yapar (oda 150KByte)
Yani bir img dosyası 150KByte ediyor Doğrumuyum?

mesaj birleştirme:: 23 Mart 2013, 10:07:56

visual tft, verilen dongle dll ile olmuyor.

mesaj birleştirme:: 23 Mart 2013, 10:10:18

Olsada işimize yararmı meçhul. Keza Kodları Kendi derleyicisine göre (ki kütüphanesi kapalı malum) ayarlanıyordur.
Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 23 Mart 2013, 10:31:13
evet verdiğim font  editörü linki çalışmıyor. kusura bakmayın kontrol etmemiştim.
şurdan indirdiğimiz rar içinde hem örnek kodlar hem de font editörü var.
http://www.circuitidea.com/images/column_1259887831/CID.rar (http://www.circuitidea.com/images/column_1259887831/CID.rar)
Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 23 Mart 2013, 12:29:35
Hocam aynen o dll visual tft de ise yaramıyor.

Gerçi ben arayüz hazırlamak için kullanıyorum. Sonradan bmp olarak alıp resim basacam.

Visual tft nin bazı özellikleri işimi kolaylaştırıyor. yoksa paint le de yaparım
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 23 Mart 2013, 17:27:56
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ış ?
Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 24 Mart 2013, 17:29:50
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
...

Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 24 Mart 2013, 20:26:31
Hocam Dikey tarıyor Anladım.
Ya Oturup yatay Tarayan Bir program yazacağız, Yada Buna Göre fonksiyon.
Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 24 Mart 2013, 22:24:22
yatay taramanın avantajı nedir?
Başlık: Ynt: ili9325 stm32f100
Gönderen: 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.

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.
Başlık: Ynt: ili9325 stm32f100
Gönderen: iyildirim - 24 Mart 2013, 23:57:41
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 (http://www.rockbox.org/wiki/pub/Main/SansaFuzePlus/ILI9325.pdf)   sf. 55,56.
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 25 Mart 2013, 00:02:57
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ş.
Başlık: Ynt: ili9325 stm32f100
Gönderen: iyildirim - 25 Mart 2013, 00:25:10
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.


Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 25 Mart 2013, 22:56:59
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 ?
Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 25 Mart 2013, 23:33:04
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.
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 26 Mart 2013, 00:10:02
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.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Burak B - 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. 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.
Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 26 Mart 2013, 10:43:40
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.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Burak B - 26 Mart 2013, 10:51:06
@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.
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 27 Mart 2013, 19:41:16
(https://lh3.googleusercontent.com/-wNqsWXys_0E/UVMtUh4ZvVI/AAAAAAAAA3c/wOJ2RZNbHvY/w497-h373/photo.jpg)

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

Tırmalattı Ama Ekranıda öğrendik.
Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 27 Mart 2013, 21:02:45
Dikmi yazdırmışsınız hocam? Max nekadar büyüklükte yazabiliyorsunuz?
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 27 Mart 2013, 21:30:52
Mucit fontconvertorün çevirdiği datayı iyi anlamak gerkiyor.
sonrasında boyut önemini yitiriyor.
Fontun büyüklüğü kadar yer açıyorsun.
Bu dataya göre aynı resim basar gibi gönderiyorsun.
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 28 Mart 2013, 16:44:18
@muhittin_kaplan hocam;
Yeni konu acmadan burdan sormak istedim.  Elimdeki  Font dosyamda bulunan 5 font dizisinden  2 si normal diğer 3 tanesi Aynadaki goruntusu cıkıyor.

Bunu nasıl ters cevirebilirim.
Normalde LCD_init teki reg. degerini değiştirerek ters dönderebiliyorum ama cozum değil. Çunku Bu sefer duz olanlar Ters oluyor.
Dizideki degerleri ters cevirmem gerekiyor. Kısa yoldan nasıl yapabilirim.


16x24 Normal
16x8   Normal

12x12 TERS
8x12   TERS
8x8     TERS

Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 28 Mart 2013, 17:18:38
hocam o ters olan fontları basarken init deki değeri değiştir bas sonra eski değerine geri al. ı denermisiniz.
yoksa teker teker çevirmek gerekiyor.
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 28 Mart 2013, 23:35:39
Alıntı yapılan: muhittin_kaplan - 28 Mart 2013, 17:18:38
hocam o ters olan fontları basarken init deki değeri değiştir bas sonra eski değerine geri al. ı denermisiniz.
yoksa teker teker çevirmek gerekiyor.
Hocam o yontem benimde aklıma geldi ama ben tum fontları bir fonksiyonda gonderiyorum.
O fonksiyon icine ilgili fontlara gore ayri bir dongu fonksiyon koymam gerekecek.
İşin aslı o fonksiyonumu bozmak istemiyorum. 


Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 29 Mart 2013, 09:46:22
Font dosyasını excel'e at (kopyala/yapıştır). Kolonların yerlerini değiştir. sonra geri kopyala.
Excel'de iyi değilsen buraya ekle ben çevireyim.
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 29 Mart 2013, 10:17:38
Alıntı yapılan: bocek - 29 Mart 2013, 09:46:22
Font dosyasını excel'e at (kopyala/yapıştır). Kolonların yerlerini değiştir. sonra geri kopyala.
Excel'de iyi değilsen buraya ekle ben çevireyim.
hocam kopyala yapıstır yapınca tek hucreye  bır cok deger geliyor.

Hocam fonts dosyam
http://s3.dosya.tc/server2/PzASnW/fonts.rar.html (http://s3.dosya.tc/server2/PzASnW/fonts.rar.html)

Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 29 Mart 2013, 10:34:05
Buyur düzeltilmişi:
http://s3.dosya.tc/server2/PlldM4/fonts_duzeltilmis.zip.html (http://s3.dosya.tc/server2/PlldM4/fonts_duzeltilmis.zip.html)

edit:
Nasıl yapıldığını da yazayım bari lazım olur.
Kopyala/yapıştır yapınca tek hücreye bütün satır gelir. Bunları kolonlara ayırmak için "Metni Sütunlara Çevir" diyeceksin. Ayraç olarak ta virgil vereceksin kolonlara ayrılacak.
Sonra kolonların, kes/yapıştır  ile yerlerini değiştireceksin. Sonra da kopyala/yapıştır ile tekrar c dosyasına yapıştıracaksın. Bu sefer virgül yerine TAB karakteri gelecek. Onları da Bul/Değiştir ile tekrar virgül yapacaksın.
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 29 Mart 2013, 10:39:23
Hocam Çok Teşekkür ederim.  Birazdan deneyecem.
Hocam vaktiniz dogrultusunda nasıl yaptığınızıda gosterebilirmisiniz.

Tekrardan teşekkürler Elinize sağlık
Başlık: Ynt: ili9325 stm32f100
Gönderen: bocek - 29 Mart 2013, 10:44:46
Rica ederim. Yukardaki mesajı düzenledim nasıl yapıldığına dair.
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 29 Mart 2013, 11:05:50
Hocam
Fontun ilk hali:
(http://c1303.hizliresim.com/17/x/lkp4k.jpg) (http://bit.ly/c25MCx)

Cevrilmis hali:
(http://c1303.hizliresim.com/17/x/lkp4w.jpg) (http://bit.ly/c25MCx)


Excel de nasıl yapılacagını sayenizde ogrendim
ama henuz olay bitmedi ;)
Goruntu gene istenen sekılde değil :(
Başlık: Ynt: ili9325 stm32f100
Gönderen: diot - 29 Mart 2013, 11:18:09
M_B fontu bu şekilde ters çeviremessin  . bit bit terslenecel 16. bit 1. 1 bite 15.bit 2. bite 14. bit 3. bite şeklinde
Başlık: Ynt: ili9325 stm32f100
Gönderen: muhittin_kaplan - 29 Mart 2013, 11:33:57
karakterler kendi aralarında simetrik. SS ve SM bitleri ile değişiyor aslında ama
Başlık: Ynt: ili9325 stm32f100
Gönderen: diot - 02 Nisan 2013, 16:32:24
@M_B
     
         7" kitteki TE , PWM, FCS ve SDCS pinlerini discovery kitte hangi pinlere bağladın ? Kit için pcb çiziyorum bu yüzden sordum.
Başlık: Ynt: ili9325 stm32f100
Gönderen: M_B - 02 Nisan 2013, 19:24:24
Alıntı yapılan: diot - 02 Nisan 2013, 16:32:24
@M_B
     
         7" kitteki TE , PWM, FCS ve SDCS pinlerini discovery kitte hangi pinlere bağladın ? Kit için pcb çiziyorum bu yüzden sordum.

hocam benim pin baglantım 3.2" ekranınkıyle aynı.  ekstradan bir pin baglantısı yapmadım.
Sadece PWM ve FCS pini baglamadım.  Şimdilik bunları kullanmıyorum. Ama fcs pinini baglayabilirim.
Flash kullanmak icin.

Başlık: Ynt: ili9325 stm32f100
Gönderen: Mucit23 - 24 Nisan 2013, 11:02:04
Dün deney kiti ile ilgili kodları ayıklarken Touch Panel Kalibrasyonu üzerine güzel bir uygulama buldum.

TCS2046 için kullanılan kütüphane budur

Touch.h
#ifndef __TOUCH_H
#define __TOUCH_H

/* °´¼ü״̬ */
#define Key_Down 0x01
#define Key_Up   0x00
/* ±Ê¸Ë½á¹¹Ìå */
typedef struct
{
u16 X0;//ԭʼ×ø±ê
u16 Y0;
u16 X; //×îÖÕ/ÔÝ´æ×ø±ê
u16 Y;        
u8  Key_Sta;//±ÊµÄ״̬  
//´¥ÃþÆÁУ׼²ÎÊý
float xfac;
float yfac;
short xoff;
short yoff;
}Pen_Holder;
extern Pen_Holder Pen_Point;

/*´¥ÃþÆÁоƬÁ¬½ÓÒý½ÅÅäÖà */   
#define PEN  PCin(4)   //PC4 INT
#define DOUT PAin(6)   //PA6  MISO
#define TDIN PAout(7)  //PA7  MOSI
#define TCLK PAout(5)  //PA5  SCLK
#define TCS  PCout(6)  //PC6  CS

/* ADS7843/7846/UH7843/7846/XPT2046/TSC2046 Ö¸Á */
#define CMD_RDY 0X90  //0B10010000¼´Óòî·Ö·½Ê½¶ÁX×ø±ê
#define CMD_RDX 0XD0  //0B11010000¼´Óòî·Ö·½Ê½¶ÁY×ø±ê 
 
void Touch_Init(void);
void Touch_Adjust(void);
void Convert_Pos(void);
void Pen_Int_Set(uint8_t en);
void Touch_Configuration(void);
void ADS_Write_Byte(uint8_t num);
uint16_t ADS_Read_AD(uint8_t CMD);
uint16_t ADS_Read_XY(uint8_t xy);
uint8_t Read_TP_Once(void);
uint8_t Read_ADS2(uint16_t *x,uint16_t *y);
uint8_t Read_ADS(uint16_t *x,uint16_t *y);
void Draw_Big_Point(uint8_t x,uint16_t y);
void Drow_Touch_Point(uint8_t x,uint16_t y);

#endif


Touch.c
/**************************************************************
** »ðÅ£¿ª·¢°å
** ¹¦ÄܽéÉÜ£º ´¥ÃþÆÁÇý¶¯´úÂë
**  °æ±¾£ºV1.0 
** ÂÛ̳£ºbbs.openmcu.com
** Íú±¦£ºwww.openmcu.com   
**  ÓÊÏ䣻support@openmcu.com
***************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "hardware_conf.h"
#include "Touch.h"
#include "ili932x_conf.h"
#include "stdlib.h"
#include "math.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
Pen_Holder Pen_Point; /* ¶¨Òå±ÊʵÌå */
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
EXTI_InitTypeDef EXTI_InitStructure;

extern void Delay(__IO uint32_t nTime);
 
void ADS_Write_Byte(uint8_t num)   

uint8_t count=0;   
for(count=0;count<8;count++) 
{  
if(num&0x80)TDIN=1; 
else TDIN=0;   
num<<=1;   
TCLK=0;
TCLK=1;     
}    
}
   
uint16_t ADS_Read_AD(uint8_t CMD)  
{
uint8_t i;
uint8_t count=0;  
uint16_t Num=0;
TCLK=0;
TCS=0;
ADS_Write_Byte(CMD);
for(i=100;i>0;i--);
// delay_us(6);//ADS7846µÄת»»Ê±¼ä×Ϊ6us
TCLK=1;//¸ø1¸öʱÖÓ£¬Çå³ýBUSY       
TCLK=0;
for(count=0;count<16;count++) 
{  
Num<<=1;
TCLK=0;//ϽµÑØÓÐЧ         
TCLK=1;
if(DOUT)Num++;

Num>>=4; 
TCS=1;
return(Num);   
}

#define READ_TIMES 15
#define LOST_VAL 5  
uint16_t ADS_Read_XY(uint8_t xy)
{
uint16_t i, j;
uint16_t buf[READ_TIMES];
uint16_t sum=0;
uint16_t temp;
for(i=0;i<READ_TIMES;i++)
{
buf[i]=ADS_Read_AD(xy);    
}    
for(i=0;i<READ_TIMES-1; i++)
{
for(j=i+1;j<READ_TIMES;j++)
{
if(buf[i]>buf[j])
{
temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}  
sum=0;
for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++)sum+=buf[i];
temp=sum/(READ_TIMES-2*LOST_VAL);
return temp;   
}

uint8_t Read_ADS(uint16_t *x,uint16_t *y)
{
uint16_t xtemp,ytemp;  
xtemp=ADS_Read_XY(CMD_RDX);
ytemp=ADS_Read_XY(CMD_RDY);      
if(xtemp<100||ytemp<100)return 0;
*x=xtemp;
*y=ytemp;
return 1;
}

#define ERR_RANGE 50
uint8_t Read_ADS2(uint16_t *x,uint16_t *y)
{
uint16_t x1,y1;
uint16_t x2,y2;
uint8_t flag;   
    flag=Read_ADS(&x1,&y1);   
    if(flag==0)return(0);
    flag=Read_ADS(&x2,&y2);    
    if(flag==0)return(0);   
    if(((x2<=x1&&x1<x2+ERR_RANGE)||(x1<=x2&&x2<x1+ERR_RANGE))
    &&((y2<=y1&&y1<y2+ERR_RANGE)||(y1<=y2&&y2<y1+ERR_RANGE)))
    {
        *x=(x1+x2)/2;
        *y=(y1+y2)/2;
        return 1;
    }else return 0;  
}

uint8_t Read_TP_Once(void)
{
uint8_t t=0;    
Pen_Int_Set(0);
Pen_Point.Key_Sta=Key_Up;
Read_ADS2(&Pen_Point.X,&Pen_Point.Y);
while(PEN==0&&t<=250)
{
t++;
Delay(10);
};
Pen_Int_Set(1);
if(t>=250)return 0;
else return 1;
}

void Drow_Touch_Point(uint8_t x,uint16_t y)
{
LCD_DrawLine(x-12,y,x+13,y);
LCD_DrawLine(x,y-12,x,y+13);
LCD_DrawPoint(x+1,y+1);
LCD_DrawPoint(x-1,y+1);
LCD_DrawPoint(x+1,y-1);
LCD_DrawPoint(x-1,y-1);
Draw_Circle(x,y,6);
}  

void Draw_Big_Point(uint8_t x,uint16_t y)
{    
LCD_DrawPoint(x,y);
LCD_DrawPoint(x+1,y);
LCD_DrawPoint(x,y+1);
LCD_DrawPoint(x+1,y+1);  
}

void Convert_Pos(void)
{  
if(Read_ADS2(&Pen_Point.X,&Pen_Point.Y))
{
Pen_Point.X0=Pen_Point.xfac*Pen_Point.X+Pen_Point.xoff;
Pen_Point.Y0=Pen_Point.yfac*Pen_Point.Y+Pen_Point.yoff; 
}
}

void Touch_Adjust(void)
{
uint16_t pos_temp[4][2];
uint8_t  cnt=0;
uint16_t d1,d2;
uint32_t tem1,tem2;
float fac;    
cnt=0;
POINT_COLOR=BLUE;
BACK_COLOR =WHITE;
LCD_Clear(WHITE); 
POINT_COLOR=RED;
LCD_Clear(WHITE);
Drow_Touch_Point(20,20);
Pen_Point.Key_Sta=Key_Up;
Pen_Point.xfac=0;
while(1)
{
if(Pen_Point.Key_Sta==Key_Down)
{
if(Read_TP_Once())
   
pos_temp[cnt][0]=Pen_Point.X;
pos_temp[cnt][1]=Pen_Point.Y;
cnt++;
}
switch(cnt)
{    
case 1:
LCD_Clear(WHITE);
Drow_Touch_Point(220,20);
break;
case 2:
LCD_Clear(WHITE);
Drow_Touch_Point(20,300);
break;
case 3:
LCD_Clear(WHITE);
Drow_Touch_Point(220,300);
break;
case 4:
       
tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2
tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2
tem1*=tem1;
tem2*=tem2;
d1=sqrt(tem1+tem2);

tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4
tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4
tem1*=tem1;
tem2*=tem2;
d2=sqrt(tem1+tem2);
fac=(float)d1/d2;
if(fac<0.95||fac>1.05||d1==0||d2==0)
{
cnt=0;
LCD_Clear(WHITE);
Drow_Touch_Point(20,20);
continue;
}
tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3
tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3
tem1*=tem1;
tem2*=tem2;
d1=sqrt(tem1+tem2);

tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4
tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4
tem1*=tem1;
tem2*=tem2;
d2=sqrt(tem1+tem2);
fac=(float)d1/d2;
if(fac<0.95||fac>1.05)
{
cnt=0;
LCD_Clear(WHITE);
Drow_Touch_Point(20,20);
continue;
}
   
tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3
tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3
tem1*=tem1;
tem2*=tem2;
d1=sqrt(tem1+tem2);

tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4
tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4
tem1*=tem1;
tem2*=tem2;
d2=sqrt(tem1+tem2);
fac=(float)d1/d2;
if(fac<0.95||fac>1.05)
{
cnt=0;
LCD_Clear(WHITE);
Drow_Touch_Point(20,20);
continue;
}

Pen_Point.xfac=(float)200/(pos_temp[1][0]-pos_temp[0][0]);
Pen_Point.xoff=(240-Pen_Point.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;
 
Pen_Point.yfac=(float)280/(pos_temp[2][1]-pos_temp[0][1]);
Pen_Point.yoff=(320-Pen_Point.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;
POINT_COLOR=BLUE;
LCD_Clear(WHITE);
LCD_ShowString(35,110,"Touch Screen Adjust OK!");
Delay(1000);
LCD_Clear(WHITE);
return;
}
}
}
}
void Touch_Init()
{
Touch_Configuration();
Read_ADS(&Pen_Point.X,&Pen_Point.Y);//µÚÒ»´Î¶ÁÈ¡³õʼ»¯

  /* Connect PEN EXTI Line to Key Button GPIO Pin */
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource4);

  /* Configure PEN EXTI Line to generate an interrupt on falling edge */ 
  EXTI_InitStructure.EXTI_Line = EXTI_Line4;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  /* Generate software interrupt: simulate a falling edge applied on PEN EXTI line */
  EXTI_GenerateSWInterrupt(EXTI_Line4);

LCD_Clear(WHITE);
    Touch_Adjust();    
}
void Touch_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE );  //ÖØÒª£¡£¡

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}

void Pen_Int_Set(uint8_t en)
{
if(en)EXTI->IMR|=1<<4;     
else EXTI->IMR&=~(1<<4);    
}

void EXTI4_IRQHandler()
{
  if(EXTI_GetITStatus(EXTI_IMR_MR4) != RESET)
{
Pen_Point.Key_Sta=Key_Down;//°´¼ü°´Ï   
    EXTI_ClearITPendingBit(EXTI_IMR_MR4);
}
}


Touch_Adjust diye bir fonksiyon var. Kalibrasyon işlemi burada yapılıyor. Yine Yapılan işlemi pek anlayamadım ama gerçekte denedim oluşan şunlar.

Sırayla Ekranın 4 köşesine bir işaret koyuluyor. Ben her seferinde ekrana yerleştirilen işaret üzerine dokunduğumda o an verdiğim kordinatlar kaydediliyor. Sonra Başka bir köşeye nokta koyuluyor. Bu işlem Ekranın 4 köşesine uygulanınca kalibrasyon işlemi bitiyor ve bazı hesaplamalar yapıyor. Bu hesaplamaları yine anlayamadım ama çözerim.

Fakat dikkatimi çekti TCS2446 ile daha uğraşmış olduğum STMPE811 deki gibi rastgele kordinat verme olayları kesinlikle gerçekleşmiyor. Demekki yazılımın rolü çok büyük.