.:: نویز | آموزش AVR | میکروکنترلر | الکترونیک ::.

وبلاگ آموزشی احسان نوری ::: Ehsan Nouri's Weblog

.:: نویز | آموزش AVR | میکروکنترلر | الکترونیک ::.

وبلاگ آموزشی احسان نوری ::: Ehsan Nouri's Weblog

" نویز رسانه ای است برای آموزش آسان مفاهیم میکروکنترلر و الکترونیک "

دریافت مستندات
آخرین نظرات
  • ۱۵ آبان ۹۵، ۱۸:۵۸ - الهام
    ممنون


این جلسه با "LCD کاراکتری" و هم چنین توابعی که برای برنامه نویسی اون مورد نیازه آشنا میشیم.

 

پس با ما در ادامه مطلب همراه باشید ...

 

به نام خدا

 

سلام

 

این هم از ادامه آموزش ها ...

منتظر بقیه اش هم باشید !

 

امروز میخوایم دل و روده LCD رو بریزیم بیرون ببینیم توش چه خبره !

 

غیر ممکنه که با میکروکنترلر سروکله زده باشین و این قطعه رو ندیده باشین.(دیگه عکسشو که حتما دیدید ؟! laugh)

ما هم برای نمایش خروجی های میکروکنترلرمون ازش استفاده میکنیم.بالاخره هرچی نباشه از سون سگمنت کاربردی تره !

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

 

 

واژه LCD مختصر شده "Liquid Crystal Display" بوده که خودش ترکیبی از دو حالت ماده یعنی Liquid (مایع) و Solid (جامد) میباشد.

بصورتی که در عین حال هم حالت مایع بودن و هم حالت جامد بودن اون حفظ میشه !

مواد جامد تمایل به حفظ حالت خود دارند و بالعکس مواد مایع تمایل به حرکت به هر قسمت از مایع مورد نظر دارند.اما مطالعات نشون داده که کریستال مایع(Liquid Crystal) بیشتر خاصیت مایع از خودش نشون میده تا جامد ! (الله اکبــــــــــــر !!! surprise)
همچنین لازم بذکره که کریستال مایع نسبت به مواد مایع معمولی به دما حساسیت بیشتری داره !

بطوریکه با اندک دمای ممکن کریستال مایع به مایع تغییر شکل میده !

 

بحث شیمی دیگه بسه !

ما را با شیمی کاری نیست ...   خخخخخ ...

 

به عکس زیر یه نگاه بندازید :

 

 

میبینید که برای نمایش هر کاراکتر روی LCD چه فرایندی طی میشه !

توضیح اینکه هرکدوم از لایه های بالا وظیفه شون چیه و باید از چه جنسی ساخته بشن و شرایط طراحیشون چیه اصلا به موضوع بحث ما ربطی نداره ! چون ما نمیخوایم LCD بسازیم!

 

 

قبل از همه بگم که LCD ها انواع مختلفی دارند که معمول ترین اونها : 1.LCD کاراکتری   2.LCD گرافیکی    3.LCD رنگی  هستند.

که در این پست فقط نوع کاراکتریشو بررسی میکنیم !

 

غالبا برای مدارهای آزمایشگاهی و پروژه های دم دستی از LCD با سایز 2*16 استفاده میشه که معنا و مفهوم عبارت روبروی اون اینه که LCD دارای 2 سطر و 16 ستونه!

سطر و ستونِ چی ؟!

میگم برات ...

ببین عزیزم heart

عکس زیرو نگاه کن :

اگه دقت کنی و ریز بشی به عکس،داخل صفحه نمایش یه سری مستطیل هایی میبینی !
دیدی ؟! (دلم آب هویج خواست cheeky).
هرکدوم از این مستطیل ها وظیفه نمایش یک کاراکتر رو برعهده دارند.

برای مثال اگه خواستیم اسم 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 ولتاژ زمین(اختیاری)

خب ...

سه تا پین اول که مشخصه ! (برای من که مشخصه ! cheeky.اگه برای شما نیست باید منتظر بمونید تا تو کارگاه عملی ببنید.)

 

سه تا پین کنترلی داریم (پین های 4 و 5 و 6 ) ؛ (این سه تا پین به میکرو وصل میشن و خواهید دید که ما بصورت مستقیم باهاشون وَر نمیریم ! laugh)

پین 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 بکار میروند.

 

LCD میتونه در دو مُد کار کنه ؛

مُد 8 بیتی :
در این مُد هر 8 پین LCD به میکرو کنترلر وصل میشند + 3 پین کنترلی
این مُد سرعت بیشتری نسبت به اون یکی مُد داره و دقیق تره .
اما اگه دقت کنید مفت و مجانی 11 تا پین از میکرو رو اشغال میکنه ! sad
نمیشه گفت بَده ولـــــــــــــــــی ادامه بحثو بخونید ...



مُد 4 بیتی :
در این مد تنها 4 پین با ارزش بیشتر (DB4,DB5,DB6,DB7) به میکرو وصل میشوند + 3 پین کنترلی
این مُد سرعت کمتری نسبت به مُد 8 بیتی داره و دقتش هم برای انجام کارهای معمولی مناسبه.
خوبیش اینه که تنها 7 پین از میکروکنترلر اشغال میشه.
در این حالت 4 پین دیتای اولی (DB0,DB1,DB2,DB3) رو هوا وِل نگه داشته میشه.(تا یخورده باد بخوره به کله اش! cheeky) ==> البته بد نیست که این 4 تا پین به زمین وصل بشند !

یه دیاگرامی داریم اینجا،خوب چییزیه،حتما ببینید :
(روش بکلیکید تا چشاتون لووچ نشه !)

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

حالا اگه قرار باشه که LCD مونو به میکرو وصل کنیم اینجوری وصلش میکنیم :

 

در شکل بالا برای مثال PORTC رو به LCD وصل کردیم.

اینجور که پیداست سه پین اول از پورت C به پایه های کنترلی و چهار پین آخر به پایه های دیتا وصل شدند.

دقت کنید که چجوری پین های LCD به پین های میکرو وصل شدند !

خیلی مهمه این قضیه ! بعدا براتون میگم که چرا اینجوری بستیم پین ها رو !!!

پین VEE هم به یک پتانسیومتر وصل شده و علت استفاده از پتانسومتر اینه که توسط اون بتونیم نور صفحه نمایشو مطابق مِیلِمون تغییر بدیم.

 

خب.

کم کم آماده بشید که میخوایم بریم سراغ معرفی توابع !

 

اگر یادتون باشه بالاتر گفتیم که 3 تا پایه کنترلی داریم و چندتا پایه دیتا !

یادتونه که ؟!

 

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

یه فرایندی انجام میشه که سرانجامش اینه که چشای ما عبارت داخل LCD رو میبینه !cool

چه فرایندی ؟

ببینید :

 

مثلا فرایند بالا برای راه اندازی اولیه LCD انجام میشه و برای نمایش یک عبارت روی LCD کلی دستور و فرامین توسط برنامه نویس باید نوشته بشه تا روی نمایشگر نتیجه دیده بشه.

 

اینم یه فلوچارت از مُد 4 بیتی :

 

به لطف وجود کتابخانه های آماده موجود در سطح نت،ما بطور مستقیم با LCD کار نمیکینم ! (برید خدا رو شکر کنید) wink

بلکه توسط چند تا تابع مشخص که ورودی و خروجی هاشون برای برنامه نویسی مث من و شما مشخص شده این عمل انجام میپذیره !

چون برنامه نویسی ما تحت نرم افزار کدویژن صورت میپذیره،ما هم از کتابخونه آماده ای که داخل خود نرم افزار هست استفاده میکنیم و کاری به کتابخونه های مجزایی که وجود داره نداریم !

 

اما تا یادم نرفته بگم که چرا بالاتر گفتم حتما باید LCD به پایه های مشخص از میکروکنترلر وصل بشه ؟!

دلیلش همینه !

کدوووم ؟!

همین دیگه !!!

.

.

.

ای بابا ...

همین کتابخونه ای که میخوایم ازش استفاده کنیمو میگم !

اون بابایی که این کتابخونه رو نوشته،نحوه اتصال پین های LCD به پین های میکرو رو اینجوری تعریف کرده !

ما هم مخلصش هستیم !!!!  (بچه با مرامیه ! ببین چقدر داره کارمونو راه میندازه !)

 

اما اینجا اجباری در کار نیست که الّا و بلّا حتما باید پین ها اینجوری بسته بشن !

بلکه میتونیم از داخل کتابخونه این پین ها رو تغییر بدیم.

و خودمون پیکره بندی کنیم LCD رو !

 

بهههههههههههههله ....

 

اول از همه خود کتابخانه رو معرفی میکنم :

lcd.h

 

کافیه که این کتابخونه رو اول نرم افزارتون لوووووووود کنید ! yes

 

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

کلا 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 مینویسد.

 

شاید با دیدن این همه تابع عجیب و غریب الان موهای بدنتون سیخ شده باشه !

اما نگران نباشید ...

چون ما با همه‌ی این توابع کار نمیکنیم !!!!

در واقع ما در برنامه نویسی هامون از توابع سطح بالا استفاده میکنیم و در استفاده از توابع سطح پایین که به کاربردهای خاصی نظیر استفاده از کاراکترهای ویژه و خاص محدود میشه،صـــــــــــــــرفه جویی میکنیم ! cheeky

در کارگاه عملی بعدی سعی میشه از LCD استفاده بشه تا کار باهاشو یاد بگیرین و برای خودتون اوستا بشییین.

 

وعده دیدار بعدی ما بعد از امتحانات پایان ترم انشاالله...

که مبحث شیرین PWM را بررسی خواهیم کرد ...

با سلام وعرض تشکر انشالله امتحانات خوش بگذره
منتظریم برای مبحث شیرین بعدی(pwm)
پاسخ:
انشاالله
سلام 
واقعا دست گلت درد نکنه خدا خیرت بده با این آموزشت امیدوارم به نوشتن آموزشهای AVR ادامه بدی و همیشه شاد و موفق باشی. بی صبرانه منتظر آموزشهای بعدیت هستم .
پاسخ:
ممنون
ایشالله ایام امتحانات بهت خوش بگذره.....
منتظرتیم .... 
پاسخ:
تشکر
دمت گرم
پاسخ:
ممنون
دوست عزیزم من شما رو نمیشناسم ولی واقعا از صمیم قلب بهترینها رو براتون ارزو دارم. دوست دارم هرخطی رو که ازتون یاد میگیرم تشکر کنم... واقعا دست میزاد...خیلی باانرِِِِزی هم هستی..
سپاس فراوان برادر
پاسخ:
مخلصیم !
آقا خیلی کارت درسته.من که یخورده دیر فهم هستم با آموزش شما خیلی خوب دارم یاد می
گیرم. :)
اجرت با خدا
پاسخ:
آفرین.
۲۹ دی ۹۳ ، ۲۰:۳۰ دوست دارت
سلام
 مچکرم مطالبتون خیلی مفیده .پایدار باشین و ادامه بدین
پاسخ:
حتما
سلام
همچنان منتظر ادامه آموزش شما در مورد مبحث شیرین PWM هستیم
ممنون از زحماتتون
پاسخ:
حتما

ممنون خیلی خوب بود

واقعا از این ساده تر نمیشه توضیح داد

پاسخ:
سپاس

سلام علکم و یه خسته نباشی مشتی

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

بازم دمت گرم و منتظر ادامه اموزشها هستم

پاسخ:
تشکر
سلام.من اولین باری هست که میخوام به زبان Cبرنامه برای میکرو کنترولر بنویسم.قبلا با زبان اسمبلی کار می کردم.اگر امکانش هست برنامه زیر رو برام بنویسید با این کار نکته هایی که نمیدونم رو متوجه میشم.
برنامه ایی بنویسید که اطلاعاتی را از پورت Aگرفته و در پورت B نمایش دهد؟خیلی برنامه ی پیش پا افتاده ایی هست اما اگه برام حلش کنید واقعا ممنون میشم.
پاسخ:
خیلی آسونه
اما شرمنده،نمی تونم به سوالات موردی پاسخ بدم !
سلام مهندس،lcd گرافیکی رو توضاح نمیدید در یک پست جداکانه؟
پاسخ:
در آینده ...
سلام چطوری موندم بهتون بگم که مطالب سایتتون عالی بود یعنی خیلی عالی عالی  و یه سوال ایا مطالب جدید روی سایت نمی ذارید ؟
پاسخ:
سلام
ممنون
معلوم نیست ...
آقا ممنون خیلی خوب بود
سلام.
خیلی ممون بابت اموزشتون.
من با پروتیوس جواب گرفتم ولی عملی کار نمیکنه.صفحه روشن میشه ها ولی چیزی نشون نمیده.ایراد از چیه:(  دیوونه شدم انقد معطلش شدم:(
سلام
آخر نتوانستم با زبان اسمبلی lcd 1620  را با میکرو راه اندازی کنم
LCD  1620  TechMart  c0421A
, GRAPHIC  LCD 12864A -PGH
فقط صفحه روشن میشه
اما

سلام.خیلی خوب بود.دمت گرم.


سلام
میشه متن lcd رو به صورت عمودی نمایش داد
سلام یه سوال فقط خیلی زود جواب بدید من یک ATMEGA 32 دارم و کدی که زدم روی پورت B نوشتم باید چیکار کنم کدم به پورت C تغییر بدم ممنون میشم خیلی زود جوابم بدید.
موفق باشید
عالی
باسلام
چه جوری میشه متن نوشته شده روی lcd را خواند با دستور
lcd_read_byte
لطفا با مثال توضیح دهید
عالی!
سلام و خسته نباشید... من یک سوالی دارم که عملا کلّه اینترنتو هم به فارسی هم انگلیسی زیر و رو کردم ولی ظاهرا عمرا کسی جواب نداده متاسفانه! یعنی اصلا کسی نپرسیده راجع بهش! ولی اینجا یک دوستی پرسیدن! سوالم اینه: 
چطور میشه از ال سی دی گرافیکی 64*128 در حالت عمودی استفاده کرد؟ منظورم اینه همیشه همه ال سی دی رو به شکل افقی استفاده میکنن! اگه کسی بخواد عمودی استفاده کنه چطور باید اینکارو بکنه؟!؟!؟! در واقع منظورم چرخش 90 درجه ای در نوشته های هست! دقیقا مثل Auto routate  که توی موبایل و تبلتهامون داریم، و با چرخوندن تبلت، صفحه مثلا از افقی به عمودی تبدیل میشه، برای ال سی دی 64*128 گرافیکی هم به شکا پیش فرض همین کارو کنیم؟!؟!؟!
بازهم سپاس بسیار بسیار فراوان!!!!

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">