- وحدة عرض مكونة من 7 أجزاء و 4 أرقام و 7 أجزاء:
- توصيل وحدة الأجزاء السبعة المكونة من 4 أرقام بوحدة التحكم الدقيقة PIC:
- البرمجة باستخدام PIC16F877A:
- إعداد واختبار الأجهزة:
هذا هو البرنامج التعليمي الثامن الخاص بنا لتعلم الميكروكونترولر PIC باستخدام MPLAB و XC8. لقد توصلنا إلى كل الطريق من تثبيت MPLABX إلى استخدام شاشة LCD مع PIC MCU. إذا كنت جديدًا هنا ، فراجع البرامج التعليمية السابقة حيث يمكنك تعلم أجهزة ضبط الوقت ، وميض LED ، وتوصيل شاشات الكريستال السائل وما إلى ذلك. يمكنك العثور على جميع دروس الموافقة المسبقة عن علم لدينا هنا. في البرنامج التعليمي الأخير ، رأينا كيف يمكننا إنشاء أحرف مخصصة من خلال شاشة LCD مقاس 16 * 2 ، والآن دعونا نجهز أنفسنا بنوع آخر من وحدات العرض تسمى شاشة العرض المكونة من 7 مقاطع ونقوم بواجهة PIC Microcontroller.
على الرغم من أن شاشة LCD مقاس 16 × 2 أكثر راحة من شاشة العرض المكونة من 7 أجزاء ، إلا أن هناك عددًا قليلاً من السيناريوهات التي تكون فيها شاشة العرض المكونة من 7 أجزاء أكثر سهولة من شاشة LCD. تعاني شاشة LCD من عيب انخفاض حجم الأحرف وستكون مبالغة في مشروعك إذا كنت تخطط فقط لعرض بعض القيم الرقمية. تتميز المقاطع السبعة أيضًا بميزة الإضاءة السيئة ويمكن رؤيتها من زوايا الجعة أكثر من شاشة LCD العادية. لذا ، دعونا نبدأ في معرفة ذلك.
وحدة عرض مكونة من 7 أجزاء و 4 أرقام و 7 أجزاء:
تحتوي شاشة العرض المكونة من 7 قطاعات على سبعة أجزاء فيها ويحتوي كل جزء على مؤشر LED واحد بداخله لعرض الأرقام عن طريق إضاءة الأجزاء المقابلة. كما لو كنت تريد أن يعرض الجزء ذي السبعة الرقم "5" ، فأنت بحاجة إلى توهج المقطع a و f و g و c و d بجعل دبابيسها المقابلة عالية. هناك نوعان من شاشات العرض المكونة من 7 مقاطع: الكاثود المشترك والأنود المشترك ، هنا نستخدم عرض مقاطع الكاثود المشترك السبعة. تعرف على المزيد حول عرض 7 أجزاء هنا.
الآن نحن نعرف كيفية عرض الحرف الرقمي المطلوب على شاشة عرض واحدة من 7 أجزاء. ولكن ، من الواضح أننا سنحتاج إلى أكثر من شاشة عرض من 7 أجزاء لنقل أي معلومات تزيد عن رقم واحد. لذلك ، في هذا البرنامج التعليمي ، سنستخدم وحدة عرض مكونة من 4 أرقام مكونة من 7 أجزاء كما هو موضح أدناه.
كما نرى ، هناك أربع شاشات عرض ذات سبعة أجزاء متصلة ببعضها البعض. نحن نعلم أن كل وحدة مكونة من 7 أجزاء ستحتوي على 10 دبابيس ولأربعة شاشات من سبع مقاطع سيكون هناك 40 سنًا في المجموع وسيكون من الصعب على أي شخص لحامها على لوحة نقطية ، لذلك أوصي بشدة أي شخص بشراء وحدة أو قم بعمل PCB الخاص بك لاستخدام شاشة عرض مكونة من 4 أرقام مكونة من 7 أجزاء. يظهر مخطط الاتصال لنفسه أدناه:
لفهم كيفية عمل الوحدة النمطية المكونة من 4 أرقام المكونة من سبعة أجزاء ، يتعين علينا النظر في المخططات المذكورة أعلاه ، كما هو موضح ، يتم توصيل المسامير A لجميع شاشات العرض الأربعة للتجمع مثل A ونفس الشيء لـ B و C…. حتى DP. إذن ، إذا كان الزناد A يعمل بشكل أساسي ، فحينئذٍ يجب أن ترتفع كل أربعة A إلى اليمين؟
لكن هذا لا يحدث. لدينا أربعة دبابيس إضافية من D0 إلى D3 (D0 و D1 و D2 و D3) والتي يمكن استخدامها للتحكم في العرض الذي يجب أن يرتفع من بين الأربعة. على سبيل المثال: إذا كنت بحاجة إلى أن يكون الإخراج الخاص بي موجودًا فقط على الشاشة الثانية ، فيجب أن يكون D1 فقط مرتفعًا مع إبقاء المسامير الأخرى (D0 و D2 و D3) منخفضة. ببساطة يمكننا تحديد الشاشة التي يجب أن تنشط باستخدام المسامير من D0 إلى D3 وما هي الشخصية التي سيتم عرضها باستخدام المسامير من A إلى DP.
توصيل وحدة الأجزاء السبعة المكونة من 4 أرقام بوحدة التحكم الدقيقة PIC:
هنا استخدمنا الميكروكونترولر PIC16F877A والتخطيطي للدائرة موضح أدناه.
لدينا 12 دبابيس إخراج من الوحدة ، منها 8 تستخدم لعرض الأحرف وأربعة تستخدم لتحديد شاشة واحدة من أصل أربعة. ومن ثم يتم تعيين جميع دبابيس الأحرف الثمانية إلى PORTD ويتم تعيين دبابيس اختيار العرض على أول أربعة دبابيس من PORTC.
ملاحظة: يجب أيضًا توصيل الدبوس الأرضي للوحدة بأرض وحدة MCU التي لا تظهر هنا.
البرمجة باستخدام PIC16F877A:
الآن ، بعد أن عرفنا كيف تعمل هذه الوحدة بالفعل ، دعنا نتعلم كيفية برمجة PIC16F877A لجعلها تعرض عددًا مكونًا من 4 أرقام. دعنا نزيد متغيرًا من 0 إلى 1000 ونطبعه على الشاشة المكونة من 7 أجزاء. قم بتشغيل برنامج MPLABX وأنشئ مشروعًا جديدًا ، فلنبدأ بتكوين بتات التكوين.
#pragma config FOSC = HS // Oscillator Selection bits (HS مذبذب) #pragma config WDTE = OFF // Watchdog Timer تمكين بت (WDT معطل) #pragma config PWRTE = ON // Power-up Timer تمكين بت (تمكين PWRT) # pragma config BOREN = ON // Brown-out إعادة تعيين تمكين بت (تمكين BOR) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circial Programming Enable bit (RB3 هو إدخال / إخراج رقمي ، HV قيد التشغيل يجب استخدام MCLR للبرمجة) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code Protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off؛ all program memory يمكن الكتابة إليه بواسطة EECON control) #pragma config CP = OFF // بت حماية رمز ذاكرة برنامج Flash (إيقاف حماية الرمز)
كالعادة نستخدم نافذة بتات التكوين المحددة لتعيين هذه البتات. إذا لم تكن متأكدًا مما تعنيه ، فانتقل إلى البرنامج التعليمي الوامض LED هنا.
بعد ذلك ، دعنا نحدد دبابيس الإخراج للتبديل بين كل رقم من الشاشة.
// *** حدد دبابيس الإشارة لجميع الشاشات الأربعة *** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // *** نهاية التعريف ** ////
هنا يتم استخدام المسامير RC0 و RC1 و RC2 و RC3 للاختيار بين الأرقام الأربعة لوحدة العرض المكونة من 7 أجزاء. يتم تعريف هذه المسامير على أنها s1 و s2 و s3 و s4 على التوالي.
بعد ذلك ، دعنا ننتقل إلى void main () ، والتي بداخلها لدينا إعلان المتغير التالي:
int أنا = 0 ؛ // القيمة المكونة من 4 أرقام التي سيتم عرضها علامة int = 0 ؛ // لإنشاء تأخير بدون إشارة int a ، b ، c ، d ، e ، f ، g ، h ؛ // فقط المتغيرات غير الموقعة int seg = {0X3F ، // قيمة Hex لعرض الرقم 0 0X06 ، // قيمة Hex لعرض الرقم 1 0X5B ، // قيمة Hex لعرض الرقم 2 0X4F ، // قيمة Hex لعرضها الرقم 3 0X66 ، // قيمة Hex لعرض الرقم 4 0X6D ، // قيمة Hex لعرض الرقم 5 0X7C ، // قيمة Hex لعرض الرقم 6 0X07 ، // قيمة Hex لعرض الرقم 7 0X7F ، / / قيمة سداسية عشرية لعرض الرقم 8 0X6F // قيمة سداسية عشرية لعرض الرقم 9} ؛ // نهاية المصفوفة لعرض الأرقام من 0 إلى 9
هنا يتم استخدام المتغيرات i و flag لتخزين القيم المراد عرضها وإنشاء تأخير على التوالي. تُستخدم متغيرات الأعداد الصحيحة غير الموقعة من a إلى h لتقسيم الأرقام المكونة من أربعة أرقام إلى أرقام فردية وتخزينها (والذي سيتم شرحه لاحقًا هنا).
الشيء الرئيسي الذي يجب ملاحظته هنا هو إعلان مصفوفة "seg" . في هذا البرنامج ، نستخدم نوع بيانات جديدًا يسمى Array. المصفوفة ليست سوى مجموعة من قيم نوع البيانات المتشابهة. هنا ، استخدمنا هذه المصفوفة لتخزين جميع القيم السداسية العشرية المكافئة لعرض رقم من 0 إلى 9.
يبدأ عنوان المصفوفة دائمًا من الصفر. لذلك ستحتوي هذه المصفوفة على القيمة السداسية العشرية لرقم رقمي (0-9) مخزن في العنوان وهو نفس الرقم كما هو موضح أدناه
متغير: |
مقطع |
مقطع |
مقطع |
مقطع |
مقطع |
مقطع |
مقطع |
مقطع |
مقطع |
مقطع |
الكود السداسي: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
مكافئ. رقم رقمي: |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
لذلك ببساطة ، إذا كنت ترغب في عرض الرقم 0 على الجزء 7 الخاص بك ، يمكنك استدعاء seg ، وبالمثل إذا كنت تريد عرض الرقم 6 ، فما عليك سوى استخدام seg.
لفهم كيفية الحصول على قيمة HEX فعليًا ، دعونا نلقي نظرة على الجدول أدناه. و يتم تخزين قيمة HEX ما يعادلها لكل رقم عشري في مجموعة بحيث يمكن استدعاء لعرض رقم واحد معين.
الآن ، دعنا ننتقل إلى الجزء التالي من الكود وهو تكوين الإدخال / الإخراج:
// ***** تكوين الإدخال / الإخراج **** // TRISC = 0X00 ؛ PORTC = 0X00 ؛ TRISD = 0x00 ؛ PORTD = 0X00 ؛ // *** نهاية تهيئة الإدخال / الإخراج ** ///
يعد تكوين الإدخال / الإخراج بسيطًا لأن جميع المسامير الموجودة في مقاطعنا السبعة عبارة عن دبابيس إخراج ، ويتم عرض التوصيلات في مخطط الدائرة أعلاه ، لذلك قم ببساطة بتعريفها على أنها مخرجات وقم بتهيئتها على الصفر.
الآن دعونا نقفز إلى الحلقة اللانهائية الخاصة بنا (while (1)). هنا يتعين علينا تقسيم قيمة "i" إلى أربعة أرقام وعرضها على الجزء السابع. لنبدأ أولاً بتقسيم القيمة على "i"
// *** تقسيم "i" إلى أربعة أرقام *** // a = i٪ 10 ؛ // يتم حفظ الرقم الرابع هنا b = i / 10 ؛ c = b٪ 10 ؛ // يتم حفظ الرقم الثالث هنا d = b / 10 ؛ ه = د٪ 10 ؛ // يتم حفظ الرقم الثاني هنا f = d / 10 ؛ ز = و٪ 10 ؛ // يتم حفظ الرقم الأول هنا h = f / 10 ؛ // *** نهاية التقسيم *** //
باستخدام عملية القسمة والمعامل البسيط ، يتم فصل الرقم المكون من 4 أرقام (i) إلى أرقام فردية. في حالتنا هذه ، لنأخذ مثالاً حيث تكون قيمة "i" 4578. ثم في نهاية هذه العملية ، المتغير g = 4 و e = 5 و c = 7 و a = 8. لذلك سيكون من السهل الآن عرض كل رقم بمجرد استخدام هذا المتغير.
PORTD = SEG ؛ s1 = 1 ؛ // قم بتشغيل العرض 1 واطبع الرقم الرابع __delay_ms (5) ؛ s1 = 0 ؛ // إيقاف تشغيل العرض 1 بعد تأخير 5 مللي ثانية PORTD = seg ؛ s2 = 1 ؛ // قم بتشغيل العرض 2 واطبع الرقم الثالث __delay_ms (5) ؛ s2 = 0 ؛ // إيقاف تشغيل العرض 2 بعد تأخير 5 مللي ثانية PORTD = seg ؛ s3 = 1 ؛ // قم بتشغيل العرض 3 واطبع الرقم الثاني __delay_ms (5) ؛ s3 = 0 ؛ // إيقاف تشغيل العرض 3 بعد تأخير 5 مللي ثانية PORTD = seg ؛ s4 = 1 ؛ // قم بتشغيل العرض 4 واطبع الرقم الأول __delay_ms (5) ؛ s4 = 0 ؛ // إيقاف تشغيل العرض 4 بعد تأخير 5 مللي ثانية
هذا هو المكان الفعلي الذي تتحدث فيه MCU مع الجزء السابع. كما نعلم ، يمكننا عرض رقم واحد فقط في كل مرة ، ولكن لدينا أربعة أرقام لعرضها وفقط إذا كانت جميع الأرقام الأربعة في وضع التشغيل ، فسيكون الرقم المكون من أربعة أرقام مرئيًا للمستخدم.
لذا ، كيف نذهب مع هذا؟
من حسن حظنا أن MCU الخاصة بنا أسرع بكثير من العين البشرية ، لذا ما نقوم به في الواقع: نعرض رقمًا واحدًا في كل مرة ولكننا نفعل ذلك بسرعة كبيرة كما هو موضح أعلاه.
نختار عرضًا مكونًا من رقم واحد ينتظر 5 مللي ثانية حتى يتمكن MCU والجزء 7 من معالجته ثم إيقاف تشغيل هذا الرقم والانتقال إلى الرقم التالي ونفعل الشيء نفسه حتى نصل إلى الرقم الأخير. لا يمكن ملاحظة هذا التأخير البالغ 5 مللي ثانية بالعين البشرية ويبدو أن جميع الأرقام الأربعة تعمل في نفس الوقت.
هذا كل شيء ، أخيرًا نزيد قيمة الرقم المعروض باستخدام تأخير كما هو موضح أدناه
if (flag> = 100) // انتظر حتى يصل العلم إلى 100 {i ++؛ flag = 0؛ // فقط إذا كانت العلامة مائة "i" سيتم زيادة} flag ++ ؛ // علامة زيادة لكل فلاش
يتم استخدام التأخير بحيث يكون الوقت المستغرق للتغيير من رقم إلى آخر طويلاً بما يكفي لملاحظة التغيير.
يتم تقديم الرمز الكامل أدناه ويتم شرح العملية أيضًا في الفيديو في النهاية.
إعداد واختبار الأجهزة:
كما هو الحال دائمًا ، دعونا نحاكي البرنامج باستخدام Proteus قبل أن نذهب بالفعل مع أجهزتنا. إذا كانت المحاكاة ناجحة ، يجب أن ترى شيئًا كهذا
لا يحتوي هذا المشروع على أي إعداد معقد للأجهزة ، فنحن نستخدم مرة أخرى نفس لوحة PIC Microcontroller التي أنشأناها في البرنامج التعليمي الوامض LED. ما عليك سوى توصيل الوحدة المكونة من 7 مقاطع بلوحة وحدة التحكم الدقيقة PIC وفقًا لمخطط التوصيل. بمجرد الانتهاء من الاتصالات ، ما عليك سوى تفريغ الكود باستخدام مبرمج PicKit 3 الخاص بك وهذا هو الاستمتاع بإخراجك.