آخرین نوشته‌ها
خانه | میکروکنترلر | ادوات جانبی | راه اندازی 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 بر اساس دما هم سر بزنید.

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

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

۴۹ ديدگاه

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

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

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

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

  3. سلام . خداقوت . مطلبتون کاملا عالی و کامل بود.
    من یه مشکل سخت افزاری دارم قبلا یکبار lcd را راه اندازی کردم و اطلاعات به درستی نمایش داده شد و میتونستم نور زمینه را تغییر بدم
    اما الان اصلا نور زمینه روشن نمیشه!!!!!!
    ممنون میشم راهنماییم کنید

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

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

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

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

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

  8. سلام …خسته نباشید…. لطفا قابلیت خواندن و نوشتن ال سی دی رو واضحتر توضیح بدید…یعنی عدد۵ رو با کیپد به ال سی دی وارد میکنیم و بعد میکرو عدد۵ رو از ال سی دی میخونه و دستور لازم رو اجرا میکنه درست میگم؟….

  9. با سلام و خسته نباشید ..من یه سوالی داشتم می خوام یه شمارنده درست کنم در lcd که تا ۵۹ بشمره .. لطفا کمکم کنید ممنون میشم

  10. من میکرو مگا ۳۲ هستش هنوز نتونستم روی ال سی دی پیاده سازیش کنم

    • مشکلتون چیه؟ کنتراست ال سی دی رو به خوبی تنظیم می کنین؟
      به کامنت های قبل مراجعه کنین، در جواب یکی از دوستان نحوه ی تنظیم کنتراست رو گفتم، نتیجه رو بهم بگین

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

    من نمی تونم ال سی دی را در فرکانس ۸ مگ خارجی روشن کنم

    مثلا یه شمارنده دو رقمی در فرکانس ۱ مگ داخلی کار می کند
    ولی در ۸ مگ خارجی هیچی نشون نمیده!!!

    لطفا راهنمایی کنید.ممنون

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

  12. سلام خسته نباشید
    نمایشگر رو که برای پروژه استفاده کردم مطالب رو درست نشون میده ولی نوسان می کنه علت این اتفاق مشکل برنامه نویسی هست یا ….
    با تشکر از شما

    • سلام به شما
      دلیل نوسان اشکال برنامه نویسی هست که به سرعت نوشته را پاک می کنید و دوباره می نویسید. کمی تاخیر استفاده کنید تا نوشته تثبیت شود

  13. سلام خسته نباشید مهندس
    اگه کتابخونه ای برای راه اندازی lcd داخل اتمل استودیو میشناسید، لطفا معرفی کنید. اگه لینک از منبع دیگه ای هم باشه مشکلی نداره فقط فارسی باشه!!! راستش خودم سرچ کردم ولی هیچ جا توضیح درستی پیدا نکردم. اگر به هردلیل امکانش وجود نداره، هیچ عیبی نداره همین که این آموزش های خوب رو قرار میدید، از نظر من کافیه!
    علت این که از کتابخونه ی کدویژن استفاده نمیکنم، وابستگی زیادش به ویزارده که نمیدونم چرا، ولی ازش خوشم نمیاد!
    یه پیشنهاد دیگه هم دارم؛ اینکه اگه بشه تو بخش آموزش زبان c، آموزشی در مورد نحوه نوشتن کتابخونه هم قرار بدید، چون تو موارد این چنینی، خیلی خیلی میتونه کمک کنه! تو اینترنت در این مورد هم سرچ کردم ولی چیز جالبی پیدا نمیشه…

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

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

        • ببخشید
          مثل اینکه فایل ضمیمه نشده بود. دوباره براتون ارسال میکنم.
          ا

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

          • نظر لطف شماست.
            خوشحالم که فایل ها براتون مفید بوده. حتما از پیش نهادهای خوب شما استقبال می کنیم و از این به بعد توجه بیشتری به کدهای مبتنی بر اتمل استدیو میشه.
            از همراهیتون بی نهایت سپاس گذاریم. 🙂

  14. سلام
    توی جدول پایه های ۱۵ و۱۶ جابجا نوشتید …

  15. سلام خدمت دوستان عزیز. ی سوال دارم و اونم اینه که:
    فرض کنید یک رشته ثابت مثلا”salam” رو داریم .میخواهم برنامه ای بنویسم که کاراکتر مثلاپنجم(m) رو روی lcd نمایش بده.چه طوری میشه؟؟؟؟

    • سلام به شما
      خب این رشته را داخل یک آرایه ذخیره کردین دیگه. حالا ببینید که حرف پنجم داخل کدوم خونه از آرایه ذخیره شده. دقیقا محتوای این خونه را که یک کاراکتر هست بفرستید به lcd.

  16. سلام
    واقعا تبریک میگم.عالی بود

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

    • سلام به شما دوست عزیز
      یک چنین ایرادهایی ۱۰۰ درصد به خاطر برنامه نویسی اشتباه رخ میده. ولی تا برنامه شما را نبینم نمیتونم هیچ نظری بدم. دستوراتی را که گفتید خودتون نوشتید یا از توابع آماده استفاده کردید؟

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

        • دوست عزیز اینجوری واقعا نمیشه فهمید برنامه داره چه کاری میکنه که حاصلش این اشتباهات میشه. بهتره کدت و فایل پروتئوست را برام ایمیل کنی تا بررسی کنم.
          eaca89@gmail.com

  18. سلام ممنون از مطلبتون
    ال سی دی من نسبت به پروگرام هیچ عکس العملی نشون نمیده
    من هفت پین رو توی کدویزارد تعیین کردم و بعد یه دستور LCD_puts تعریف کردم برنامه کامپایل میشه ولی ال سی دی عکس العملی نداره.سطر پایین ال سی دی توپره ولی سطر بالا نه آیا ال سی دی مشکل داره؟

    • سلام
      خوشحالیم که مطالبمون میتونه کمک کننده باشه.
      احتمالا مشکل از کنتراست ال سی دی هست. پایه های ۱ , ۲ , ۳ ال سی دی (VSS و VDD و VEE) رو به چه ترتیبی وصل کردین؟ از پتانسیومتر (مثل شماتیکی که توی یکی از کامنت ها آورده م) استفاده کردین؟ برنامه تون رو توی شبیه ساز پروتئوس تست کردین و جواب داده؟

      • تو پروتیوس جواب میده،پایه ها هم از پایه یک زمین وی سی سی و پتانسیونتر،پتانسیومتر رو که تغییر میدم کنتراست تغییر میکنه ولی نسبت به برنامه عکس العملی نداره

  19. سلام
    پایه های vdd و VEE به چی وصل شده؟
    برنامه رو میدم به تمگا اما چیزی نمایش نمیده

    • سلام
      علت نمایش ندادن، تنظیم نبودن کنتراست هست. برای این کار باید پین هایی که فرمودین رو طبق شکل زیر به Vcc و GND وصل کنید.

      • چرا RW رو دستی زمین کردین؟ دلیل خاصی داره؟

        • نه اصلا
          توی اکثر کاربردها نیازی نیست که مقداری رو از رجیسترهای LCD بخونیم و همیشه مقادیر داده و دستور رو داخل رجیسترهاش می ریزیم. به همین دلیل گاها به طور دستی پین RW رو صفر می کنن.
          وگرنه لزومی به این کار هم نیست و میشه که به هنگام ارسال داده و دستور به صورت نرم افزاری صفرش کرد.
          در خدمتم.

        • سلام علی جان.همانطور که دوست عزیزم مجتبی اشاره کرد خواندن از ریجیسترهای lcd معمول نیست.ولی یه نکته را در تکمیل گفته های آقا مجتبی میخواستم بگم که البته اون هم رایج نیست ولی گفتنش خالی از لطف نیست. اگر بعد از هر ارسال دستور و یا داده به ال سی دی پایه R/Wرا یک کنی پایه DB7 که در حالت معمولی به عنوان بیت شماره ۷ داده و دستور بکار میرود به عنوان پرچم وضعیت ال سی دی تغییر وظیفه می دهد. در این حالت میتونی با بررسی این پایه از اشتغال ال سی دی با خبر بشی.به این صورت که تا زمانی که این پایه یک باشد ال سی دی مشغول است و عملیات جدیدی را نمیپذیرد.به محض اینکه DB7 صفر شد ال سی دی آماده پذیرش عملیات جدید است. به جای استفاده از تاخیر زمانی مابین دستورات ال سی دی می توان ازاین روش هم استفاده کرد.

  20. سلام
    خیلی ممنون بابت وقتی که گذاشتید و این مطالب مفید رو آماده کردید.
    یک سوال
    در مد ۴ بیت، کجای کد قید شده که از کدوم پین میکرو برای اتصال به پایه های LCD استفاده شده. آیا کدویژن خودش در کتابخانه های داخلی این بیت ها رو ست میکنه؟؟؟

    • سلام به شما. خیلی خوشحال میشیم که به دوستانمون کمک کنیم و دانش و تجربه خودمون را به اون ها هم منتقل کنیم.
      برای مشخص کردن پورتی که میخواید به وسیله ی اون اطلاعات را به lcd ارسال کنید دو راه دارید. ۱- استفاده از کدویزارد در کدویژن ۲-نوشتن توابع به صورت دستی.
      در روش اول همون طور که در شکل هم مشخص شده شما باید داخل کدویزارد برای lcd کاراکتری پورت مورد نظر خودتون را تعیین کنید و دیگه نیازی به کدنویسی برای این کار ندارید. فقط کافیه کتابخانه alcd.h را include کنید.
      اما در روش دوم همون طور که در کد نویسی اول میبینید در خط شماره ۳ پورت مورد نظر برای این کار را خودمون تعریف کردیم.
      اگه بازم سوالی داشتید حتما بپرسید. 🙂

  21. سلام
    ببخشید من lcd وصل کردم به میکرو ولی فقط جعبه های سیاه رنگ نشون میده و متن رو lcd نشون نمیده

    • سلام. مشکل از کنتراست هست. شما باید پتانسیومتری را که وصل کردید بچرخونید تا نوشته ها مشخص باشه.از چه پتانسیومتری استفاده کردید؟

      • سلام من پتانسیومتر ۵ کیلو استفاده کردم ولی پتانسیومتر رو که میچرخونم کل جعبه سیاه ناپدید میشه و نوشته پیدا نمیشه

        • درسته. در واقع با چرخوندن پتانسیومتر باعث میشی که نوشته ها مشکی تر نمایش داده بشه. اگه این کارو میکنی و چیزی نشون داده نمیشه دلیلش میتونه چیزای زیادی باشه. مثلا کدنویسی برای lcd را اشتباه کردی. یا اینکه برای atmega32 اومدی lcd رو به پورت c وصل کردی و یادت رفته jtag را غیرفعال کنی. اول بگو میکروی که استفاده کردی چیه و به چه پورتی وصل کردی و کدی که نوشتی را برای من کامنت کن تا راهنماییت کنم.

          • از atmega 32 استفاده کردم به پورت A وصل کردم .
            /**********************

            Chip type : ATmega32A
            Program type : Application
            AVR Core Clock frequency: 16.000000 MHz
            Memory model : Small
            External RAM size : 0
            Data Stack size : 512
            *****************************************************/

            #include
            #asm
            .equ __lcd_port=0x1b;PORTA
            #endasm
            #include
            #include

            // Alphanumeric LCD functions
            // Declare your global variables here

            void main(void)
            {
            // Declare your local variables here

            PORTA=0x00;
            DDRA=0x00;

            PORTB=0x00;
            DDRB=0x00;

            PORTC=0x00;
            DDRC=0x00;

            PORTD=0x00;
            DDRD=0x00;

            // Analog Comparator initialization
            // Analog Comparator: Off
            // Analog Comparator Input Capture by Timer/Counter 1: Off
            ACSR=0x80;
            SFIOR=0x00;

            // Alphanumeric LCD initialization
            // Connections are specified in the
            // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
            // RS – PORTA Bit 0
            // RD – PORTA Bit 1
            // EN – PORTA Bit 2
            // D4 – PORTA Bit 4
            // D5 – PORTA Bit 5
            // D6 – PORTA Bit 6
            // D7 – PORTA Bit 7
            // Characters/line: 16
            lcd_init(16);
            delay_ms(50);
            while (1)
            {
            lcd_clear();
            lcd_gotoxy(3,0);
            lcd_putsf(“HELLO WORLD”);
            delay_ms(1000);

            }
            }

          • فرکانست خیلی زیاده کمش کنه(البته اشکال نداره ولی بهتری بذاری روی ۸ یا ۱۲ مگ که خطا کمتر بشه). در ضمن اتصال های تغذیه میکرو را مثال AVCC را حتما وصل کن. راستی یادت نره که الان داری lcd را در حالت ۴ بیتی راه اندازی میکنی پست ۴پین با ارزش کمتر مربوط به دیتا در lcd را حتما به زمین وصل کنی.حالا تابع main را به این شکل بنویس و بررسیش کن.


            void main(void){
            lcd_init(16);
            delay_ms(50);
            while (1){
            lcd_clear();
            lcd_gotoxy(3,0);
            lcd_putsf("HELLO WORLD");
            delay_ms(1000);
            }
            }

  22. ممنون از پست کاملتون. توی سایتای فارسی جزء بهترین توضیحاتی بود که در باره ی lcd تونستم پیدا کنم. ولی من یه سوالم داشتم. بهترین مقداری که پتانسیومتر متصل به پایه VEE میتونه داشته باشه تا کیفیت نمایش خوب باشه چقدره؟

    • سلام. ممنون از نظرتون. خب این بستگی به نظر شما داره. چون شما پتانسیومتر متصل به پین VEE را اون قدر تغیر می دید تا برای چشم شما در بهترین وضعیت قابل نمایش قرار بگیره.

پاسخ دهید

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

Time limit is exhausted. Please reload CAPTCHA.

کانال تلگرام میکرولرن
  • سلام دوست من :)
  • دوس داری AVR را ساده یاد بگیری؟
  • برنامه نویسی C را توی دانشگاه خوب یاد نگرفتی؟
  • از سایت های جذاب و تکنولوژیکی دنیا خبر داری؟
  • میونت با فیلمای با نمک و جذاب رباتیک چطوره؟
  • دنبال پروژه های جذاب برای دانشگاه یا کارای مورد علاقت میگردی؟
  • پس رو دکمه ی زیر یه تلنگر کوچولو بزن