نمایشگرهای سونسگمنت همواره یکی از جذابترین و کاربردیترین رابطهای کاربری در سیستمهای نهفته بودهاند. با این حال، درایو کردن مستقیم آنها توسط میکروکنترلر به دلیل اشغال پایههای متعدد و نیاز به رفرش مداوم (Multiplexing)، بار پردازشی سنگینی را به سیستم تحمیل میکند. تراشه TM1637 یک درایور اختصاصی کیبورد و سونسگمنت است که این مشکل را به طور کامل حل کرده و تنها با استفاده از دو پین (شبیه به پروتکل I2C) میتواند تا ۶ عدد سونسگمنت را درایو کند.

در این مقاله، به بررسی عمیق معماری این آیسی، پروتکل ارتباطی، رجیسترها و در نهایت پیادهسازی یک درایور کاملاً صنعتی، شیگرا و رویدادمحور (Event-Driven) برای میکروکنترلرهای STM32 میپردازیم که بدون استفاده از هیچگونه تاخیر مسدودکننده (HAL_Delay)، نمایشگر را مدیریت میکند.
۱. آشنایی با آیسی TM1637 و ویژگیهای آن
تراشه TM1637 یک درایور LED با آند مشترک (بسته به نحوه اتصال میتواند کاتد مشترک را نیز تا حدی پشتیبانی کند اما بهینهسازی آن برای آند مشترک است) است که دارای یک اسیلاتور داخلی، مدار کنترل PWM برای تنظیم روشنایی و رم داخلی (SRAM) برای ذخیره دیتای نمایشگر است.
از مهمترین ویژگیهای این تراشه میتوان به موارد زیر اشاره کرد:
- ارتباط تنها از طریق دو سیم: CLK (کلاک) و DIO/DATA (داده).
- قابلیت درایو حداکثر ۶ گرید (سونسگمنت).
- تنظیم روشنایی دیجیتال در ۸ سطح مختلف از طریق PWM داخلی.
- عدم نیاز به رفرش مداوم توسط میکروکنترلر اصلی.

۲. کالبدشکافی پروتکل ارتباطی (I2C-Like)
پروتکل ارتباطی TM1637 بسیار شبیه به I2C است، با این تفاوت که آدرسدهی سختافزاری (Device Address) برای خود تراشه روی باس وجود ندارد. ارتباط کاملاً یکطرفه (به جز پالس ACK) و بر پایه انتقال ۸ بیتی است. تولید سیگنالها در این پروتکل به زبان ساده به شرح زیر است:
- شرایط شروع (START Condition): زمانی که خط کلاک (CLK) در وضعیت High (یک منطقی) قرار دارد، خط داده (DATA) از وضعیت High به Low تغییر میکند. این لبه پایینرونده به تراشه میفهماند که یک بسته داده در راه است.
- ارسال دادهها (Data Transmission): دادهها بیتبهبیت و از کمارزشترین بیت (LSB First) ارسال میشوند. تغییر وضعیت خط DATA (صفر یا یک شدن) فقط و فقط زمانی مجاز است که خط کلاک در وضعیت Low قرار داشته باشد. سپس کلاک High میشود تا تراشه TM1637 در لبه بالارونده کلاک، بیت را بخواند.
- دریافت تاییدیه (ACK / NACK): پس از ارسال ۸ بیت، میکروکنترلر باید در پالس کلاک نهم، خط DATA را آزاد کند (High شود). تراشه TM1637 در صورت دریافت صحیح داده، خط DATA را به زمین متصل میکند (Low میکند). خواندن این وضعیت برای اطمینان از سلامت فیزیکی باس و اتصال تراشه الزامی است.
- شرایط پایان (STOP Condition): زمانی که خط کلاک در وضعیت High قرار دارد، خط داده از وضعیت Low به High تغییر میکند. این لبه بالارونده پایان فریم ارتباطی را اعلام میکند.

۳. بررسی تخصصی رجیسترها و دستورات کنترلی
برای نمایش یک عدد روی سگمنتها، باید سه فریم (دستور) مجزا به تراشه TM1637 ارسال شود. این دستورات به شرح زیر هستند:
فریم اول: دستور تنظیمات داده (Data Command Set)
این دستور نحوه نوشتن در حافظه SRAM تراشه را مشخص میکند.
- مقدار استاندارد: 0x40
- نقش: این مقدار تراشه را در حالت «افزایش خودکار آدرس» (Auto Address Increment) قرار میدهد. با این کار، دیگر نیازی نیست برای تکتک سگمنتها آدرس جداگانه بفرستیم؛ کافیست آدرس اولین سگمنت را مشخص کرده و دادهها را به صورت پشتسرهم (Burst) ارسال کنیم.
فریم دوم: دستور آدرسدهی و ارسال مقادیر (Address Command Set)
این فریم ابتدا آدرس سگمنت هدف را مشخص کرده و سپس مقادیر هگزادسیمال مربوط به الگوهای روشنشدن LEDها را میفرستد.
- آدرس پایه: 0xC0 (مربوط به گرید یا سگمنت اول). سگمنتهای بعدی به ترتیب آدرسهای 0xC1 تا 0xC5 را دارند.
- روند کار: میکروکنترلر یک Start ایجاد کرده، مقدار 0xC0 را میفرستد و سپس مقادیر مربوط به سگمنتهای ۱ تا ۶ را به ترتیب ارسال میکند و در نهایت Stop را ایجاد میکند.
فریم سوم: دستور کنترل نمایشگر و روشنایی (Display Control)
این دستور برای روشن/خاموش کردن کل نمایشگر و تنظیم سطح PWM آن استفاده میشود. آدرس پایه این رجیستر 0x80 است.
- خاموش کردن نمایشگر: ارسال مقدار 0x80.
- روشن کردن نمایشگر: بیت سوم باید یک شود (ارسال 0x88).
- تنظیم روشنایی: ۳ بیت اول (LSB) سطح روشنایی را تنظیم میکنند. تراشه دارای یک کنترلر PWM داخلی با ۱۶ پله است. مقادیر 0 تا 7 به ترتیب Duty Cycle را از حداقل (1/16) تا حداکثر (14/16) تنظیم میکنند.
- مثال: مقدار 0x8F (حاصل 0x88| 0x07) نمایشگر را روشن کرده و در بالاترین سطح روشنایی قرار میدهد.



۴. پیکربندی سختافزاری اصولی در STM32CubeMX
برای راهاندازی این تراشه در سطح صنعتی، تنظیمات پایهها از اهمیت فوقالعادهای برخوردار است:
۱. پیکربندی پینهای CLK و DATA:
هر دو پین باید منحصراً در حالت Output Open-Drain (OD) با مقاومت Pull-Up تنظیم شوند.
استفاده از حالت Push-Pull یک خطای طراحی است. در پالس نهم (ACK)، تراشه TM1637 خط دیتا را زمین (Low) میکند. اگر پین میکروکنترلر در حالت Push-Pull باشد و میکرو در آن لحظه لاجیک High روی پین قرار دهد، یک اتصال کوتاه مستقیم رخ داده و پین میکروکنترلر آسیب میبیند. در حالت Open-Drain، لاجیک High صرفاً خط را رها میکند تا Pull-Up آن را بالا بکشد و تداخلی ایجاد نمیشود.
۲. پیکربندی تایمر زمانبندی (Tick Timer):
یک تایمر پایه (مثلاً TIM3 یا TIM6) را به گونهای تنظیم کنید که هر ۱۰ میکروثانیه (100kHz) یک وقفه (Interrupt) تولید کند. این تایمر قلب تپنده ماشین حالت درایور ما خواهد بود.
۵. معماری نرمافزاری پیشرفته (Non-Blocking State Machine)
معمولاً از تابع HAL_Delayیا حلقههای for با دستور nop برای ایجاد تاخیر بین لبههای کلاک استفاده میشود. این روش در سیستمهای بلادرنگ (Real-Time) مانند درایو موتورهای براشلس، الکترونیک قدرت یا سیستمهای پردازش لبه، باعث قفل شدن پردازنده و فاجعه میشود.
بهترین الگو برای حل این مشکل، استفاده از معماری «ماشین حالت ناهمگام» (Asynchronous State Machine) است. در این ساختار:
۱. ایجاد یک ساختار کپسوله (Handle Typedef): تمامی پینها، متغیرهای وضعیت، و صف دستورات (Job Queue) در یک استراکچر محلی قرار میگیرند. این کار امکان کنترل همزمان دهها آیسی TM1637 را بدون تداخل متغیرهای سراسری (Global Variables) فراهم میکند.
۲. صف دستورات (Job Queue): زمانی که برنامه اصلی درخواست نمایش یک عدد را میدهد، توالی دستورات Start، بایتها و Stop وارد یک آرایه (صف) میشود و تابع فوراً به برنامه اصلی برمیگردد.
۳. تغذیه باس در بستر وقفه (ISR): تایمر ۱۰ میکروثانیهای به صورت مداوم وضعیت ماشین حالت را چک میکند. اگر دستوری در صف باشد، فازهای تولید کلاک، تغییر لاجیک پینها و خواندن وضعیت NACK به صورت اتمیک و سیکلبهسیکل داخل روتین وقفه اجرا میشوند. در صورت بروز خطا (مانند قطعی سیم)، ماشین حالت با تولید یک توالی Stop ایمن، عملیات را متوقف (Abort) میکند تا باس قفل نشود.
این رویکرد تضمین میکند که بار پردازشی CPU برای مدیریت نمایشگر تقریباً به صفر برسد و سیستم با حداکثر بهرهوری و پایداری به وظایف اصلی خود بپردازد.
شما با استفاده از کتابخانه توسعه شده توسط اصفهان درایو قادر هستید به صورت کاملا بهینه و حرفه ای با استفاده از آی سی TM1637 تا 6 عدد سون سگمنت را به سادگی درایو کرده و در پروژه های خود به صورت غیر مسدود کننده استفاده کنید!
در زیر، پروژه ای که با استفاده از همین کتابخانه برای شمارش صفر تا 999 در هر ثانیه با استفاده از برد STM32L476RG انجام شده است، برای دانلود قرار داده شده است.در این پروژه، نحوه استفاده از کتابخانه برای سایر پروژه های دلخواه آموزش داده شده است.
نتیجه اجرای برنامه با استفاده از کتابخانه توسعه داده شده توسط اصفهان درایو
دانلود پروژه کامل راه اندازی TM1637 با برد NUCLEO-L476RG
امیدواریم از این آموزش استفاده برده باشید!
با سایر آموزش های اصفهان درایو همراه باشید!










