Nokia 7210 4096 renkli GLCD

Başlatan serdararikan, 19 Mayıs 2010, 21:09:55

serdararikan

ilgilenen arkadaşlar için Nokia 7210 ekran için yazdığım kodları ve basit bir uygulama adına scope çalışmamın videosunu ekliyorum.


c dosyası
#include"7210_driver.h"
#define _XTAL_FREQ 20000000L

void ShiftBits(unsigned char dt)
{
	unsigned char i,mask=0b10000000;
	for (i=0;i<8;i++)
	{
		if (dt & mask) DATA=1; else DATA=0;
		clk_plus
		mask>>=1;
	}
}

unsigned char data;
void shift()
{
		#asm
		BSF	7,3
		BCF	7,3
		BCF	7,5
		btfsc (_data),7
		bsf	7,5
		BSF	7,3
		BCF	7,3
		BCF	7,5
		btfsc (_data),6
		bsf	7,5
		BSF	7,3
		BCF	7,3
		BCF	7,5
		btfsc (_data),5
		bsf	7,5
		BSF	7,3
		BCF	7,3
		BCF	7,5
		btfsc (_data),4
		bsf	7,5
		BSF	7,3
		BCF	7,3
		BCF	7,5
		btfsc (_data),3
		bsf	7,5
		BSF	7,3
		BCF	7,3
		BCF	7,5
		btfsc (_data),2
		bsf	7,5
		BSF	7,3
		BCF	7,3
		BCF	7,5
		btfsc (_data),1
		bsf	7,5
		BSF	7,3
		BCF	7,3
		BCF	7,5
		btfsc (_data),0
		bsf	7,5
		BSF	7,3
		BCF	7,3	
	#endasm	
}

void SendData(unsigned char dt)
{	
	CS=0;
	DATA=1;
	clk_plus
	ShiftBits(dt);
}

void SendCommand(unsigned char dt)
{	
	CS=0;
	DATA=0;
	clk_plus
	ShiftBits(dt);
}

void SetContrast(unsigned char value)
{
	SendCommand(SETCON);
	SendData(value);
	CS=1;
}

void LCD_Initialize(unsigned char value)
{
	CS=1;
	RST=0;
	__delay_ms(30);
	RST=1;
	SendCommand(SLEEPOUT);
	__delay_ms(2);	
	SendCommand(MADCTL);
	SendData(0x20);
	SendCommand(SETCON);
	SendData(0x30);
	CS=1;
	__delay_ms(4);	
	SendCommand(DISPON);
	SendCommand(COLMOD);
	if (value==Mod_RGB8) SendData(2); else SendData(3);
}

void DoluDikdortgen(int X1,int Y1,int X2,int Y2,unsigned char renk)
{	int PixelCount,i;
	SendCommand(PASET);
	SendData(X1);
	SendData(X2);
	SendCommand(CASET);
	SendData(Y1);
	SendData(Y2);
	SendCommand(RAMWR);
	PixelCount = (X2 - X1 + 1) * (Y2 - Y1 + 1);
	for (i = 0; i < PixelCount; i++) SendData(renk);
	SendCommand(NOP);
	CS=1;
}

void Pixel(int X,int Y,unsigned char renk)
{	
	SendCommand(PASET);
	SendData(X);
	SendCommand(CASET);
	SendData(Y);
	SendCommand(RAMWR);
	SendData(renk);
	CS=1;
}

void CizgiCiz(int X1,int Y1,int X2,int Y2,unsigned char renk)
{	
	int dy;
   int dx;
   int StepX, StepY;
   int Fraction;

   dy = Y2 - Y1;
   dx = X2 - X1;

   if (dy < 0)
   {   
		dy = -dy;
      StepY = -1;
   }
   else StepY = 1;

   if (dx < 0)
   {   
		dx = -dx;
      StepX = -1;
   }
   else StepX = 1;

   dy <<= 1;                            // dy is now 2*dy
   dx <<= 1;                            // dx is now 2*dx
   Pixel(X1,Y1,renk);

   if (dx > dy)
   {   Fraction = dy - (dx >> 1);             // same as 2*dy - dx
      while (X1 != X2)
      {   if (Fraction >= 0)
         {   Y1 += StepY;
            Fraction -= dx;             // same as fraction -= 2*dx
         }

         X1 += StepX;
         Fraction += dy;                // same as fraction -= 2*dy
         Pixel(X1, Y1, renk);
      }
   }

   else
   {   Fraction = dx - (dy >> 1);
      while (Y1 != Y2)
      {   if (Fraction >= 0)
         {   X1 += StepX;
            Fraction -= dy;
         }

         Y1 += StepY;
         Fraction += dx;
         Pixel(X1, Y1,renk);
      }
   }
}

void DaireCiz(int X,int Y,int Radius,unsigned char renk)
{
	int f;
   int ddF_x;
   int ddF_y;
   int x;
   int y;

   f = 1 - Radius;
   ddF_x = 0;
   ddF_y = -2 * Radius;
   x = 0;
   y = Radius;

   Pixel(X, Y + Radius, renk);
   Pixel(X, Y - Radius, renk);
   Pixel(X + Radius, Y, renk);
   Pixel(X - Radius, Y, renk);

   while (x < y)
   {   if (f >= 0)
      {   y--;
         ddF_y += 2;
         f += ddF_y;
      }

      x++;
      ddF_x += 2;
      f += ddF_x + 1;

      Pixel(X + x, Y + y, renk);
      Pixel(X - x, Y + y, renk);
      Pixel(X + x, Y - y, renk);
      Pixel(X - x, Y - y, renk);
      Pixel(X + y, Y + x, renk);
      Pixel(X - y, Y + x, renk);
      Pixel(X + y, Y - x, renk);
      Pixel(X - y, Y - x, renk);
   }
}

void DoluDaireCiz(int X,int Y,int Radius,unsigned char renk)
{
	int f;
   int ddF_x;
   int ddF_y;
   int x;
   int y;

   f = 1 - Radius;
   ddF_x = 0;
   ddF_y = -2 * Radius;
   x = 0;
   y = Radius;

	CizgiCiz(X - Radius,Y,X + Radius,Y,renk);
	Pixel(X, Y + Radius, renk);
   Pixel(X, Y - Radius, renk);
   
   while (x < y)
   {   if (f >= 0)
      {   y--;
         ddF_y += 2;
         f += ddF_y;
      }

      x++;
      ddF_x += 2;
      f += ddF_x + 1;

		CizgiCiz(X + x,Y + y,X - x,Y + y,renk);
		CizgiCiz(X + x,Y - y,X - x,Y - y,renk);
		CizgiCiz(Y + y,X - x,Y - y,X - x,renk);
		CizgiCiz(Y + y,X + x,Y - y,X + x,renk);
   }
}

void Dikdortgen12(unsigned char X1,unsigned char Y1,unsigned char X2,unsigned char Y2,unsigned int renk)
{
	CizgiCiz12(X1,Y1,X2,Y1,renk);
	CizgiCiz12(X1,Y2,X2,Y2,renk);
	CizgiCiz12(X1,Y1,X1,Y2,renk);
	CizgiCiz12(X2,Y1,X2,Y2,renk);
}

void DoluDikdortgen12(int X1,int Y1,int X2,int Y2,unsigned int renk)
{
	int i;
   int PixelCount;
   unsigned char Byte1, Byte2, Byte3;
   int LoopCount;

	SendCommand(PASET);
	SendData(X1);
	SendData(X2);
	SendCommand(CASET);
	SendData(Y1);
	SendData(Y2);
	SendCommand(RAMWR);
	
   if ((X1 > X2) || (Y1 > Y2)) return;
  
   Byte1 = (renk >> 4) & 0xff;
   Byte2 = (((renk & 0x0f) << 4) | ((renk >> 8) & 0x0f));
   Byte3 = (renk & 0xff);

   PixelCount =  (X2 - X1 + 1) * (Y2 - Y1 + 1);
   LoopCount = (PixelCount / 2) + 1;
	CS=0;
   for (i = 0; i < LoopCount; i++)
   {   
		DATA=1;
		data=Byte1;
		shift();
		DATA=1;
		data=Byte2;
		shift();
		DATA=1;
		data=Byte3;		
		shift();
	}
   SendCommand(NOP);
   CS=1;
}

void Pixel12(int X,int Y,int renk)
{	
	unsigned char Byte1, Byte2;
	SendCommand(PASET);
	SendData(X);
	SendCommand(CASET);
	SendData(Y);
	SendCommand(RAMWR);
  
   Byte1 = (renk >> 4) & 0xff;
   Byte2 = ((renk & 0x0f) << 4) ;

	SendData(Byte1);
	SendData(Byte2);

   SendCommand(NOP);
   CS=1;
}

void DaireCiz12(int X,int Y,int Radius,int renk)
{
	int f;
   int ddF_x;
   int ddF_y;
   int x;
   int y;

   f = 1 - Radius;
   ddF_x = 0;
   ddF_y = -2 * Radius;
   x = 0;
   y = Radius;

   Pixel12(X, Y + Radius, renk);
   Pixel12(X, Y - Radius, renk);
   Pixel12(X + Radius, Y, renk);
   Pixel12(X - Radius, Y, renk);

   while (x < y)
   {   if (f >= 0)
      {   y--;
         ddF_y += 2;
         f += ddF_y;
      }

      x++;
      ddF_x += 2;
      f += ddF_x + 1;

      Pixel12(X + x, Y + y, renk);
      Pixel12(X - x, Y + y, renk);
      Pixel12(X + x, Y - y, renk);
      Pixel12(X - x, Y - y, renk);
      Pixel12(X + y, Y + x, renk);
      Pixel12(X - y, Y + x, renk);
      Pixel12(X + y, Y - x, renk);
      Pixel12(X - y, Y - x, renk);
   }
}

void CizgiCiz12(int X1,int Y1,int X2,int Y2,int renk)
{	
	int dy;
   int dx;
   int StepX, StepY;
   int Fraction;

   dy = Y2 - Y1;
   dx = X2 - X1;

   if (dy < 0)
   {   
		dy = -dy;
      StepY = -1;
   }
   else StepY = 1;

   if (dx < 0)
   {   
		dx = -dx;
      StepX = -1;
   }
   else StepX = 1;

   dy <<= 1;                            // dy is now 2*dy
   dx <<= 1;                            // dx is now 2*dx
   Pixel12(X1,Y1,renk);

   if (dx > dy)
   {   Fraction = dy - (dx >> 1);             // same as 2*dy - dx
      while (X1 != X2)
      {   if (Fraction >= 0)
         {   Y1 += StepY;
            Fraction -= dx;             // same as fraction -= 2*dx
         }

         X1 += StepX;
         Fraction += dy;                // same as fraction -= 2*dy
         Pixel12(X1, Y1, renk);
      }
   }

   else
   {   Fraction = dx - (dy >> 1);
      while (Y1 != Y2)
      {   if (Fraction >= 0)
         {   X1 += StepX;
            Fraction -= dy;
         }

         Y1 += StepY;
         Fraction += dx;
         Pixel12(X1, Y1, renk);
      }
   }
}

void DoluDaireCiz12(int X,int Y,int Radius,int renk)
{
	int a, b, P;
   a = 0;
   b = Radius;
   P = 1 - Radius;

   do
   {
      CizgiCiz12(X-a, Y+b, X+a, Y+b, renk);
      CizgiCiz12(X-a, Y-b, X+a, Y-b, renk);
      CizgiCiz12(X-b, Y+a, X+b, Y+a, renk);
      CizgiCiz12(X-b, Y-a, X+b, Y-a, renk);
      if(P < 0)
         P+= 3 + 2*a++;
      else
         P+= 5 + 2*(a++ - b--);
    } while(a <= b);
}

void Buton12(unsigned char X,unsigned char Y,unsigned char width,unsigned char height,int renk)
{
	DoluDikdortgen12(X,Y,X+width,Y+height,white);
	DoluDikdortgen12(X+3,Y+3,X+width-3,Y+height-3,renk);
	CizgiCiz12(X+width,Y,X+width,Y+height,black);
	CizgiCiz12(X+width-1,Y+1,X+width-1,Y+height-1,black);
	CizgiCiz12(X+width-2,Y+2,X+width-2,Y+height-2,black);
	CizgiCiz12(X,Y+height,X+width,Y+height,black);
	CizgiCiz12(X+1,Y+height-1,X+width-1,Y+height-1,black);
	CizgiCiz12(X+2,Y+height-2,X+width-2,Y+height-2,black);
	CizgiCiz12(X,Y,X+3,Y+3,renk);
}


header dosyası
#include<pic.h>

#define		RST	RC0
#define		CS		RC1
#define		LED	RB0
#define		CLK	RC3
#define		DATA	RC5

#define SDO		RC5
#define SCK		RC3

#define NOP    		0x00       // nop
#define SWRESET 		0x01       // software reset
#define BSTROFF 		0x02       // booster voltage OFF
#define BSTRON    	0x03       // booster voltage ON
#define RDDIDIF 		0x04       // read display identification
#define RDDST    		0x09       // read display status
#define SLEEPIN 		0x10       // sleep in
#define SLEEPOUT 		0x11       // sleep out
#define PTLON    		0x12       // partial display mode
#define NORON    		0x13       // display normal mode
#define INVOFF    	0x20       // inversion OFF
#define INVON    		0x21       // inversion ON
#define DALO    		0x22       // all pixel OFF
#define DAL    		0x23       // all pixel ON
#define SETCON    	0x25       // write contrast
#define DISPOFF 		0x28       // display OFF
#define DISPON    	0x29       // display ON
#define CASET    		0x2A       // column address set
#define PASET    		0x2B       // page address set
#define RAMWR    		0x2C       // memory write
#define RGBSET    	0x2D       // colour set
#define PTLAR    		0x30       // partial area
#define VSCRDEF 		0x33       // vertical scrolling definition
#define TEOFF    		0x34       // test mode
#define TEON    		0x35      // test mode
#define MADCTL    	0x36       // memory access control
#define SEP    		0x37       // vertical scrolling start address
#define IDMOFF    	0x38       // idle mode OFF
#define IDMON    		0x39       // idle mode ON
#define COLMOD    	0x3A       // interface pixel format
#define SETVOP    	0xB0       // set Vop
#define BRS    		0xB4       // bottom row swap
#define TRS    		0xB6       // top row swap
#define DISCTR    	0xB9       // display control
#define DOR    		0xBA       // data order
#define TCDFE    		0xBD       // enable/disable DF temperature compensation
#define TCVOPE    	0xBF       // enable/disable Vop temp comp
#define EC       		0xC0       // internal or external oscillator
#define SETMUL    	0xC2       // set multiplication factor
#define TCVOPAB 		0xC3       // set TCVOP slopes A and B
#define TCVOPCD 		0xC4       // set TCVOP slopes c and d
#define TCDF    		0xC5       // set divider frequency
#define DF8COLOR 		0xC6       // set divider frequency 8-color mode
#define SETBS    		0xC7       // set bias system
#define RDTEMP    	0xC8       // temperature read back
#define NLI    		0xC9       // n-line inversion
#define RDID1    		0xDA       // read ID1
#define RDID2    		0xDB       // read ID2
#define RDID3    		0xDC       // read ID3

#define Mod_RGB8		2
#define Mod_RGB12		3

#define red				0xf00
#define green			0x0f0
#define blue			0x00f
#define black			0x000
#define white			0xfff
#define cyan			0x0FF
#define magenta 		0xF0F
#define yellow			0xFF0
#define brown			0xB22
#define orange			0xFA0
#define pink			0xF6A


#define clk_plus	CLK=1;CLK=0;

extern void ShiftBits(unsigned char dt);
extern void SendData(unsigned char dt);
extern void SendCommand(unsigned char dt);

extern void LCD_Initialize(unsigned char value);
extern void SetContrast(unsigned char value);

extern void DoluDikdortgen(int X1,int Y1,int X2,int Y2,unsigned char renk);
extern void Pixel(int X,int Y,unsigned char renk);
extern void CizgiCiz(int X1,int Y1,int X2,int Y2,unsigned char renk);
extern void DaireCiz(int X,int Y,int Radius,unsigned char renk);
extern void DoluDaireCiz(int X,int Y,int Radius,unsigned char renk);

extern void Dikdortgen12(unsigned char X1,unsigned char Y1,unsigned char X2,unsigned char Y2,unsigned int renk);
extern void DoluDikdortgen12(int X1,int Y1,int X2,int Y2,unsigned int renk);
extern void Pixel12(int X,int Y,int renk);
extern void CizgiCiz12(int X1,int Y1,int X2,int Y2,int renk);
extern void DaireCiz12(int X,int Y,int Radius,int renk);
extern void DoluDaireCiz12(int X,int Y,int Radius,int renk);

extern void Buton12(unsigned char X,unsigned char Y,unsigned char width,unsigned char height,int renk);




http://rapidshare.com/files/389245531/nokia_7210.rar.html


serdararikan

16F876A ile 20MHz de sürdüm.
bu ekranlar iki tip sürücü kullanıyorlar.: PCF8833 veya S1D15G10 .
benim aldığım ekran PCF8833 kullanıyor.datasheet:  http://rapidshare.com/files/389259475/philips_lcd_datasheet.pdf.html


aşağıdaki sayfada bir uygulama var.ekranın hangi sürücüyü kullandığını filmin renginden anlıyorsun.truncu =PCF8833
http://electronique.marcel.free.fr/LCD%20Nokia%20couleurs.html


haberleşmeyi seri olarak yapıyorsun.ben yazılımla seri haberleşme yaptım fakat yazılımla hız yetersiz oluyor.SPI ile denedim fakat henüz neticeye ulaşamadım.Eğer SPI ile sonuca ulaşabilirsen kodu görmek isterim.

http://img697.imageshack.us/i/post571140433871.jpg/

http://img140.imageshack.us/i/665072107250lcd.jpg/

pin1Vlogic (3.3 V)
pin2_Reset
pin3Sdta
pin4Sclk
pin5_Cs
pin6Vlcd (3.3 V)
pin7Nc
pin8Gnd
pin9Vled-
pin10Vled+


papylon

Hocam peki bu ekranın soket işini nasıl hallettiniz.

Karınca kadar bir şey bu soket.

serdararikan

sokette satılıyor aldığım pasajda.pad lar biraz ince  ama epi topu 10 pin var.:)

papylon

Bu gün karşıda işim vardı. Hazır gelmişken bir de Tahtakale ye uğrayayım dedim ve iki adet 7210 display ile @ahmet2004'ün deneme yaptığı ILI9325 çipsetli LCD modülü aldım fakat soketi hiç aklıma gelmedi.
Sağlık olsun bir daha ki gidişimde de soket bakarım.

gurbuz58

Serdar ARIKAN hocamın yardımlarıyla bende yaptım güzel çalışıyor hocam sağoll.

anl_ozrmn


papylon

Bu gün soketini de aldım, verdiğiniz kütüphane ile nasip olursa haftaya bir deneme yaparım.

serdararikan

soketi lehimlerken dikkat edin hemen eriyebiliyor.uzun süre ısıtmayın

ferdem

Bu ekranı ben de zamanında CCS C ile sürmüştüm, hazır bir kütüphane kullanmıştım. Sparkfun ın bu ekran için mini geliştirme kiti var, o kitin kullanım kılavuzu da pratik bilgiler içeriyor. Pin bağlantıları pcf8833.c içinde tanımlı.
Bahsettiğim dosyalar burda.


papylon

Alıntı yapılan: serdararikan - 26 Mayıs 2010, 15:38:50
soketi lehimlerken dikkat edin hemen eriyebiliyor.uzun süre ısıtmayın
Buna dikkat etmeye çalışırım.

Bozulsa da 10 tane aldım bozar bozar yeniden lehimlerim artık.  ;D

Ayrıca eklediğin dosyalarda oldukça faydalı @ferdem, Teşekkürler.

papylon

@serdararikan

Verdiğin kodlarla bugün deneme şansım oldu ve gayet güzel çalışıyor. Çok Teşekkürler.

LCD'nin sağını solunu kurcalayıp mıncıklarken, x ve y de 0 ve 131. Piksellere bilginin yazılmadığını gördüm. Acaba kütüphane kodlarında mı problem var diye fonksiyonları inceledim fakat hata yok.

Fark ettim ki x ve y de 0 ve 131. Pikseller yok ve buraya yazılan bilgiler boşa gidiyor.

Yani çekik gözlü çan çin kardeşler, her köşeden birer sıra pikseli tırtıklayıp 130 x 130 piksel GLCD üretmeyi başarmışlar. Kutlamak lazım.  ;D

serdararikan

Alıntı yapılan: papylon - 01 Haziran 2010, 22:59:40
@serdararikan

Verdiğin kodlarla bugün deneme şansım oldu ve gayet güzel çalışıyor. Çok Teşekkürler.

LCD'nin sağını solunu kurcalayıp mıncıklarken, x ve y de 0 ve 131. Piksellere bilginin yazılmadığını gördüm. Acaba kütüphane kodlarında mı problem var diye fonksiyonları inceledim fakat hata yok.

Fark ettim ki x ve y de 0 ve 131. Pikseller yok ve buraya yazılan bilgiler boşa gidiyor.

Yani çekik gözlü çan çin kardeşler, her köşeden birer sıra pikseli tırtıklayıp 130 x 130 piksel GLCD üretmeyi başarmışlar. Kutlamak lazım.  ;D

evet aynen dediğin gibi malzemeden çalmışlar:) erçekten 0 ve 131. pixeller görünmüyor. ama nette araştırırsan bazı sitelerde bu ekran için 130x130  pixel 4096 color LCD yazdığını görürsün...
ben kütüphane üzerinde fazla kafa yormadım.Asıl amacım ahmet2004 ün yaptığı gibi çin telefonların dokunmatik ekranlarını sürmek.şuan başlamadım ama yakında başlayacağım.

papylon

7210 LCD'yi alırken @Ahmet2004'ün kullandığı ILI9325 yongalı GLCD'yi ben de aldım ama deneme fırsatım olmadı.
Kütüphaneyle biraz oynayıp, LCD'nin kendisi gibi ufak ve sevimli projelerde kullanılabilir.

132-2 X 132-2 piksel bile olsa  :D

serdararikan

Alıntı yapılan: papylon - 02 Haziran 2010, 00:32:09
7210 LCD'yi alırken @Ahmet2004'ün kullandığı ILI9325 yongalı GLCD'yi ben de aldım ama deneme fırsatım olmadı.
Kütüphaneyle biraz oynayıp, LCD'nin kendisi gibi ufak ve sevimli projelerde kullanılabilir.

132-2 X 132-2 piksel bile olsa  :D

mesajım yanlış anlaşılmasın.ben bu lcd yi kullanmak isterken ilk amacım gidip 15-20tl verip 128x64 LCD ler almayı mantıklı bulmadığım için yola koyuldum.ve halen aynı fikirdeyim.bu tip bi lcd 5tl ye alınırken monokrom bir ekrana 20tl vermek anlamsız.