پنج شنبه , ۲ آذر ۱۳۹۶
آخرین نوشته‌ها
خانه | سیستم های نهفته | میکروکنترلر | ادوات جانبی | راه اندازی LCD کاراکتری با میکروکنترلر AVR

راه اندازی 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 بر اساس دما هم سر بزنید.

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

10,000 ریال – خرید

درباره‌ی مجتبی

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

۶۲ ديدگاه

  1. با سلام و خسته نباشید .

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

    نکته دوم اینکه کلا در فضای اینترنت آموزش glcd ها یا همان ال سی دی های گرافیکی بسیار کم و پیش پا افتاده است
    لطفا یک آموزش در حد امکان جامع راجع به این lcd ها بگزارید .
    همچنین در مورد تاچ آنها
    با تشکر فراوان
    بی صبرانه منتظر مطالب بعدی شما هستم
    لطفا اگر هم مقدور نیست بفرمایید تا من منتظر نمانم

    • با سلام به شما دوست عزیز و علاقه مند
      در تهیه مطالب میکرولرن همیشه سعی بر بیان ساده و جامع بوده. که انشالله این مهم ادامه پیدا خواهد کرد. برای بحث lcd های گرافیکی درخواست های زیادی تا کنون مطرح شده و به نظر میرسه به تعداد کافی علاقه مند و مشتاق برای تهیه چنین پستی وجود داره. این پست در دستور کار قرار گرفته و حتما منتشر خواهد شد ولی از نظر زمانی نمیتونم تاریخ دقیقی را بگم. اما سعی بر این هست که تا قبل از پایان آبان ماه پست منتشر بشه. قطعا خیلی از مفاهیم طراحی فونت، رسم اشکال و یک کتابخانه جامع و کامل برای فونت فارسی از مواردی هستند که در این پست اموزش داده خواهد شد.

      با تشکر از صبوری شما

  2. خیلی راحت تر هم میشه این و انجام داد
    با کد ویزارد البته

  3. سلام
    خسته نباشید
    ال سی دی من کار میکنه ولی دری وری نشون میده علت چیه؟چطوری جلوی نویز و بگیرم؟

    • سلام
      باید تغزیه lcd درست باشه. اتصالات هم درست باشه. کنتراست را برای مشاهده صحیح تنظیم کنید. در نهایت توابع کتابخانتون باید درست نوشته شده باشن. در این صورت هیچ وقت نویز دیده نمیشه.

  4. سلام
    ممنون مطلب خوبی بود. از اینکه با ما به اشتراک گذاشتید ممنونم!

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

    الان نور زمینه روشن نمیشه اصلا . اطلاعات اما به درستی نمایش داده میشه
    در ضمن lcd را به پورت c وصل کردم

    ممنون میشم راهنمایی کنید

  6. سلام اساتید و دوستان گرامی و تشکر از سایت میکرولرن

    بنده یه سوال تو داشتم
    نمیدونم چرا در راه اندازی به مشکل برخوردم. من از lcd 16*4 استفاده کردم و می خواستم بدونم مشکل از lcd است آیا؟
    چون تمام اتصالات همونطور که شما گفتید هست و کنتراست درست تنظیم میشه.
    در lcd من فقط نور زمینه روشن میشه و ۱۶ خونه سیاه میشه و تغییری به جز این دیده نمیشه!
    خواستم بدونم lcd تا چه حد به ولتاژ حساسه؟
    همچنین اگر ممکن نحوه تست سوختن lcd را بفرمایین؟

  7. سلام خسته نباشید به خاطر مطالب خوبتون هم ممنون.
    من یه مشکلی توی کار کردن با lcdکاراکتری دارم و اونم اینه که بعضی از مواقع وقتی برنامه نوشته و خوبم کامپایل و توی سیمولاتور بسکام تست میشه روی ال سی دی که پیاده سازی میکنم فقط نوشته های نامفهوم و اجخ وجخ درمیاد و هیچ کار هم نمیشه کرد.بحث های مربوط به کنتراست روهم رعایت میکنم و حتی پایه های داده ای استفاده نمیکنم روهم زمین میکنم ولی بازهم مشکل پابرجاست.لطفا کمکم کنید.مرسی

    • پایه های اضافی را به گراند وصل کنید. سیسم ها را درست وصل کنید. jtag را روی پورت c غیر فعال کنید. معمولا با این کارها مشکل حل میشه.

  8. سلام من میخوام در ردیف بالای ال سی دی سمت چپ اسم نمایش داده بشه و در ردیف پایین سمت راست فامیلی نمایش داده بشه بعد هر دو تا به سمت مخالف برن و برگردن
    میشه کمک کنین

  9. سلام،جایی دیدم که رو همین ال سی دی ۱۶×۲ کاراکترها رو خیلی بزرگ نشون میداد،یعنی برای نمایش یک حرف مثلا A از بیش از یک آرایه استفاده کرده بود و خیلی هم جالب بود.چطوری باید این کار رو کرد؟

پاسخ دهید

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

Time limit is exhausted. Please reload CAPTCHA.