راه اندازی LCD کاراکتری با میکروکنترلر AVR

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

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

LCDs

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

ال سی دی چگونه کار می کند؟

یک ال سی دی (نمایشگر کریستال مایع) بر اساس عکس العمل کریستال مایع در میدان الکتریکی کار می کند. هر ال سی دی دارای یک نور زمینه در پشت کریستال مایع می باشد که به عنوان منبع نور عمل می کند. هنگامی که میدان الکتریکی روی کریستال مایع اعمال می شود کریستال مایعی که قبلا نور را از خود عبور می داد، با تغییر جهت مولکول هایش مانع از عبور نور می گردد. بنابراین با اعمال ولتاژهای مناسب قادر به کنترل عبور یا عدم عبور نور از پیکسل های مختلف ال سی دی خواهیم بود.

LCD های مختلفی در بازار موجودند مانند LCD 16×2،  LCD 16×4،  LCD 20×2، LCD 20×4، ال سی دی گرافیکی ۱۲۸ در ۶۴ پیکسل و … .

LCD کاراکتری ۲x16

ال سی دی که ما می خواهیم از آن استفاده کنیم ال سی دی کاراکتری ۱۶x2 است که قابلیت نمایش ۳۲ کاراکتر را در  دو ردیف ۱۶ تایی دارا می باشد. یعنی در هر ردیف ۱۶ کاراکتر را می تواند نمایش دهد. هر کاراکتر عملا یک آرایه ی ۵x10 یا ۵x8 و یا ۵x7 پیکسلی است به طوری که برای نمایش یک کاراکتر خاص از بین این پیکسل ها بعضی روشن شده و بعضی خاموش باقی می مانند تا آن کاراکتر نمایش داده شود. شکل زیر یک LCD 16×2 را نشان می دهد که آرایه های آن دارای ابعاد ۵x8 می باشند:

LCD-matrix

به عنوان مثال در انیمیشن زیر به ترتیب سه حرف A ، B و C در یک آرایه ی ۵x7 نمایش داده می شوند:

LCD-ABC

پس اگر بخواهیم دو کاراکتر A و a را در یک ماتریس ۵x7 نمایش دهیم باید به صورت زیر عمل کنیم:

LCD-Aa

پس برای نمایش یک کاراکتر در هر آرایه باید ۷ عدد هشت بیتی را که مقادیر هفت ردیف آن آرایه هستند، به ال سی دی داد. البته نگران نباشید چون قرار نیست که ما کل این کارها را انجام دهیم. به همین جهت است که LCDهای کاراکتری مجهز به کنترلر HD44780 از شرکت hitachi  و یا کنترلرهای دیگر مبتنی بر همین معماری می باشند. این کنترلر تمامی کارهای مربوط به کنترل پیکسل ها را بر عهده گرفته و کار را برای ما برنامه نویسان میکروکنترلر آسان می سازد. به کمک همین کنترلر ما قادر به نمایش تمامی حروف و اعداد، حروف یونانی، علائم دستور زبان، سمبل های ریاضیاتی و … هستیم. همچنین این کنترلر ویژگی های دیگری را شامل شیفت اتوماتیک، نمایش کرسر، نور زمینه ی LED فراهم می آورد.

رجیسترهای داخلی LCD

LCD دارای دو رجیستر به نام های «رجیستر دستور» و «رجیستر داده» می باشد.  رجیستر دستور دستورالعمل هایی را که به ال سی دی داده می شود در خود ذخیره می کند. یک دستور دستورالعملی است که به ال سی دی داده می شود تا ال سی دی وظایف از قبل تعریف شده ای مانند: راه اندازی، پاک کردن صفحه، تنظیم محل کرسر، کنترل نمایشگر و … را انجام دهد. رجیستر داده اطلاعاتی را ذخیره می کند که باید توسط ال سی دی نمایش داده شوند. بلوک دیاگرام ساختمان داخلی LCD کاراکتری به صورت زیر می باشد:

LCD-blockdigram

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

ASCII-table

چینش پین های ماژول LCD

ماژول ال سی دی دارای ۱۶ پین می باشد، که هر پین برای وظیفه ای خاص تعبیه شده است. شماره بندی پین ها به صورتی که در شکل زیر نشان داده شده است، صورت می پذیرد.

LCD-pins

در ادامه کاربرد هر پین به ترتیب شماره گذاری بالا توضیح داده خواهد شد:

پین های VSS، VDD و VEE

این سه پین به ترتیب دارای شماره های ۱، ۲ و ۳ می باشند. پین ۱ (VSS) پین زمین بوده و باید زمین شود تا LCD به خوبی کار کند. معمولا پین های VEE و VDD به ولتاژهای +۵ ولت متصل می شوند. بدین صورت که پین VDD حتما باید همیشه به ولتاژ +۵ ولت وصل باشد ولی پین VEE می تواند به جای این که مستقیما به ولتاژ +۵ وصل گردد قبل از آن به پتانسیومتری متصل شود تا کنتراست و وضوح LCD قابل تنظیم باشد.

پین های Register Select (یا RS) و  Read/Write (یا R/W) و Enable (یا E)

این سه پین نیز به ترتیب با شماره های ۴، ۵ و ۶ مشخص می شوند. پایه ی RS برای انتخاب بین رجیسترهای داده و دستور به کار می رود. وقتی  RS=0 رجیستر دستور انتخاب می شود و هنگامی که RS=1 رجیستر داده انتخاب می گردد. و پین R/W برای انتخاب خواندن یا نوشتن است، به طوری که اگر قصد خواندن رجیستری را داشته باشیم باید R/W=1 و اگر تصمیم بر نوشتن مقداری روی رجیستر داریم باید R/W=0  باشد.

پین های Data  یعنی از DB0 تا DB7

این پین ها برای انتقال داده های هشت بیتی هستند که برای ارسال اطلاعات به LCD و یا خواندن محتویات رجیستر درونی LCD به کار می روند.

پین های آند و کاتد LED زمینه

پین ۱۵ و ۱۶ به ترتیب قطب کاتد و آند LED هستند که نور زمینه ی LCD را فراهم می کند و باید به ترتیب به زمین و ولتاژ +۵ ولت وصل گردند.

در جدول زیر لیست هر ۱۶ پین ماژول LCD و کاربردشان به همراه توضیحاتی مختصر ارائه گردیده است:

جدول پایه های LCD کاراکتری

همان طور که گفته شد LCD دو نوع سیگنال را می پذیرد، یکی سیگنال داده و دیگری سیگنال کنترل. در قسمت قبل توضیح داده شد که این سیگنال ها توسط پین RS از هم تشخیص داده می شوند. به محض این که  یک پالس به پایه ی E  داده شود ماژول LCD در لبه ی پایین رونده ی پالس اطلاعات را از روی گذرگاه داده می خواند ، اگر اطلاعات دریافتی از نوع داده باشد آن را بر روی LCD نمایش می دهد و اگر از نوع دستور باشد آن را اجرا می کند. ماژول LCD  برای نمایش یک کاراکتر و یا اجرای یک دستور نیاز به حدود ۳۹ تا ۴۳ میکروثانیه زمان نیاز دارد. مگر دستورهای «پاک کردن صفحه» و «بردن نشانگر به مکان اول» که درحدود ۵۳/۱ تا ۶۴/۱ میلی ثانیه زمان می برد. اگر در حین این مدت هرگونه داده ای به LCD ارسال شود نادیده گرفته می شود.

نمایشگرهای LCD دارای دو حافظه ی RAM هستند که DDRAM و CGRAM نام دارند. DDRAM نشان می دهد که کدام یک از  کاراکترهای ASCII و در چه مکانی به نمایش درآید. هر بایت از DDRAM نشان دهنده ی یک مکان (آرایه) بر روی نمایشگر LCD می باشد. کنترل کننده ی LCD اطلاعات را از DDRAM  خوانده و بر روی نمایشگر نشان می دهد. CGRAM به کاربر این اجازه را می دهد تا کاراکترهای سفارشی خود را برای LCD تعریف کنند.

دستورالعمل های LCD

اطلاعاتی که برای LCD فرستاده می شود می تواند داده ای (کاراکتری) در فرمت ASCII باشد که جهت نمایش بر روی LCD ارسال می گردد (کدهای اسکی قبلا در جدولی ارائه گردیدند)، همچنین می تواند دستوری باشد که به LCD می دهیم تا کاری را انجام دهد. مثلا کل صفحه را پاک کند. دستورات متعددی برای ماژول LCD وجود دارند که هرکدام فرمان به کاری می دهند. هنگامی که بخواهیم به LCD دستور خاصی را ارسال کنیم باید کد هگز مربوط به آن دستور را بر روی گذرگاه داده قرار دهیم. در جدول زیر دستورالعمل های مهم و پرکاربرد LDC آمده است:

LCD-table command

مُدهای کاری LCD

مد ۸ بیتی:

در مد ۸ بیتی پین های شماره ۷ تا ۱۴ از ماژول LCD به ۸ پین ورودی/خروجی میکروکنترلر متصل می شوند. در نتیجه در این مد ما برای تبادل اطلاعات نیاز به ۸ پین داریم. مزیت این مد در این است که برنامه نویسی برای این مد آسان بوده و داده ها به سرعت آپدیت می شوند.

مد ۴ بیتی:

در مد ۴ بیتی پین های شماره ی ۱۱ تا ۱۴ از ماژول LCD به چهار پین ورودی/خروجی میکروکنترلر وصل می گردند. از این رو در این مد برای تبادل داده فقط به ۴ پین نیاز داریم. دلیل اصلی استفاده از مد ۴ بیتی استفاده از ۴ پایه ی میکروکنترلر به جای استفاده از ۸ پایه است.

  راه اندازی و نمایش «MicroLearn» بر روی LCD در مد ۸ بیتی

  • راه اندازی اولیه ی LCD

برای استفاده از LCD باید در ابتدا آن را راه اندازی کنیم. برای این کار باید مراحل زیر صورت پذیرد:

۱) ارسال کد ۰x38 برای استفاده از LCD در مد ۸ بیتی

۲) ارسال کد ۰x01 جهت پاک کردن LCD

۳) ارسال کد ۰x0E برای روشن کردن نشانگر

۴) ارسال کد ۰x80 برای رفتن به اولین مکان از اولین خط

  • مراحل  ارسال دستور  به LCD :

۱) گذاشتن کد دستور بر روی پورت میکروکنترلر متصل به گذرگاه داده LCD

۲) صفر کردن پین های RS و R/W و یک کردن پین Enable

۳) ایجاد تأخیری کوچک

۴) صفر کردن پین Enable

  • مراحل ارسال داده قابل نمایش به LCD:

۱) گذاشتن کد اسکی کاراکتر موردنظر بر روی پورتی از میکروکنترلر که به گذرگاه داده ی LCD متصل است.

۲) صفر کردن پین R/W و یک کردن پین های RS و Enable

۳) ایجاد یک تأخیر کوچک

۴) صفر کردن پین Enable

مراحل راه اندازی اولیه ی LCD را در تابعی تحت عنوان init_LCD انجام می دهیم. همچنین مراحل ارسال دستور به LCD را در تابع LCD_cmd و مراحل ارسال داده جهت نمایش را در تابع LCD_write  می نویسیم. برنامه ی زیر در محیط کدویژن نوشته شده است. در این برنامه قصد بر این است تا عبارت MicroLearn بر روی LCD نمایش داده شود.

پس از نوشتن این برنامه در محیط کدویژن و کامپایل کردن آن، شبیه سازی در نرم افزار پروتئوس صورت گرفت و به صورتی که در شکل زیر آمده، شبیه سازی شد:

LCD8-simultn

راه اندازی و نمایش «MicroLearn» بر روی LCD در مد ۴ بیتی

در مد ۴ بیتی می خواهیم از کتابخانه ی موجود در نرم افزار کدویژن استفاده نماییم. در این جا از ورژن ۳٫۱۲ استفاده شده است. برای استفاده از کتابخانه ی LCD در کدویژن در ابتدا هدرفایل alcd.h را اضافه می کنیم. لازم به ذکر است که پس از این کار نیاز است تا در منوی project قسمت configure را انتخاب نموده و در پنجره ی باز شده در قسمت c compiler تب libraries و سپس تب alphanumeric lcd را باز کرده و در تیک گزینه ی موجود را بزنیم. سپس باید پورتی که میخواهیم ال سی دی به آن متصل باشد را انتخاب نماییم. ما به صورت زیر پورت را انتخاب نمودیم:

alcd.h

چند تابع پرکاربرد نرم افزار کدویژن مربوط به LCD

تابع ()lcd_init

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

تابع ()lcd_clear

این تابع صفحه ی نمایش را پاک کرده و نشانگر را به سطر و ستون ۰ می برد.

تابع ()lcd_gotoxy

این تابع نشانگر را به مکان داده شده می برد. ورودی های این تابع دو عدد بی علامت هستند که عدد اول شماره ی ستون و عدد دوم شماره سطر مورد نظر است.

تابع ()lcd_putchar

این تابع کاراکتر مورد نظر را نمایش می دهد. ورودی این تابع کد اسکی کاراکتری است که می خواهیم نمایش دهیم.

تابع ()lcd_puts

این تابع رشته ی مورد نظر ار روی ال سی دی نمایش می دهد. ورودی این تابع یک رشته می باشد. برنامه ای که با استفاده از توابع موجود در کدویژن نوشته شد به صورت زیر است:

شبیه سازی در محیط پروتئوس در شکل زیر قابل مشاهده است:

۴mode

  فایل های مربوط به این پروژه را می توانید از طریق لینک زیر دریافت نمایید:

پسورد فایل زیپ: www.microlearn.ir lc

دانلود فایل پروژه LCD کاراکتری

خسته نباشید میگم بهتون. امیدوارم که الان دیگه کار با LCD کاراکتری رو به خوبی یاد گرفته باشید. باز هم منتظر پروژه های بعدی ما باشید و ما رو از نظراتتون بی نصیب نذارین. برای اینکه بتونید از آموزش امروز در یک پروژه آموزشی استفاده کنید به پست کنترل دور موتور DC بر اساس دما هم سر بزنید.

درباره‌ی مجتبی حکیمیان

Avatar
کارشناس الکترونیک و کارشناس ارشد مخابرات سیستم | زمینه ی تحقیقاتی : پردازش تصویر و تعقیب اشیاء متحرک |‌فعال در حوزه ی الکترونیک مبتنی بر میکروکنترلر | برنامه نویس و طراح بردهای الکترونیکی مبتنی بر میکروکنترلر

۷۵ نظر

  1. Avatar

    سلام
    میشه بفرمایید کی از دستور asmاستفاده می شود ؟
    خیلی ازتون ممنونم

  2. Avatar

    سلام من میخام متن طولانی تری توی lcd بنویسم.چطور میتونم ادامه ی نوشته رو به خط بعد انتقال بدم؟

  3. Avatar

    سلام
    من می‌خوام یک منوی ۴ گزینه ای درست کنم با ۴ تا کلید(بالا، پایین، انتخاب، برگشت)
    مثلاً:
    ۱-start process
    ۲-set motor
    ۳-set temp
    ۴-timet
    که اشاره‌گر با کلید بالا و پایین بین گزینه ها جا به جا بشه
    با کلید انتخاب یا enter وارد گزینه بشه که بشه مقادیرشونو تغییر داد
    و با کلید برگشت هم به منوی قبل برگرده

  4. Avatar

    سلام خیلی ممنون از توضیحات عالیتون.
    یه سوال داشتم، در یک پروژه پایه‌های Vss و Vdd را جابجا وصل کردم آیا با این کار LCD میسوزه؟
    انقدری وصل بود که حتی سیمای تغذیش داغ شد⁦☹️⁩
    روشی هست که بشه LCD رو بدن میکرو تست کرد که سالمه؟(من شک دارم که حتی از اولم این LCD سالم بوده باشه)

دیدگاهتان را بنویسید

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