لینک پست معرفی مشخصات کتابخانه
لینک اولین قسمت آموزش
لینک فهرست موضوعی مطالب
موضوع این قسمت: فرمت رنگ lcd نوکیا 1661 و شرح قسمت نمایش تصویر کتابخانه .
با سلام .
قبل از اینکه وارد مطلب بشم . لازم هست که از خلاصه خصوصیات این قسمت مطلع باشید .
خلاصه خصوصیات این قسمت از کتابخانه :
1 - قابلیت انخاب فرمت bmp 16 bit یا فرمتbmp 24bit برای نمایش تصاویر .
2 - قابلیت اتخاب کتابخانه ff14 یا pff برای ارتباط با میکرو sd کارت .( کتابخانه pff یک نسخه از کتابخانه
fatfs هست که برای کار با میکرکنترلر های با حافظه رم و فلش کم توسط شخصی به نام چان نوشته شده ، و در سایت شخصیش elm_chan قرار داده .)
3 - این کتابخانه با مدل ذخیره سازی litte-endian سازگارهست .
اگر نمیدونید این چیه ، زیاد فکرتون رو درگیرش نکنید .کمپایلر کدویژن ، GCC(شامل نرم افزارهایtruestudio ,winavr ، آردوینو و اتمل استودیو) و کمپایلر کیل همه به طور پیشفرض از این مدل ذخیره سازی استفاده میکنند .
نمونه فایل هگز ،برای نمایش تصویر در زیر قرار دادم که میتونید دانلود کنید .
توجه : این فایلهای تست مربوط به نسخه 1.1.3 هستند.
فایل هگز تست برای میکرو stm32f103 c8t6
فایل هگز تست برای میکرو stm32f072 c8t6
فایل هگز تست حالت ترانسپرانت برای میکرو stm32f103 c8t6
فایل هگز تست حالت ترانسپرانت برای میکرو stm32f072 c8t6
و اما ماجرا :
راستش قرار نبود این قسمت به کتابخانه اضافه کنم. چون این کتابخانه و این lcd قرار بود که برای میکروکنترلرهای کوچک مثل avr یا stm32 با سایز فلش کم به جای lcd کاراکتری استفاده بشه .
هدف این کتابخانه در ایتدا این بود ، برای همین لازم بود که حجم کم و سرعت بالا داشته باشه .
یکی از دلایلی که قسمتهای مختلف کتابخانه رو مثل هسته ، قسمت متنی ، قسمت گرافیک و حالا هم قسمت نمایش تصویر را ، جدا از هم نوشتم همین مورد بود . ( قسمتهایی که با اون کاری ندارید لازم نیست به پروژه اضافه کنید)
ولی به هر حال تعدادی از دوستان سوال پرسیدن که چطور روی ال سی دی تصویر نمایش داده میشه ؟ من هم دیدم چون اینکار ممکنه برای عده ای سخت باشه ، خودم توابعی رو برای اینکار نوشتم .
این توابع تصویر با فرمت bmp رو از micro sd card میخونن و روی ال سی دی نمایش میدن .
تصویر تست نمایش تصویر را در زیر میبینید .در این تست از میکرو stm32f103c8t6 و کتابخانه ff14 و فرمت bmp 24 bit برای تصویر استفاده شده است .
زمان لازم برای نمایش 380 میلی ثانیه است .

نکاتی پیرامون بخش نمایش تصویر :
این توابع تصویر را از روی میکرو sd میخونه . بنابراین یک لایه پایین تر از توابع خواندن و نمایش تصویر ، باید توابعی برای کار با sdکارت مهیا بشه . من برای اجرای مثال از کتابخانه fatfs استفاده کردم .
fatfs کتابخانه خیلی مرتبی هست .خوبیش اینه که میشه تصاویر رو به صورت فایل و در پوشه های مختلف همانطوری که توی ویندوز ذخیره میشه ، استفاده کرد و برای ارتباط با انواع حافظه ها میکرو sd کارت ها cf card و حافظه های usb و غیره ...بنا به نیاز استفاده کرد .(این کتابخانه را شخصی به نام چان نوشته و در سایت شخصیش( اینجا) قرار داده )
ولی در عین حال کتابخانه مفصلی هم هست و شاید همین باعث پرحجم شدن و کمی کند شدن اجرای برنامه میشه . بنابراین زمانهایی که برای نمایش تصاویر در مطلب اومده اگر کمی کند به نظر بیاد،مقداری از کتابخانه FatFs تاثیر میگیره . البته شما اگر از کتابخانه های ساده تر و شخصی شده استفاده کنید احتمالا سرعت افزایش هم پیدا کنه .
خوب بریم سر اصل مطلب :
فرمت رنگ در lcd نوکیا 1661:
این ال سی دی از عمق رنگ رنگ 16 بیتی استفاده میکنه ( کدهای رنگ پیکسلها 16 بیتی هستن )
و فرمتش به صورت RGB 5:6:5 هست .
و این عبارت یعنی 5 بیت برای رنگ قرمز ، 6 بیت برای رنگ سبز ، و 5 بیت هم برای رنگ آبی تعیین شده و ارزش و جایگاه بیتهای رنگ ها مطابق تصویر زیر است .

حالا شما از هر فرمتی که برای تصاویر بخواهید استفاده کنید لازم هست که اون رو به فرمت RGB 5:6:5 تبدیل کنید . چون فرمت bmp خیلی ساده هست و کد رنگ پیکسلها بدون هیچ فشرده سازی و رمز گزاری در فایل تصویرقرار داده شده ، خیلی سریع تر از بقیه هست . البته bmpفرمت های مختلفی از نظر عمق رنگ داره مثلا 24 بیت ، 32 بیت و 16 بیت .
کتابخانه قابلیت خواندن فرمتهای bmp24bit و bmp16bit را داره ولی به دلیل سهولت ، در مثال از فرمت 24 بیت استفاده کردم چون به هیچ نرم افزار اضافه ای برای تبدیل عکس نیازه نداره و با paint ویندوز هم قابل انجام هست .
تهیه تصویر با فرمت مناسب :
فرمت bmp24 :
فقط کافیه تصویر را با نرم افزار paint ویندوز باز کنید و سایز اون رو به اندازه مناسب تغییر بدید . بعد اون رو سرو ته کنید و تصویر رو با فرمت bmp 24bit ذخیره کنید . ( موقع ذخیره خودش فرمت رو ازتون میپرسه ) . تصاویر رو روی sd card کپی کنید . به همین سادگی !! و احتیاج به نرم افزار خاصی هم نیست .
فرمت bmp16 :
البته از فرمت bmp16bit ویندوز هم میتوانید استفاده کنید . برای اینکار ابتدا تصویر را با paint به سایز مناسب تبدیل کنید و د رآخر اون رو سر و ته کنید . بعد با نرم افزار های دیگه ای باید اون رو به فرمت bmp 16 bit تبدیل نمایید . ( ظاهرا paint فرمت 16 بیت رو پشتیبانی نمیکنه .البته در ویندوز 7 اینطوریه )
** توجه :کاملا واضح هست که با فرمت رنگ 16 بیت برای تصویر ، زمان نمایش یک تصویر حدود 33.3% کمتر هست .
استراتژی نمایش تصویر روی lcd :
برای نمایش تصویر به طور کلی باید از توابع nlcd_set_window() و تابع nlcd_paint_pixel()
مربوط به هسته کتابخانه lcd nokia 1661 استفاده کرد . ( برای آشنایی با عملکرد توابع لطفا به قسمت پنجم مراجعه نمایید )
ابتدا با تابع nlcd_set_window() یک پنجره به ابعاد تصویر مورد نظر و در مکان مناسب تعریف میکنیم .
در مرحله بعدی رنگ پیکسلهای تصویر را از فایل که بر روی حافظه قرار دارد خوانده ، و سپس با تابع
nlcd_paint_pixel() به lcd ارسال میکنیم . این استراتژی کلی برای نمایش تصویر روی ال سی دی هست .
حالا اول بریم ببینیم توی پوشه picture هست؟
محتویا پوشه شامل فایلهای زیر هست :

در نسخه 1.1.3 محتویات به شکل زیر است .

و تنظیمات و الگوی تولبع در فایل picture_lcd.h قرار دارد . محتویات این فایل در تصویر زیر است .

در قسمت configuration :
PICT_LCD_COLOR_DEPT : مربوط به انتخاب فرمت رنگ فایل تصویر هست . اون عدد روبه رو طول عمق رنگ به بایت هست . برای bmp16 bit عدد 2 ( 2بایت = 16 بیت ) و برای bmp24 عدد 3 هست .
PICT_LCD_BUFFER_SIZE : این در واقع سایز بافر داخلی تابع نمایش تصویر هست .
لازم هست که اندازه بافر مضرب صحیحی از PICT_LCD_COLOR_DEPT باشه . و از 3 هم کوچکتر نباشه . البته لازم به نگرانی نیست ، اگر اشتباهی صورت بگیره کمپایلر خودش بهتون اخطار میده .
این بافر بهتره که به اندازه عرض بزرگترین تصویری که میخواهید نمایش بدید، ضرب در تعداد بایتهای عمق رنگ باشه .
مثلا برای یک تصویر با عرض 120 و فرمت bmp 24bit بهتره که اندازه بافر 360 باشه .
اینن اندازه باعث بالاترین سرعت نمایش تصویر میشه . البته در مواردی هست که شرایط رم میکرو و اجرای توابع اجازه این کار رو نمیده .
به طور مثال در همین تصویر میبینید که من اندازه رو 180 تعریف کردم . و برای تست روی cortex m0 ناچار شدم اون رو روی 3 !!!! تعریف کنم .
PICT_LCD_FATFS_LIB:
این مربوط به انتخاب نسخه کتابخانه fatfs مورد استفاده است .
برای ff14 عدد 0
و برای pff عدد 1
در نسخه 1.1.3 :
تنظیمات قسمت تصویر به فایل picture_lcd_conf.h منتقل شده است که در تصویر زیر میبینید .

همانطور که در تصویر میبینید قابلیت ترانس پارنت به کتابخانه اضافه شده است .( کادر قرمز)
ماکروی PICT_LCD_TRANSPARENT :
اگر 0 منظوربشه ترانسپرانت غیر فعال هست و تصاویر به صورت عادی نمایش داده خواهند شد .
اگر 1 باشد ترانسپرانت فعال خواهد شد و ماکروی دوم هم نیاز به تنظیم دارد .
ماکروی PICT_LCD_NONE_SHOW_COLOR :
این ماکرو برای کتابخانه کد رنگی که( یک عدد 16 بیتی است و ) باید از تصویر حذف شود را مشخص میکند .
و تمام پیکسلهایی که به این رنگ هستند چاپ نخواهند شد و در نتیجه قسمت هایی از تصویر قبلی نمایان خواهد ماند .
در این مثال من رنگ سیاه خالص ( کد 0x0000 ) را انتخاب کردم .
اما یک سوال :
اگر در تصویر اصلی رنگ مشکی وجود داشت چکار باید کرد .؟
اگر در تصویر اصلی تصویر همان رنگی که شما در ماکروی دوم به کار برده اید وجود داشت باید با نرم افزاری رنگها را کمی تغییر دهید تا کد رنگ آنها با رنگ مکروی دوم اندکی ( حداقل 1 واحد ) تفاوت کند و در عین حال با چشم هم قابل تشخیص نباشد .
به طورمثال کد رنگ 0x00 مربوط به سیاه خالص است ولی کد 0b 0000100000100001 در مبنای 2 ( کد 0x0821) خاکستری بسیار بسیار تیره است که در عمل همان سیاه دیده میشود .
با اینکار رنگهای سیاه تصویر حذف نخواهد شد .
عملکرد ترانسپرانت را در تصویرهای زیر میبینید که تصویر با پس زمنه مشکی تصویر اصلی و تصویر با پس زمینه سفید نتیجه فعال کردن حالت ترانسپرانت میباشد .


این تصاویر مربوط به استفاده از کتابخانه روی میکرو stm32f072 c8 با فرکانس کلاک 48 مگاهرتز است.
نکته ای که وجود دارد مربوط به زمانهای رفرش صفحه است . با توجه به عملکرد ترانسپرانت ، زمان بیشتری برای رفرش صفحه مورد نیاز است که در تصویر میبینید .
برای تست این عملکرد میتوانید با توجه به نوع میکرو یکی از فایلهای زیر را به کار ببرید .
فایل هگز تست حالت ترانسپرانت برای میکرو stm32f103 c8t6
فایل هگز تست حالت ترانسپرانت برای میکرو stm32f072 c8t6
در قسمت توابع :
توابع لایه اول :
lcd_picture_init() : این تابع از کتابخانه fat به نام mount رو اجرا میکنه .که یک فضای کاری برای کتابخانه fat ایجاد میشه . و مستقیم بامیکرو sd card ارتباط برقرار میکنه .
این تابع باید قبل از هر نمایش تصویر توسط توابع بعدی استفاده بشه .
البته اگر خودتون به طور دستی تابع mount را اجرا کرده باشید نیازی به استفاده از این تابع نیست .
lcd_picture_deinit() :
این تابع عملکرد mount رو با حالت 0 اجرا میکنه که فضای کار با میکرو sd رو میبنده .
استفاده از اون ضروری نیست .ولی ممکنه لازم بشه .
توابع لایه دوم :
lcd_picture_show(uint8_t x , uint8_t y , const TCHAR * str):
این همون تابعی هست که تصویر مورد نظر شما رو نمایش میده .
x , y : مربوط به مختصات گوشه بالا چپ تصویر هست .
و str : نام فایل مورد نظر همراه با پسوند در micro sd card هست .
در نسخه 1.1.3 :
در لایه دوم:
تابع lcd_picture_show_part( picture_lcd_cor_typedef lcd_start_col , picture_lcd_cor_typedef lcd_start_row ,
picture_lcd_cor_typedef pict_start_col , picture_lcd_cor_typedef pict_start_row ,
picture_lcd_cor_typedef pict_width , picture_lcd_cor_typedef pict_height ,
const TCHAR* picture_path);
این تابع یک قسمت از تصویر درون فایل را روی lcd نمایش میدهد .
متغیرهای lcd_start_col و lcd_start_row :
مربوط به ستون و سطر از lcd هست که گوشه بالا و چپ تصویر قرار هست در آنجا قرار بگیرد.
متغیرهای pict_start_col وpict_start_row :
به ترتیب از راست ، ستون و سطر گوشه بالا و چپ محدوده ای از تصویر درون فایل هست که میخواهید روی lcd نمایش دهید .
متغیرهای pict_width وpict_height :
به ترتیب از راست عرض و ارتفاع محدوده ای از تصویر درون فایل هست که میخواهید روی lcd نمایش دهید .
کاربرد :
این تابع کاربردهای زیادی میتونه داشته باشه .
مثلا نمایش قسمتی از تصاویر بزرگتر از سایز lcd .
یا وقتی که نیاز هست یک عدد یا مطلبی با پس زمینه تصویر مرتب آپدیت بشه .
یا ایجاد حالت اسکرول برای نمایش تصاویر.
در فیلم زیر این عملکرد را میبینید.
برای تست این قابلیت با توجه به نوع میکرو از یکی از فایلهای زیر استفاده نمایید .
فایل هگز تست برای میکرو stm32f103 c8t6
فایل هگز تست برای میکرو stm32f072 c8t6
در لایه سوم:
تابع lcd_picture_show هست که قبلا توضیح داده شده است .
توجه : در نسخه 1.1.3 این تابع با استفاده از تابع lcd_picture_show_part نوشته شده است . این کار حجم کتابخانه را کاهش داده اما در عمل اندکی( حدود 2 %) از سرعت تابع نسبت به نسخه اولیه کم کرده است . به همین جهت من تابع نسخه اولیه را به صورت کامنت در کتابخانه قرارداده ام که با فعال کردن آن میتوانید ازش استفاده کنید .
نحوه ی اضافه کردن به پروژه :
ابتدا فایلها رو داخل پروژه قرار بدید . و در آخر فایل picture_lcd.h را در اینکلود کنید .
*************************************************************************************
دانلود کد نمونه برای نمایش تصویر از روی sd card
توضیح : فایلهای مثال برای بورد blue pill (stm32f103) و میکرو stm32f072 برنامه نویسی شده است.
کتابخانه fat چان ( که خودم ویرایش کردم را) برای کار با فایلها در پوشه پروژه قراردادم.
این کدها در محیط true studio تولید شده است ولی فاقد کتابخانه lcd میباشد برای استفاده لازم است پوشه کتابخانه lcd را در پوشه پروژه کپی و سپس کمپایل کنید .
فایل cube Mx پروژه را در فایلها قرار دادم تا بتوانید برای اتصال پایه های میکروکنترلر به lcd و micro sd از آن استفاده کنید همچنین میتوانید پروژه را برای میکروکنترلرهای دیگر باز تولید کرده و استفاده کنید.
امیدوارم مطالب این قسمت برای شما مفید بوده باشد .
سربلند و پیروز باشید .
لینک قسمت قبلی
مطالب مرتبط :
نمایش تصویر از روی فلش میکروکنترلر
پایان
مالکیت معنوی : لطفا کپی نکنید ، لینک بدید .