نمایش عکس در LCD NOKIA 1616 C1

مقدمه:

یکی از خروجی های جذاب در دستگاه های الکترونیکی LCD گرافیکی رنگی هست. این مدل LCD ها این روزها خیلی گرون شدن ولی هنوز هم LCD های رنگی اروزن قیمتی وجود داره که میشه با کمی حوصله اونها رو با میکرو راه اندازی کرد. یکی از این مدل LCD ها نمایشگر رنگی Nokia 1616 یا Nokia 1661 یا Nokia C1 و… هست. بیش از 20 مدل گوشی هستن که از این نوع LCD با درایور SPFD54124b استفاده کنن. این LCD رو سیسوگ راه اندازی کرده و ما براش تابع نمایش عکس و یه برنامه تبدیل عکس به هدر فایل نوشتیم.

فایل اصلی:

فایل اصلی این پروزه رو میتونید روی سایت سیسوگ ببینید:

راه اندازی LCD گرافیکی نوکیا 1661

 

کتابخانه نمایش عکس:

برای نمایش عکس تابعی در برنامه اصلی ایجاد کردیم که داخل گیت هاب قرار دادیم:

https://github.com/Behnamzaki/Nokia-1616-1661-TFT-Library

در این سورس در فایل main.c کدی مطابق زیر ایجاد کردیم:

 

 

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

 

برنامه تبدیل عکس به هدرفایل:

تئوری این برنامه در ایتدا خیلی خوب پیش رفت و فایل های دستنویس رو بخوبی نمایش میداد، اما نیاز به برنامه ای داشتیم که بتونه عکسهای بزگتر مثلا 100 در 100 پیکسل رو به هدر فایل تبدیل کنه. برای همین منظور مجبور شدیم برنامه ای برای اینکار بنویسیم. (دقت کنید بزگترین عکس میتونه نهایتا 127 در 128 باشه چون ما در AVR GCC در آرایه ها محدودیت ایندکس داریم)

برنامه تبدیل عکس bitmap به rgb565

 

نمایشگر نوکیا C1 از فرمت RGB565 برای نمایش عکس اسفاده میکنه. این فرمت میگه که هر پیکس عکس میتونه 16 بیتی باشه، یعنی عکس هایی با رزولوشن 2 به توان 16 بیت رو نشون میده که میشه 65 هزار رنگ. طبق اسمش 5 بیت با ارزش تر رنگ قرمز 6 بیت بعدی رنگ سبز و 5 بیت کم ارزشتر هم رنگ آبی رو نشون میده.

راحت ترین راه برای تبدیل عکس به این فرمت این بود که اول از همه عکس دلخواهمون رو که باید کمتر از 128 در 128 پیکسل باشه با Paint باز کنیم و به فرمت Bitmap 24 bit ذخیره کنیم. این فرمت کد نشده هست که هر پیکسل رو در 24 بیت ذخیره میکنه. 8 بیت برای آبی، 8 بیت برای سبز و 8 بیت هم برای قرمز.

در مرحله بعد باید برنامه ای بنویسیم که فایل بیت مپ 24 بیت رو باز کنه و پیکسل به پیکسل بخونه و پیکسل قرمز 8 بیتی رو به 5 بیتی، سبز 8 بیتی رو به 6 بیتی و آبی 8 بیتی رو به 5 بیتی تبدیل کنه. برای اینکار میشه محتوای پیکسل ها رو به راست شیفت داد تا چند بیت کم ارزش تر ار بین بره و بشه در نهایت 24 بیت رو در 16 بیت جا داد. در آخر هم باید هدر رو با فرمت متنی مشخصی بصورت فایل متنی با نام image.h ذخیره کنیم:

 

گفتن این پروسه راحت به نظر میاد اما با توجه به مطالبی که در این آدرس:

https://en.wikipedia.org/wiki/BMP_file_format

در خصوص فرمت فایل های بیت مپ آورده شده و نحوه خوندن اونها از آخر به اول و پدینگ 4 بیتی فایلها، محاسبه طول و عرض عکس از هدر فایل و… کار رو بسیار دشوار کرد ولی به هر حال برنامه ای با #C نوشتیم که این کار رو انجا میده و میتونید سورسش رو از github ما بردارید:

https://github.com/Behnamzaki/bmp24_to_rgb565

سخت افزار:

توضیحات کامل سخت افزار داخل سایت سیسوگ هست ولی ما طبق تجربه ای که داشتیم به این نتیجه رسیدیم که بعضی میکروها مثل ATmega8A با 3.3 ولت براحتی کار میکنن و می تونید هم میکرو و هم LCD رو با 3.3 راه اندازی کنید و پایه های دیتا رو مستقیم به هم وصل کنید ولی برای میکروهایی مثل ATmega128A که برای ما با 3.3 کا نکرد باید میکرو با 5 ولت و LCD با 3.3 ولت راه اندازی بشه و حتما بین تمام 4 پایه دیتا و کلاک و ریست و cs چهار مقاومت 1 کیلو سری بشه. اگه مقاومتها رو نزارید کار نمیکنه.

 

نرم افزار:

برنامه اصلی با فرمت C هست که ما با ATMEL Studio راه اندازیش کردیم و یه کوچولو نیاز به تمیزکاری داشت چون اتمل استودیو بعضی کلیدواژهای مربوط به میکروی STM رو که داخل کتابخونه هست نمیشناسه و ایراد میگیره و باید کامنت میشدن. در هر حال سورسی که ما تمیزکاری کردیم به دلیل محدودیت های fork نمیشد در گیت هاب اعمال کرد چون قصد نداریم پروژه اصلی رو خراب کنیم و در اینجا برای دانلود قرا میدیم:

atmel_nokia_c1

بازدیدها: 833

6 دیدگاه دربارهٔ «نمایش عکس در LCD NOKIA 1616 C1»

  1. بله جناب زکی زاده فضای رم مهم است
    و ATmega128A که اشاره فرمودید 4 کیلوبایت می باشد که برای کتابخانه ارزشمند فوق کفایت می کند
    اما جهت افزایش سرعت اینجا مدار و روشی ارائه شده است که می توان با اتصال S RAM خارجی ظرفیت آن را بالا برد
    این مدار برای پروژه های دیگر نیز مناسب خواهد بود
    https://scienceprog.com/adding-external-memory-to-atmega128/

  2. سلام جناب مهندس زکی زاده
    ما با پروگرام کردن میکروهای atmega64 و atmega128 روی برد و با پروتوکل ISP مشکل داریم و سایت های مختلف روش های مختلف ارائه شده ولی میکرو شناسایی نمی شود!
    با توجه به تجارب عملی ارزنده جنابعالی لطفا اگر وقت کردید یک آموزش مختصر برای این منظور بگذارید… تشکر

    • سلام در M64 و M128 پایه های PDI و PDO همان MOSI و MISO هستند. باید پایه های پروگرمر به این ها متصل شوند نه MISO و MOSI میکرو.
      MOSI=PDI
      MISO=PDO
      پس از اتصال موفق به میکرو فورا فیوزبیت آخر یعنی Mega103 Compatibility را غیرفعال کنید.

دیدگاه‌ها غیرفعالند.