اطلاعیه

Collapse
No announcement yet.

اتصال مستقیم تاچ اسکرین به میکرو

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    اتصال مستقیم تاچ اسکرین به میکرو

    سلام دوستان. راستش چندتا سوال دارم:
    آیا میشه 2تا تاچ اسکرین رو مستقیما به میکرو AT91SAM7X256 وصل کرد ؟ (4تا ADC میکرو آزاده و استفاده نشده ) . بنظر شما اگر از درایور تاچ استفاده کنم بهتره یا مستقیم به میکرو بزنم بهتره ؟ کتابخانه خوب برای TFT LCD 2.4 و تاچ اون سراغ دارین ؟ یه سوال دیگه هم این که چطور میتونم بفهمم کنترلر LCD من چیه ؟



    ممنون.

    #2
    پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

    نوشته اصلی توسط rezaf
    سلام دوستان. راستش چندتا سوال دارم:
    آیا میشه 2تا تاچ اسکرین رو مستقیما به میکرو AT91SAM7X256 وصل کرد ؟ (4تا ADC میکرو آزاده و استفاده نشده ) . بنظر شما اگر از درایور تاچ استفاده کنم بهتره یا مستقیم به میکرو بزنم بهتره ؟ کتابخانه خوب برای TFT LCD 2.4 و تاچ اون سراغ دارین ؟ یه سوال دیگه هم این که چطور میتونم بفهمم کنترلر LCD من چیه ؟



    ممنون.
    مصلما اگه از درایور استفاده کنی بهتر و دقیق تره ولی برای هر تاچ نیاز به 2تاADC و 2تا IO معمولی داری. توی انجمن ی هدر خوب برای تاچ گذاشتم که با تغییر پارامترای ابعاد تاچ که همون اول هدر هست میتونی برای هر LCD ای استفاده کنی
    زندگی یعنی امید و حرکت
    کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
    سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
    برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
    به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

    دیدگاه


      #3
      پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

      جناب ایمانی فر میشه لینک هدری که برای تاچ گذاشتی برام بذاری آخه جستجوی سایت کار نمی کنه و خطا میده. پس میشه 2 تا تاچ گذاشت. مشکل اینجاست که SPI و I2C میکرو رو استفاده کردم و درایورهای تاچ هم با این پروتکل ها خروجی میدن.
      بازم ممنونم جناب ایمانی فر.

      دیدگاه


        #4
        پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

        نوشته اصلی توسط rezaf
        جناب ایمانی فر میشه لینک هدری که برای تاچ گذاشتی برام بذاری آخه جستجوی سایت کار نمی کنه و خطا میده. پس میشه 2 تا تاچ گذاشت. مشکل اینجاست که SPI و I2C میکرو رو استفاده کردم و درایورهای تاچ هم با این پروتکل ها خروجی میدن.
        بازم ممنونم جناب ایمانی فر.
        سلام
        بفرما
        http://www.eca.ir/forum2/index.php?topic=74895.msg518799#msg518799
        زندگی یعنی امید و حرکت
        کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
        سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
        برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
        به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

        دیدگاه


          #5
          پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

          سلام
          جناب ایمانی فر بعد از باز کردن این LCD از روی بوردش و خواندن سریال پشت LCd متوجه شدم ظاهرا کنترلرش S6D1121 هست. سریالش دقیقا مثل این LCD هست:


          با این فزق که LCD من آخرش نوشته HLY-B-1121 .

          هر چی گشتم هدر مناسب براش پیدا نکردم این صفحه ویکی هست که برای آردینو مثال براش داره اونم در حالت 16بیت (این ماژول پیش فرض برای 8بیت تنظیم شده) :

          http://www.elecfreaks.com/wiki/index....4#Programming

          حالا با این اوصاف،می خوام اگه میشه کمکم کنید هدر LCD 3.2 خود ECA رو که کنترلرهای مختلف رو ساپورت می کنه تغییر بدیم که این کنترلر رو هم ساپورت کنه. یا اگه راه بهتری به نظرتون میرسه ممنون میشم کمکم کنید.

          دیدگاه


            #6
            پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

            با ترکیبی از هدرهایی که پیدا کردم (و البته با اجازتون از هدر شما هم استفاده کردم) این هدر رو آماده کردم ولی هنوز کار نمیکنه. نمیدونم هدر ایراد داره یا کنترلر LCD رو درست تشخیص ندادم.


            کد:
            #include <Headers\AT91SAM7X256.H> 
            #include <Headers\delay.h>
            
            /**********************************************
            Define zone
            **********************************************/
            #define S6DLCD_DATAPORT_B       
            #define S6DLCD_DATAPORT_OFFSET   2
            #define S6DLCD_CONTROLPORT_B     
            #define S6DLCD_RST         18
            #define S6DLCD_RS          19
            #define S6DLCD_CS          20
            #define S6DLCD_WR          21
            #define S6DLCD_RD          22 
            
            	#define _S6DLCD_DATAPORT_ID_	    AT91C_ID_PIOB
            	#define _S6DLCD_DATAPORT_PER_	    *AT91C_PIOB_PER
            	#define _S6DLCD_DATAPORT_PDR_	    *AT91C_PIOB_PDR
            	#define _S6DLCD_DATAPORT_OER_	    *AT91C_PIOB_OER
            	#define _S6DLCD_DATAPORT_ODR_	    *AT91C_PIOB_ODR
            	#define _S6DLCD_DATAPORT_PUER_	  	 *AT91C_PIOB_PPUER
            	#define _S6DLCD_DATAPORT_PUDR_	   *AT91C_PIOB_PPUDR
            	#define _S6DLCD_DATAPORT_PDSR_	   *AT91C_PIOB_PDSR
            	#define _S6DLCD_DATAPORT_SODR_	   *AT91C_PIOB_SODR
            	#define _S6DLCD_DATAPORT_CODR_	   *AT91C_PIOB_CODR
            	#define _S6DLCD_DATAPORT_PCER_    *AT91C_PMC_PCER
            	#define _S6DLCD_DATAPORT_PCDR_    *AT91C_PMC_PCDR
            
            	#define _S6DLCD_CONTROLPORT_ID_	    AT91C_ID_PIOB
            	#define _S6DLCD_CONTROLPORT_PER_	  *AT91C_PIOB_PER
            	#define _S6DLCD_CONTROLPORT_PDR_	  *AT91C_PIOB_PDR
            	#define _S6DLCD_CONTROLPORT_OER_	  *AT91C_PIOB_OER
            	#define _S6DLCD_CONTROLPORT_ODR_	  *AT91C_PIOB_ODR
            	#define _S6DLCD_CONTROLPORT_PUER_	  *AT91C_PIOB_PPUER
            	#define _S6DLCD_CONTROLPORT_PUDR_	  *AT91C_PIOB_PPUDR
            	#define _S6DLCD_CONTROLPORT_SODR_	  *AT91C_PIOB_SODR
            	#define _S6DLCD_CONTROLPORT_CODR_	  *AT91C_PIOB_CODR
            
            #define S6DLCD_RST_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_RST)
            #define S6DLCD_RST_HIGH        _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_RST)
            #define S6DLCD_RS_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_RS)
            #define S6DLCD_RS_HIGH         _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_RS)
            #define S6DLCD_CS_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_CS)
            #define S6DLCD_CS_HIGH         _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_CS)			
            #define S6DLCD_RD_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_RD)
            #define S6DLCD_RD_HIGH         _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_RD)
            #define S6DLCD_WR_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_WR)
            #define S6DLCD_WR_HIGH         _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_WR)  
            #define S6DLCD_DATAPORT_INPUT		    _S6DLCD_DATAPORT_ODR_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET),_S6DLCD_DATAPORT_PER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET)	  
            #define S6DLCD_DATAPORT_INPUT_CLK_E		 _S6DLCD_DATAPORT_PCER_ = (1 << _S6DLCD_DATAPORT_ID_)
            #define S6DLCD_DATAPORT_INPUT_CLK_D		 _S6DLCD_DATAPORT_PCDR_ = (1 << _S6DLCD_DATAPORT_ID_)
            #define S6DLCD_DATAPORT_OUTPUT     _S6DLCD_DATAPORT_OER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET)           
            #define S6DLCD_DATAPORT_CLEAR     _S6DLCD_DATAPORT_CODR_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET)
            
            #define HIGH 1
            #define LOW 0
            
            #define X_CONST  240
            #define Y_CONST  320
            #define PREC_TOUCH_CONST 10
            #define PixSizeX 13.78
            #define PixOffsX 411
            #define PixSizeY 11.01
            #define PixOffsY 378
            
            #define WINDOW_XADDR_START  0x0050 // Horizontal Start Address Set
            #define WINDOW_XADDR_END   0x0051 // Horizontal End Address Set
            #define WINDOW_YADDR_START  0x0052 // Vertical Start Address Set
            #define WINDOW_YADDR_END   0x0053 // Vertical End Address Set
            #define GRAM_XADDR      0x0020 // GRAM Horizontal Address Set
            #define GRAM_YADDR      0x0021 // GRAM Vertical Address Set
            #define GRAMWR        0x0022 // memory write
            
            /* LCD color */
            #define S6DLCD_White  0xFFFF
            #define S6DLCD_Black  0x0000
            #define S6DLCD_Blue   0x001F
            #define S6DLCD_Blue2  0x051F
            #define S6DLCD_Red   0xF800
            #define S6DLCD_Magenta 0xF81F
            #define S6DLCD_Green  0x07E0
            #define S6DLCD_Cyan   0x7FFF
            #define S6DLCD_Yellow  0xFFE0
            
            /**********************************************
            Val Zone
            **********************************************/
            int TP_X,TP_Y;
            /**********************************************
            Standard C functions zone
            **********************************************/
            void Write_Command(unsigned int c)
            {
            	S6DLCD_RS_LOW;        //LCD_RS=0;
            	S6DLCD_CS_LOW;        //LCD_CS =0;!
            	S6DLCD_DATAPORT_OUTPUT;
            	S6DLCD_DATAPORT_CLEAR;
            	_S6DLCD_DATAPORT_SODR_ = ((c>>8) << S6DLCD_DATAPORT_OFFSET); //LCD_DataPortH=DH>>8;
            	S6DLCD_WR_LOW;       //LCD_WR=0;
            
            	S6DLCD_WR_HIGH;       //LCD_WR=1;!
            	S6DLCD_DATAPORT_CLEAR;
            	_S6DLCD_DATAPORT_SODR_ = ((c) << S6DLCD_DATAPORT_OFFSET);  //LCD_DataPortH=DH;
            	S6DLCD_WR_LOW;       //LCD_WR=0;
            	S6DLCD_WR_HIGH;      //LCD_WR=1;
            	S6DLCD_CS_HIGH ;      //LCD_CS =0;
            }
            void Write_Data(unsigned int c)
            {
            	S6DLCD_RS_HIGH;       //LCD_RS=0;
            	S6DLCD_CS_LOW;       //LCD_CS =0;!
            	S6DLCD_DATAPORT_OUTPUT;
            	S6DLCD_DATAPORT_CLEAR;
            	_S6DLCD_DATAPORT_SODR_ = ((c>>8) << S6DLCD_DATAPORT_OFFSET); //LCD_DataPortH=DH>>8;
            	S6DLCD_WR_LOW;       //LCD_WR=0;
            	S6DLCD_WR_HIGH;       //LCD_WR=1;!
            	S6DLCD_DATAPORT_CLEAR;
            	_S6DLCD_DATAPORT_SODR_ = ((c) << S6DLCD_DATAPORT_OFFSET);  //LCD_DataPortH=DH;
            	S6DLCD_WR_LOW;       //LCD_WR=0;
            	S6DLCD_WR_HIGH;       //LCD_WR=1;
            	S6DLCD_CS_HIGH;       //LCD_CS =0;
            }
            void Write_Command_Data(unsigned int cmd,unsigned int dat)
            {
            	Write_Command(cmd);
            	Write_Data(dat);
            }
            void Lcd_Init()
            {
            	S6DLCD_DATAPORT_INPUT_CLK_E;
            	_S6DLCD_DATAPORT_PER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET);
            	_S6DLCD_DATAPORT_OER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET);
            	_S6DLCD_DATAPORT_PUER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET);
            	_S6DLCD_CONTROLPORT_PER_ = (1 << S6DLCD_RST) | (1 << S6DLCD_RS) | (1 << S6DLCD_CS) | (1 << S6DLCD_WR) | (1 << S6DLCD_RD);
            	_S6DLCD_CONTROLPORT_OER_ = (1 << S6DLCD_RST) | (1 << S6DLCD_RS) | (1 << S6DLCD_CS) | (1 << S6DLCD_WR) | (1 << S6DLCD_RD);
            	_S6DLCD_CONTROLPORT_PUDR_ = (1 << S6DLCD_RST) | (1 << S6DLCD_RS) | (1 << S6DLCD_CS) | (1 << S6DLCD_WR) | (1 << S6DLCD_RD);
            	_S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_RST) | (1 << S6DLCD_CS) | (1 << S6DLCD_RD); 
            	_S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_WR);
            
             S6DLCD_RST_HIGH;
             delay_ms(500);
             S6DLCD_RST_LOW;
             delay_ms(500);
            
             S6DLCD_RST_HIGH;
            	S6DLCD_CS_HIGH;
            	S6DLCD_WR_HIGH;
             delay_ms(1000);
             
            	 Write_Command_Data(0x0011,0x2004);
            	 Write_Command_Data(0x0013,0xCC00);
            	 Write_Command_Data(0x0015,0x2600);
            	 Write_Command_Data(0x0014,0x252A);
            	// Write_Command_Data(0x14,0x002A);
            	 Write_Command_Data(0x0012,0x0033);
            	 Write_Command_Data(0x0013,0xCC04);
            	 //delayms(1);
            	 Write_Command_Data(0x0013,0xCC06);
            	 //delayms(1);
            	 Write_Command_Data(0x0013,0xCC4F);
            	 //delayms(1);
            	 Write_Command_Data(0x0013,0x674F);
            	 Write_Command_Data(0x0011,0x2003);
            	 //delayms(1);
            	 Write_Command_Data(0x0030,0x2609);
            	 Write_Command_Data(0x0031,0x242C);
            	 Write_Command_Data(0x0032,0x1F23);
            	 Write_Command_Data(0x0033,0x2425);
            	 Write_Command_Data(0x0034,0x2226);
            	 Write_Command_Data(0x0035,0x2523);
            	 Write_Command_Data(0x0036,0x1C1A);
            	 Write_Command_Data(0x0037,0x131D);
            	 Write_Command_Data(0x0038,0x0B11);
            	 Write_Command_Data(0x0039,0x1210);
            	 Write_Command_Data(0x003A,0x1315);
            	 Write_Command_Data(0x003B,0x3619);
            	 Write_Command_Data(0x003C,0x0D00);
            	 Write_Command_Data(0x003D,0x000D);
            
            	 Write_Command_Data(0x0016,0x0007);
            	 Write_Command_Data(0x0002,0x0013);
            	 Write_Command_Data(0x0003,0x0003);
            	 Write_Command_Data(0x0001,0x0127);
            	 //delayms(1);
            	 Write_Command_Data(0x0008,0x0303);
            	 Write_Command_Data(0x000A,0x000B);
            	 Write_Command_Data(0x000B,0x0003);
            	 Write_Command_Data(0x000C,0x0000);
            	 Write_Command_Data(0x0041,0x0000);
            	 Write_Command_Data(0x0050,0x0000);
            	 Write_Command_Data(0x0060,0x0005);
            	 Write_Command_Data(0x0070,0x000B);
            	 Write_Command_Data(0x0071,0x0000);
            	 Write_Command_Data(0x0078,0x0000);
            	 Write_Command_Data(0x007A,0x0000);
            	 Write_Command_Data(0x0079,0x0007);
            	 Write_Command_Data(0x0007,0x0051);
            	 //delayms(1);
            	 Write_Command_Data(0x0007,0x0053);
            	 Write_Command_Data(0x0079,0x0000);
            	 Write_Command_Data(0x0007,0x0051);
              Write_Command(0x0022);
            	 delay_ms(500);
            }
            
            
            void SetXY(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)
            {
            	Write_Command_Data(0x0046,(x1 << 8)| x0);
            	//Write_Command_Data(0x0047,x1);
            	Write_Command_Data(0x0047,y1);
            	Write_Command_Data(0x0048,y0);
            	Write_Command_Data(0x0020,x0);
            	Write_Command_Data(0x0021,y0);
            	Write_Command (0x0022);
            	//LCD_WriteCMD(GRAMWR);
            }
            
            void Pant(unsigned int color)
            {
            	 int i,j;
            
            	 SetXY(0,239,0,319);
            		
            		 for(i=0;i<320;i++)
            		 {
            			 for (j=0;j<240;j++)
            				{
            					Write_Data(color);
            				}
            		 }
            	 }
            
            void LCD_clear()
            {
            		unsigned int i,j;
            	
            		SetXY(0,239,0,319);
            	
            		 for(i=0;i<X_CONST;i++)
            		 {
            		  for(j=0;j<Y_CONST;j++)
            			 {
            		   Write_Data(0x0000);
            			 }
            		 }
            }

            دیدگاه


              #7
              پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

              سلام
              تا مطمئن نشی که درایورش چیه نمیتونی راش بندازی مگر هی درایورای مختلف رو تست کنی تا شانسی یکی درست در بیاد
              نکته مهم توی تبدیل درایور ها توابع پایه (مثل رایت و رید از GRAM) و تابع init هست.
              زندگی یعنی امید و حرکت
              کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
              سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
              برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
              به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

              دیدگاه


                #8
                پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

                یه سوالی برام پیش اومده، چرا ماژول LCD ECA پین D9 نداره ؟ آیا این تاثیری تو کارکرد هدر میذاره (تو مد 8 بیتی )؟

                دیدگاه


                  #9
                  پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

                  از بابت درایورش مطمین شدم که S6D1121 هست. و با این کدها init شد و کارای اولیه رو هم انجام داد حالا موندم بقیه تابع ها رو چی کار کنم.
                  آخرین تغییرات هدر :


                  کد:
                  #include <Headers\AT91SAM7X256.H> 
                  #include <Headers\delay.h>
                  
                  /**********************************************
                  Define zone
                  **********************************************/
                  #define S6DLCD_DATAPORT_B       
                  #define S6DLCD_DATAPORT_OFFSET   2
                  #define S6DLCD_CONTROLPORT_B     
                  #define S6DLCD_RST         18
                  #define S6DLCD_RS          19
                  #define S6DLCD_CS          20
                  #define S6DLCD_WR          21
                  #define S6DLCD_RD          22 
                  
                  #define _S6DLCD_DATAPORT_ID_	    AT91C_ID_PIOB
                  #define _S6DLCD_DATAPORT_PER_	    *AT91C_PIOB_PER
                  #define _S6DLCD_DATAPORT_PDR_	    *AT91C_PIOB_PDR
                  #define _S6DLCD_DATAPORT_OER_	    *AT91C_PIOB_OER
                  #define _S6DLCD_DATAPORT_ODR_	    *AT91C_PIOB_ODR
                  #define _S6DLCD_DATAPORT_PUER_	  	 *AT91C_PIOB_PPUER
                  #define _S6DLCD_DATAPORT_PUDR_	   *AT91C_PIOB_PPUDR
                  #define _S6DLCD_DATAPORT_PDSR_	   *AT91C_PIOB_PDSR
                  #define _S6DLCD_DATAPORT_SODR_	   *AT91C_PIOB_SODR
                  #define _S6DLCD_DATAPORT_CODR_	   *AT91C_PIOB_CODR
                  #define _S6DLCD_DATAPORT_PCER_    *AT91C_PMC_PCER
                  #define _S6DLCD_DATAPORT_PCDR_    *AT91C_PMC_PCDR
                  
                  #define _S6DLCD_CONTROLPORT_ID_	    AT91C_ID_PIOB
                  #define _S6DLCD_CONTROLPORT_PER_	  *AT91C_PIOB_PER
                  #define _S6DLCD_CONTROLPORT_PDR_	  *AT91C_PIOB_PDR
                  #define _S6DLCD_CONTROLPORT_OER_	  *AT91C_PIOB_OER
                  #define _S6DLCD_CONTROLPORT_ODR_	  *AT91C_PIOB_ODR
                  #define _S6DLCD_CONTROLPORT_PUER_	  *AT91C_PIOB_PPUER
                  #define _S6DLCD_CONTROLPORT_PUDR_	  *AT91C_PIOB_PPUDR
                  #define _S6DLCD_CONTROLPORT_SODR_	  *AT91C_PIOB_SODR
                  #define _S6DLCD_CONTROLPORT_CODR_	  *AT91C_PIOB_CODR
                  
                  #define S6DLCD_RST_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_RST)
                  #define S6DLCD_RST_HIGH        _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_RST)
                  #define S6DLCD_RS_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_RS)
                  #define S6DLCD_RS_HIGH         _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_RS)
                  #define S6DLCD_CS_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_CS)
                  #define S6DLCD_CS_HIGH         _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_CS)			
                  #define S6DLCD_RD_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_RD)
                  #define S6DLCD_RD_HIGH         _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_RD)
                  #define S6DLCD_WR_LOW         _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_WR)
                  #define S6DLCD_WR_HIGH         _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_WR)  
                  #define S6DLCD_DATAPORT_INPUT		    _S6DLCD_DATAPORT_ODR_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET),_S6DLCD_DATAPORT_PER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET)	  
                  #define S6DLCD_DATAPORT_INPUT_CLK_E		 _S6DLCD_DATAPORT_PCER_ = (1 << _S6DLCD_DATAPORT_ID_)
                  #define S6DLCD_DATAPORT_INPUT_CLK_D		 _S6DLCD_DATAPORT_PCDR_ = (1 << _S6DLCD_DATAPORT_ID_)
                  #define S6DLCD_DATAPORT_OUTPUT     _S6DLCD_DATAPORT_OER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET)           
                  #define S6DLCD_DATAPORT_CLEAR     _S6DLCD_DATAPORT_CODR_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET)
                  
                  #define HIGH 1
                  #define LOW 0
                  
                  //S6D1121 16 bit mode
                  #define 	disp_x_size 239
                  #define 	disp_y_size 319
                  #define 	display_transfer_mode 16
                  
                  #define X_CONST  240
                  #define Y_CONST  320
                  #define PREC_TOUCH_CONST 10
                  #define PixSizeX 13.78
                  #define PixOffsX 411
                  #define PixSizeY 11.01
                  #define PixOffsY 378
                  
                  #define WINDOW_XADDR_START  0x0050 // Horizontal Start Address Set
                  #define WINDOW_XADDR_END   0x0051 // Horizontal End Address Set
                  #define WINDOW_YADDR_START  0x0052 // Vertical Start Address Set
                  #define WINDOW_YADDR_END   0x0053 // Vertical End Address Set
                  #define GRAM_XADDR      0x0020 // GRAM Horizontal Address Set
                  #define GRAM_YADDR      0x0021 // GRAM Vertical Address Set
                  #define GRAMWR        0x0022 // memory write
                  
                  /* LCD RGB color definitions  */
                  #define S6DLCD_Black      0x0000		  /*  0,  0,  0 */
                  #define S6DLCD_Navy      0x000F   /*  0,  0, 128 */
                  #define S6DLCD_DarkGreen    0x03E0   /*  0, 128,  0 */
                  #define S6DLCD_DarkCyan    0x03EF   /*  0, 128, 128 */
                  #define S6DLCD_Maroon     0x7800   /* 128,  0,  0 */
                  #define S6DLCD_Purple     0x780F   /* 128,  0, 128 */
                  #define S6DLCD_Olive      0x7BE0   /* 128, 128,  0 */
                  #define S6DLCD_LightGrey    0xC618   /* 192, 192, 192 */
                  #define S6DLCD_DarkGrey    0x7BEF   /* 128, 128, 128 */
                  #define S6DLCD_Blue      0x001F   /*  0,  0, 255 */
                  #define S6DLCD_Green      0x07E0   /*  0, 255,  0 */
                  #define S6DLCD_Cyan      0x07FF   /*  0, 255, 255 */
                  #define S6DLCD_Red       0xF800   /* 255,  0,  0 */
                  #define S6DLCD_Magenta     0xF81F   /* 255,  0, 255 */
                  #define S6DLCD_Yellow     0xFFE0   /* 255, 255, 0  */
                  #define S6DLCD_White      0xFFFF   /* 255, 255, 255 */
                  #define S6DLCD_WHITE      0XFFFF
                  #define S6DLCD_RED       0xF800
                  #define S6DLCD_BLUE      0x001F
                  
                  /**********************************************
                  Standard C functions zone
                  **********************************************/
                  void Write_Command(unsigned int c)
                  {
                  	S6DLCD_RS_LOW;        //LCD_RS=0;
                  	S6DLCD_WR_LOW;       //LCD_WR=0;	
                  	S6DLCD_RD_HIGH;
                  	S6DLCD_DATAPORT_CLEAR;
                  	_S6DLCD_DATAPORT_SODR_ = (c << S6DLCD_DATAPORT_OFFSET); 
                  	S6DLCD_CS_LOW ;
                  	S6DLCD_CS_HIGH ;      //LCD_CS=1;
                  	S6DLCD_DATAPORT_CLEAR;
                  	S6DLCD_RS_HIGH;
                  }
                  
                  void Write_Data(unsigned int c)
                  {
                  	S6DLCD_RS_HIGH;        
                  	S6DLCD_WR_LOW;       
                  	S6DLCD_RD_HIGH;	
                  	_S6DLCD_DATAPORT_SODR_ = (c << S6DLCD_DATAPORT_OFFSET); 
                  	S6DLCD_CS_LOW ;
                  	S6DLCD_CS_HIGH ;     
                  }
                  
                  void Write_Command_Data(unsigned int cmd,unsigned int dat)
                  {
                  	Write_Command(cmd);
                  	Write_Data(dat);
                  }
                  
                  void S6DLCD_Init()
                  {
                  S6DLCD_DATAPORT_INPUT_CLK_E;
                  _S6DLCD_DATAPORT_PER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET);
                  _S6DLCD_DATAPORT_OER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET);
                  _S6DLCD_DATAPORT_PUER_ = (0xFFFF << S6DLCD_DATAPORT_OFFSET);
                  _S6DLCD_CONTROLPORT_PER_ = (1 << S6DLCD_RST) | (1 << S6DLCD_RS) | (1 << S6DLCD_CS) | (1 << S6DLCD_WR) | (1 << S6DLCD_RD);
                  _S6DLCD_CONTROLPORT_OER_ = (1 << S6DLCD_RST) | (1 << S6DLCD_RS) | (1 << S6DLCD_CS) | (1 << S6DLCD_WR) | (1 << S6DLCD_RD);
                  _S6DLCD_CONTROLPORT_PUDR_ = (1 << S6DLCD_RST) | (1 << S6DLCD_RS) | (1 << S6DLCD_CS) | (1 << S6DLCD_WR) | (1 << S6DLCD_RD);
                  _S6DLCD_CONTROLPORT_SODR_ = (1 << S6DLCD_RST) | (1 << S6DLCD_CS) | (1 << S6DLCD_RD); 
                  _S6DLCD_CONTROLPORT_CODR_ = (1 << S6DLCD_WR);
                  
                  S6DLCD_RST_HIGH;    //reset the LCD
                  delay_ms(500);
                  S6DLCD_RST_LOW;
                  delay_ms(500);
                  
                  S6DLCD_RST_HIGH; 
                  S6DLCD_CS_HIGH;
                  S6DLCD_WR_HIGH;
                  delay_ms(1000);
                  	
                   //setup registers of LCD for initialization
                  	Write_Command_Data(0x11,0x2004);		
                  	Write_Command_Data(0x13,0xCC00);		
                  	Write_Command_Data(0x15,0x2600);	
                  	Write_Command_Data(0x14,0x252A);	
                  	Write_Command_Data(0x12,0x0033);		
                  	Write_Command_Data(0x13,0xCC04);		
                  	Write_Command_Data(0x13,0xCC06);		
                  	Write_Command_Data(0x13,0xCC4F);		
                  	Write_Command_Data(0x13,0x674F);
                  	Write_Command_Data(0x11,0x2003);
                  	Write_Command_Data(0x30,0x2609);		
                  	Write_Command_Data(0x31,0x242C);		
                  	Write_Command_Data(0x32,0x1F23);		
                  	Write_Command_Data(0x33,0x2425);		
                  	Write_Command_Data(0x34,0x2226);		
                  	Write_Command_Data(0x35,0x2523);		
                  	Write_Command_Data(0x36,0x1C1A);		
                  	Write_Command_Data(0x37,0x131D);		
                  	Write_Command_Data(0x38,0x0B11);		
                  	Write_Command_Data(0x39,0x1210);		
                  	Write_Command_Data(0x3A,0x1315);		
                  	Write_Command_Data(0x3B,0x3619);		
                  	Write_Command_Data(0x3C,0x0D00);		
                  	Write_Command_Data(0x3D,0x000D);		
                  	Write_Command_Data(0x16,0x0007);		
                  	Write_Command_Data(0x02,0x0013);		
                  	Write_Command_Data(0x03,0x0003);		
                  	Write_Command_Data(0x01,0x0127);		
                  	Write_Command_Data(0x08,0x0303);		
                  	Write_Command_Data(0x0A,0x000B);		
                  	Write_Command_Data(0x0B,0x0003);  
                  	Write_Command_Data(0x0C,0x0000);  
                  	Write_Command_Data(0x41,0x0000);  
                  	Write_Command_Data(0x50,0x0000);  
                  	Write_Command_Data(0x60,0x0005);  
                  	Write_Command_Data(0x70,0x000B);  
                  	Write_Command_Data(0x71,0x0000);  
                  	Write_Command_Data(0x78,0x0000);  
                  	Write_Command_Data(0x7A,0x0000);  
                  	Write_Command_Data(0x79,0x0007);		
                  	Write_Command_Data(0x07,0x0051);  
                  	Write_Command_Data(0x07,0x0053);		
                  	Write_Command_Data(0x79,0x0000);
                  	Write_Command(0x22);
                  	 delay_ms(500);
                  }
                  
                  
                  void S6DLCD_SetXY(unsigned int x1,unsigned int x2,unsigned int y1,unsigned int y2)
                  {
                  	Write_Command_Data(0x46,(x2 << 8) | x1);
                  	Write_Command_Data(0x47,y2);
                  	Write_Command_Data(0x48,y1);
                  	Write_Command_Data(0x20,x1);
                  	Write_Command_Data(0x21,y1);
                  	Write_Command(0x22);	
                  }
                  
                  void S6DLCD_Fill(unsigned int color)
                  {
                  	 int i,j;
                  
                  	 S6DLCD_SetXY(0,239,0,319);
                  		
                  		 for(i=0;i<320;i++)
                  		 {
                  			 for (j=0;j<240;j++)
                  				{
                  					Write_Data(color);
                  				}
                  		 }
                  	 }
                  
                  void S6DLCD_clear()
                  {
                  		unsigned int i,j;
                  	
                  		S6DLCD_SetXY(0,239,0,319);
                  	
                  		 for(i=0;i<X_CONST;i++)
                  		 {
                  		  for(j=0;j<Y_CONST;j++)
                  			 {
                  		   Write_Data(0x0000);
                  			 }
                  		 }
                  }

                  با این برنامه هم LCD رو اینیت کرد بعد پاک کرد(با رنگ سیاه) بعدم صفحه رو با آبی fill کرد .

                  کد:
                  S6DLCD_Init();
                  S6DLCD_clear();
                  delay_ms(1000);
                  S6DLCD_SetXY(0, 0, 240, 320);
                  delay_ms(1000);
                  S6DLCD_Fill(S6DLCD_Blue);
                  آقای ایمانی فر شما با این تابع ها کار کردید اگه ممکنه یه نگاهی بندازید ببینید میشه تابع های اولیه مثل نوشتن جمله و کاراکتر و انداختن عکس و مثل اون رو براش نوشت ؟

                  دیدگاه


                    #10
                    پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

                    خیلی خب پس حله
                    شما اول کاری که میکنی باید تابع رسم پیکسل رو راه بندازی و بعد همه چی حله
                    چون بقیه توابه با همین تابع کار میکنن.
                    ببین برای رسم پیکسل کافیه این کار رو کنی
                    کد:
                    S6DLCD_Init();
                    S6DLCD_clear();
                    delay_ms(1000);
                    S6DLCD_SetXY(x, y, x, y);
                    delay_ms(1000);
                    S6DLCD_Fill(S6DLCD_Blue);
                    به جای این که کل صفحه رو بگیری باید فقط همون پیکسل رو بگیری.
                    خبرشو بده که چی شد
                    زندگی یعنی امید و حرکت
                    کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                    سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                    برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                    به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                    دیدگاه


                      #11
                      پاسخ : پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

                      نوشته اصلی توسط علی ایمانی فر
                      خیلی خب پس حله
                      شما اول کاری که میکنی باید تابع رسم پیکسل رو راه بندازی و بعد همه چی حله
                      چون بقیه توابه با همین تابع کار میکنن.
                      ببین برای رسم پیکسل کافیه این کار رو کنی
                      کد:
                      S6DLCD_Init();
                      S6DLCD_clear();
                      delay_ms(1000);
                      S6DLCD_SetXY(x, y, x, y);
                      delay_ms(1000);
                      S6DLCD_Fill(S6DLCD_Blue);
                      به جای این که کل صفحه رو بگیری باید فقط همون پیکسل رو بگیری.
                      خبرشو بده که چی شد
                      خبر خوب این که تابع های رسم پیکسل و خط هم کار کرد :
                      کد:
                      void S6DLCD_DrawPixel(U16 x,U16 y)
                      {
                      	S6DLCD_SetXY(x,y,x,y);//
                      	Write_Data(PIXEL_COLOR);	  
                      } 
                      
                      void S6DLCD_DrawHLine(int x, int y, int l)
                      {
                      		if (l<0)
                      		{
                      			l = -l;
                      			x -= l;
                      		}
                      		S6DLCD_SetXY(x, y, x+l, y);
                      		Write_Data(PIXEL_COLOR);
                      }
                      
                      void S6DLCD_DrawVLine(int x, int y, int l)
                      {
                      	if (l<0)
                      	{
                      		l = -l;
                      		y -= l;
                      	}
                      	S6DLCD_SetXY(x, y, x, y+l);
                      	Write_Data(PIXEL_COLOR);
                      }
                      
                      void S6DLCD_DrawLine(int x1, int y1, int x2, int y2)
                      {
                      	if (y1==y2)
                      		S6DLCD_DrawHLine(x1, y1, x2-x1);
                      	else if (x1==x2)
                      		S6DLCD_DrawVLine(x1, y1, y2-y1);
                      	else
                      	{
                      		unsigned int	dx = (x2 > x1 ? x2 - x1 : x1 - x2);
                      		short			xstep = x2 > x1 ? 1 : -1;
                      		unsigned int	dy = (y2 > y1 ? y2 - y1 : y1 - y2);
                      		short			ystep = y2 > y1 ? 1 : -1;
                      		int				col = x1, row = y1;
                      
                      		if (dx < dy)
                      		{
                      			int t = - (dy >> 1);
                      			while (1)
                      			{
                      				S6DLCD_SetXY (col, row, col, row);
                      				Write_Data(PIXEL_COLOR);
                      				if (row == y2)
                      					return;
                      				row += ystep;
                      				t += dx;
                      				if (t >= 0)
                      				{
                      					col += xstep;
                      					t  -= dy;
                      				}
                      			} 
                      		}
                      		else
                      		{
                      			int t = - (dx >> 1);
                      			while (1)
                      			{
                      				S6DLCD_SetXY (col, row, col, row);
                      				Write_Data(PIXEL_COLOR);
                      				if (col == x2)
                      					return;
                      				col += xstep;
                      				t += dy;
                      				if (t >= 0)
                      				{
                      					row += ystep;
                      					t  -= dx;
                      				}
                      			} 
                      		}
                      	}
                      }
                      این تابع ها رو دارم توسط کتابخونه UTFT که یه کتابخونه جنرال برای انواع ماژول و کنترلر هست و برای آردینو آماده شده کامل می کنم و توابعش رو برای SAM7X و بورد خودم تغییر میدم. حالا تو تابع نوشتن کاراکتر گیر کردم.

                      http://www.henningkarlsen.com/electr...rary.php?id=51

                      دیدگاه


                        #12
                        پاسخ : پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

                        نوشته اصلی توسط rezaf
                        خبر خوب این که تابع های رسم پیکسل و خط هم کار کرد :
                        کد:
                        void S6DLCD_DrawPixel(U16 x,U16 y)
                        {
                        	S6DLCD_SetXY(x,y,x,y);//
                        	Write_Data(PIXEL_COLOR);	  
                        } 
                        
                        void S6DLCD_DrawHLine(int x, int y, int l)
                        {
                        		if (l<0)
                        		{
                        			l = -l;
                        			x -= l;
                        		}
                        		S6DLCD_SetXY(x, y, x+l, y);
                        		Write_Data(PIXEL_COLOR);
                        }
                        
                        void S6DLCD_DrawVLine(int x, int y, int l)
                        {
                        	if (l<0)
                        	{
                        		l = -l;
                        		y -= l;
                        	}
                        	S6DLCD_SetXY(x, y, x, y+l);
                        	Write_Data(PIXEL_COLOR);
                        }
                        
                        void S6DLCD_DrawLine(int x1, int y1, int x2, int y2)
                        {
                        	if (y1==y2)
                        		S6DLCD_DrawHLine(x1, y1, x2-x1);
                        	else if (x1==x2)
                        		S6DLCD_DrawVLine(x1, y1, y2-y1);
                        	else
                        	{
                        		unsigned int	dx = (x2 > x1 ? x2 - x1 : x1 - x2);
                        		short			xstep = x2 > x1 ? 1 : -1;
                        		unsigned int	dy = (y2 > y1 ? y2 - y1 : y1 - y2);
                        		short			ystep = y2 > y1 ? 1 : -1;
                        		int				col = x1, row = y1;
                        
                        		if (dx < dy)
                        		{
                        			int t = - (dy >> 1);
                        			while (1)
                        			{
                        				S6DLCD_SetXY (col, row, col, row);
                        				Write_Data(PIXEL_COLOR);
                        				if (row == y2)
                        					return;
                        				row += ystep;
                        				t += dx;
                        				if (t >= 0)
                        				{
                        					col += xstep;
                        					t  -= dy;
                        				}
                        			} 
                        		}
                        		else
                        		{
                        			int t = - (dx >> 1);
                        			while (1)
                        			{
                        				S6DLCD_SetXY (col, row, col, row);
                        				Write_Data(PIXEL_COLOR);
                        				if (col == x2)
                        					return;
                        				col += xstep;
                        				t += dy;
                        				if (t >= 0)
                        				{
                        					row += ystep;
                        					t  -= dx;
                        				}
                        			} 
                        		}
                        	}
                        }
                        این تابع ها رو دارم توسط کتابخونه UTFT که یه کتابخونه جنرال برای انواع ماژول و کنترلر هست و برای آردینو آماده شده کامل می کنم و توابعش رو برای SAM7X و بورد خودم تغییر میدم. حالا تو تابع نوشتن کاراکتر گیر کردم.

                        http://www.henningkarlsen.com/electr...rary.php?id=51
                        اگه پیکسل رو نوشتی پس همه چی حله
                        یکی از کتابخونه های LCD رو بگیر و تابع هایی رو که تا الان نوشتی جایگزین همسانشون کن . مثلا روشن کردن پیکسل و اینیت کردن بعد خیلی راحت همون تابع رسم کاراکتر کار میکنه. بدون هیچ تغییری چون فقط از تابعی که پیکسل روشن میکنه استفاده کرده
                        زندگی یعنی امید و حرکت
                        کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                        سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                        برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                        به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                        دیدگاه


                          #13
                          پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

                          فکر نکنم به این راحتی باشه آخه هدرهای مختلف رو نگاه کردم هر کدوم یجوری این کارو کردن (غیر از تابع های رسم پیکسل و اینیت کارای دیگه ای هم لنجام میشه که مربوط به همون LCD هست) .
                          شما از این متغیرا چیزی متوجه میشید ؟ توی هدری که ازش کمک می گیرم جایی پیدا نکردم که این متغیر تعریف شده باشه و فقط به این شکل ها ازش استفاده کرده، کامپایلر ارور میده که تعریف نشدن.
                          کد:
                          struct _current_font
                          {
                          	U32* font;
                          	U32 x_size;
                          	U32 y_size;
                          	U32 offset;
                          	U32 numchars;
                          };
                          
                          cfont.x_size
                          cfont.y_size
                          cfont.font[temp]
                          cfont.offset

                          دیدگاه


                            #14
                            پاسخ : اتصال مستقیم تاچ اسکرین به میکرو

                            من این کارو کردم
                            وقتی شما از LCD جواب گرفتی پس تابع init درسته
                            برای رسم کاراکتر و نمایش رشته هم همون تابع های 2.8 اینچی رو استفاده کن
                            خیلی راحت جواب میگیری
                            میگی نه امتحان کن :mrgreen:
                            زندگی یعنی امید و حرکت
                            کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                            سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                            برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                            به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                            دیدگاه


                              #15
                              پاسخ : پاسخ : اتصال مستقیم تاچ اسکرین به میکر&#16

                              نوشته اصلی توسط علی ایمانی فر
                              من این کارو کردم
                              وقتی شما از LCD جواب گرفتی پس تابع init درسته
                              برای رسم کاراکتر و نمایش رشته هم همون تابع های 2.8 اینچی رو استفاده کن
                              خیلی راحت جواب میگیری
                              میگی نه امتحان کن :mrgreen:
                              امتحان کردم و جوابم داد هورررررااااااا :wow: :nice: :job: ممنوننننننممممم جناب ایمانی فر، انشاا... هر چی از خدا می خوای بهت بده.
                              یکم تابع های 2.8 اینچی رو تغییر دادم و تابع هایی که تو درایور خودم جواب گرفته بودم رو تو درایور 2.8 اینچی جایگزین کردم از جمله تابع های اینیت و رسم پیکسل و چندتا دیگه رو و در نهایت نوشتن کاراکتر و جمله و ... هم اوکی شد. اگه خواستی تابع های تغییر داده شده رو هم میذارم.

                              حالا ببشخیدا یه سوالی، فونتی که شما پیش فرض گذاشتی خیلی کوچیکه، میتونم بزرگترش کنم (بخصوص انگلیسیشو البته بدون اینکه مثل عکس تبدیل کنم) ؟ اینجور که فهمیدم برای اینکه توسط خود تابع های درایور فونت رو بزرگتر کنم باید اول عکسش رو به رشته هگز تبدیل کنم (مثل مثالی که گذاشتید) بعد با سایز اونو بزرگتر کنم درسته؟
                              کد:
                              const unsigned char str[] =
                              {
                                0x28, 0x06, 0x47, 0x06, 0x20, 0x00, 0x46, 0x06, 0x27, 0x06, 0x45, 0x06, 0x20, 0x00, 
                                0x2E, 0x06, 0x2F, 0x06, 0x27, 0x06, 0x00 
                              } ;
                              
                              	tftlcd_fill(DARK_GREEN);
                              	tftlcd_set_font_color(CYAN);
                              	tftlcd_font_effect(4);
                              	tftlcd_goto_xy(40,16*1);
                              	unicode2ascii((char *)str,lcd_buf);
                              	tftlcd_putsf_mix((unsigned char*)lcd_buf,3);
                              بعد این جمله ها رو توسط برنامه ی خودت به هگز تبدیل کردی که حجمش کم شده ؟
                              وقتی می خوام با دستور tftlcd_put_bold_char کاراکتر فارسی بنویسم، تو کیل بجاش علامت سوال میذاره تو LCD هم چیزی نشون نمیده، چجوری این مشکلو حل کنم؟

                              دیدگاه

                              لطفا صبر کنید...
                              X