seyed ali abdallahian
seyed ali abdallahian
خواندن ۶ دقیقه·۲ سال پیش

طرح دلخواه در LCD کاراکتری

مقدمه


اگر برای وسیله ای که می‌سازین نیاز به نمایشگر پیدا کرده باشین و سیستم‌عامل یا رابطی برای ارتباط با نمایشگر نباشه ٬نیاز دارین تا خودتون این رابط رو ایجاد کنین که میتونه یک کتابخانه باشه که خواستتون رو روی نمایشگر نشون بده و یا کتابخانه برای ارتباط وجود داشته باشه ولی کاراکتری که شما مدنظرتون هست مثل حروف فارسی رو نداشته باشه یا حتی بخواین لوگو شرکتتون رو داخل نمایشگر نشون بدین٬ در این صورت باید خودتون دستورات لازم برای نمایش اون رو بنویسین.

در اینجا قرار نیست نحوه نوشتن کتابخانه رو آموزش بدیم چون برای هر نمایشگر با توجه به کنترلر استفاده شده متفاوته و باید حتما دیتاشیت اون رو مطالعه کنین٬ فقط قراره بگیم چجوری کاراکتر مورد نظرتون رو با توجه به بلوک های سازنده LCD بسازین و حتی بتونین برای کتابخانه‌های آماده حروف دلخواه اضافه کنین.

راستی نتیجه این نوشته رو که روی میکروکنترلر STM32F4 اجرا کردم داخل گیت هاب(+) قرار دادم. در حال حاضر تمام قسمت های کتابخانه کار نمیکنه ولی سعی می‌کنم کتابخانه رو در نسخه های بعدی بهبود بدم و کامل تر کنم.

اجرا شده با کتابخانه روی STM32F4
اجرا شده با کتابخانه روی STM32F4

فلسفه کار نمایشگرهای LCD


دیود نورانی(LED)

خب همگی با LED آشنا هستین٬ LED های معمولی تنها دو حالت روشن و خاموش دارن(البته با تنظیم نرخ تغییرات خاموش و روشن شدنش میشه نورش رو کم کرد که حالا کار به اون نداریم)ُ.

دات ماتریس

اگه بیایم چند تا LED رو کنار هم قرار بدیم مثلا در ۵ ردیف ۵ تایی٬ می‌تونیم با تنظیم چگونگی روشن و خاموش شدنشون شکل دلخواهمون رو بسازیم که نمونه‌های صنعتیش این شکلین:

سون سگمنت

مثال مشهودتر از قرار دادن چند تا LED کنار هم٬ سون سگمنت هست که ۷ تا LED(بدون حساب کردن LED ممیز) کنار هم قرار گرفتن و با روشن یا خاموش شدنشون عددهارو بهمون نشون میدن:

کاربرد زیادی هم دارن مثلا در آسانسور ها یا حتی شمارنده‌های چهارراه‌ها البته برای اینکه مشکلی براشون پیش نیاد بجای ۷ تا LED ٬ تعدادشون بیشتره ولی دسته بندی شدن و هر دسته مانند یک واحد، خاموش یا روشن میشه:

نمایشگر های LCD

حالا برای نمایش بیشتر اطلاعات و اشکال مختلف و متن نوشتن٬ تراکم این LED هارو زیاد می‌کنن و چون تعدادشون زیاد میشه٬ وظیفه کنترل روشن و خاموش شدنشون رو به یک تراشه کنترلر می‌سپارن و برای کار با نمایشگر باید به کنترلر دستور بدیم.

معمولا نمایشگرهای LCD رو با بلوک‌های ۸ تایی روی محور y تقسیم می‌کنن(یعنی اگر قرار به نمایش دیتا روی ال سی دی باشه مختصات x دونه دونه به طول کل LCD قابل تنظیمه ولی مختصات Y بر اساس مضربی از 8 کنترل میشه و وقتی دیتایی(8 بیت) در مختصاتی از X و Y بر روی رم LCD ریخته میشه ال سی دی 8 بیت رو به صورت عددهای بیتی در محور Y روی بلوک میریزه به این صورت که هر بیت 1 پیکسل را روشن می‌کنه و هر بیت 0 پیکسل را خاموش می‌کنه)

برخی اوقات بین این بلوک‌ها فاصله هست و از همدیگه جدا شدن:

یا مثلا در گوشی های موبایل قدیمی، مثلا نوکیا ۱۱۰۰ و مار بازی جذابش، از نمایشگر های LCD کاراکتری استفاده می‌کردن و بلوک‌های اون هم نزدیک به هم بود یا ابعادشون متفاوت بود ولی باز هم دستور دادن بهش با همین ساختار بود که بلوک به بلوک باید برنامه ریزی می‌شدن.



نوشتن کاراکتر دلخواه



نمایشگر مورد استفاده

در اینجا ما برای نمونه LCD ٬ Nokia 5110 رو داریم که در این تاریخ داخل بازار ایران موجوده ولی اگر هم نبود٬ LCD‌های کاراکتری ساختار یکسانی دارن با هم. این LCD از میکروکنترلر PCD8544 که ساخت شرکت Philips هست استفاده می‌کنه(برخی نسخه ها هم از کنترلر LPH7366 استفاده میکنن که تفاوتی نداره کار کردن باهاش) و تک رنگ هست یعنی پیکسل های اون(همون LED ها) تنها می‌تونن خاموش یا روشن باشن.LCD های رنگی هم در بازار وجود داره که بجای اینکه بگیم این پیکسل رو روشن کن٬ رنگش رو مشخص می‌کنیم.

ساختار بلوک های LCD در دیتاشیت

اولین کاری که باید انجام بدیم اینه ساختار بلوک‌ها و آدرس دهی مموری رو از دیتاشیت کنترلر LCD مشخص کنیم:

نحوه آدرس دهی
نحوه آدرس دهی

ساختار آدرس دهی و حافظه کنترلر LCD

طبق دیتاشیت آدرس دهی مموری LCD ما بدین صورته که در راستای Y فقط میشه ادرسی از 0 تا 5 بدیم که میشه 6 ادرس و هر 8 پیکسل زیر مجموعه یکی از این آدرس‌ها هستن پس 6 تا مجموعه 8 تایی از پیکسل‌ها داریم که میشه 48 پیکسل در عرض LCD و برای طول که در راستای X باشه هم 84 پیکسل داریم که میتونیم تک تک ادرس بدیم از ادرس 0 تا 83 و مشکلی از این نظر وجود نداره.

ساختار بلوک ها

این LCD ٬ 48 x 84 پیکسل داره که میشه 4032 پیکسل٬ اگر LCD دیگه ای دارین٬شاید برای شما بیشتر یا کمتر باشه.

طبق دیتاشیت٬ نمایشگر به بلوک‌هایی در ساختار 8 بیت عمودی و 5 بیت افقی تقسیم شده البته میتونیم تعداد پیکسل های افقی بلوک رو کمتر یا بیشتر در نظر بگیریم.

طراحی طرح مورد نظر

برای اینکه کاراکتر دلخواهمون رو رسم کنیم٬ ابتدا روشن یا خاموش بودن بیت های بلوک اون رو مشخص کنیم٬ برای این کار مثلا یک جدول ۸ در ۶ تشکیل میدیم و خانه‌های اون رو روشن یا خاموش می‌کنیم برای مثال این بلوک اسم علی را نمایش می‌دهد(پیشنهاد می‌شود به علت تراکم بالای پیکسل‌ها٬ از هر بلوک برای یک حرف استفاده کنید و بلوک ابتدا و انتهای کلمتون رو یک ستون خالی بذارین٬ البته در اینجا برای مثال یک کلمه را در یک بلوک نوشتیم):

تبدیل طراحی به دستور

ساختار مشخص کردن روشن یا خاموش بودن پیکسل‌ها بدین شکله که در هر دستور روشن یا خاموش بودن پیکسل های هر ستون (از چپ شروع میکنیم) از پایین بلوک می‌نویسیم که برای ستون اول٬ باینری آن می‌شود:0111000 آن را تبدیل به هگز میکنیم به برابر میشود با 0x70 .

بدین ترتیب تمام بلوک را تبدیل می‌کنیم که برابر می‌شود با:

Ch = {0x70, 0x50, 0x5e, 0x50, 0x5c, 0x14}

البته اگر از نمایشگری استفاده می کنین که از ساختار بلوک 8 در 5 استفاده میکنه، میتونین بجای اینکه به صورت دستی این تبدیل ها رو انجام بدین از این سایت(+) استفاده کنین که همزمان هم دستور و هم نتیجه روی یک بلوک رو بهتون نشون میده. بهتره این موضوع رو هم در نظر داشته باشین که برخی نمایشگر ها مانند نمایشگری که ما استفاده کردیم(Nokia 5110)، میتونن دستور رو به صورت بلوک 8 در 84 بگیرن(طبق آدرس دهی مموری، یعنی یک ردیف Y رو به طور یکجا) و بلوک هاشون محدود به 8 در 5 نشده، سایت ذکر شده هم برای کنترلر همین نمایشگر (PCD8544) ساخته شده و بلوک پایه 8 در 5 رو نظر گرفته.

در نهایت با دادن این متغیر به نمایشگر٬ بلوک مطابق دستور ما روشن می‌شود و اسم علی همانطور که آن را خواستیم در آن نمایش داده می‌شود:


نکات و نتیجه گیری


خب دیدیم که با خوندن دیتاشیت و شناخت ساختار بلوک‌ها٬ طراحی کاراکتر مورد نظر در یک بلوک و ارسال دستور آن به LCD ٬ می‌تونیم کاراکتر مورد نظرمون رو روی اون چاپ کنیم.

برای لوگو یا طرح‌هایی که بیش از یک بلوک نیاز دارند٬ باید طرح رو روی بلوک‌هایی که نیاز داره رسم کنیم و دستور هر بلوک رو تک به تک به نمایشگر بدیم که ساختاری شبیه ارسال دستور یک کاراکتر به LCD داره.اگر هم لوگو رو به صورت عکس دارین میتونین با رفتن به این سایت(+) اون رو تبدیل به آرایه هگز کنین.

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


پایان




lcd کاراکتریآردوینوstm32dotmatrixlcd
شاید از این پست‌ها خوشتان بیاید