در بیشتر مدارهای میکروکنترلری ما نیاز به نمایش اطلاعات برای کاربر داریم، برای این کار راه های مختلفی وجود دارد از جمله استفاده از چند ، LEDاستفاده از ، 7segmentاستفاده از LCD و …،اما LCDها به علت داشتن قابلیتهای بیشتر نمایش،ابعاد مختلف و برنامه ریزی آسان اغلب مورد توجه قرار می گیرند.
LCDها شامل انواع کاراکتری و گرافیکی هستند که در اینجا نوع کاراکتری آن را معرفی و طرز استفاده آن را شرح می دهیم.
LCDهای کاراکتری نیز خود از نظر نحوه تبادل اطلاعات به دو دسته سریال و موازی تقسیم می شوند،از مزایای نوع سریال استفاده کمتر از پین های میکروکنترلر است.
از نظر اندازه،این LCDها دارای تنوع مختلفی هستنداز جمله 16×4،40×2،32×2،16×2و … که منظور از این اعداد تعداد کاراکترهای قابل نمایش در یک سطر و تعداد سطرهای آن است،به عنوان مثال نوع 16×2دارای 2 سطر است و در هر سطر تعداد 61 کاراکتر را نمایش می دهد.
ما در این مقاله در مورد نوع 16×2 که بسیار پرکاربرد است صحبت می کنیم با این توضیح که سایر انواع موازی نیز مشابه همین نوع هستند.
این نوع LCD ها بسته به اینکه دارای نور پشت زمینه باشند یا نه دارای 14 یا 16 پایه هستندکه در جدول زیر این پایه ها معرفی شده اند.
توضیح | I/O | سمبول | پایه |
زمین منبع تغذیه | —- | VSS | 1 |
ولتاژ ۵ ولت منبع تغذیه | —- | VDD | 2 |
ولتاژ کنترل شدت نور صفحه | —- | VEE | 3 |
اگر RS=0 باشد رجیستر دستور انتخاب می شود. اگر RS=1 باشد رجیستر دستور انتخاب می شود. | / | RS | 4 |
R/W=0 برای نوشتن اطلاعات R/W=1 برای خواندن اطلاعات | —- | R/W | 5 |
فعال ساز | I | E | 6 |
بیت ۰ باس داده | I/O | D0 | 7 |
بیت ۱ باس داده | I/O | D1 | 8 |
بیت ۲ باس داده | I/O | D2 | 9 |
بیت ۳ باس داده | I/O | D3 | 10 |
بیت ۴ باس داده | I/O | D4 | 11 |
بیت ۵ باس داده | I/O | D5 | 12 |
بیت ۶ باس داده | I/O | D6 | 13 |
بیت ۷ باس داده | I/O | D7 | 14 |
آنود LED پشت زمینه LCD | — | BLA | 15 |
کاتود LED پشت زمینه LCD | — | BLK | 16 |
توضیح مختصری راجع به پایه ها
پایه :RS در داخل LCDدو رجیستر وجود دارد،که توسط پایه RSانتخاب می شوند.اگر 0= RSشود رجیستر دستور ( (Instruction Register انتخاب می شود تا فرمانهای مانند پیکره بندی ،LCDپاک کردن آن،جابجایی مکان نما و … برای LCDارسال شود.
در صورتی که اگر 1= RSشود،رجیستر داده )(Data Registerانتخاب می شود،تا کاربر بتواند اطلاعاتی را که می خواهد روی LCD بنویسد برای LCDارسال کند.
پایه :R/Wبه کمک این پایه کاربر مشخص می کند که می خواهد اطلاعات را روی LCDبنویسد یا از روی آن بخواند.اگر این پایه یک شود اطلاعات از روی LCD خوانده می شود و در صورتی که صفر شود اطلاعات روی آن نوشته می شود.
پایه :Eاگر در این پایه پالسی از یک به صفر قرار داده شود،اطلاعاتی که روی پایه های D0 تا D7 قرار دارد درون یکی از رجیسترهایی که توسط پایه (Register Select) RS مشخص می شود،جای می گیرد.حداقل زمانی که این پایه باید صفر باشد 450 نانو ثانیه است.
نحوه اتصال LCD به میکروکنترلر
با اینکه این نوع LCDهای کاراکتری دارای 8 پایه برای تبادل اطلاعات هستند(ارتباط 8 بیتی) اما دارای قابلیت ارتباط با 4 پایه را نیز دارند(ارتباط 4 بیتی0) که این امر باعث صرفه جویی در استفاده از پایه های میکروکنترلر می شود.
کتابخانه موجود برای LCDکاراکتری در نرم افزار Codevisionنیز برای ارتباط 4 بیتی نوشته شده است.
البته بهتر است که پایه های آزاد LCDتوسط 4 عدد مقاومت به زمین متصل شوند.
توجه
این نحوه اتصال با توجه به برنامه ای است که درون کتابخانه نرم افزار Codevisionنوشته شده است.
برنامه نویسی برای LCD
آسان ترین روش برای پیکره بندی LCDدر نرم افزار Codevisionاستفاده از CodeWizard آن است.بعداز اجرای برنامه Codevisionبا زدن کلیدهای Shift+F2 منوی CodeWizardنمایش داده می شود.همانطور که در شکل زیر نمایش داده شده است،زبانه LCDرا انتخاب کنید،سپس از قسمت مربوطه پورتی را که LCDبا آن متصل است را مشخص کنید،همچینین نوع ) LCDتعداد کاراکترها برای هر سطر) را مشخص کنید.همانطور که مشاهده می کنید نحوه اتصال پایه های LCD به میکروکنترلر در زیر این قسمت برای شما نمایش داده می شود.
سپس از منوی Fileگزینه Generate,Save and Exitانتخاب کنید(شکل زیر).
بعد از طی مراحلی که برای مشخص مردن محل ذخیره فایلهای برنامه است،محیط برنامه نویسی که شامل چند خط برنامه است ظاهر می شود،این برنامه ها در واقع همان تنظیماتی است که در CodeWizard انجام داده اید.
توجه کنید اگر از CodeWizardاستفاده نمی کنید،باید قسمت های زیر را خودتان به برنامه اضافه کنید.
مشخص کردن پورتی که LCDبه آن متصل است و همچنین اضافه کردن کتابخانه LCDاین قسمتها باید در ابتدای برنامه اضافه شوند.
خطی از برنامه که بین دو عبارت #asmو #endasmآمده است یک دستور اسمبلی است و مشخص کننده پورتی است که LCDبه آن متصل است،به عنوان مثال در شکل زیر LCD به پورت Dمتصل شده است و عدد ox12 مشخص کننده آدرس این پورت است.
توجه
اگر میخواهید این پورت را تغییر بدهید باید حتما این آدرس را عوض کنید.
// Alphanumeric LCD Module Functions
#asm
.equ __lcd _port=0x12 ;PORTD
#endasm #include
نام پورت | آدرس پورت |
PORTA > | ox1b |
PORTB | ox18 |
PORTC | ox15 |
PORTD | ox12 |
اگر از پورت دیگری استفاده میکنید آدرس آن را میتوانید از جدول مربوط به آدرس رجیسترها در دیتاشیت میکروکنترلر مورد نظر بیابید.
•پیکره بندی LCD:برای پیکره بندی LCD در تابع mainبرنامه و قبل از عبارت (1) Whileاین عبارت را اضافه کنید:
//LCD module initialization
lcd_init(16) ;عدد 16 به معنای این است که LCDدارای 16 کاراکتر در هر سطر است،پس اگر از نوع دیگری استفاده میکنید این عدد را تغییر دهید.
توجه : اگر LCDبه پورت مشخص شده در اول برنامه متصل نباشد،میکروکنترلر کار نخواهد کرد!!! زیرا این تابع منتظر خواندن اطلاعات از LCDمی ماند و چون LCDبه آن متصل نیست میکروکنترلر بقیه کدهای برنامه را اجرا نمی کند.
توجه: ممکن است بعد از اتصال LCDبه میکروکنترلر،با اینکه همه موارد به درستی رعایت شده است، LCDکار نکند!!! در نظر داشته باشید که بعضی از مدلهای میکروکنترلرهای AVR دارای قابلیتی به نام JTAG هستند. پایه های TMS،TDO،TDIو TCKمربوط به JTAG هستند.مثلا برای مدلهای ATMEGA16 و ATMEG32 این پایه ها روی پورت C قرار دارند.برای اینکه بتوانید از این پایه ها به عنوان ورودی و خروجی استفاده کنید باید قابلیت JTAGرا غیر فعال کنید.برای کار باید فیوزبیت JTAGENرا از حالت برنامه ریزی شده خارج کرد)برای این کار باید عدد یک را در آن نوشت.
برای اینکه فیوزبیت JTAGرا غیر فعال کنیم ابتدا باید فیوز بیتها را بخوانیم.برای این کار ابتدا وارد محیط Chip Programmer می شویم(،(Shift+F4سپس از منوی Readگزینه ( Fuse Bit(sرا انتخاب می کنیم.
بعد از اینکه فیوزبیتها خوانده شوند،پیغام زیر نمایش داده می شود.
همانطور که در شکل بالا دیده می شود مقابل عبارت JTAGعدد صفر نوشته شده است،این بدان معنی است که قابلیت JTAG فعال است و نمی توان LCD را به پورتی که JTAG روی آن قرار دارد متصل کرد. برای ادامه روی گزینه Yes کلیک می کنیم تا تغییرات خوانده شده را روی جدول فیوزبیتها در صفحه اصلی محیط Chip Programmer اعمال شود.در شکل زیر وضعیت فیوزبیتهای خوانده شده نمایش داده شده است.
اکنون با کلیک کردن بر روی علامت کنار گزینه ،JTAGاین علامت را حذف می کنیم.
اکنون باید مقادیر جدید فیوز بیت ها را روی میکروکنترلر Program کنیم.برای این کار از منوی Programگزینه ( Fuse Bit(sرا انتخاب می کنیم.اکنون قابلیت JTAGغیر فعال شده است.
توابع ارتباط با LCDدر Codevision
کتابخانه نوشته شده در Codevisionبرای ارتباط با LCDمدلهای زیر را پشتیبانی می کند:
40 1×8, 2×12, 3×12, 1×16, 2×16, 2×20, 4×20, 2×24 , 2x
اما توابع این کتابخانه به دو دسته سطح پایین ( (Low Levelو سطح بالا ( (High Levelتقسیم می شوند.
توابع سطح پایین ارتباط با :LCD
Void_lcd_ready(void |
این تابع منتظر می ماند تا LCD آماده دریافت اطلاعات شود.این تابع باید همیشه قبل از تابع lcd_write_data فراخوانی شود. |
(Void_lcd_write_data(unsigned char data |
این تابع محتویات data را درون رجیستر دستور LCD می نویسد. |
Void cld_write _byte(unsigned char addr , unsigned char data) |
این تابع محتویات dataرا در آدرس مشخص شده در addrدرون حافظه Display )DDRAM (Data RAMیا (Character Generator RAM) CGRAMمی نویسد. |
این تابع محتویات آدرس مشخص شده در addrدرون حافظه (Display Data RAM)DDRAM یا (Character Generator RAM) CGRAMرا می خواند |