آشنایی با LCD کاراکتری + توابع برنامه نویسی LCD ؟ [26](نویسنده: احسان نوری)
این جلسه با "LCD کاراکتری" و هم چنین توابعی که برای برنامه نویسی اون مورد نیازه آشنا میشیم.
پس با ما در ادامه مطلب همراه باشید ...
به نام خدا
سلام
این هم از ادامه آموزش ها ...
منتظر بقیه اش هم باشید !
امروز میخوایم دل و روده LCD رو بریزیم بیرون ببینیم توش چه خبره !
غیر ممکنه که با میکروکنترلر سروکله زده باشین و این قطعه رو ندیده باشین.(دیگه عکسشو که حتما دیدید ؟! )
ما هم برای نمایش خروجی های میکروکنترلرمون ازش استفاده میکنیم.بالاخره هرچی نباشه از سون سگمنت کاربردی تره !
سعی میکنم بحثو در عین مختصر بودن،بصورت مفید و کاربردی پیش ببرم و از بیان جزئیات خودداری کنم.چون اساس کارکرد LCD خودش یه مقاله است و گفتنش در این پست باعث طولانی تر شدن مبحث میشه و خدای ناکرده حوصلتونو سر میبره !
واژه LCD مختصر شده "Liquid Crystal Display" بوده که خودش ترکیبی از دو حالت ماده یعنی Liquid (مایع) و Solid (جامد) میباشد.
بصورتی که در عین حال هم حالت مایع بودن و هم حالت جامد بودن اون حفظ میشه !
مواد جامد تمایل به حفظ حالت خود دارند و بالعکس مواد مایع تمایل به حرکت به هر قسمت از مایع مورد نظر دارند.اما مطالعات نشون داده که کریستال مایع(Liquid Crystal) بیشتر خاصیت مایع از خودش نشون میده تا جامد ! (الله اکبــــــــــــر !!! )
همچنین لازم بذکره که کریستال مایع نسبت به مواد مایع معمولی به دما حساسیت بیشتری داره !
بطوریکه با اندک دمای ممکن کریستال مایع به مایع تغییر شکل میده !
بحث شیمی دیگه بسه !
ما را با شیمی کاری نیست ... خخخخخ ...
به عکس زیر یه نگاه بندازید :
میبینید که برای نمایش هر کاراکتر روی LCD چه فرایندی طی میشه !
توضیح اینکه هرکدوم از لایه های بالا وظیفه شون چیه و باید از چه جنسی ساخته بشن و شرایط طراحیشون چیه اصلا به موضوع بحث ما ربطی نداره ! چون ما نمیخوایم LCD بسازیم!
قبل از همه بگم که LCD ها انواع مختلفی دارند که معمول ترین اونها : 1.LCD کاراکتری 2.LCD گرافیکی 3.LCD رنگی هستند.
که در این پست فقط نوع کاراکتریشو بررسی میکنیم !
غالبا برای مدارهای آزمایشگاهی و پروژه های دم دستی از LCD با سایز 2*16 استفاده میشه که معنا و مفهوم عبارت روبروی اون اینه که LCD دارای 2 سطر و 16 ستونه!
سطر و ستونِ چی ؟!
میگم برات ...
ببین عزیزم
عکس زیرو نگاه کن :
اگه دقت کنی و ریز بشی به عکس،داخل صفحه نمایش یه سری مستطیل هایی میبینی !
دیدی ؟! (دلم آب هویج خواست ).
هرکدوم از این مستطیل ها وظیفه نمایش یک کاراکتر رو برعهده دارند.
برای مثال اگه خواستیم اسم Ehsan رو روی این LCD نمایش بدیم،پنج کاراکتر (5 مستطیل) از LCD بالا اشغال میشه.
حالا وقتی میگیم که LCD ما 16 ستون داره یعنی؛در یک سطرش میتونه 16 کاراکترو نشون بده !
ادامه بحث ...
پشت هر LCD یه دونه چیپست (Chipset) هست که رابط کاربری بین میکرو و نمایشگر به حساب میاد.
یکی از نمونه های معروف این چیپست،مدل HD44780 هیتاچیِ ـه !
که البته نمونه مورد استفاده ما هم هست.
و البته یه سری مشخصات دیگه هم هست که از LCD به LCD متفاوته و بستگی به کارخانه سازنده اون داره که از گفتن اون صرفنظر میکنم.
در عکس زیر دوتا دایره سیاه رنگ میبینید که زیرش اون چیپستی که گفتم قرار گرفته :
اگه دقت کنید در قسمت بالا سمت راست،16 تا پین قرار داره.
در سمت چپ و راست هم دوتا پین قرار داره.
به انضمام پینهای دیگری که جهت بکاربردن خازن و تراشه های خاصه،که بیشتر به کار سازنده میاد تا کاربر !!!
روی بورد تعدادی مقاومت هم دیده میشه !
و حالا میریم بررسی کنیم تک تک پین ها رو ...
شماره پین | نام پین | وظیفه |
1 | VSS | ولتاژ زمین |
2 | VCC | +5 ولت |
3 | VEE | ولتاژ کنتراست |
4 | RS | Register Select 0=Instruction Register 1=Data Register |
5 | R/W | Read / Write 0=Write Mode 1=Read Mode |
6 | E | Enable 0=Start To Latch Data To LCD 1=Disable |
7 | DB0 | بیت دیتا 0 |
8 | DB1 | بیت دیتا 1 |
9 | DB2 | بیت دیتا 2 |
10 | DB3 | بیت دیتا 3 |
11 | DB4 | بیت دیتا 4 |
12 | DB5 | بیت دیتا 5 |
13 | DB6 | بیت دیتا 6 |
14 | DB7 | بیت دیتا 7 |
15 | BPL | نور پس زمینه (ولتاژ 5 ولت یا کمتر)(اختیاری) |
16 | GND | ولتاژ زمین(اختیاری) |
خب ...
سه تا پین اول که مشخصه ! (برای من که مشخصه ! .اگه برای شما نیست باید منتظر بمونید تا تو کارگاه عملی ببنید.)
سه تا پین کنترلی داریم (پین های 4 و 5 و 6 ) ؛ (این سه تا پین به میکرو وصل میشن و خواهید دید که ما بصورت مستقیم باهاشون وَر نمیریم ! )
پین RS : در LCD دو رجیستر داریم.یکی به نام Instruction و دیگری به نام Data.حالا اگه مقدار RS=0 باشه LCD آماده میشه که Instruction (دستور العمل) دریافت کنه و اگه RS=1 باشه LCD آماده میشه که Data (اطلاعات) دریافت کنه.
پین R/W : دو وضعیت در LCD داریم؛خواندن و نوشتن ! اگه R/W=0 باشه یعنی میخوایم روی LCD بنویسیم و اگه R/W=1 باشه یعنی میخوایم از روی LCD بخونیم.
پین E : با این یکی پین هم میشه LCD و فعال و غیر فغال کرد ! اگه E=0 باشه LCD فعال میشه و اگه E=1 باشه LCD غیرفعال میشه.
8 پین دیتا داریم (پین های 7 تا 14) :
پین DB0,DB1,DB2,DB3,DB4,DB5 : جهت گرفتن دیتا از LCD بکار میروند.
پین DB6,DB7 : جهت ارسال دیتا به LCD بکار میروند.
مُد 8 بیتی :
در این مُد هر 8 پین LCD به میکرو کنترلر وصل میشند + 3 پین کنترلی
این مُد سرعت بیشتری نسبت به اون یکی مُد داره و دقیق تره .
اما اگه دقت کنید مفت و مجانی 11 تا پین از میکرو رو اشغال میکنه !
نمیشه گفت بَده ولـــــــــــــــــی ادامه بحثو بخونید ...
مُد 4 بیتی :
در این مد تنها 4 پین با ارزش بیشتر (DB4,DB5,DB6,DB7) به میکرو وصل میشوند + 3 پین کنترلی
این مُد سرعت کمتری نسبت به مُد 8 بیتی داره و دقتش هم برای انجام کارهای معمولی مناسبه.
خوبیش اینه که تنها 7 پین از میکروکنترلر اشغال میشه.
در این حالت 4 پین دیتای اولی (DB0,DB1,DB2,DB3) رو هوا وِل نگه داشته میشه.(تا یخورده باد بخوره به کله اش! ) ==> البته بد نیست که این 4 تا پین به زمین وصل بشند !
یه دیاگرامی داریم اینجا،خوب چییزیه،حتما ببینید :
حالا اگه قرار باشه که LCD مونو به میکرو وصل کنیم اینجوری وصلش میکنیم :
در شکل بالا برای مثال PORTC رو به LCD وصل کردیم.
اینجور که پیداست سه پین اول از پورت C به پایه های کنترلی و چهار پین آخر به پایه های دیتا وصل شدند.
دقت کنید که چجوری پین های LCD به پین های میکرو وصل شدند !
خیلی مهمه این قضیه ! بعدا براتون میگم که چرا اینجوری بستیم پین ها رو !!!
پین VEE هم به یک پتانسیومتر وصل شده و علت استفاده از پتانسومتر اینه که توسط اون بتونیم نور صفحه نمایشو مطابق مِیلِمون تغییر بدیم.
خب.
کم کم آماده بشید که میخوایم بریم سراغ معرفی توابع !
اگر یادتون باشه بالاتر گفتیم که 3 تا پایه کنترلی داریم و چندتا پایه دیتا !
یادتونه که ؟!
در واقع ما وقتی که میخوایم به LCD اطلاعاتی برای نمایش بفرستیم،همینجوری نیست که خیلی راحت اطلاعات ارسال بشند و ما نتیجه رو ببینیم .
یه فرایندی انجام میشه که سرانجامش اینه که چشای ما عبارت داخل LCD رو میبینه !
چه فرایندی ؟
ببینید :
مثلا فرایند بالا برای راه اندازی اولیه LCD انجام میشه و برای نمایش یک عبارت روی LCD کلی دستور و فرامین توسط برنامه نویس باید نوشته بشه تا روی نمایشگر نتیجه دیده بشه.
اینم یه فلوچارت از مُد 4 بیتی :
به لطف وجود کتابخانه های آماده موجود در سطح نت،ما بطور مستقیم با LCD کار نمیکینم ! (برید خدا رو شکر کنید)
بلکه توسط چند تا تابع مشخص که ورودی و خروجی هاشون برای برنامه نویسی مث من و شما مشخص شده این عمل انجام میپذیره !
چون برنامه نویسی ما تحت نرم افزار کدویژن صورت میپذیره،ما هم از کتابخونه آماده ای که داخل خود نرم افزار هست استفاده میکنیم و کاری به کتابخونه های مجزایی که وجود داره نداریم !
اما تا یادم نرفته بگم که چرا بالاتر گفتم حتما باید LCD به پایه های مشخص از میکروکنترلر وصل بشه ؟!
دلیلش همینه !
کدوووم ؟!
همین دیگه !!!
.
.
.
ای بابا ...
همین کتابخونه ای که میخوایم ازش استفاده کنیمو میگم !
اون بابایی که این کتابخونه رو نوشته،نحوه اتصال پین های LCD به پین های میکرو رو اینجوری تعریف کرده !
ما هم مخلصش هستیم !!!! (بچه با مرامیه ! ببین چقدر داره کارمونو راه میندازه !)
اما اینجا اجباری در کار نیست که الّا و بلّا حتما باید پین ها اینجوری بسته بشن !
بلکه میتونیم از داخل کتابخونه این پین ها رو تغییر بدیم.
و خودمون پیکره بندی کنیم LCD رو !
بهههههههههههههله ....
اول از همه خود کتابخانه رو معرفی میکنم :
lcd.h
کافیه که این کتابخونه رو اول نرم افزارتون لوووووووود کنید !
بقیه برنامه نویسیتون فقط به استفاده از چندتا تابع که در ادامه معرفی میکنیم محدود میشه و ما هم که دنبال راحتی هستیم و چندتا نقطه .... خخخ...
کلا 11 تا تابع داخل این کتابخونه تعریف شده که تک تک همشونو بررسی میکنیم :
توابع سطح پایین ؛ توابعی که ارتباط تنگاتنگی با سخت افزار دارند و برنامه نویسیشون بیشتر به زبان ماشین شباهت داره ! :
1.
void _lcd_ready(void);
با صدا زدن این تابع در برنامه،میکروکنترلر منتظر آماده شدن LCD برای دریافت اطلاعات میشه.
2.
void _lcd_write_data(unsigned char data);
وظیفهی این تابع مقدار دهی رجیستر درون LCD میباشد.این رجیستر برای تنظیم کردن LCD استفاده میشه.
3.
void lcd_write_byte(unsigned char addr, unsigned char data);
این تابع اطلاعات را در آدرس مشخص شده در حافظه LCD میریزد.
4.
unsigned char lcd_read_byte(unsigned char addr);
این تابع اطلاعات درون آدرس مشخص از حافظه LCD را میخواند.
توابع سطح بالا ؛ توابعی که ارتباطشون با سخت افزار کمتره و برنامه نویسیشون ساده تر ! :
5.
void lcd_gotoxy(unsigned char x, unsigned char y);
این تابع مکان نمای LCD را به ستون x و سطر y منتقل میکند.
6.
void lcd_clear(void);
این تابع صفحه نمایشو پاک میکنه و مکان نما به سطر صفر و ستون صفر منتقل میشه.
7.
void lcd_putchar(char c);
این تابع کاراکتر "c" (در اینجا اسم متغیر c تعریف شده) را بر روی نمایشگر LCD نمایش میدهد.
8.
void lcd_puts(char *str);
این تابع رشته str (اسم متغیر str تعریف شده) را که در حافظه SRAM ذخیره شده بر روی LCD نمایش میده.
9.
void lcd_putsf(char flash *str);
این تابع رشته str که در حافظه FLASH وجود داره رو روی LCD نمایش میده.
10.
unsigned char lcd_init(unsigned char lcd_columns);
این تابع جهت پیکره بندی LCD مورد استفاده قرار میگیره،صفحه نمایش را پاک میکنه و مکان نما را به سطر صفر و ستون صفر منتقل میکنه.
ورودی این تابع تعداد ستون های LCD مورد استفاده ما رو مشخص میکنه.
خروجی این تابع هم در صورتیکه LCD ای وجود داشته باشه 1 رو برمیگردونه !
11.
void lcd_control (unsigned char control);
این تابع بایت کنترلی را در LCD مینویسد.
شاید با دیدن این همه تابع عجیب و غریب الان موهای بدنتون سیخ شده باشه !
اما نگران نباشید ...
چون ما با همهی این توابع کار نمیکنیم !!!!
در واقع ما در برنامه نویسی هامون از توابع سطح بالا استفاده میکنیم و در استفاده از توابع سطح پایین که به کاربردهای خاصی نظیر استفاده از کاراکترهای ویژه و خاص محدود میشه،صـــــــــــــــرفه جویی میکنیم !
در کارگاه عملی بعدی سعی میشه از LCD استفاده بشه تا کار باهاشو یاد بگیرین و برای خودتون اوستا بشییین.
وعده دیدار بعدی ما بعد از امتحانات پایان ترم انشاالله...
منبع : www.noise.blog.ir