پرش به محتوای اصلی
آزمایشگاه‌های مجازی یادگیری با شبیه‌سازی ورود ثبت‌نام
درس ۷ از ۹ متوسط ۲۵ دقیقه

نمایشگر کاراکتری LCD

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

در پایان این درس می‌توانید

  • توضیح دهی حالت چهار بیتی چیست و چرا شش سیم سیگنال برای نمایشگر کافی است.
  • نقش پایه‌های RS و EN را در فرستادن دستور و داده تشخیص دهی.
  • با begin و print و setCursor و clear یک صفحهٔ متنی بسازی.
  • ستون و سطر را از صفر بشماری و آخرین خانهٔ صفحه را درست آدرس بدهی.
  • بفهمی چرا clear در حلقه اشتباه است و به‌جایش مکان‌نما را جابه‌جا کنی.

نمایشگر کاراکتری شانزده در دو، ارزان‌ترین راهی است که پروژه‌ات بدون رایانه هم بتواند حرف بزند. این ماژول بر خلاف نمایشگر گرافیکی پیکسل‌به‌پیکسل رسم نمی‌کند؛ یک کنترلر کوچک به نام HD44780 درونش نشسته که شکل همهٔ حروف را از پیش در حافظه دارد. تو فقط کدِ یک کاراکتر را می‌فرستی، او همان کاراکتر را در خانهٔ جاری می‌کشد و مکان‌نما را یک خانه جلو می‌برد. صفحه از ۱۶ ستون و ۲ سطر ساخته شده است؛ یعنی روی هم ۳۲ خانه، و هر خانه دقیقاً یک کاراکتر جا می‌دهد.

حالت چهار بیتی: چرا شش سیم بس است

گذرگاه دادهٔ این کنترلر در اصل هشت بیتی است. اگر هر هشت خط داده را سیم بکشی، با احتساب دو خط فرمان دست‌کم ده پایه از آردوینو را گرفته‌ای و برای بقیهٔ مدار چیزی نمی‌ماند. سازندهٔ HD44780 راه دومی هم گذاشته است: حالت چهار بیتی. در این حالت فقط خطوط بالایی داده، یعنی D4 تا D7، سیم می‌شوند و هر بایت در دو نوبت فرستاده می‌شود؛ اول نیم‌بایت بالا و بعد نیم‌بایت پایین. پس چهار خط داده به‌علاوهٔ دو خط فرمان می‌شود شش سیم سیگنال، و دو سیم دیگر هم تغذیهٔ پنج ولت و زمین است. بهایی که می‌پردازی دو برابر شدن تعداد نوبت‌های نوشتن است، ولی هر نوبت در حد ده‌ها میکروثانیه طول می‌کشد و چشم انسان اصلاً متوجهش نمی‌شود.

دو خط فرمان: RS و EN

خط RS یا انتخاب‌گر رجیستر تعیین می‌کند که آنچه روی گذرگاه است «دستور» است یا «داده». وقتی این خط پایین باشد، بایت به‌عنوان فرمان تفسیر می‌شود؛ مثل پاک‌کردن صفحه یا بردن مکان‌نما به خانه‌ای دیگر. وقتی بالا باشد، همان بایت کد یک کاراکتر است و روی صفحه ظاهر می‌شود. خط EN نقش ماشه را دارد: نمایشگر تا وقتی این خط تغییر نکند به گذرگاه نگاه نمی‌کند و درست در لحظهٔ افت این خط، مقدار خطوط داده را برمی‌دارد. کتابخانهٔ LiquidCrystal هر دوی این خط‌ها را خودش می‌چرخاند و تو فقط شمارهٔ پایه‌ها را در سازنده به ترتیب RS، EN، D4، D5، D6 و D7 می‌دهی.

چهار تابعی که کارت را راه می‌اندازد

lcd.begin(16, 2) اندازهٔ صفحه را اعلام و کنترلر را راه‌اندازی می‌کند و یک بار در setup() بس است. lcd.print() متن یا عدد را از محل مکان‌نما می‌نویسد و مکان‌نما را جلو می‌برد. lcd.setCursor() مکان‌نما را جابه‌جا می‌کند و lcd.clear() کل صفحه را پاک و مکان‌نما را به خانهٔ آغازین برمی‌گرداند. نکتهٔ ظریف در setCursor است: آرگومان اول ستون است و آرگومان دوم سطر، و هر دو از صفر شمرده می‌شوند. پس گوشهٔ بالا-چپ می‌شود صفر و صفر، و آخرین خانهٔ صفحهٔ شانزده در دو ستون ۱۵ و سطر ۱ است. اگر عادت داری از یک بشماری، همین‌جا یک خانه خطا می‌کنی و متن از لبه بیرون می‌زند.

فرمانِ پاک‌کردن صفحه در HD44780 حدود ۱٫۶ میلی‌ثانیه طول می‌کشد، در حالی که جابه‌جایی مکان‌نما کمتر از ۵۰ میکروثانیه وقت می‌گیرد؛ یعنی بیش از سی برابر تفاوت. بدتر از کندی، چشمک‌زدن است: بین پاک‌شدن و نوشتن دوبارهٔ متن، صفحه لحظه‌ای خالی می‌ماند. پس clear() را برای شروع کار نگه دار، و داخل حلقه فقط مکان‌نما را جابه‌جا کن.

یک حساب عددی

فرض کن مقدار پتانسیومتر را هر ۲۰۰ میلی‌ثانیه یک بار تازه می‌کنی. در هر ثانیه ۱۰۰۰ تقسیم بر ۲۰۰ یعنی ۵ بار و در یک دقیقه ۵ ضربدر ۶۰ یعنی ۳۰۰ بار روی صفحه می‌نویسی. اگر هر بار clear() صدا بزنی، ۳۰۰ ضربدر ۱٫۶ میلی‌ثانیه می‌شود ۴۸۰ میلی‌ثانیه؛ نزدیک نیم ثانیه از هر دقیقه فقط صرف پاک‌کردن می‌شود و در تمام آن مدت پردازنده هیچ کار دیگری نمی‌کند. با روش جابه‌جایی مکان‌نما همان کار در حدود ۱۵ میلی‌ثانیه تمام می‌شود.

یک تلهٔ کوچک هم هست: وقتی مکان‌نما را جابه‌جا می‌کنی، خانه‌های قبلی پاک نمی‌شوند. اگر عدد از ۱۰۲۳ به ۷ برسد، رقم اول جای خودش را به ۷ می‌دهد ولی سه رقم بعدی سر جایشان می‌مانند و روی صفحه «۷۰۲۳» می‌خوانی. راه‌حل ساده است: بعد از عدد چند فاصله چاپ کن تا طول نوشته همیشه ثابت بماند.

کجا به کار می‌آید

پنل ماکروویو، صفحهٔ چاپگر سه‌بعدی، ترازوی دیجیتال فروشگاه و بیشتر تابلوهای صنعتی ساده هنوز همین نمایشگر کاراکتری را دارند؛ چون مصرفش کم است، در نور روز خوانده می‌شود و برنامه‌نویسی‌اش چند خط بیشتر نیست. در کیت این درس یک پتانسیومتر روی پایهٔ A0 بسته‌ایم و عددش زنده روی سطر دوم می‌آید، تا هم‌زمان ببینی ورودی آنالوگ و خروجی نمایشی چطور به هم گره می‌خورند.

رابطه‌های کلیدی

cells = 16 x 2 = 32تعداد خانه‌های یک نمایشگر شانزده در دو؛ هر خانه یک کاراکتر
n = 60000 ms / 200 ms = 300 /minتعداد بازنویسی صفحه در هر دقیقه با به‌روزرسانی هر ۲۰۰ میلی‌ثانیه
lcd.setCursor(col, row) : 0 <= col <= 15 , 0 <= row <= 1بازهٔ مجاز ستون و سطر؛ شمارش از صفر شروع می‌شود
درس قبلی

مأموریت روی میز کار

کیت را اجرا کن؛ نمایشگر LCD در حالت چهار بیتی به برد وصل است و عدد پتانسیومتر زنده روی سطر دوم می‌آید.

  1. کد را اجرا کن و پیچ پتانسیومتر را بچرخان تا عدد سطر دوم بین ۰ و ۱۰۲۳ حرکت کند.
  2. متن سطر اول را عوض کن و با setCursor آن را از ستون ۳ شروع کن؛ ببین سه خانهٔ اول خالی می‌ماند.
  3. رشتهٔ فاصله‌های بعد از عدد را حذف کن، پتانسیومتر را از انتها به ابتدا ببر و بقایای رقم‌های قبلی را روی صفحه ببین.
  4. یک clear در ابتدای حلقه اضافه کن و چشمک‌زدن صفحه را با حالت قبل مقایسه کن، بعد دوباره حذفش کن.
  5. با setCursor(15, 1) یک کاراکتر در گوشهٔ راست-پایین بنویس و تأیید کن ستون ۱۵ آخرین ستون است.
انتظار می‌رود: سطر اول ثابت می‌ماند و فقط عدد سطر دوم با چرخاندن پتانسیومتر تغییر می‌کند، بدون هیچ چشمک‌زدنی.
مدار و کد این درس همین حالا اجرا می‌شود و حساب لازم ندارد. با حساب رایگان پیشرفت و نمرهٔ شما هم ثبت می‌شود و سقف روزانه بالاتر می‌رود.

مدار و کد این درس از پیش چیده شده‌اند. آزادانه تغییرشان بدهید — پروژه‌های خودتان دست‌نخورده می‌مانند. تمام‌صفحه با همین کیت

آزمون این درس

۵ پرسش چهارگزینه‌ای. پس از ثبت، پاسخ درست و توضیح هر پرسش را می‌بینید. می‌توانید هر چند بار که خواستید تلاش کنید؛ بهترین نمره در کارنامه ثبت می‌شود.