چگونه یک کتابخوانه lcd کاراکتری برای STM32 بنویسید؟

چگونه_یک_کتابخوانه_lcd_کاراکتری_برای_STM32_بنویسید
50 بازدید
۱۴۰۴-۰۷-۰۸
4 دقیقه
  • نویسنده: علی احسان حصیری
  • درباره نویسنده: ---

LCD های کاراکتری معمولا جزو یکی اولین تجربه‌های ما در زمان شروع کاربا میکروکنترلر‌های مختلف هستند. این lcd ها ساختار ساده ای دارن که شامل چند سطر کاراکتر (معمولا یک یا دو) و یک نور پس زمینه هست. آیسی HD44780 یک درایور نمایشگر‌های ماتریسی است. ابن تراشه می‌تواند بصورت 4 و 8 بیتی مورد استفاده قرار گیرد.

احتمالا شما که خواننده این مطلب هستید تجربه کار با این نمایشگر و HD44780 را با میکروکنترلر‌های AVR  و یا Arduino دارید. اما در این مطلب ما قصد داریم که با استفاده از datasheet HD44780 یک کتابخانه از ابتدا برای راه اندازه نمایشگر با قابلیت‌های اختصاصی مورد نظر خودمون ایجاد کنیم.

اشنایی با قابلیت های HD44780

HD44780  دارای یک رم با ظرفیت 80 *8 بیت است که گنجایش 80 کاراکتر را داره.همچنین این تراشه قابلیت این رو داره که ما فونت‌های اختصاصی خودمون رو به اون اضافه کنیم رو داره ما می‌تونیم از این قابلیت استفاده کنیم تا کاراکتر‌های اختصاصی خودمون رو برای نمایش تولید کنیم. اینجا اشاره کنم که در آینده با استفاده از این قابلیت قصد داریم یسری بازی رو برای اجرا روی میکروکنترلر تولید کنیم پس حتما با ادامه این سری از اموزش‌ها همراه ما باشید.

داخل دیتاشیت این تراشه ذکر شده که قابلیت اجرای ی لیست از دستورات داره دستوراتی مثل Display clear، cursor home، display on/off، cursor on/off، display character blink، cursor shift، display shift. به شکل زیر دقت کنید در این شکل ما دو ریجستر اصلی داریم یکی رجیستر هشت بیتی  Instruction Register(IR) و دیگری رجیسیتر هشت بیتی Data Register(DR) رجیستر IR تنها توسط کنترلر قابل دسترسی هست، اینجا از کلمه میکروکنترلر استفاده نمی‌کنم چون سیستم‌های دیجیتال دیگه ای هم می‌تونن ازین نمایشگراستفاده کنند. رجیستر DR هم داده‌هایی رو که قراره روی حافظه نوشته بشه یا دستورانی که از حافظه خونده میشه رو نگهداری می‌کنه.

همچنین رجیستر Busy Flag(BF) زمانی که یک باشه نشون میده که تراشه مشغول پردازش دستور قبلیه و ما نمی‌تونیم دستور جدیدی رو براش ارسال کنیم. زمانی که پایه R/W مقدار یک داشته باشه خروجی DB7 برابر با مقدار Busy Flag هست. خب اینجا شاید جرقه ی سوال تو ذهنتون شکل بگیره که ما معمولا چیزی رو از روی این نمایشگر نمی‌خونیم و flag خاصی رو چک نمی‌کنیم، پس نقش این Flag و دستورات خوندن چی میشه؟ که در جواب این سوال باید بگم ما در کاربرد های معمول که از میکروکنترلر‌ها استفاده می‌کنیم.

سعی داریم تا جایی که امکانش هست در مصرف پایه‌ها صرفه جویی کنیم پس سعی می‌کنیم با نوشتن تاخیر‌هایی به اندازه کافی طولانی نیاز به خوندن Flag نداشته باشیم و پایه R/W رو به زمین متصل کنیم. البته تو این اموزش ما سعی داریم که قابلیت خوندن این پایه رو به برنامه کتابخونه که می‌نویسیم اضافه کنیم و به سرعت اجرای بالاتری دست پیدا کنیم.

شاید برای شما مفید باشد:
آموزش STM32 با توابع LL قسمت 27: کالیبره کردن RTC

رجیستر Address Counter(AC) آدرس داده ای DDRAM را نگهداری می‌کنه. زمانی که R/W = 1 مقدار AC روی پایه‌های DB0 تا DB6 قرار می‌گیره.

  1. Display Data RAM (DDRAM)

داده‌هابرای این که روی این حافظه نمایش داده شوند، روی DISPLAY DATA RAM  (DDRAM) زخیره قرار می‌گیرن.این حافظه ظرفیت دخیره 80 کاراکتر را داره، برای مثال زمانی که ما H رو روی خونه اول این حافظه می‌نویسیم H تو خونه اول LCD نمایش داده می‌شه.  مشخصه که اگه ابعاد LCD کوچیک تر از تعداد خونه‌های RAM باشه همه خونه‌ها نمایش داده نمی‌شوند. تو دیتاشیت ذکر شده که از این مکان‌های حافظه میشه به عنوان حافظه جنرال استفاده کرد. حالا کی ممکنه نیازش بشه که از این حافظه‌ها استفاده کنه؟

شکل زیر ساختار حافظه DDRAM رو نشون میده.

برای مثال در یک lcd با ابعاد   16*2 خونه 1 تا 16 حافظه به سطر اول نمایشگر اختصاص داده می‌شوند. و خونه 40 به بعد شروع سطر دوم میشه. ادرس 40    خونه اول سطر دوم میشه.شکل زیر تاثیر شیفت دادن را بر روی محتوای DDRAM  نمایش می‌دهد.

خب با اطلاعاتی که تا اینجا داریم می‌تونیم استارت کار بزنیم. خب ابتدایی ترین نیاز ما برای راه اندازی lcd دسترسی به gpio  هاست. توابع HAL_GPIO باعث کند شدن برنامه میشن. پس توابع دسترسی GPIO خودمون رو بنویسیم.

برای اینکه تابع ما سرعت خوبی داشته باشه باید مستقیما رجیستر‌ها مقدار دهی کنیم.

  • آشنایی با رجیستر‌های GPIO

    • GPIOx_MODER:این رجیستر وضعیت پایه شمال ورودی، خروجی، انالوگ بودن پایه را مشخص می‌کند.
    • GPIOx_OTYPER: وضعیت خروجی مثل Push-Pull یا Open Drain  بودن رو مشخص می‌کنه.
    • GPIOx_OSPEEDR: سرعت پایه خروجی رو تنظیم میکنه. به اصطلاح slew rate پایه.
    • GPIOx_PUPDR: این رجیستر مشخص می‌کنه که پایه بصورت Pull-up باشه  یا  Pull-down .
    • GPIOx_IDR: مقدار ورودی رو نگهداری می‌کنه.
    • GPIOx_ODR: مقدار این رجیستر روی خروجی نوشته می‌شه.
    • GPIOx_BSRR: بصورت مستقل مقدار یک پایه رو ست می‌کنه. تو این پروژه این رجیستر مورد علاقه ماست. برای این که بیشتر با رجیستر‌ها آشنا شید می‌تونید به این سایت مراجعه کنید.

https://deepbluembedded.com/stm32-gpio-registers-direct-access-fast-pin-control/

ماکرو ‌های زیر پیاده سازی می‌کنیم تا به رجیستر ها‌دسترسی داشته باشیم. دقت کنید که برای Reset کردن یک پایه کافیه تو 16 بیت پر ارزش رجیستر BSRR پایه مورد نظر بنویسیم.

شاید برای شما مفید باشد:
بررسی مدار های ترکیبی و ترتیبی و بررسی الگو و ساختار کد در زبان VHDL - آموزش FPGA قسمت چهارم

همچنین نیاز داریم که تاخیر پیاده سازی کنیم. می‌تونیم از تابع HAL_Delay استفاده کنیم، یا اینکه خودمون پیاده سازیش کنیم.

خب سعی  کنید با استفاده از این ماکرو‌ها یک پین 1 کنید. یا اینکه یک پین رو toggle کنید.

اینترفیس

این آیسی هم قابلیت استفاده چهار بیتی و هم بصورت هشت بیتی را داره. این قابلیت به ما کمک می‌کنه که تو تعداد پایه‌های کنترلر صرفه جویی کنیم.تو حالت چهار بیتی از پایه‌های DB7 تا DB4 استفاده میشه. تو این حالت انتقال یک دستور یا بایت داده در دو مرحله انجام میشه، چهار بیت پر ارزش در ابتدا و بعد از اون چهار بیت کم ارزش انتقال پیدا می‌کنند. شکل زیر فرایند انتقال یک دستور به نمایشگر رو نمایش می‌دهد.

شاید برای شما مفید باشد:
از نرم افزار تا سخت افزار – قسمت سوم – هدر فایل (Header file)

دقت کنید برای ارسال یک instruction هر دو بیت RS و R/W باید صفر باید. جدول زیر وضعیت پایه‌های RS و R/W را نمایش می‌دهد.

برای ارسال یک دستور نیازه که پین EN یک بار صفر و یک بشه مثل عکس بالا، پس تابع زیر برای نوشتن دستور می‌نویسیم.

راه اندازی نمایشگر

خب حالا به جایی رسیدیم که می‌تونیم یکسری دستورات رو به سمت نمایشگر ارسال کنیم. طبق دیتاشیت برای راه‌اندازی نمایشگر باید دستورات زیر به تراشه ارسال کنیم.

با استفاده از توابعی که بالا توسعه دادیم سعی کنید که این دستورات به lcd ارسال کنید. توصیه می‌کنم از لاجیک آنالایزر برای اسکن کردن سیگنال‌های ورودی استفاده کنید.

تو قسمت بعدی از این سری سورس کد کامل این قسمت قرار میدم، و امکان نوشتن کاراکتر و سپس string رو به کتاخونه‌مون اضافه کنیم.

اطلاعات
50
0
2
لینک و اشتراک
profile

نویسنده: علی احسان حصیری

متخصص الکترونیک

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ
سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله