آردوینومقدماتی۹ دقیقه مطالعهArduino IDE 2.x / Uno R3

نمایشگر کاراکتری LCD ۱۶×۲

سیم‌کشی کامل نمایشگر کاراکتری ۱۶×۲ با کنترلر HD44780 به آردوینو در حالت ۴ بیتی؛ تنظیم کنتراست با پتانسیومتر و چاپ متن و ساخت کاراکتر سفارشی با کتابخانهٔ LiquidCrystal.

آنچه در این درس می‌آموزید

  • کارکرد نمایشگر کاراکتری و معنای عبارت ۱۶×۲ را توضیح دهید
  • هر ۱۶ پین LCD را بشناسید و ماژول را در حالت ۴ بیتی سیم‌کشی کنید
  • با کتابخانهٔ LiquidCrystal متن را چاپ و جابه‌جا کنید و کاراکتر سفارشی بسازید
  • مشکلات رایج مثل صفحهٔ خالی و حروف بی‌معنا را عیب‌یابی کنید
نویسنده: تیم داکنامه · بازبینی: ۲۰۲۶-۱۰-۳۱
فهرست مطالب

تا این جای دوره، خروجی برنامه‌های شما یا یک LED بود یا متن در Serial Monitor. حالا خروجی را روی خود پروژه می‌آوریم: نمایشگر کاراکتری ۱۶×۲ (16x2 Character LCD) که ارزان و کم‌مصرف است و در هر کیت آردوینویی پیدا می‌شود.

نمایشگر کاراکتری چیست و ۱۶×۲ یعنی چه؟

LCD مخفف نمایشگر بلور مایع (Liquid Crystal Display) است. عبارت ۱۶×۲ یعنی ۱۶ خانهٔ کاراکتری در هر سطر و ۲ سطر؛ در مجموع ۳۲ خانه که هر کدام یک کاراکتر استاندارد (حروف انگلیسی، رقم، علائم) را نشان می‌دهند. این نمایشگر «کاراکتری» است و مثل نمایشگرهای گرافیکی، تصویر دلخواه نمی‌کشد.

پشت شیشهٔ نمایشگر یک تراشهٔ سیاه هست که در تقریباً همهٔ ماژول‌ها سازگار با کنترلر HD44780 است: شما به آن دستور و داده می‌فرستید و او خانه‌های نمایش را روشن و خاموش می‌کند. کتابخانهٔ این درس دقیقاً برای همین خانوادهٔ کنترلر نوشته شده است.

جدول کامل ۱۶ پین

نمایشگر ۱۶×۲ یک ردیف ۱۶ پینی دارد؛ نام هر پین را بشناسید چون عیب‌یابی این درس بر همین نام‌ها تکیه می‌کند:

پین نام کارکرد
۱ VSS زمین (GND)
۲ VDD تغذیهٔ منطقی؛ ۵ ولت
۳ VO ولتاژ کنتراست
۴ RS انتخاب رجیستر (Register Select)؛ صفر یعنی دستور، یک یعنی دادهٔ کاراکتر
۵ RW خواندن/نوشتن (Read/Write)؛ ما فقط می‌نویسیم، پس به GND می‌رود
۶ E فعال‌سازی (Enable)؛ کنترلر با لبهٔ پایین‌روندهٔ آن داده را می‌گیرد
۷ D0 خط دادهٔ ۰؛ در حالت ۴ بیتی بلااستفاده
۸ D1 خط دادهٔ ۱؛ در حالت ۴ بیتی بلااستفاده
۹ D2 خط دادهٔ ۲؛ در حالت ۴ بیتی بلااستفاده
۱۰ D3 خط دادهٔ ۳؛ در حالت ۴ بیتی بلااستفاده
۱۱ D4 خط دادهٔ ۴؛ به آردوینو وصل می‌شود
۱۲ D5 خط دادهٔ ۵؛ به آردوینو وصل می‌شود
۱۳ D6 خط دادهٔ ۶؛ به آردوینو وصل می‌شود
۱۴ D7 خط دادهٔ ۷؛ به آردوینو وصل می‌شود
۱۵ A آند نور پس‌زمینه (Backlight)؛ از طریق مقاومت به ۵ ولت
۱۶ K کاتد نور پس‌زمینه؛ به GND

حالت ۴ بیتی و تنظیم کنتراست

کنترلر HD44780 داده را می‌تواند با هر ۸ خط D0 تا D7 بگیرد یا فقط با ۴ خط بالایی D4 تا D7. حالت دوم «حالت ۴ بیتی» (4-bit mode) نام دارد: هر بایت در دو نیمه ارسال می‌شود و به‌جای ۱۰ پین آردوینو فقط ۶ پین لازم است؛ یعنی ۴ پین دیجیتال برد برای سنسورهای بعدی آزاد می‌ماند. سرعت کمی پایین‌تر می‌شود، اما برای نمایش متن کافی است. خطوط D0 تا D3 هیچ وصل نمی‌شوند.

پین VO کنتراست را تعیین می‌کند: ولتاژ کمتر یعنی کاراکترهای پررنگ‌تر. راه درست، یک پتانسیومتر ۱۰ کیلواهم است: دو سرش به ۵ ولت و GND، سر وسط (wiper) به VO.

سیم‌کشی به آردوینو در حالت ۴ بیتی

Arduino Uno LCD ۱۶×۲
GND پین ۱ (VSS)
5V پین ۲ (VDD)
سرِ وسط پتانسیومتر ۱۰ کیلواهم پین ۳ (VO)
پین ۱۲ پین ۴ (RS)
GND پین ۵ (RW)
پین ۱۱ پین ۶ (E)
— پین‌های ۷ تا ۱۰ (D0 تا D3) بلااستفاده
پین ۵ پین ۱۲ (D4)
پین ۴ پین ۱۳ (D5)
پین ۳ پین ۱۴ (D6)
پین ۲ پین ۱۴ (D7)

دو سر پتانسیومتر هم به 5V و GND وصل می‌شوند. برای نور پس‌زمینه، پین A از طریق یک مقاومت ۲۲۰ اهم به 5V و پین K به GND می‌رود؛ اگر مقاومتِ نور پس‌زمینه روی ماژول شما از قبل لحیم شده، اتصال مستقیم A به 5V هم مجاز است.

کتابخانهٔ LiquidCrystal

چیزی لازم نیست نصب کنید: کتابخانهٔ LiquidCrystal همراه خود Arduino IDE نصب است. کافی است #include <LiquidCrystal.h> را بنویسید و ترتیب پین‌ها را به سازندهٔ کلاس بدهید.

نخستین اسکچ روی نمایشگر

lcd-hello.ino
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // RS, E, D4, D5, D6, D7

void setup() {
  lcd.begin(16, 2);               // 16 columns, 2 rows
  lcd.print("Hello, DocNameh!");  // starts at column 0 of row 0
}

void loop() {
  lcd.setCursor(0, 1);            // column 0 of row 1
  lcd.print("Uptime: ");
  lcd.print(millis() / 1000);     // seconds since power-on
  delay(1000);
}

توضیح خط‌به‌خط:

  1. LiquidCrystal lcd(12, 11, 5, 4, 3, 2) — ترتیب پین‌ها را به کتابخانه می‌دهد: RS، E و سپس D4 تا D7.
  2. lcd.begin(16, 2) — کنترلر را در حالت ۴ بیتی راه می‌اندازد و تعداد ستون و سطر را اعلام می‌کند؛ اعداد اشتباه، چیدمان متن را به‌هم می‌ریزد.
  3. lcd.print و setCursor — رشته یا عدد را از موقعیت جاری می‌نویسند؛ setCursor(0, 1) مکان‌نما را به ستون ۰ سطر ۱ می‌برد و شمارش از صفر است.
  4. millis() / 1000 — ثانیه از لحظهٔ روشن‌شدن برد.

رفتار قابل مشاهده: سطر اول پس از آپلود عبارت Hello, DocNameh! را نشان می‌دهد (دقیقاً ۱۶ کاراکتر و پُرکنندهٔ کل سطر) و سطر دوم هر ثانیه با عددی مثل Uptime: 12 به‌روز می‌شود. برای جابه‌جایی کل صفحه، lcd.scrollDisplayLeft() را با delay(300) در loop() صدا بزنید تا متن به چپ بلغزد و از سمت راست دوباره بیاید.

کاراکتر سفارشی بسازید

حافظهٔ کنترلر ۸ خانه برای کاراکتر دلخواه دارد (اندیس‌های ۰ تا ۷) و هر کاراکتر یک ماتریس ۵ در ۸ پیکسلی است:

lcd-custom-char.ino
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte heart[8] = {  // 5x8 pixel pattern
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000,
  0b00000
};

void setup() {
  lcd.begin(16, 2);
  lcd.createChar(0, heart);  // store pattern in slot 0
  lcd.clear();
  lcd.setCursor(6, 0);
  lcd.write(byte(0));        // draw the custom character
}

void loop() {}

createChar الگوی بایت‌ها را در خانهٔ ۰ ذخیره می‌کند و lcd.write(byte(0)) همان کاراکتر را در محل مکان‌نما می‌کشد؛ روی نمایشگر یک قلب کوچک ۵ در ۸ پیکسلی در وسط سطر اول ظاهر می‌شود. پیشوند 0b یعنی بایت دودویی نوشته شده و هر بیت یک پیکسل روشن است.

خطاهای رایج و عیب‌یابی

نشانه علت رایج راه‌حل
نور پس‌زمینه روشن است ولی کاراکتری دیده نمی‌شود کنتراست اشتباه؛ رایج‌ترین علت در کار با LCD پتانسیومتر VO را به‌آرامی بچرخانید تا متن تیز شود
صفحه کاملاً خالی و بدون نور تغذیه یا مسیر A و K وصل نیست سیم‌های VDD و 5V و A و K را چک کنید
حروف بی‌معنا و تصادفی (garbage) سیم‌کشی RS/E/داده با آرگومان‌های کتابخانه نمی‌خواند یا سیمی شُل است هر سیم را با جدول سیم‌کشی و LiquidCrystal(...) مقایسه کنید
متن با فاصلهٔ عجیب یا نصفه می‌افتد آرگومان‌های begin با نمایشگر نمی‌خواند همان lcd.begin(16, 2) را بنویسید
کاراکترها تار یا کم‌رنگ‌اند ولتاژ VO بالاست پتانسیومتر را به سمت ولتاژ کمتر بچرخانید

تمرین‌ها

تمرین

تمرین ۱ — پیام مرکزچین روی سطر دوم

اسکچ کاراکتر سفارشی را طوری تغییر دهید که قلب در ستون ۷ سطر دوم نمایش داده شود. کدام خط را باید عوض کنید؟

نمایش راه‌حل

فقط آرگومان‌های setCursor عوض می‌شوند؛ آرگومان اول ستون و دومی سطر است:

cpp
lcd.setCursor(7, 1);  // column 7 of row 1
lcd.write(byte(0));

به‌جای setCursor(6, 0) در setup()، همین دو خط را بنویسید؛ قلب در سطر پایین ظاهر می‌شود.

:::

خلاصه

  • نمایشگر ۱۶×۲ یعنی ۱۶ کاراکتر در هر سطر و ۲ سطر؛ مغز آن کنترلری سازگار با HD44780 است.
  • حالت ۴ بیتی فقط از D4 تا D7 استفاده می‌کند و ۴ پین آردوینو را آزاد می‌گذارد.
  • کنتراست با پتانسیومتر ۱۰ کیلواهم روی VO تنظیم می‌شود؛ صفحهٔ خالی تقریباً همیشه یعنی کنتراست.
  • با begin راه‌اندازی می‌کنید، با print و setCursor متن می‌نویسید و با createChar کاراکتر دلخواه می‌سازید.
  • RW را در کارهای نوشتن‌محور همیشه به GND ببندید.

سیم‌کشی این نمایشگر ۶ سیم لازم داشت؛ در درس بعدی همین نمایشگر را با یک بک‌پک I2C می‌بندید که با فقط ۴ سیم کار می‌کند و چند نمایشگر را روی یک خط مدیریت می‌کند.

منابع و ارجاع‌ها

درس‌های مرتبط