اطلاعیه

Collapse
No announcement yet.

تغییر جهت نوشتن در LCD

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

    تغییر جهت نوشتن در LCD


    سلام دوستان

    دارم برای یه TFT LCD برنامه می نویسم این LCD بصورت پیش فرض ظاهرا Landscape رو ساپورت نمی کنه. حالا برای اینکه بتونم به این شکل داخلش رشته و کاراکتر بنویسم به نظر شما جدول فونت رو تغییر بدم و جهت کاراکترا رو تو فایل هگز فونت عوض کنم یا تابعی که PutChar انجام میده دستکاری کنم ؟ یا راه دیگه ای به ذهنتون میرسه ؟ ممنون میشم کمکم کنید.

    #2
    پاسخ : تغییر جهت نوشتن در LCD

    نوشته اصلی توسط rezaf
    سلام دوستان

    دارم برای یه TFT LCD برنامه می نویسم این LCD بصورت پیش فرض ظاهرا Landscape رو ساپورت نمی کنه. حالا برای اینکه بتونم به این شکل داخلش رشته و کاراکتر بنویسم به نظر شما جدول فونت رو تغییر بدم و جهت کاراکترا رو تو فایل هگز فونت عوض کنم یا تابعی که PutChar انجام میده دستکاری کنم ؟ یا راه دیگه ای به ذهنتون میرسه ؟ ممنون میشم کمکم کنید.
    چرا جواب نده؟
    من که راحت جواب میگرفتم
    یه باگی تو هدر بود که من اونو برطرف کردم و دوباره رو انجمن جای قبلیه پلود کردم
    یه هدر هم جدید نوشتم که اونم همه چی داره. فارسی - انگلیسی و ....
    زندگی یعنی امید و حرکت
    کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
    سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
    برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
    به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

    دیدگاه


      #3
      پاسخ : تغییر جهت نوشتن در LCD

      آقای ایمانی فر قربونت پست که میذاری امیدوارتر میشم. این LCD مال یه گوشی قدیمیه نه ماژول N96 که ECA زده. یه تابع برای نوشتن کاراکتر براش پیدا کردم ولی نمیدونم با دستکاری تابع میشه Landscape نوشت یا باید فونت رو عکس کنم و الان که عکس کردم چجوری راحت تر نمایش بدم.
      کد:
      void LCDPutChar(char c, int x, int y, int size, int fColor, int bColor) 
      {
      	extern const unsigned char FONT6x8[97][8];
      	extern const unsigned char FONT8x8[97][8];
      	extern const unsigned char FONT8x16[97][16];
      	int i,j;
      	unsigned int nCols;
      	unsigned int nRows;
      	unsigned int nBytes;
      	unsigned char PixelRow;
      	unsigned char Mask;
      	unsigned int Word0;
      	unsigned int Word1;
      	unsigned char *pFont;
      	unsigned char *pChar;
      	unsigned char *FontTable[] = {(unsigned char *)FONT6x8,
      	(unsigned char *)FONT8x8,
      	(unsigned char *)FONT8x16};
      	
      	// get pointer to the beginning of the selected font table
      	pFont = (unsigned char *)FontTable[size];
      	
      	// get the nColumns, nRows and nBytes
      	nRows = *pFont;
      	nCols = *(pFont + 1);
      	nBytes = *(pFont + 2);
      	
      	// get pointer to the last byte of the desired character
      	pChar = pFont + (nBytes * (c - 0x1F)) + nBytes - 1;
      	
      	// Row address set (command 0x2B)
      	WriteSpiCommand(PASET);
      	WriteSpiData(x);
      	WriteSpiData(x + nRows - 1);
      	
      	// Column address set (command 0x2A)
      	WriteSpiCommand(CASET);
      	WriteSpiData(y);
      	WriteSpiData(y + nCols - 1);
      	
      	// WRITE MEMORY
      	WriteSpiCommand(RAMWR);
      	
      	// loop on each row, working backwards from the bottom to the top
      	for (i = nRows - 1; i >= 0; i--) {
      		
      	// copy pixel row from font table and then decrement row
      	PixelRow = *pChar--;
      		
      	// loop on each pixel in the row (left to right)
      	// Note: we do two pixels each loop
      	Mask = 0x80;
      	for (j = 0; j < nCols; j += 2) {
      		
      	// if pixel bit set, use foreground color; else use the background color
      	// now get the pixel color for two successive pixels
      	if ((PixelRow & Mask) == 0)
      	Word0 = bColor;
      	else
      	Word0 = fColor;
      	Mask = Mask >> 1;
      	if ((PixelRow & Mask) == 0)
      	Word1 = bColor;
      	else
      	Word1 = fColor;
      	Mask = Mask >> 1;
      	
      	// use this information to output three data bytes
      	WriteSpiData((Word0 >> 4) & 0xFF);
      	WriteSpiData(((Word0 & 0xF) << 4) | ((Word1 >> 8) & 0xF));
      	WriteSpiData(Word1 & 0xFF);
      	}
      	}
      	// terminate the Write Memory command
      	WriteSpiCommand(NOP);
      }
      راستی این LCD با SPI کار می کنه و الان راه اندازی اولیه شده ولی این مشکل رودارم یه مشکل دیگمم اینه که کاراکترا رو میرور شده می نویسه.

      دیدگاه


        #4
        پاسخ : تغییر جهت نوشتن در LCD

        خواهش میکنم
        ببین
        یه جا تو برنامت اومده گفته
        کد:
        // Row address set (command 0x2B)
        	WriteSpiCommand(PASET);
        	WriteSpiData(x);
        	WriteSpiData(x + nRows - 1);
        	
        	// Column address set (command 0x2A)
        	WriteSpiCommand(CASET);
        	WriteSpiData(y);
        	WriteSpiData(y + nCols - 1);
        اگه میخای landscape کنی باید جای سطر رو ستون رو عوض کنی
        اگه میگی میرور نمایش میده خب شما هم میرورش کن تا بشه حالت عادی.
        به عنوان مثال توی حالت portrait شما بیا مختصاتی رو که برای ردیفت میزاره رو از عرض lcd کم کن.
        مثلا اگه عرضش 240 هست شما بزن x1 = 240 - x
        البته ممکنه اینجوری میرور نشه و مجبور شی تو تنظیمات اولیه جهت رفرش شدن میکرو رو تغییر بدی
        زندگی یعنی امید و حرکت
        کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
        سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
        برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
        به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

        دیدگاه


          #5
          پاسخ : تغییر جهت نوشتن در LCD

          ممنون جناب ایمانی فر.
          با 3تا کار این 2تا مشکل رو حل کردم. اول اینکه با یه کامند کنترلی که مال کنترلر LCD بود مشکل میرور رو حل کردم . نوشتن بصورت Landscape رو هم با 2تا کار انجام دادم اول کدهای هگز فایل فونت رو دستکاری کردم و کاراکترها رو چرخوندم به اندازه 90 درجه به چپ. کار دومم هم این بود که تو تابعی که رشته رو چاپ می کرد بجای اینکه y رو زیاد کنه و کاراکتر بعدی رو بنویسه گفتم x رو زیاد کنه در نتیجه شروع کرد عمودی نوشتن شکل کاراکترا رو هم که چرخونده بودم در نتیجه مشکل حل شد. اینا رو گفتم شاید بدرد دوستانم بخوره :wow: :nerd: :applause: :job:

          دیدگاه


            #6
            پاسخ : تغییر جهت نوشتن در LCD

            راستی بد نیست سر فرصت چیزایی که درمورد فایل فونت و جدول کاراکترا که به هگز هست و یه سری ماتریس ثابت داره فهمیدم براتون توضیح بدم آخه تو اینترنت جایی پیدا نکردم بصورت جامع گفته باشه این کدای هگز چه معنی ای میدن و چجوری میشه شکل کاراکترا رو عوض کرد بنابراین حالا که فهمیدم سر فرصت میگم براتون چون فکر کنم سوال بقیه دوستانم باشه. نظرتون چیه ؟

            دیدگاه


              #7
              پاسخ : تغییر جهت نوشتن در LCD

              خوب حالا که فرصت کردم الوعده وفا. ببینید فایلی که فونت مورد استفاده شما توی اون تعریف میشه (کاراکتر به کاراکتر) یه چیزی مثل اینه :
              کد:
              const unsigned char FONT_6x8[97][8] = {
              	{0x06,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char
              	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20
              	{0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00}, // !
              	{0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00}, // "
              	{0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x00}, // #
              	{0x20,0x78,0xA0,0x70,0x28,0xF0,0x20,0x00}, // $
              	{0xC0,0xC8,0x10,0x20,0x40,0x98,0x18,0x00}, // %
              	{0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68,0x00}, // &
              	{0x30,0x30,0x20,0x40,0x00,0x00,0x00,0x00}, // '
              	{0x10,0x20,0x40,0x40,0x40,0x20,0x10,0x00}, // (
              	{0x40,0x20,0x10,0x10,0x10,0x20,0x40,0x00}, // )
              	{0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00}, // *
              	{0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00}, // +
              	{0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40}, // ,
              	{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00}, // -
              	{0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00}, // .
              	{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00}, // / (forward slash)
              	{0x70,0x88,0x88,0xA8,0x88,0x88,0x70,0x00}, // 0 0x30
              	{0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00}, // 1
              	{0x70,0x88,0x08,0x70,0x80,0x80,0xF8,0x00}, // 2
              	{0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x00}, // 3
              	{0x10,0x30,0x50,0x90,0xF8,0x10,0x10,0x00}, // 4
              	{0xF8,0x80,0xF0,0x08,0x08,0x88,0x70,0x00}, // 5
              	{0x38,0x40,0x80,0xF0,0x88,0x88,0x70,0x00}, // 6
              	{0xF8,0x08,0x08,0x10,0x20,0x40,0x80,0x00}, // 7
              	{0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00}, // 8
              	{0x70,0x88,0x88,0x78,0x08,0x10,0xE0,0x00}, // 9
              	{0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x00}, // :
              	{0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x00}, // ;
              	{0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00}, // <
              	{0x00,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00}, // =
              	{0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00}, // >
              	{0x70,0x88,0x08,0x30,0x20,0x00,0x20,0x00}, // ?
              	{0x70,0x88,0xA8,0xB8,0xB0,0x80,0x78,0x00}, // @ 0x40
              	{0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00}, // A
              	{0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x00}, // B
              	{0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00}, // C
              	{0xF0,0x88,0x88,0x88,0x88,0x88,0xF0,0x00}, // D
              	{0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00}, // E
              	{0xF8,0x80,0x80,0xF0,0x80,0x80,0x80,0x00}, // F
              	{0x78,0x88,0x80,0x80,0x98,0x88,0x78,0x00}, // G
              	{0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00}, // H
              	{0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00}, // I
              	{0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00}, // J
              	{0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00}, // K
              	{0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00}, // L
              	{0x88,0xD8,0xA8,0xA8,0xA8,0x88,0x88,0x00}, // M
              	{0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x00}, // N
              	{0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00}, // O
              	{0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x00}, // P 0x50
              	{0x70,0x88,0x88,0x88,0xA8,0x90,0x68,0x00}, // Q
              	{0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x00}, // R
              	{0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00}, // S
              	{0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x00}, // T
              	{0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00}, // U
              	{0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00}, // V
              	{0x88,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00}, // W
              	{0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00}, // X
              	{0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00}, // Y
              	{0xF8,0x08,0x10,0x70,0x40,0x80,0xF8,0x00}, // Z
              	{0x78,0x40,0x40,0x40,0x40,0x40,0x78,0x00}, // [
              	{0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00}, // \ (back slash)
              	{0x78,0x08,0x08,0x08,0x08,0x08,0x78,0x00}, // ]
              	{0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00}, // ^
              	{0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00}, // _
              	{0x60,0x60,0x20,0x10,0x00,0x00,0x00,0x00}, // ` 0x60
              	{0x00,0x00,0x60,0x10,0x70,0x90,0x78,0x00}, // a
              	{0x80,0x80,0xB0,0xC8,0x88,0xC8,0xB0,0x00}, // b
              	{0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x00}, // c
              	{0x08,0x08,0x68,0x98,0x88,0x98,0x68,0x00}, // d
              	{0x00,0x00,0x70,0x88,0xF8,0x80,0x70,0x00}, // e
              	{0x10,0x28,0x20,0x70,0x20,0x20,0x20,0x00}, // f
              	{0x00,0x00,0x70,0x98,0x98,0x68,0x08,0x70}, // g
              	{0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x00}, // h
              	{0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00}, // i
              	{0x10,0x00,0x10,0x10,0x10,0x90,0x60,0x00}, // j
              	{0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x00}, // k
              	{0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00}, // l
              	{0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x00}, // m
              	{0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x00}, // n
              	{0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00}, // o
              	{0x00,0x00,0xB0,0xC8,0xC8,0xB0,0x80,0x80}, // p 0x70
              	{0x00,0x00,0x68,0x98,0x98,0x68,0x08,0x08}, // q
              	{0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x00}, // r
              	{0x00,0x00,0x78,0x80,0x70,0x08,0xF0,0x00}, // s
              	{0x20,0x20,0xF8,0x20,0x20,0x28,0x10,0x00}, // t
              	{0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x00}, // u
              	{0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00}, // v
              	{0x00,0x00,0x88,0x88,0xA8,0xA8,0x50,0x00}, // w
              	{0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00}, // x
              	{0x00,0x00,0x88,0x88,0x78,0x08,0x88,0x70}, // y
              	{0x00,0x00,0xF8,0x10,0x20,0x40,0xF8,0x00}, // z
              	{0x10,0x20,0x20,0x40,0x20,0x20,0x10,0x00}, // {
              	{0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00}, // |
              	{0x40,0x20,0x20,0x10,0x20,0x20,0x40,0x00}, // }
              	{0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00}, // ~
              	{0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00} // DEL
              };
              البته اول این رو بگم چیزایی که توضیح میدم تجربی متوجه شدم اگر ایرادی دیدین بگین که کسی اشتباه متوجه نشه. تو خط اول آرایه مربوطه رو تعریف کرده و گفته که این آرایه 97تا سطر داره و 8تا ستون. 97 تعداد کاراکترامونم هست و 8 هم تعداد بایت هر کاراکتر. پس 97تا کاراکتر داریم که هر کدوم 8 بایت اطلاعات دارند. تو خط دوم تعداد سطر و ستون و تعداد بایت هر کاراکتر رو میگه که 0x06 و 0x08 یعنی هر کاراکتر 6 در 8 هستش و 0x08 بعدش هم یعنی هر کاراکتر 8 بایت اطلاعات داره.
              حالا یکی از کاراکترها رو بررسی می کنیم ببینیم چجوری 8تا ردیف و 6تا ستون داره و 8بایت اطلاعات مال چی هستش:
              اولا هر بایت مربوط به یک سطر از کاراکتر هست پس حالا که هر کاراکتر 8تا ردیف داره باید 8بایت اطلاعات برای تعریف شکلش داشته باشه. کنترلر این LCD میاد و سطر به سطر دات ها را پر می کنه بنابراین کافیه بهش بگیم دات های هر سطر رو چجوری روشن یا خاموش کنه (کدوم روشن باشه کدوم خاموش) . به عکس زیر توجه کنید :





              البته این نرم افزار برای طراحی کاراکتر 8 در 8 هست و من برای نشون دادن اینکه هر بایت چجوری یک سطر رو میسازه ازش کمک گرفتم. کاراکتر S رو که طراحی شده ببینید، کنار هر سطر یک

              دیدگاه


                #8
                پاسخ : تغییر جهت نوشتن در LCD

                ببخشید تو پست قبلی جا نشد اومدم پست دیگه. داشتم می گفتم، کنار هر سطر یک عدد دسیمال و معادل هگزش رو نوشته، این همون بایت اطلاعاتی هست که برای هر سطر یک کاراکتر باید تو تعریفش برای ماتریس (داخل فایل هگز فونتتون) بنویسید. این عدد دقیقا به LCD میگه که کدوم دات ها رو خاموش نگهداره و کدوم رو روشن کنه و در نهایت کاراکتر ما رو بسازه دقیقا مثل عکسی که گذاشتم. کدی که شما می نویسید میاد بایت به بایت اطلاعات سطرهای کاراکتر مورد نظر رو برای کنترلر LCD میفرسته و کنترلر داخل رم ذخیره میکنه در نهایت کاراکتر روی صفحه چاپ می کنه.
                حالا که متوجه شدید روند کار چجوریه می تونید خودتون هرجور فونت و کاراکتر و هر شکلی با هر ابعادی خواستید طراحی کنید.

                سعی کردم راحت و روان بگم. امیدوارم این مطالب مفید واقع بشه. :smile: :nerd: :read:

                دیدگاه

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