در ادامه پروژه های اموزشی میکروکنترلر AVR , در این پست با نحوه راه اندازی و نوشتن متن روی LCD کاراکتری اشنا می شوید. از LCD های کاراکتری در پروژه های مختلف استفاده می شود که برای نمایش خروجی شامل متن, اعداد و مقادیر و … کاربرد دارد . در این پروژه از میکروکنترلر ATmega16 و lcd کاراکتری 16*2 استفاده شده است, برای اشنایی با پین های مگا 16 اینجا کلیک کنید.
اشنایی با lcd کاراکتری 16*2 :
منظور از 16*2 تعداد سطرها و ستون های این lcd می باشد که دارای 2 سطر و 16 ستون است, lcd های کاراکتری با تعداد سطر و ستون های مختلف وجود دارند که بسته به نیازتان یکی از انها را انتخاب می کنید ولی معروف ترین و پرکاربرد ترین انها lcd 2*16 می باشد.
پایه ها :
همانطور که در تصویر بالا مشاهده می کنید این lcd دارای 16 پین می باشد که پین های 7 تا 14 پین های دیتا می باشند و درصورتی که از lcd در مد 8 بیتی استفاده کنید, این 8 پین باید به میکرو وصل شوند. ولی معمولا در مد 4 بیتی از این lcd استفاده می شود که باعث می شود پین های کمتری از میکرو را اشغال کند (تفاوت مد 8 و 4 بیتی این است که در مد 8 بیتی سرعت نسبت به 4 بیتی بیشتر است)
پین های 1 و 2 برای اتصال تغذیه می باشند که پین 1 به منفی و پین 2 به مثبت 5 ولت وصل می شود. پین یا پایه ی 3 برای تنظیم کنتراست lcd می باشد که برای تنظیم میزان کنتراست به یک پتانسیومتر متصل می شود (اگه پتانسیومتر نداشتید میتونید به منفی وصل کنید)
پین های 4 تا 6 پین های کنترلی می باشند. پایه های 15 و 16 برای تنظیم نور پس زمینه می باشند که معمولا به همان تغذیه 5 ولت وصل می کنند. (16 به منفی و 15 به مثبت)
کتابخانه کدویژن lcd کاراکتری :
در پست ” LED چشمک زن با میکروکنترلر AVR ” در مورد کتابخانه ها توضیح داده شد که به منظور راحتی ما برای کار کردن با قطعات و ماژول های مختلف از کتابخانه ی ان قطعه در کدویژن استفاده می کنند. به همین منظور کتابخانه lcd کاراکتری به همراه توابع مهم ان در ادامه توضیح داده شده است :
برای استفاده از این کتابخانه در ابتدای برنامه, باید به شکل زیر فراخوانی شود. البته توجه کنید در صورتی که توسط کدویزارد lcd کاراکتری را فعال کنید, کدویژن خودش این کتابخانه را به ابتدای برنامه اضافه می کند
1 |
#include <alcd.h> |
تابع زیر برای تعیین موقعیت نمایش کاراکتر lcd می باشد (ستون x و سطر y)
1 |
void lcd_gotoxy(unsigned char x, unsigned char y); |
تابع زیر کل صفحه نمایش lcd را پاک می کند
1 |
void lcd_clear(void); |
تابع زیر برای ارسال یک کاراکتر به lcd می باشد
1 |
void lcd_putchar(char c); |
تابع زیر برای نمایش یک رشته کاراکتری ذخیره شده در حافظه RAM میکرو روی lcd استفاده می شود
1 |
void lcd_puts(char *str); |
تابع زیر برای نمایش یک رشته کاراکتری ذخیره شده در حافظه Flash میکرو روی lcd استفاده می شود
1 |
void lcd_putsf(char flash *str); |
تابع زیر جهت پیکره بندی LCD مورد استفاده قرار میگیرد, که ورودی ان تعداد ستون lcd می باشد و خروجی ان در صورت اتصال lcd یک می باشد
1 |
unsigned char lcd_init(unsigned char lcd_columns); |
در ادامه با نحوه استفاده از برخی از این توابع در برنامه اشنا می شوید
شماتیک پروژه نوشتن متن روی LCD کاراکتری :
شماتیک بسیار ساده است و نیاز به توضیح خاصی نیست, فقط ممکن است سوال پیش اید که چرا lcd به این شکل به میکرو متصل شده است؟ ما در کدویزارد خودمان مشخص میکنیم که lcd به کدام پورت و پین ها متصل باشد. تنظیمات قسمت lcd کاراکتری در کدویزارد برای این پروژه به شکل زیر تنظیم شده است
برنامه :
یک پروژه جدید در کدویژن ایجاد کنید, میکرو را ATmega16 و فرکانس را روی یک مگاهرتز تنظیم کنید. از انجایی که قرار است lcd را به پورت c متصل کنیم پس در قسمت ports تمام پین های پورت c را خروجی تنظیم کنید و تنظیمات قسمت lcd را هم مانند تصویر بالا انجام دهید .
برنامه این پروژه به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <mega16.h> /* معرفي کتابخانه مگا 16 */ #include <alcd.h> /* lcd معرفي کتابخانه */ #include <delay.h> /* delay معرفي کتابخانه */ void main(void) { DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0); /* C خروجي کردن تمام پين هاي پورت */ PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); /* مقاومت بالاکش نداشته باشد C هيچ کدام از پين هاي پورت */ lcd_init(16); /*(LCD بررسي اتصال) LCD پيکره بندي */ while (1) /* حلقه بينهايت براي تکرار برنامه */ { lcd_clear(); /* LCD پاک کردن */ lcd_gotoxy(2,0); /* رفتن به ستون 2 و سطر 0 */ lcd_putsf("WWW.EMIC.IR"); /* LCD روي WWW.EMIC.IR نوشتن */ delay_ms(2000); /* ايجاد تاخير به مدت 2 ثانيه */ lcd_clear(); /* LCD پاک کردن */ lcd_gotoxy(0,0); /* رفتن به ستون 0 و سطر 0 */ lcd_putsf("Electronic and"); /* LCD روي Electronic and نوشتن */ lcd_gotoxy(0,1); /* رفتن به ستون 1 و سطر 0 */ lcd_putsf("Microcontroller"); /* LCD روي Microcontroller نوشتن */ delay_ms(3000); /* ايجاد تاخير به مدت 3 ثانيه */ } } |
توجه کنید که تمام کدها بجز کدهای داخل حلقه while توسط خود کدویژن ایجاد می شود. توضیحات برنامه نوشته شده و شما می توانید مقادیر و متن دلخواه خود را جایگزین کنید و برنامه را به دلخواه خود تغییر دهید.
کلیپ شبیه سازی در پروتئوس :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره …
سلام پورت C برای استفاده مشکلاتی داره , من چندین بار تمام مراحل رو تکرار کردم آخرش از پورت A استفاده کردم و نتیجه گرفتم .
سلام, احتمالا فیوزبیت jtag فعال است که برای استفاده از پورت C این فیوزبیت را هنگام پروگرام کردن میکرو غیرفعال کنید.
سلام پروژه رو اجرا کردم ولی فقط دو سطر در LCD به صورت مربع نمایش میده ؟ پایه های 10 و 11 رو به مثبت و منفی وصل کردم . پتانسیومتر نداشتم .
سلام, باید برای تنظیم کنتراست LCD از پتانسیومتر استفاده کنید.
سلام جناب مهندس. واسه پروژه Ads که توی کد ویژن و پر توس نمایشش هست. من کدها رو زدم توی کدویژن’ اونوقت میگه read_adsو sprintf
undefined symbol هست. چکار باید بکنم
سلام, لطفا در پست مربوطه سوال خود را مطرح کنید
سلام مهندس خسته نباشی
مهندس اگر در همین ال سی دی ۱۶×۲ بخوایم یک کاراکتر بصورت زیگزاگی ( ابتدا کاراکتر در سطر صفر ستون صفر سپس سطر یک ستون یک سپس سطر صفر ستون سوم و …) نمایش بدیم چه دستور ساده تری (البته به غیر از دستور نوشتن مختصات هر خانه که خیلی طولانی میشه) میشه استفاده کرد
سلام, به طور کلی پاسختون را میدم که شما باید یک رابطه برای کار مورد نظرتون پیدا کنید و این رابطه را درون یک حلقه for قرار دهید تا تکرار شود. اگر نتونستید یک رابطه پیدا کنید باید به همون روش طولانی انجام بدید
سلام جناب مهندس خسته نباشید،یه سوال داشتم تابع آخر دقیقا کاربردش چیه که معرفیش کردین؟فقط برای معرفی نوع lcd استفاده میشه؟
سلام, این تابع تعداد ستون های LCD را مشخص می کند و تنظیمات اولیه LCD را انجام می دهد
سلام
مرسی بابت پروژه خیلی خوبتون
چطور میتونم به جای انگلیسی متن فارسی رو بنویسم تو ال سی دی؟
ممنون میشم پاسخ بدید.
سلام, قبلا پروژه فارسی نویسی روی LCD کاراکتری را انجام داده بودم ولی الان متاسفانه دقیقا یادم نیست که چطور بود در اینده حتما این پروژه را در سایت قرار خواهم داد
ممنون از زحماتتون