یکی از چالش های طراحی مدارهای الکترونیکی نمایش نتیجه و Result خروجی است. برای مثال نمایش اطلاعات سنسور های استفاده شده در پروژه مسئلهی بسیار مهمی است که با استفاده از نمایشگرهای مختلفی قابل اجرا است. یکی از این نمایشگرها قابل استفاده در انواع پروژه های الکترونیکی LCD های کاراکتری هستند. که دارای راه اندازی نسبتا ساده ای هستند. در این پست قصد داریم روش راه اندازی ال سی دی کاراکتری با بردهای میکروکنترلر stm32 را بررسی کنیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.
معرفی LCD کاراکتری ۱۶*۲
LCD کاراکتری ۱۶*۲ یکی از پایهای ترین نمایشگرهای الکترونیکی میباشد. این LCD در بسیاری از مدارها کاربرد دارد. یکی از دلایل پر مصرف بودن این مدل LCD در مقابل نمایشگرهایی همچون سون سگمنت، عدم محدودیت در نمایش کاراکترها میباشد. همچنین توانایی ساختن کارکترهای دلخواه را دارند. این نوع LCD دارای ۲ سطر و ۱۶ ستون است. که در هر یک از این ۳۲ بخش یک کاراکتر جای میگیرد.
LCD کاراکتری ۱۶*۲ دارای ۱۶ پایه است. که در تصور زیر میتوانید این پایه ها را مشاهده کنید. که این پایه ها عبارتند؛
- VSS = زمین GND
- VCC = تغذیه ۵ ولت
- (V0 (Display Contrast Pin = تنظیم شدت نور صفحه
- (RS (Register Select = انتخاب رجیستر ( برای ارسال دستور یا دیتا)
- (RW (Read/Write = پایه Read و Write
- E = پایه Enable (این پایه بایستی به میکروکنترلر متصل شود و همیشه High باشد)
- D0 – D7 = پایه های دیتا
- A = پایه Anode
- K = پایه Cathode
اتصالات LCD کاراکتری به STM32
LCD دارای ۱۶ پایه است که ۷ عدد از این پایه ها به میکروکنترلر متصل میشوند. ترتیب اتصال این پایه ها را میتوانید داخل جدول و شماتیک زیر مشاهده نمایید. برای راه اندازی ال سی دی کاراکتری با بردهای میکروکنترلر stm32 به مقاومت دقت کنید. همچنین جدول اتصالات هم برای درک بهتر قرار داده شده است.
پیکربندی پایه های مربوط به LCD
در صورتی که با میکروکنترلر های STM32 آشنایی کافی ندارید. ابتدا از این لینک آموزش های ابتدای میکروکنترلرهای STM32 را مطالعه کنید سپس به مطالعه این آموزش بپردازید. برای پیکربندی پایه های مربوط به LCD در نرم افزار Stm32CubeMX بایستی ابتدا مد کاری LCD در کتابخانه ای که مورد استفاده قرار میدهید، را بررسی کنید. سپس با توجه به این موضوع پیکربندی پایه ها را انجام دهید. LCD مورد استفاده در این آموزش دارای دو مد کاری ۴ بیتی و ۸ بیتی است. کتابخانه مورد استفاده قرار داده شده در این آموزش از هر دو مد کاری LCD را پشتیبانی کنید. در این آموزش قصد داریم تا LCD را در مد ۴ بیتی راه اندازی کنیم. در ادامه پایه هایی از LCD که بایستی به میکروکنترلر متصل شوند. به دوسته پایه های کنترل کننده و پایه های دیتا تقسیم میشوند. پایه های کنترل کنترل کننده پایه های RW ،RS و E هستند و با توجه به این که LCD در مد ۴ بیتی راه اندازی میشود، پایه های دیتا عبارتند از؛ پایه های D4 تا D7.
داخل نرم افزار STM32CubeMX پس از انجام تنظیمات اولیه که در بخش اول آموزش های میکروکنترلر Stm32 گفته شد. ۷ پایه از میکروکنترلر را بعنوان خروجی تعریف میکنیم. در انتخاب پایه ها بایستی توجه داشته باشید که پایه های کنترل کننده بایستی همگی بر روی یک پورت قرار گیرند. همچنین پایه های دیتا نیز بایستی بر روی یک پورت قرار گرفته و شماره پایه های آنها بصورت پشت سر هم باشد. در این آموزش پایه های LCD بصورت زیر تعریف شده است.
سپس مطابق آموزش های قبل فرکانس میکروکنترلر را بر روی ۷۲ مگاهرتز تنظیم کنید. همچنین در قسمت Project Manager نیز تنظیمات لازم را انجام داده و سپس بر روی گزینه GENERATE CODE کلیک کنید و وارد KEIL شوید.
اضافه کردن کتابخانه LCD به پروژه
ابتدا بایستی کتابخانه LCD کاراکتری را از این لینک دانلود کنید. سپس فایل های مربوط به کتابخانه را داخل پوشه پروژه Extract کنید. سپس کتابخانه را به پروژه اضافه کنید. در صورتی که با روش اضافه کردن کتابخانه به پروژه آشنا نیستید، آموزش اضافه کردن کتابخانه به پروژه STM32 در نرم افزار KEIL را مطالعه کنید. پس از اضافه نمودن کتابخانه بایستی وارد فایل character_lcd_conf.h شده و پایه هایی که داخل نرم افزار STM32CubeMX برای LCD تعریف کردید را به کتابخانه معرفی کنید. در این آموزش پایه های کنترل کننده LCD بر روی پورت B و پایه های دیتا بر روی پورت A قرار دارد. پس کد های داخل این فایل را به صورت زیر تغییر میدهیم.
/* ~~~~~~~~~~~~~~~~~~ Options ~~~~~~~~~~~~~~~~~~ */ /* ~~~~~~ Data PORT ~~~~~~ */ #define _LCD_CTRL_PORT GPIOB #define _LCD_DATA_PORT GPIOA /* ~~~~~~ Data PIN ~~~~~~~ */ #define _LCD_DATA_PIN 8 #define _LCD_RS_PIN 13 #define _LCD_RW_PIN 14 #define _LCD_EN_PIN 15
فراموش نکنید که هدر character_lcd.h را به ابتدای فایل main خود اضافه کنید. پس از انجام مواردی که تا به اینجای کار گفته شد. کتابخانه بطور صحیح به برنامه شما اضافه شده و شما میتوانید به راحتی از فایل های داخل کتابخانه استفاده کنید. در ادامه توابع داخل کتابخانه را مورد بررسی قرار میدهیم.
بررسی توابع کتابخانه LCD
برای راه اندازی ال سی دی کاراکتری با بردهای میکروکنترلر stm32 از کتابخانه معرفی شده استفاده میکنیم. این کتابخانه توابع زیر را در اختیار شما میگذارد. که در ادامه کاربرد هر یک از این توابع را توضیح میدهیم.
void LCD_Init(void); void LCD_GotoXY(uint8_t column , uint8_t row); void LCD_PutChar(char character); void LCD_PutString(char *str); void LCD_Clear(void);
-
void LCD_Init(void)
این تابع LCD را اماده به کار میکند. محل قرار گیری این تابع داخل اصلی (main) قبل از while(1) است. توجه داشته باشید که این تابع بایستی قبل از توابع دیگر LCD قرار گیرد. برای درک بیشتر این موضوع به مثال زیر توجه کنید.
LCD_Config.Font = _FONT_5X10; LCD_Config.Mode = _4BIT_INTERFACE; LCD_Config.NumberOfLine = _2LINE_DISPLAY; LCD_Init();
-
void LCD_GotoXY(uint8_t column , uint8_t row)
این تابع نشانگر را به آدرس داده شده انتقال میدهد. ورودی های این تابع بدون علامت هستند. ورودی اول که برای مشخص کردن ستون است میتواند یک عدد صحیح بین ۰ تا ۱۵ باشد. ورودی دوم برای مشخص کردن سطر است و میتواند یک عدد صحیح بین ۰ و ۱ باشد.
-
void LCD_PutChar(char character)
با استفاده از این تابع میتوانید یک کاراکتر را بر روی LCD نمایش دهید. این تابع زمانی کاربرد دارد که شما قصد چاپ یک کاراکتر را بر روی LCD دارید.
-
void LCD_PutString(char *str)
این تابع همانند تابع قبل عمل میکند. تنها با این تفاوت که این تابع برای چاپ رشته بر روی LCD است.
-
void LCD_Clear(void)
با استفاده از این تابع تمام رشته ها و کاراکتر هایی که بر روی LCD چاپ شده است، پاک میشود. توابع دیگری نیز در این کتابخانه موجود است. اما در این آموزش توابع پر کاربرد این کتابخانه معرفی شدند. با باز کردن فایل character_lcd.h میتوانید تمامی توابعی که داخل کتابخانه قرار دارند را مشاهده کنید.
کد نویسی پروژه
در ادامه قصد داریم تا با استفاده از توابع بالا متن “DigiSpark.ir” را بر روی LCD نمایش دهیم. توجه داشته باشید که در کد زیر بایستی بخش های مختلف را به پروژه ساخته شده توسط نرم افزار STM32CubeMX اضافه نمایید. در صورتی که کد زیر را کپی کنید. و داخل برنامه خود Paste کنید. نرم افزار KEIL به شما ارور خواهد داد.
#include "character_lcd.h" int main(void) { char str[13]={"DigiSpark.ir\0"}; LCD_Config.Font = _FONT_5X7; LCD_Config.Mode = _4BIT_INTERFACE; LCD_Config.NumberOfLine = _2LINE_DISPLAY; LCD_Init(); while (1) { LCD_GotoXY(2,0); LCD_PutString(str); LCD_GotoXY(0,1); LCD_PutString("2*16 LCD & STM32"); } }
در صورتی که با نحوه پروگرام کردن میکروکنترلر های Stm32 آشنا نیستید. لطفا بخش اول آموزش های میکروکنترلر Stm32 را مطالعه نمایید. در تصویر زیر میتوانید نتیجه کد بالا را مشاهده نمایید.
جمع بندی
در این آموزش به نحوه راه اندازی LCD کاراکتری با استفاده از میکروکنترلرهای STM32 پرداختیم. برای راه اندازی این نوع LCD با استفاده از نرم افزار هایی همچون KEIL بایستی کتابخانه ای برای LCD دانلود کرده و یا خودتان کتابخانه را بنویسید. در این آموزش کتابخانه ای برای راه اندازی LCD معرفی شده است. توابع داخل کتابخانه نیز به صورت جداگانه توضیح داده شده است. همچنین با پروژه ساده ای با استفاده از این کتابخانه انجام شده است.
لوازم مورد نیاز
چنانچه در مراحل راه اندازی میکروکنترلرهای stm32 با مشکل مواجه شدید. بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
پروژه و دریافت بن ارسال رایگان
برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکههای اجتماعی از جمله آپارات و اینستگرام، با هشتگهای #دیجی_اسپارک ، #دانشجوکیت ، digispark# و daneshjookit# منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام و وقت بخیر آقای مهندس
ممنونم که خیلی خوب و روان مطالب را توضیح می دهید. بی زحمت با STM32 ماژول MPU6050 در پروژه های آتی تون راه اندازی کنید.با تشکر
با سلام از توجه شما سپاسگزارم
به تازگی نوشتن آموزش راه اندازی ماژول GY-521 با Stm32 را شروع کردم. بزودی منتشر خواهد شد.
سلام مهندس راه اندازی ماژول GY-521 آماده نشد؟
با سلام
آموزش راه اندازی ماژول GY-521 اخیرا منتشر شده است. با کلیک روی لینک زیر میتوانید آموزش را مطالعه کنید.
https://digispark.ir/author/alixahedi
با سلام ممنون از سایت خوبتون. من کتابخانه های lcd را دانلود و در نرم افزار keil اضافه کردم ولی دو تا ارور دارم چطور میتونم حلش کنم؟
با سلام
بایستی در انتهای فایل character_lcd_conf.h دستور #include “GPIO_UNIT/gpio_unit.h” را حذف کنید.
این خط از برنامه را حذف کردم ولی بازم ۴ تا خطا دارم . خطاها مربوط به پورت های A و B بخش های دیتا و کنترلی هست در فایل c. هم ضربدر قرمز کنارشون اومده
با سلام
شما از کدام ورژن کتابخانه معرفی شده استفاده کرده اید؟
سلام
متاسفانه نصب کتابخانه در کیل با ارور مواجه میشه . میگه کامپایلر ساپورت نمیکنه . هر ۳ کتابخانه رو امتحان کردم
CHARACTER_LCD-V1.0.0\GPIO_UNIT\gpio_unit.h(43): error: #35: #error directive: Compiler not supported /* Send error */
برای کتابخانه GPIO هم همین خطا رو داره . نصب کتابخانه رو دقیقا مطابق کلیپی که در اپارات گذاشتید انجام دادم
از ورژن ۵٫۲۴٫۲٫۰ کیل استفاده می کنم
با سلام
ممکن است در بروزرسانی های کتابخانه تغیراتی در کد ایجاد شده باشد. من این مورد را بررسی میکنم و آموزش را برروزرسانی میکنم.
مهندس چک کردی؟
با سلام
در برروز رسانی اخیر کتابخانه کلمه Lcd اول دستورات به LCD تغیر کرده بود که در آموزش نیز برروز رسانی شد.
با سلام
برای نمایش خروجی یک عدد چگونه آن را بر روی LCD می توانیم نمایش بدهیم؟
فرض کنیم مقدار نهایی عدد a برابر ۴۵ شده است، با چه دستوری می توان آن را نمایش داد؟ اگر مقدار عدد a اعشاری شد چه؟
با سلام
شما با استفاده از کتابخانه stdio.h و قرار دادن تابع sprintf در کد خود میتوانید عدد ذخیره شده در یک متغیر را در LCD نمایش دهید. در مثال زیر مقدار متغیر a در lcd بصورت عدد صحیح نمایش داده می شود.
char lcd_buffer[16];
sprintf(lcd_buffer,”a = %2d”,a);
LCD_GotoXY(0,0);
LCD_PutString(lcd_buffer);
و در مثال زیر زمانی که عدد a بصورت اعشاری باید بایستی از f% استفاده شود.
sprintf(lcd_buffer,”a = %2.2f”,a);
LCD_GotoXY(0,0);
LCD_PutString(lcd_buffer);
سلام دوست عزیز
ممنون ازآموزش خوبتون.
چطورمیشه متغیرها را روی lcd نمایش بدهیم؟مثلا اطلاعات مربوط به A/D.
با سلام از توجه شما سپاسگزارم
برای نمایش مقدار متغیر ها روی LCD بایستی از دستوری مثل sprintf استفاده کنید. فرض کنید میخواهیم مقدار متغیری با نام value را بر روی LCD نمایش دهیم. برای این کار ابتدا بایستی یک رشته به تعداد ستون های LCD تعرف کنید.
char LCD_Buff[16];
سپس داخل کد به این صورت عمل کنید.
sprintf(LCD_Buff,”Val = %d”,value);
LCD_GotoXY(0,0);
LCD_PutString(LCD_Buff);
سلام من عینا مراحلی که گفتید رو رفتم
کتابخونه رو هم اد کردم
ولی موقع کامپایل کردن خیلی خطا میده و کتابخونه رو شناسایی نمیکنه .
این فایل هم داخل لینک هست خواستید کامپایل بگیرید ببینید .
https://s21.picofile.com/file/8443030050/p3_Voltmeter_Cube.rar.html
با سلام
کتابخانه موجود در لینک اپدیت شده و تغییراتی در آن ایجاد شده است. این آموزش نیز به زودی مطابق تغییرات جدید بروز رسانی خواهد شد.
باشه ممنون
منتظر آپدیت هستم .
سلام و سپاس از شما
آموزش خوب و جامعی گذاشتید .
من ال سی دی کاراکتری ۴*۴۰ دارم و برای راه اندازی از این کتابخانه استفاده کردم ، ولی داخل این کتابخانه راه اندازی برای این ال سی دی وجود نداره و تغییراتی ایجاد کردم .
مشکل اینجاست که این ال سی از ۲ پایه e1 و e2 استفاده میکنه و هرکاری میکنم نمیتونم نمایش درست داشته باشم .
اگر تجربه ای در این زمینه دارید ، لطف میکنید که کمکم کنید .
با سلام
بایستی دیتاشیت LCD را مورد بررسی قرار دهید. تا مشخص شود آیا ارتباط LCD با میکرو مطابق LCD های ۲*۱۶ , ۴*۲۰ و… هست یا خیر.
سلام، مهندس تمام نکاتی رو که طی آموزش فرمودین انجام دادم وقتی به کلی خطا برخوردم، یه خطا مربوط به هدرفایل کتابخنه هست که در ابتدای پروژه اینکلود کردم باقی خطاها هم توی کتابخانه دات سی از خط ۴۴ تا خط ۶۰ هستن، ممنون میشم راهنمایی کنید
با سلام
در کتابخانه جدیدی که منتشر شده است. برخی از دستورات با حروف بزرگ نوشته شده است. با توجه به این موراد میتوانید ارور هارا برطرف کنید.
سلام هر کار میکنم کتابخانه دانلود نمیشه جطوری باید دانلود کرد؟
سلام مهندس جان این سایته خیلی مارو اذیت کرده چطوری باید کتابخانه رو دانلود کنیم باتشکر.
سلام
ممنون بابت آموزش های مفیدتون
میشه بپرسم علت اینکه پایه های data و کنترل کننده باید روی پورت های جدا تعریف بشه چی هست؟ مثلا یه پروژه ای مجبور شدیم اینارو روی یک پورت مثلا A تعریف کنیم اون موقع راه حل چی هست؟
ممنون
با سلام
مشکلی وجود ندارد، میتوانید هر ۲ را بر روی یک پروت تعریف کیند. و داخل برنامه در فایل LCD_Config پورت مربوط به پایه های کنترل و دیتا را تنظیم کنید.
سلام تنظیم برای معرفی پایه های دیتا در کتابخانه نبود ! فقط یک دیفاین یک پین هست!
با سلام
سپاس از همراهی شما
با سلام
ممنون از آموزش خوبتون
یک سوال داشتم امکانش هست با این کتابخونه به جای این که پین های d4 و d5 و d6 و d7 از یک پورت باشد و کنار هم در پورت های مختلف و پین های مختلف قرار دهیم؟
سلام مهندس
کتابخانه مربوط به lcd 4*20 را هم دارید؟
با سلام
میتوانید از همین کتابخانه برای راه اندازی ال سی دی استفاده کنید.
سلام.من نمیتونم کنابخونه ی lcd رو از لینکی که گذاشتین دانلود کنم…
با سلام
پس از ورود به لینک بایستی بر روی گزینه Code کلیک کریده و download zip کلیک کنید. سپس کد مورد نظر دانلود شده و میتوانید به پروژه اضاقه کنید.
سلام من کدتونو بدون ارور اجرا کردم . کد بر روی چند ال سی دی تست شد و برای هر کدام نتایج مختلفی بدست میارم مثلا بر روی بعضی فقط سطر ۱ اجرا میشه برای بعضی نصفی از سطر ۱ و سطر ۲ اجرا میشه برای بعضی کاراکتر ها ناخواناست … و مشکلم فقط با کد شما نیست با سایر کتابخانه هایی که از نت برداشتم هم همیشن مشکل رو دارم بنظر سخت افزار و درایور ال سی دی ها فرق دارن … هنوز راه حلشو پیدا نکردم احتمالا باید خودم دست بکار شمو کتابخونشو بنویسم.
با سلام
لطفا اتصالات مدار خود را بررسی کنید. هچنین در نظر داشته باشید که کتابخانه موجود در github بروزرسانی شده و بایستی کمی تغیرات در کدی که داخل آموزش قرار داده شده است، اعمال شود.
سلام .من وقتی کتابخانه رو اضافه میکنم ارور میده در کامپایل
Build started: Project: lc2
*** Using Compiler ‘V5.06 update 6 (build 750)’, folder: ‘C:\Keil_v5\ARM\ARMCC\Bin’
Build target ‘lc2’
compiling character_lcd.c…
..\LCD2\character_lcd.c(39): error: #20: identifier “PORTA” is undefined
_GPIO_WritePin(LCD_RS_GPIO, (1 << LCD_RS_PIN), TType); /* Set/Reset RS pin */
..\LCD2\character_lcd.c(39): warning: #188-D: enumerated type mixed with another type
_GPIO_WritePin(LCD_RS_GPIO, (1 << LCD_RS_PIN), TType); /* Set/Reset RS pin */
..\LCD2\character_lcd.c: 1 warning, 1 error
"lc2\lc2.axf" – 1 Error(s), 1 Warning(s).
Target not created.
Build Time Elapsed: 00:00:01
لطفا راهنمایی کنید
با سلام
ممکن است تغیرات گفته شده در LCD_Config را به درستی انجام نداده باشید. لطفا مجددا این بخش را بررسی فرمایید.
سپاسگذارم. عالی بود
با سلام
سپاس از همراهی شما
#define _LCD_DATA_PIN 8 میشه مهندس این خط کد رو توضیح بدید ؟لازم نیست برای پایه های دیگه یعنی َa9 , a10 a11 هم این کد نوشته بشود؟
با سلام. من فایل LCD Example – BluePill Board رو دانلود کردم. بعدش با stm32cubemx اجرا کردم. بعدش generate code کردم که بدون هیچ مشکلی ساخته شد. ولی وقتی build رو میزنم error میده.
linking…
LCD Example – BluePill Board\LCD Example – BluePill Board.axf: Error: L6218E: Undefined symbol LCD_DefInit (referred from main.o).
LCD Example – BluePill Board\LCD Example – BluePill Board.axf: Error: L6218E: Undefined symbol LCD_GotoXY (referred from main.o).
LCD Example – BluePill Board\LCD Example – BluePill Board.axf: Error: L6218E: Undefined symbol LCD_PutString (referred from main.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 3 error messages.
“LCD Example – BluePill Board\LCD Example – BluePill Board.axf” – 3 Error(s), 1 Warning(s).
Target not created.
مشکل چیه؟
ممنون میشم راهنمایی کنید.