logo-site-sefid
Search
Close this search box.
Character

ساخت کاراکتر سفارشی برای ال سی دی 2*16

ساخت کاراکتر سفارشی یا Custom Character برای ال سی دی 2*16

میتوانید قبل از مطالعه ی این بخش دیتاشیت صفحه نمایش ال سی دی و راه اندازی ال سی دی کاراکتری 2*16 با آردوینو را مطالعه کنید.

در مقالات قبلی گفتیم که ال سی دی کاراکتری 2*16 از 16 ستون و 2 ردیف کاراکتر تشکیل شده است و هر کدام از این کاراکترها خود از 5 ستون و 8 ردیف تشکیل میشوند که به آنها پیکسل میگوند.

lcdcc 2

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

حال با بیانی واضح تر هر کاراکتر از 5 ستون و 8 ردیف ساخته شده در صورتی که در کدنویسی مقدار 0 را به هر یک از این پیکسل ها بدهیم این پیکسل ها بر روی صفحه نمایش خاموش میمانند و اگر مقدار 1 را به این پیکسل ها بدهیم آنها روشن خواهند شد. برای مثال برای ساخت کلمه ی فارسی ” ب ” ابتدا باید شکل بصری آن را در جدول(و یا مبدل کاراکتر سفارشی )رسم کنیم سپس اگر یک جدول 5*8 را در نظر بگیریم مقدار هر پیکسل خاموش برابر صفر و هر پیکسل روشن برابر 1 میباشد.

20221030 051503
20221030 052127

تصاویر بالا تصویر بصری کاراکتر سفارشی ما و کدهای سفارشی آن را نشان میدهند و کلمه ی B قبل از آنها ، در کدنویسی به این معنی است که از یک رشته بیت استفاده میکنیم. ما برای ساخت کدهای سفارشی از ژنراتورها(مبدل هایی)استفاده میکنیم که ساخت کاراکترها و تبدیل آنها به کد را برای ما راحت میکنند.

ژنراتور کاراکتر سفارشی (مبدل کاراکتر سفارشی)

20221030 054034

همانطور ک در تصویر بالا میبینید با استفاده از این مبدل میتوان نوع اتصال را مشخص کرد مثلا اتصال (I2c).همینطور میتوان رنگ صفحه نمایش و نوع کدها را نیز مشخص کرد یعنی انتخاب میکنیم که قصد استفاده از کدام یک از رشته های اعداد را داریم اینکه میخاهیم از مبنای ۱۶ استفاده کنیم یا مبنای ۲(منظور انتخاب بین باینری و هگزادسیمال (Hexadecimal) است.)

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

با ارسال این آدرس ها به صفحه ی نمایشگر میتوان هر کاراکتر را نمایش داد. مثلا آدرس کاراکتر R را مشاهده میکنید که با ارسال نیبل پایینی(۴ بیت پایینی) 0010 و نیبل بالایی 0101 نمایش داده میشود که در حقیقت همان آدرس ۸ بیتی 01010010 هستند که معرف کاراکتر R است. و اگر بخواهیم آدرس را به صورت کدهای هگزادسیمال ارسال کنیم ۰۱۰۱۰۰۱۰ را به صورت 0x52 ارسال میکنیم که 0x اول آن برای ارسال رشته ی هگزادسیمال(Hex) استفاده میشود و ۵۲ همان مبنای ۱۶ عدد باینری ۰۱۰۱۰۰۱۰ میباشد(رجوع کنید به اعداد باینری دسیمال و هگزادسیمال).کاراکتر سفارشی هم آدرس مخصوص به خود را دارد که البته محل آدرس آنها مشخص است (شکل زیر) و ما کاراکتر سفارشی خود را فقط در این آدرس ها میتوانیم قرار دهیم.

اما نکته ی دیگر این است در قسمت های خالی که تحت عنوان CG RAM (1) و CG RAM (2) و… در جدول مشخص شده اند در واقع فضاهایی در حافظه هستند که برای استفاده ی ما جهت ایجاد کاراکترهای سفارشی طراحی شده اند.ما میتوانیم از این فضاها و آدرس هایی که دارند استفاده کنیم تا آدرس مخصوص کاراکتر سفارشی خود را در آن ذخیره کنیم اما در صورتی که از کتابخانه ها استفاده میکنیم شرایط کمی متفاوت است و نیاز به این کارها نداریم زیرا که این کارها به صورت پیش فرض با وارد کردن کتابخانه انجام میشوند.

Screenshot 20221101 063200 Office

قبل از خواندن بخش زیر میتوانید راه اندازی ال سی دی کاراکتری به وسیله ی آردوینو  را مطالعه کنید.

گفتیم که در محیط آردوینو و با وجود کتابخانه های فراوانش کار ما را بسیار راحت تر شده و تمام مراحل آدرس دهی و ذخیره ی کاراکتر سفارشی در حافظه به صورت پیش فرض انجام میشود پس وقتی از کتابخانه های صفحه نمایش کریستال مایع استفاده میکنیم کافی است فقط مراحل زیر را انجام دهیم:

ابتدا در مبدل کاراکترهای سفارشی کاراکتر مورد نظر خود را میسازیم مثلا کلمه ی فارسی “ن” را در نظر بگیرید:

وقتی وارد سایتی یا نرم افزاری که مبدل یا ژنراتور ساخت کاراکتر سفارشی دارد شدیم(مبدل کاراکتر سفارشی ) نوع میکروکنترلر را آردوینو ، نوع اعداد را باینری و همچنین اتصال را I2C (اگر از ماژول I2C استفاده میکنید) انتخاب میکنیم.

ساخت کاراکتر سفارشی برای ال سی دی 2*16

سپس کدهایی را که بعد از ترسیم بصری کاراکتر سفارشی و انتخاب گزینه ها ایجاد شده است را در محیط آردوینو کپی میکنیم، همچنین آدرس ال سی دی خود برای اتصال به آردوینو را وارد میکنیم _ در اینجا آدرس LCD ال سی دی(اتصال I2c استفاده کرده ایم) 0x27 بود( گفتیم ک 0x نشان دهنده ی رشته اعداد Hexadecimal است)_ . برای پیدا کردن آدرس ال سی دی خود جهت اتصال به آردوینو میتوانید به مقاله ی پیدا کردن آدرس ال سی دی برای اتصال به آردوینو بروید.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

byte customChar[] = {
  B00000,
  B00000,
  B00000,
  B00100,
  B10001,
  B10001,
  B10001,
  B01110
};


void setup()
{
lcd.init(); 
Serial.begin(9600);             
lcd.backliht(); //open the backlight
lcd.createChar(0, customChar);
lcd.home();
lcd.write(0);
}

void loop()
{

حال با آپلود کردن کد بر روی برد آردوینو کاراکتر ما نمایش داده میشود اما ما در این مقاله به تغییرات کوچکی نیاز داریم تا نحوه ی کدنویسی را اندکی تغییر دهیم تا بتوانیم پاسخگوی سوالات شما باشیم.

ابتدا عبارت customChar را بعد از byte پاک میکنیم و به جای آن اسمی که میخواهیم برای کاراکتر سفارشی بکار ببریم را مینویسیم تا کاراکتر سفارشی ما از این پس با این نام در کدها شناسایی شود(یعنی برای کاراکتر سفارشی خود اسم وارد میکنیم). سپس دقیقا عین همان عبارت را(بزرگی و کوچکی حروف مهم است)در هر جایی که customChar به کار رفته قرار میدهیم تا برنامه به درستی اجرا شود.

یکی دیگر از مواردی که میخواهیم تغییر دهیم این است که دستور (lcd.write(0 را از ()void setup به ()void loop منتقل کنیم که برای این کار کافیست این کد را در داخل ()void loop بنویسیم و آن را از قسمت ()void setup پاک کنیم.

اما باید با دستور lcd.setCursor( , ) محلی که قرار است کاراکتر در آن قراربگیرد را مشخص کنیم. در این دستور ابتدا ستون و بعد سطر قرار میگیرد مثال : (lcd.setCursor(9,1 یعنی با اعمال این دستور مکان نمایی که محل قرار گیری حروف و نوشته را مشخص میکند به ستون ۹ و سطر یک برود.حال میتوانیم کدها را به وسیله ی کابل داخل برد آپلود کنیم:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

byte non[] = {
  B00000,
  B00000,
  B00000,
  B00100,
  B10001,
  B10001,
  B10001,
  B01110
};


void setup()
{
lcd.init(); 
Serial.begin(9600);             
lcd.backlight(); //open the backlight
lcd.createChar(0, non);
lcd.home();

}

void loop()
{
  lcd.setCursor(9,1);
  lcd.write(0);
}

 

اما اگر بخواهیم چند کاراکتر سفارشی را وارد کنیم کافیست هر یک از آنها را با نام متفاوت بنویسیم و سپس در (lcd.creatChar(0,name به جای name نام هر یک را قرار میدهیم اما در دستور creatChar بعدی در کنار name عدد  ۱ را به جای صفر قرار میدهیم و برای نمایش آن در دستور (lcd.write(0  به جای عدد 0 عدد 1 را قرار میدهیم و کاراکتر بعدی ما نمایش داده میشود. یعنی در واقع در قسمت اول دستور ( ، )creatChar با وارد کردن عدد ۰ و یا ۱ و یا ۲ و یا … آدرس آن کاراکتری را که میخواهیم در حافظه ذخیره کنیم وارد میکنیم(گفتیم که آدرس هایی برای کاراکتر سفارشی به صورت پیشفرض در کتابخانه ها قرار داده شده اند برای همین است که از اعداد ۰ و ۱ و ۲ و … استفاده میکنیم که کاراکتر سفارشی خود را در این آدرس ها قرار دهیم) و همینطور اگر خواستیم کاراکتر های سفارشی را که در این آدرس ها ذخیره کرده ایم نمایش دهیم با دستور (lcd.write(2 و یا (lcd.write(1 این کار را انجام میدهیم عددی که وارد میکنیم همان کاراکتری را نمایش میدهد که در دستور creatChar آدرس دهی کرده ایم.
 لازم به یاداوری است که باید قبل از write دستور ()lcd.setCursor را برای هر کدام وارد کنیم و یا مکان قرارگیری آنها را به روش های دیگر مشخص کنیم.

به یاد داشته باشید که تنها ۸ کاراکتر سفارشی میتوانید به این روش بسازید یعنی برای آدرس دهی فقط از ارقام ۰ تا ۷ میتوانید استفاده کنید نه بیشتر و دلیل آن را در پایان مقاله به شما میگوییم.

مثال

#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display byte non[] = { B00000, B00000, B00000, B00100, B10001, B10001, B10001, B01110 }; byte senoghte[] = { B00000, B00100, B01010, B00000, B10001, B11111, B00000, B00000 }; void setup() { lcd.init(); Serial.begin(9600); lcd.backlight(); //open the backlight lcd.createChar(0, non); lcd.createChar(1, senoghte); lcd.home(); } void loop() { lcd.setCursor(9,0); lcd.write(0); lcd.setCursor(9,1); lcd.write(1); }

 

 

Screenshot 20221101 083733 Office

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

همانطور که در تصویر بالا ملاحظه میکنید در صفحه ۱۳ دیتاشیت ال سی دی با آی سی HD44780U در قسمت CGRAM) Character Generator RAM نوشته شده است در قسمت CGRAM تنها ۸ کاراکتر (منظور همان کاراکترهایی است که از ۸ ردیف و ۵ ستون پیکسل تشکیل شده) میتوانیم بازنویسی کنیم.

پس دلیل اینکه در قسمت بالا گفتیم تنها برای آدرس دهی به کاراکتر های سفارشی از اعداد ۰ تا ۷ یعنی به اندازه ی ۸ کاراکتر سفارشی استفاده کنید این است که حافظه ی RAM این آی سی ما را محدود میکند. در مقاله های بعدی به شما نکته های دیگری در این زمینه خواهیم گفت.

اگر سوالی دارید میتوانید در قسمت زیر از ما بپرسید:

رضا قنبری
متخصص آموزش رباتیک

رضا قنبری هستم متخصص آموزش رباتیک با بیش از 10 سال سابقه فعالیت در ایران

این مطلب را به اشتراک بگذارید

دسته بندی نشده

ماژول WIFI

ماژول WIFI قبل از خواندن این مقاله بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته اند از مقالات

ماژول آمپلی فایر

ماژول آمپلی فایر قبل از خواندن این مقاله بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته اند از

ماژول سنسور مجاورت خازنی

ماژول سنسور مجاورت خازنی قبل از خواندن این مقاله بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته اند

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *