۲-۵ اتصال میکروکنترلرهای AVR به LCD
۱۱ بهمن ۱۳۹۷بخش ۳-۱ راه اندازی سنسور مادون قرمز (اینفرارد یا IR) با برد آردوینو
۱۱ بهمن ۱۳۹۷برای استفاده از امکانات CodeVision برای نوشتن بر روی LCD باید ابتدا کتابخانهی مربوط به آنرا در برنامه اضافه کنیم. اگر از Code Wizard استفاده کنید این عمل به صورت خودبهخودی انجام خواهدشد. اولین دستور قابل استفاده در CodeVision برای چاپ تنها یک کاراکتر دستور ()lcd_putchar است.
با استفاده از این تابع میتوانید بر روی LCD خود یک کاراکتر چاپ کنید.
به قطعه کد زیر نگاه کنید:
[php] while (1) { lcd_putchar('a'); }; [/php]
اگر این قطعه کد را کامپایل کرده و بر روی میکروکنترلری که به یک LCD متصل شده است بریزید بر روی LCD مشاهده خواهیدکرد که تمام خانههای LCD شامل حرف a خواهند شد. علت این امر آن است که از آنجایی که حلقهی (while(1 همواره درحال اجرا است در هر بار یک a بر روی یک خانهی LCD چاپ میشود و cursor توسط نرمافزار CodeVision بر روی خانهها جابهجا میشود و تمام خانهها پر از حرف a میشود. Cursor همان مکاننما است که به همواره به صورت خودبهخود به آخرین مکان قابل نوشتن اشاره دارد. همچنین بهجای نوشتن عبارت ‘a’ در داخل تابع میتوانید یک کاراکتر را که قبلا تعریف و مقداردهی کردهاید را به این تابع پاسدهید.
مثلا مثل قطعه کد زیر عمل کنید:
[php] while (1) { char str='a'; lcd_putchar(str); }; [/php]
بازهم در این حالت اتفاقی مشابه قبل رخ خواهدداد. یک روش ساده برای اینکه از چاپ شدن بیش از یک کاراکتر برروی LCD در حلقهی (while(1 جلوگیری کنیم استفاده از تکنیک flag گذاری است. نحوه استفاده از این تکنیک را در زیر مشاهده میکنید.
[php] int flag=1; void main(void) { // Declare your local variables here [/php] [php] while (1) { if(flag) { lcd_putchar('a'); flag=0; } }; [/php]
در این تکنیک درابتدای برنامه ضمن تعریف متغیر flag و مقداردهی به آن به عدد ۱ و سپس پس از ورود به حلقه و یک بار صحیح بودن شرط حلقه و اجرای دستور مورد نظر و نهایتا صفر کردن flag برای غلط شدن شرط حلقه استفاده شده است. هرجای برنامه که باز نیاز داشتید تابع داخل if دوباره اجرا شود میتوانید متغیر flag را ۱ کنید. در واقع ۱ به معنای همان true بودن شرط if است. حال میتوانید هرجا که نیاز به پاک کردن تمام کاراکترهای روی LCD داشتید، از دستور ( ) lcd_clear استفاده کنید.
به قطعه کد زیر نگاه کنید. در این قطعه کد کاراکتر ‘a’ برروی LCD چاپ شده و به مدت ۲ ثانیه نیز برروی صفحه ی LCD قابل مشاهده است و پس از آن این کاراکتر از روی صفحه پاک میشود. اگر میخواهید رشته ای ثابت از حروف و اعدد را بر روی LCD چاپ کنید میتوانید از دستور ()lcd_putsf استفاده کنید.
[php] int flag=1; void main(void) { // Declare your local variables here [/php] [php] while (1) { if(flag) { lcd_putchar('a'); flag=0; } delay_ms(2000); lcd_clear(); }; [/php]
مثلا به قطعه کد مقابل نگاه کنید:
[php] int flag=1; void main(void) { // Declare your local variables here [/php] [php] while (1) { if(flag) { lcd_putsf("Hello AVR World 12/8/2012"); flag=0; } }; [/php]
با اجرای چنین کدی بر روی میکرو رشتهای متشکل از اعداد و حروف بر روی LCD قابل مشاهده است. توجه داشته باشید که طول این رشته نباید بیش از ۳۲ کاراکتر باشد. نکتهای که در این دستور وجود دارد این است که شما تنها رشتههای ثابت را میتوانید با این تابع بر روی LCD چاپ کنید.
تابع دیگری که به وسیله ی آن میتوان یک رشته با طول و حروف متغیر را بر روی LCD چاپ کرد به صورت ( )lcd_puts است.
با استفاده از این تابع میتوان با پاس دادن یک اشاره گر به رشته که همان نام رشته میباشد یک رشته را بر روی LCD چاپ کرد. حال به قطعه کد زیر نگاه کنید:
[php] int flag=1; char str[]="Dreamy World of Electronics"; void main(void) { // Declare your local variables here [/php] [php] while (1) { if(flag) { lcd_puts(str); flag=0; } }; [/php]
در قطعه کد بالا ابتدا یک رشته با محتوای “Dreamy World of Electronics” تولید کردهایم، سپس با استفاده از پاسدادن نام رشته به تابع ()lcd_puts آن را بر روی LCD چاپ کردیم. در این جا چون طول رشتهها و محتوای آن قابل تغییر است میتوان چندینبار یک رشته را بر روی LCD با محتوای متفاوت چاپ کرد. مثلا به قطعه کد زیر نگاه کنید:
[php] int flag=1; char str[]="Dreamy World of Electronics"; void main(void) { // Declare your local variables here [/php] [php] while (1) { str[0]='*'; str[0]='^'; str[0]='^'; str[0]='*'; if(flag) { lcd_puts(str); flag=0; } }; [/php]
پس از اجرای چنین کدی عبارت “*^^*my World of Electronics” برروی LCD چاپ خواهدشد. بنابراین همانطور که میبینید میتوان عناصر داخل یک رشته را قبل از چاپ کردن تغییر داد. با استفاده از این تابع میتوانید محاسبات عددی خود را پس از آنکه آنها را به رشته تبدیل کردید بر روی LCD چاپ کنید.
حال اگر بخواهیم مکان شروع عمل نوشتن کاراکترها در LCD را مشخص کنیم میتوانیم از تابع (lcd_gotoxy(int column , int row استفاده کنیم.
در واقع خانههای موجود در یک LCD به ابعاد 2*8 ومشابه آن LCD های 2*16 دارند به شکل زیر است.
(7,0) | (6,0) | (5,0) | (4,0) | (3,0) | (2,0) | (1,0) | (0,0) |
(7,1) | (6,1) | (5,1) | (4,1) | (3,1) | (2,1) | (1,1) | (0,1) |
حال مشابه قطعه کد زیر میتوان شروع نوشتن رشتهی str را از خانهی (0,1) از سر گرفت.
[php] int flag=1; char str[]="AVR Book"; void main(void) { // Declare your local variables here [/php] [php] while (1) { lcd_gotoxy(0,1); if(flag) { lcd_puts(str); flag=0; } }; [/php]
درواقع حرف ‘A’ که اولین حرف از رشتهی str است در خانهی (0,1) از LCD چاپ خواهد شد.
حال اگر بخواهیم اعداد و متغیرهایی از نوعهای integer و یا float را برروی LCD چاپ کنیم میتوانیم از تابع ()sprint مانند قطعه کد زیر استفاده کنیم.
[php] #include <stdio.h> int flag=1; char str[20]; int amount=18; void main(void) { // Declare your local variables here [/php] [php] while (1) { if(flag) { sprintf(str,"the amount is : %d",amount); lcd_puts(str); flag=0; } }; [/php]
این تابع در واقع برای عملکرد خود نیاز به یک رشته و عدد مورد نظر دارد.
این تابع عدد مورد نظر را به رشته تبدیل کرده و آن را داخل رشتهی پاس دادهشده به خود میگذارد و ما با استفاده از این رشته میتوانیم عدد تبدیل یافته به رشته را روی LCD چاپ کنیم. تا اینجا شما بهطور کامل با روشهای چاپ کاراکترها در انواع مختلف برروی LCD کاملا آشنا شدید، لازم به ذکر است مفاهیم این فصل در فصول بعدی به دفعات تکرار خواهد شد، بنابراین لطفا در یادگیری مفاهیم این فصل دقت لازم را به عمل آورید.
2 Comments
سلام داداشم
فک کنم اشتباه می فرمایید، چون lcd_putchar() فقط مخصوص چاپ کاراکتر هست و نه متغیر، منم خودم این مشکل رو داشتم، چون برای رشته این مشکل وجود نداره، چون هم تابع puts برای متغیر هست و هم putsf , putse برای رشته در فلش و اییپرام، خلاصه بگم خودم درستش کردم، کافیه بری تو کتابخانه lcd.h و یه ضربدر * قبل از معرفی آرگومان c تابع lcd_putchar() بذاری، مشکل حل میشه، و هم میتونه کاراکتر و هم متغیر رو بخونه، با پروتئوس تست کردم درسته، اما هنوز با میکرو تستش نکردم،
بگو یا علی
اینجوری دیگه بصورت تابع ارجاع به آدرس میده، حالا چه آدرس متغیر باشه، و چه خود کاراکتر فرقی نداره، یا علی