اردوينو: العرض الديناميكي. مؤشر ديناميكي مخطط مؤشر ديناميكي للمؤشرات الرقمية

يعد العرض الديناميكي إحدى المشكلات التي يواجهها مبرمجو وحدات التحكم الدقيقة المبتدئون. لقد قيل الكثير عنها، لكنني قررت دعم ما هو معروف بالصور والأمثلة على الكود المصدري في لغة C لتسهيل إتقان طريقة العرض هذه.

1 أساسيات أو مقدمة

أولاً، دعونا نحدد المصطلحات التي سنستخدمها خلال المقالة.

إذا كنت بحاجة إلى التحكم في شاشة عرض تتكون من مألوفة واحدة مكونة من سبعة أجزاء، فهذا لا يسبب أي مشاكل - يمكن اعتبارها 8 مصابيح LED مستقلة. إذا كنت بحاجة إلى عرض معلومات أكثر من حرف واحد، تبدأ المشاكل: مكانان مألوفان يشكلان 16 مصباح LED، وثلاثة - 24، وما إلى ذلك، أي أنه بالنسبة لشاشة مكونة من ثلاثة أرقام، قد لا يكون هناك ما يكفي من دبابيس وحدة التحكم الدقيقة، وليس ل أذكر شاشات عرض مكونة من 6 أرقام أو أكثر، وخاصة مؤشرات المصفوفة.

من أجل التبسيط، دعونا نتفق على أن جميع مؤشراتنا لها كاثود مشترك. حل المشكلة بسيط للغاية: قم بتوصيل أطراف قطاعات جميع المؤشرات ببعضها البعض. الآن، إذا كنت تريد إخراج المعلومات إلى أول موقع مألوف، فيجب عليك تطبيق المستويات المطلوبة على خطوط المقطع، وتوصيل الخرج المشترك للمؤشر الأول بالسلك المشترك للدائرة. وبطبيعة الحال، يجب أن تكون المستويات العالية موجودة في الكاثودات المشتركة لجميع المؤشرات الأخرى. من الواضح أن الأجزاء الضرورية من المؤشر الأول سوف تضيء. للإخراج إلى الثاني والثالث وما إلى ذلك. يجب أن تفعل المؤشرات نفس الشيء، أي. من خلال تطبيق صفر منطقي على أحد الكاثودات المشتركة، نختار الرقم المعروض الحالي، وتحدد حالة خطوط المقطع الرمز المرئي.

لكي يُنظر إلى الشاشة بأكملها على أنها متوهجة باستمرار، يجب تبديل الأرقام بسرعة - أكثر من 25 مرة في الثانية. كما ترون، فإن مستويات جميع النواتج (والتي، بالمناسبة، أصبحت أقل بكثير من النهج المعتاد) تتغير باستمرار، أي. ليس لها مستويات ثابتة، بل مستويات ديناميكية، ومن هنا جاء اسم طريقة الإشارة - ديناميكية.

صورة العرض الديناميكية

2 أنواع تنفيذ الأجهزة

2.1 المصفوفات المسطحة

إذا قمنا بالتجريد من المؤشرات المكونة من سبعة أجزاء، فيمكن تمثيل شاشتنا كمصفوفة من مصابيح LED الفردية، حيث يتم دمج الأنودات في صفوف المصفوفة، والكاثودات في أعمدة. في الواقع، هذا هو بالضبط ما هو عليه.

من الواضح أنه من خلال توفير المستويات المطلوبة لصفوف وأعمدة المصفوفة الخاصة بنا، يمكننا إضاءة أي جزء LED أولي (المعروف أيضًا باسم البكسل - وهذا مصطلح أكثر تقليدية فيما يتعلق بشاشات المصفوفة). اعتمادًا على كيفية تغيير المستويات في الصفوف والأعمدة، يمكننا الحصول على عدة أنواع من العرض الديناميكي:

  • بالخطوط
  • بالأعمدة
  • قطعة بقطعة (لكل بكسل)؛
  • بطريقة مختلطة.

لقد نظرنا إلى خيار العمود في الفصل السابق. يختلف خيار الصف عنه فقط حيث يتم تبديل صفوف وأعمدة المصفوفة. تعني طريقة المقطع بقطعة أنه في أي وقت من الأوقات يحتوي صف واحد وعمود واحد فقط على المستوى اللازم لإضاءة مؤشر LED. أي أنه في أي وقت من الأوقات، يمكن أن يضيء مؤشر LED واحد فقط للمصفوفة بأكملها (على عكس الخيارات السابقة، عندما يمكن أن يضيء الصف بأكمله أو العمود بأكمله في نفس الوقت). تذكرنا هذه الطريقة بمسح جهاز تلفزيون، عندما يمتد الشعاع حول الشاشة بأكملها، ويضيء الفوسفور في الأماكن الصحيحة. الخيار المختلط، كما يوحي الاسم، هو أن المستويات "النشطة" في نفس الوقت يمكن أن تكون موجودة في عدة صفوف وأعمدة في وقت واحد.

الخياران الأولان سهلان جدًا في التنفيذ، وبالتالي يتم استخدامهما على نطاق واسع. يتم استخدام الخيار الثالث بشكل أقل تواترا، لأنه يتطلب معدلات تحديث معلومات أعلى في الصفوف والأعمدة، ويكون متوسط ​​التيار عبر المقطع (أي سطوع المقطع) في هذه الحالة أقل بكثير من الحالات الأخرى. الطريقة المختلطة الأخيرة هي الأقل شيوعا، على الرغم من أنها تحتوي على عدد من الصفات الإيجابية. أولاً، تتطلب هذه الطريقة أن تستخدم سلاسل الصفوف والأعمدة المصادر تيار مستقروإلا فإن سطوع الأجزاء المضيئة سيعتمد حتما على العدد الإجمالي لها. وحساب مجموعات الإشارات على الصفوف والأعمدة ليس بالأمر السهل.

2.2 المصفوفات متعددة الأبعاد

تفترض الأمثلة التي تناولناها تنفيذ شاشة أحادية اللون، أي. تتكون من مصابيح LED أحادية اللون. ماذا تفعل إذا كنت ترغب في الحصول على شاشة متعددة الألوان، على سبيل المثال، من مصابيح RGB LED؟ هناك نوعان من الحلول الممكنة.

الأول هو ببساطة زيادة عدد الصفوف (أو الأعمدة) في المصفوفة الخاصة بنا، ومعاملة كل RGB LED على أنها 3 مصابيح LED فردية مستقلة. العيب الكبير لهذا النهج هو زيادة عدد الصفوف (أو الأعمدة) بمقدار 3 مرات. مثال بسيط يوضح بسهولة ما يعنيه هذا في الممارسة العملية: باستخدام متحكمين دقيقين بثمانية بتات، يمكننا الحصول على مصفوفة مقطعية أحادية اللون 8 × 8 أو مصفوفة ألوان 4 × 4. توافق على أنه في الحالة الثانية، من المستحيل عمليًا عرض أي شيء واضح...

الطريقة الثانية هي الانتقال من مصفوفة القطع "المسطحة" إلى مصفوفة "متعددة الأبعاد". إذا تم تمرير إشارة كل سطر من خلال معدد إرسال 1x3، فيمكننا أن نتخيل نظام عرض مصابيح RGB LED كثلاث مصفوفات مستقلة ذات البعد الأصلي: كل مصفوفة تتكون من مصابيح LED من نفس اللون، ونختار المصفوفة المطلوبة باستخدام معدد الإرسال إشارات التحكم. الصورة توضح ما قيل.

من الواضح أنه في حالة المصفوفة متعددة الأبعاد، يلزم أيضًا عدد إضافي من خطوط التحكم، ومع ذلك، فإن هذا العدد ليس كبيرًا جدًا: على نفس منفذي التحكم يمكننا الحصول على شاشة ملونة مقاس 7x7!!!

2.3 طرق تقليل أبعاد المصفوفات

إذا كان عدد أطراف المتحكم الدقيق محدودًا جدًا، فسيتعين علينا البحث عن طرق لتقليل عدد صفوف وأعمدة المصفوفة. بالطبع، المعجزات لا تحدث، وفي هذه الحالة سيتعين علينا الدفع باستخدام دوائر دقيقة إضافية بالإضافة إلى المتحكم الدقيق. كما كنت قد خمنت، هنا يمكنك استخدام الطريقة التي تمت مناقشتها مسبقًا للمصفوفات "متعددة الأبعاد" - بعد كل شيء، لن يمنعنا أحد من استخدام ثلاثة أضعاف عدد مصابيح LED أحادية اللون بدلاً من مصابيح RGB LED؟ الشيء الرئيسي هو ترتيبها بشكل مناسب.

لذلك يمكننا تقليل أبعاد المصفوفة باستخدام:

  • أجهزة فك التشفير أو معددات الإرسال؛
  • سجلات التحول.

لقد التقينا بالفعل معددات الإرسال في وقت سابق، فك التشفير، كما يمكنك تخمين، لا يختلف جوهريا عن معدد الإرسال. يجب أن نضيف فقط أنه باستخدام أجهزة فك التشفير/مضاعفات الإرسال لكل من الصفوف والأعمدة، من الممكن تقليل بُعد المصفوفة على طول كلا البعدين في وقت واحد، ولكن في هذه الحالة قد يكون من الضروري استخدام العرض الديناميكي مقطعًا تلو الآخر فقط، بكل عيوبه.

يمكن أن تساعد سجلات Shift بشكل أفضل بكثير من برامج فك التشفير. النظر في الرسم البياني في الشكل أدناه.

من السهل أن نرى أن أي عدد من الصفوف والأعمدة سيتطلب فقط زيادة في عدد السجلات، وسيظل عدد خطوط التحكم في المتحكم الدقيق كما هو! العيب الصغير لهذا النهج هو أنه مع زيادة عدد السجلات في السلسلة، يجب زيادة سرعة الإخراج التسلسلي للمعلومات فيها، وهو أمر ليس من السهل تحقيقه دائمًا. على سبيل المثال، المتحكمات الدقيقة الشائعة في العائلة أفر، عمليا لا تسمح لك بتجاوز سرعة الإخراج التسلسلي البالغة 10 ميغابت / ثانية. من ناحية أخرى، إذا كنت تستخدم وحدات تحكم أخرى يمكنها إخراج الإشارات بشكل أسرع، فقد تنشأ مشكلات ذات ترتيب مختلف: انتشار إشارة ساعة عالية التردد على طول خط طويل (ومع وجود عدد كبير من السجلات ستكون حتمًا واحدة) ) يحدث بشكل مختلف تمامًا عن التردد المنخفض، لذلك ستكون هناك حاجة إلى تدابير خاصة أثناء توصيل الأسلاك لوحة الدوائر المطبوعةوغيرها من الأمور التي لن نتناولها في نطاق هذا المقال.

3 طرق تنفيذ البرمجيات

لن نفكر في تنفيذ البرنامج لجميع خيارات العرض الديناميكية المذكورة - وهذا من شأنه أن يؤدي إلى تضخم المقالة بشكل غير معقول. سنقتصر على ثلاثة فقط من الأمثلة الأكثر شيوعًا: مصفوفة مسطحة مع التحكم المباشر في الصفوف والأعمدة، ونفس الشيء مع استخدام وحدة فك التشفير، وأخيرًا متغير باستخدام سجلات التحول. في جميع الحالات انتباه خاصسيتم تخصيص جميع الفروق الدقيقة في تنفيذ البرنامج، أي أن رمز C سيكون مصحوبًا بتفسيرات فقط في الحالات التي يتزامن فيها هذا مع نية المؤلف، وليس على الإطلاق مع مستوى تدريبك. بهذا ألمح إلى أنك يجب أن تعرف أساسيات لغة C بدوني.

بالنسبة لجميع الأمثلة، سوف نتفق على أن شاشتنا مبنية على مؤشرات من سبعة قطاعات مع كاثود مشترك.

3.1 أبسط طريقة

من الواضح أنه سيكون أكثر ملاءمة في البرنامج أن يكون لديك مصفوفة معينة، ستحدد محتوياتها بشكل لا لبس فيه الأجزاء التي تضاء فيها المناطق المألوفة من الشاشة - وهو نوع من التناظرية لذاكرة الوصول العشوائي التي تظهر على الشاشة.

دعونا نقدم تعريف الثوابت التالية:

#define SCR_SZ 6 /* عدد تعريفات العرض */ #define ROWS PORTB /* عرض منفذ "الصفوف"، أي. إدارة القطاع */ #define COLS PORTD /* منفذ إدارة "العمود"، أي الكاثودات المشتركة */

الآن لنعلن عن مصفوفة الشاشة:

حرف SCR غير موقع؛

في البداية، سنفترض أن كل عنصر في المصفوفة يتوافق مع ألفة العرض، وكل بت من هذا العنصر يتوافق مع جزء معين من المؤشر. أي بت يتوافق مع أي جزء - في هذه الحالة لا يهم، تمامًا كما لا يهم كيفية تعيين هذه البتات في بايتات المصفوفة، سنفترض فقط في الوقت الحالي أنها موجودة بالفعل. من أجل التبسيط، سنفترض أيضًا أن الكاثودات المشتركة متصلة بمنافذ المنفذ كولسبالتسلسل: البتة الأقل أهمية هي المؤشر الموجود في أقصى اليمين، ثم الثاني، ثم الثالث، وما إلى ذلك.

كيفية جعل هذه المصفوفة "تظهر" على الشاشة؟ لنكتب الكود التالي :

< SCR_SZ; pos++){ ROWS = SCR; COLS = ~(1 << pos); }

هل سيؤدي الوظيفة المطلوبة؟ نعم. لكنها ليست جيدة.

أولاً، يرجى ملاحظة أنه ليس لدينا أي سيطرة على مدى سرعة تحديث محتويات الصفوف والأعمدة. ثانيًا، لاحظ أنه بحلول الوقت الذي تتم فيه طباعة عنصر المصفوفة الجديد صفوفعلى السطور كولسالمعنى القديم لا يزال موجودا! إلى أين يؤدي؟ علاوة على ذلك، في جزء من الثانية، ستعرض منطقة الألفة أجزاء من منطقة الألفة المجاورة، أي: سيتم إضاءة بعض الأجزاء بشكل خاطئ.

يمكنك تجنب هذا التأثير عن طريق القيام بذلك: قبل تحديث المحتوى صفوف، قم دائمًا بإطفاء المكان المألوف الذي كان في السابق. لكي لا تهتم بتحديد الألفة السابقة، يمكنك إطفاء كل شيء مرة واحدة. لذلك يأخذ الكود الخاص بنا النموذج التالي:

حرف غير موقع؛ بينما (1) لـ (pos = 0؛ pos< SCR_SZ; pos++){ COLS = 0xFF; ROWS = SCR; COLS = ~(1 << pos); delay(); }

أضفنا إفراغ الشاشة بأكملها قبل تحديث حالة خطوط المقطع (التغذية مستوى عالإلى الكاثودات المشتركة، سنقوم بإيقاف تشغيل المؤشر بغض النظر عما هو موجود على الأنودات) ونقدم تأخيرًا في نهاية الدورة. الآن ستعمل الشاشة بشكل أفضل. لكن هل كتبنا برنامجًا جيدًا؟ للاسف لا.

والحقيقة هي أن دورة العرض لا نهاية لها بينمالن يسمح لنا بفعل أي شيء آخر. ما هو نوع البرنامج الذي سيكون لدينا والذي يمكنه فقط عرض شيء ما على المؤشر؟! بالطبع، كل شيء ليس سيئًا بنسبة 100٪، حيث يمكن القيام بشيء مفيد باستخدام المقاطعات... وبدلاً من التأخير تأخير()يمكنك تنفيذ بعض الإجراءات... لكن كل هذا ملتوي للغاية: لا يُنصح بتنفيذ شيء معقد ومرهق في معالجات المقاطعة؛ من ناحية أخرى، إذا قمت بشيء معقد ومرهق بدلاً من التأخير، فمن الصعب ضمان نفس وقت الحساب، وإلا فسوف يتبين أن الأماكن المألوفة تتوهج لفترات زمنية مختلفة، والتي ستبدو بصريًا مثل أماكنها توهج أو وميض من سطوع مختلف.

بشكل عام، لا يمكن السماح بهذا الخيار إلا كاستثناء، أو كمثال تعليمي فقط، أو في هذه الحالة (ولكن مرة أخرى، كاستثناء فقط!) عندما تكون المشكلة الرئيسية التي يتم حلها بسيطة للغاية (قد يكون هذا، على سبيل المثال) مشكلة القياس باستخدام أدكالجهد وعرضه على الشاشة).

ماذا عليك ان تفعل؟ الجواب، كما هو الحال دائما، بسيط: جميع العمليات التي يجب تنفيذها دون أن يلاحظها أحد من خلال حل المهمة الرئيسية (والإشارة، بالطبع، مثل هذه العملية) يجب أن يتم تنفيذها باستخدام مقاطعات الموقت.
ستصل الانقطاعات على فترات زمنية محددة بدقة، مما يضمن إضاءة موحدة للعلامات المألوفة. سيسمح لنا مؤشر الخلفية بكتابة شيء ما في المصفوفة في الوقت المناسب في الحلقة الرئيسية SCR- وسيظهر على الفور على الشاشة! وجميع التعديلات على الكود سوف تتلخص في حقيقة أننا بدلاً من الحلقات نستخدم وظيفة معالج المقاطعة:

ISR(TIMER0_OVF_vect)( char pos ثابت غير موقع = 0؛ COLS = 0xFF؛ ROWS = SCR؛ COLS = ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

بعض التعليقات.

عامل نقاط البيع، مع الإشارة إلى رقم الإشارة المضيئة الحالية، نجعلها متغيرًا ثابتًا محليًا بحيث تحتفظ بقيمتها من المقاطعة إلى المقاطعة. في نهاية الوظيفة، نقوم بشكل مستقل (بعد كل شيء، لم يعد لدينا حلقة) بزيادة عدد المكان المألوف حتى نصل إلى الحد الأقصى - في هذه الحالة، نعود مرة أخرى إلى البداية.

في البرنامج الرئيسي سنحتاج فقط إلى تهيئة المنافذ والمؤقت (في هذه الحالة - الموقت 0)، بحيث يفيض على الفواصل الزمنية التي نحتاجها، ويسمح بالانقطاعات. بعد ذلك، ليس من الضروري التفكير في الإشارة - فستعمل بهدوء وسلام من تلقاء نفسها. ولكن كيف يمكن تحديد الفاصل الزمني لتجاوز المؤقت المطلوب؟ بسيط جدا. ترى العين البشرية الخفقان بتردد يزيد عن 25 هرتز على أنه توهج مستمر. لدينا 6 مؤشرات، يجب أن يومض كل منها بهذا التردد، مما يعني أنه يجب تحديث المعلومات الموجودة على الشاشة بتردد 25 × 6 = 150 هرتز أو أكثر. الآن دعونا نحسب قيمة المقياس المسبق للمؤقت: قسّم تردد الساعة لـ MK على 256 ( الموقت 0الجميع لديه أفرثمانية بت، مما يعني أنه يفيض بعد العد إلى 256) - ستكون هذه هي القيمة المطلوبة لمقياس المؤقت المسبق. بالطبع، من غير المرجح أن تتزامن النتيجة مع إحدى قيم المقياس المسبق القياسية - هذه ليست مشكلة، يمكنك أن تأخذ أقرب قيمة أصغر مناسبة. ستعمل الشاشة بتردد أعلى، لكن هذا لن يقلل من جودتها! سيكون التأثير الجانبي بمثابة حمل كبير على قلب MK للشاشة. إذا كان هذا يتعارض بشكل كبير مع البرنامج الرئيسي، فسيتعين عليك تبديل العرض إلى مؤقت آخر، على سبيل المثال، 16 بت الموقت 1، أو أدخل عدادًا لتجاوزات المؤقت التي تم تخطيها:

#define SKIP 15 /* عدد مقاطعات المؤقت التي يجب تخطيها */ ISR(TIMER0_OVF_vect)( static unsigned char pos = 0; static unsigned charتخطي = SKIP; إذا (--skip) العودة; تخطي = SKIP; COLS = 0xFF; ROWS = سر؛<< pos); if(++pos == SCR_SZ) pos = 0; }

في هذه الأمثلة المبسطة نفترض أن المنفذ كولس، باستثناء الكاثودات المشتركة للمؤشرات، لا يوجد شيء آخر متصل. ومع ذلك، في الحياة الحقيقية، لا يحدث هذا الحظ في كثير من الأحيان، ومن المرجح أن يكون هناك شيء آخر متصل بالخطوط المتبقية من هذا المنفذ. لذلك، عند تنظيم العرض الديناميكي، يجب عليك دائمًا التأكد من أن حالة جميع خطوط المنافذ غير المرتبطة بشكل مباشر بالشاشة تظل دون تغيير. يتم ذلك ببساطة: بدلًا من مجرد كتابة قيمة جديدة على المنفذ، يجب عليك استخدام إخفاء البتات غير الضرورية:

كولز |= 0x3F; // لذلك نطفئ جميع الأماكن المألوفة COLS &= ~(1<

لا يقوم كلا المشغلين بتغيير قيمة البتات الأكثر أهمية للمنفذ كولس.

3.2 الطريقة مع وحدة فك التشفير

يمكن استخدام وحدة فك الترميز إما للتحويل عرافةأو بي سي ديرمز إلى رموز مكونة من سبعة أجزاء، أو لتحديد أحد أعمدة المصفوفة. سيختلف كلا الخيارين عن الطريقة الأبسط التي تمت مناقشتها سابقًا فقط في كيفية تنظيم الإخراج إلى المنافذ صفوفو/أو كولس، والتي سيتم توصيل مدخلات وحدة فك التشفير بها.
خيار لاستخدام وحدة فك التشفير للحصول على رمز مكون من سبعة أجزاء:

ISR(TIMER0_OVF_vect)( char pos ثابت غير موقع = 0; COLS |= 0x3F; ROWS = (ROWS & 0xF0) | (SCR & 0x0F); COLS &= ~(1<< pos); if(++pos == SCR_SZ) pos = 0; }

كما ترون، التغييرات ضئيلة - قبل العرض صفوفرمز الحرف من المصفوفة SCR، يتم إخفاء البتات الأكثر أهمية، وبعد ذلك يتم تعيين البتات الأقل أهمية وفقًا لرمز الحرف. أي أننا نعتقد أن وحدة فك التشفير متصلة بالبتات الأربعة الأقل أهمية في المنفذ صفوف.

آمل ألا يكون هناك فائدة من إعطاء مثال لفك تشفير الأعمدة - كل شيء واضح بالفعل.

3.3 طريقة التسجيل

على الرغم من أن الإشارة الديناميكية باستخدام سجلات التحول لا تختلف جوهريًا عن الطرق التي تمت مناقشتها مسبقًا، إلا أن هناك العديد من الخيارات لتنفيذها. سننظر في أبسطها - إخراج البتات عن طريق البرنامج فقط. وفي تنفيذ الآخرين (باستخدام USI/USART/SPI/توي) يمكنك تجربة ذلك بنفسك.

بالنسبة لمتغير العرض المحدد مسبقًا للمواقع المألوفة المكونة من 6 وسبعة أجزاء، نستخدم مسجلي إزاحة من النوع 74HC595. يتم التحكم في هذا السجل بواسطة ثلاث إشارات: نبضات ساعة إدخال البيانات التسلسلية CLK، البيانات الفعلية بياناتونبضة من الإخراج المتوازي المتزامن للمعلومات المكتوبة في السجل تعيين. لنعلن عن وحدات الماكرو المقابلة (للتبسيط، سنرسل جميع الإشارات إلى منفذ واحد):

#حدد CLK _BV(PB0) #حدد DATA _BV(PB1) #حدد SET _BV(PB2) #حدد REG_PORT PORTB

للكتابة في السجل، من المناسب كتابة وظيفة منفصلة:

تحول الفراغ الثابت (حرف غير موقع d) (حرف غير موقع i؛ for (i=0; i< 8; i++){ // устанавливаем нужный уровень DATA if(d & 1) REG_PORT |= DATA; else REG_PORT &= ~DATA; REG_PORT |= CLK; // даем импульс CLK REG_PORT &= ~CLK; d >>= 1; } }

يُنصح بشدة بجعل هذه الوظيفة ثابتة، لأنها سيتم استخدامه في معالج المقاطعة. من المرجح أن يقوم المترجم بإنشاء وظائف ثابتة في النموذج في النسق-الإدراج في معالج المقاطعة، أي. لن يكون هناك استخدام غير ضروري للمكدس، وهو أمر غير مضمون للوظائف غير الثابتة.

الآن سيبدو معالج المقاطعة الخاص بنا كما يلي:

ISR(TIMER0_OVF_vect)( char pos ثابت غير موقع = 0; Shift(SCR); Shift(~(1<< pos)); REG_PORT |= SET; // выдаем импульс SET REG_PORT &= ~SET; if(++pos == SCR_SZ) pos = 0; }

وبما أن البيانات المكتوبة على السجلات تظهر في مخرجاتها في وقت واحد فلا داعي لإطفاء المؤشرات أولا. يجب أن نتذكر أن الإخراج التسلسلي للبرنامج هو عملية طويلة إلى حد ما، خاصة بالنسبة للمصفوفات ذات الأبعاد الكبيرة، لذلك يجب تحسينها من أجل السرعة قدر الإمكان. من الأفضل القيام بذلك باستخدام أجهزة الإخراج التسلسلية الموجودة في MCU.

4 بالنسبة لأولئك الذين ليس لديهم ما يكفي

لقد تعرفت على أساسيات تنفيذ العرض الديناميكي. لكن كالعادة الأسئلة لا تتناقص بل تتزايد. توقعًا لبعضهم، سأحاول تقديم الإجابات اللازمة على الفور.

4.1 الأنودات والكاثودات - ماذا تختار؟

كل ما نظرنا إليه سابقًا يتعلق بالمؤشرات ذات الكاثودات المشتركة. ماذا لو كنت تريد استخدامه مع الأنودات المشتركة؟ بشكل عام، يبقى كل شيء على حاله، باستثناء أنه قبل الإخراج سيكون من الضروري عكس البيانات - يتم مسح الألفة عن طريق إخراج الأصفار في كولس، الاشتعال - على التوالي، الوحدات والقطاعات في صفوفسيتم تضمينها مع الأصفار بدلاً من الآحاد. لذلك سيبدو معالج المقاطعة كما يلي:

ISR(TIMER0_OVF_vect)( char pos ثابت غير موقع = 0; COLS &= 0xC0; ROWS = ~SCR; COLS |= (1<< pos); if(++pos == SCR_SZ) pos = 0; }

انه سهل. ما لم تحاول بالطبع كتابة رمز عالمي مناسب لكل من الأنودات والكاثودات المشتركة. هناك طريقتان للقيام بذلك: إما باستخدام توجيهات الترجمة الشرطية أو باستخدام وظيفة التحويل. سأوضح الخيار الأول، وأقترح عليك أن تفكر في الخيار الثاني بنفسك.

#define COMMON_ANODE 1 ISR(TIMER0_OVF_vect)( static unsigned char pos = 0; #if COMMON_ANODE != 1 COLS &= 0xC0; ROWS = ~SCR; COLS |= (1)<< pos); #else COLS |= 0x3F; ROWS = SCR; COLS &= ~(1 << pos); #endif if(++pos == SCR_SZ) pos = 0; }

على الرغم من أن هذا الأمر مرهق بعض الشيء، إلا أنه بعد كتابته مرة واحدة، يمكنك استخدامه في جميع المشاريع دون أي تغييرات تقريبًا.

4.2 وميض

في كثير من الحالات، يتم استخدام الشاشة ليس فقط كوسيلة لعرض المعلومات الواردة من داخل الجهاز، ولكن أيضًا لعرض مدخلات المستخدم. وفي هذه الحالة، من الضروري أن تكون قادرًا على فصل ما هو غير قابل للتغيير عن ما هو قابل للتغيير على الشاشة بطريقة أو بأخرى. أسهل طريقة للقيام بذلك هي جعل المكان المألوف المقابل (أو عدة أماكن مألوفة) يومض.

فإنه من السهل جدا القيام به. دعونا نقدم متغيرًا عامًا، كل وحدة بت منه ستشير إلى رمز وامض:

وميض حرف غير موقع = 0؛

لنقم الآن بتعديل معالج المقاطعة قليلًا:

ISR(TIMER0_OVF_vect)( static unsigned char pos = 0; static unsigned char input = 0; COLS |= 0x3F; if(!(blink & (1<

كما ترون، تمت إضافة متغير ثابت واحد فقط - عداد المدخلات إلى معالج المقاطعة دخول، ومشغل اختبار الحالة. المنطق بسيط: يتم تنفيذ إخراج المعرفة التالية فقط إذا كان أي منهما في البت المقابل رمشصفر أو الجزء الأكثر أهمية من العداد دخوليساوي 1. إذا، لنفترض، رمشيحتوي على جميع الأصفار، فهذا الشرط يتم استيفاءه دائمًا - يتم عرض جميع الأماكن المألوفة. لو رمشتحتوي على 1 في إحدى بتاتها، ثم سيتم إضاءة الإشارة المقابلة فقط في الوقت الذي تكون فيه البتة الأكثر أهمية في العداد مساوية لـ 1. وبما أن العداد يتزايد في كل مرة يتم فيها إدخال معالج المقاطعة، فإن الإشارة المقابلة سوف تكون وميض بتردد أقل بـ 128 مرة من تردد المقاطعة.

4.3 ضبط سطوع المقاطع

لقد كتبت عن تعديل السطوع في مقال منفصل، والذي كان يسمى بهذه الطريقة.

4.4 التوزيع التعسفي للدبابيس

لقد قيل سابقًا أن سعادة تخصيص منفذ MK كامل للعرض أمر نادر جدًا. ولكن من النادر الحصول على تتبع ملائم للوحة الدوائر المطبوعة إذا تم استخدام منفذ واحد بالكامل للصفوف، وتم استخدام المنفذ الآخر لأعمدة مصفوفة العرض. في كثير من الأحيان، يتم الحصول على التتبع الأمثل فقط عندما يتم خلط الصفوف والأعمدة بين منفذين أو أكثر من منافذ وحدة التحكم الدقيقة. لن تضطر إلى التضحية بجمال لوحة الدوائر المطبوعة إذا قمت بتنظيم إعادة ترتيب البرامج للبتات أثناء العرض.

دعونا نلقي نظرة على بعض الأمثلة المجردة. دع أفضل تتبع يتم توفيره من خلال التوزيع التالي للإشارات على غرار منافذ MK:

الجزء أ

الجزء ب

الجزء ح

الجزء ج

الجزء د

الجزء ز

الجزء ه

الجزء واو

كما ترون فإن خطوط المصفوفة تختلط بين المنافذ الثلاثة، ومن الطبيعي أن لا تتغير جميع الخطوط غير المستخدمة لهذه المنافذ في مستوياتها أثناء عملية العرض.

من الأفضل البدء في تطوير وظيفة الإشارة الديناميكية لهذه الحالة عن طريق توزيع المقاطع عبر بتات الرموز. في السابق، كنا نؤمن بذلك في المصفوفة SCRنقوم بتخزين أقنعة بتات الأحرف، على سبيل المثال. تشير تلك الموجودة في البايت إلى الأجزاء المضيئة. لم نفكر في أي جزء يتوافق مع أي جزء. لذا، حان الوقت للتفكير في الأمر.

من الملائم رسم الغرض من خطوط المنفذ على شكل ثلاث لوحات:

1

أ

0

4

ح

3

2

ب

F

ه

5

ز

د

ج

يجب علينا جمع كافة الأجزاء في بايت واحد. يجب أن يتم ذلك من خلال عمليات المناوبة، لذا يجب أن تحاول توزيعها لتحقيق الحد الأدنى من المناوبات. دعونا نتحدث.

إذا بت الجزء FEGDCاترك في الرمز حتى يقعوا فيه بورتددون التحولات، ثم الجزء حيمكن أيضًا أن يبقى في البت السادس من الرمز، ولا يلزم أيضًا إزاحته قبل الإخراج بورتكولكن للقطاعات أو فيستبقى البتتان 7 و3، أي على الأرجح المقطع فييجب أن يتم نقلها بمقدار 3 مواضع قبل الإخراج، والقطعة أ- بحلول 6. سأركز على هذا الخيار، ويمكنك الاستمرار في البحث عن الحد الأدنى من التحولات (التحولات في عدة مواضع ليست عملية سريعة، لذلك يُنصح بتقليل عددها إلى الحد الأدنى).

لذا، في حالتنا حصلنا على التوزيع التالي للبتات على بايت الحرف:

أ

ح

F

ه

ب

ز

د

ج

لنضع علامة على أقنعة البت للإخراج إلى المنافذ المقابلة:

د

0

0

1

1

0

1

1

1

0x37

ب

1

0

0

0

0

0

0

0

0x80

ج

0

1

0

0

1

0

0

0

0x48

باستخدام هذه الأقنعة، باستخدام عملية "bitwise AND"، سنختار البتات اللازمة للإخراج إلى المنفذ.

لنعلن عن ثوابت القناع:

# تعريف MASKD 0x37 # تحديد MASKB 0x80 # تحديد MASKC 0x48

في السابق، قمنا بإخراج الرمز إلى منفذ واحد صفوفالآن سيتم تقسيم هذا الإجراء إلى ثلاثة أجزاء:

PORTD = (PORTD & ~MASKD) | (SCR & MASKD)؛ PORTB = (PORTB & ~MASKB) | ((SCR & MASKB) >> 6)؛ PORTC = (PORTC & ~MASKC) | ((SCR & _BV(6)) | (((SCR & _BV(3)) >> 3);

يرجى ملاحظة أنه بالنسبة للانسحاب إلى بورتكيجب إخراج بت واحد بدون إزاحة، والثاني - بإزاحة، وذلك بدلاً من MASKCاضطررت إلى استخدام وحدات ماكرو منفصلة _BV().

الآن يبقى أن نقرر كيفية إطفاء وإضاءة الأماكن المألوفة المقابلة. لنعلن عن الثوابت المقابلة لبتات التحكم في الألفة:

#حدد COM0 _BV(0) #حدد COM1 _BV(3) #حدد COM2 _BV(4) #حدد COM3 _BV(5) #حدد COM4 _BV(7) #حدد COM5 _BV(3) #حدد COM_D (COM5) #حدد COM_C (COM2 | COM3 | COM4) # تعريف COM_B (COM0 | COM1)

لإطفاء جميع معارفك، تحتاج إلى إخراج الثوابت المقابلة إلى المنافذ COM_x:

بورتد |= COM_D; PORTC |= COM_C; PORTB |= COM_B;

ولكن لتشغيل الألفة، يجب أن تكون مخادعًا (ليس هناك فائدة من الإخراج إلى جميع المنافذ الثلاثة، لأن بت واحد فقط سيكون نشطًا في منفذ معين، اعتمادًا على القيمة نقاط البيع)، على سبيل المثال، باستخدام عامل التشغيل يُحوّل:

Switch(pos)( الحالة 0: PORTB &= ~COM0; استراحة; الحالة 1: PORTB &= ~ COM1; استراحة; الحالة 2: PORTC &= ~ COM2; استراحة; الحالة 3: PORTC &= ~ COM3; استراحة; حالة 4: PORTC &= ~COM4;

إنها ليست الطريقة الأجمل، لكنها فعالة.

وبالتالي، فإن معالج المقاطعة لدينا يأخذ الشكل التالي:

ISR(TIMER0_OVF_vect)( static unsigned char pos = 0; static unsigned char input = 0; // قمع PORTD |= COM_D; PORTC |= COM_C; PORTB |= COM_B; // عرض PORTD = (PORTD & ~MASKD) | ( SCR & MASKD); PORTB = (PORTB & ~MASKB) | ((SCR & MASKB) >> 6); / / وميض إذا(!(وميض & (1<< pos)) || (++entry & 0x80)) { switch(pos){ case 0: PORTB &= ~COM0; break; case 1: PORTB &= ~COM1; break; case 2: PORTC &= ~COM2; break; case 3: PORTC &= ~COM3; break; case 4: PORTC &= ~COM4; break; case 5: PORTD &= ~COM5; break; } } if(++pos == SCR_SZ) pos = 0; }

الآن يبقى معرفة كيفية وصف رموز الإخراج بشكل أكثر ملاءمة... أقترح القيام بما يلي: تحديد الثوابت المقابلة لبتات المقاطع، ثم "إنشاء" الرموز الضرورية من هذه الثوابت:

// المقاطع الأولية #define _A _BV(7) #define _B _BV(3) #define _C _BV(0) #define _D _BV(1) #define _E _BV(4) #define _F _BV(5) #define _G _BV (2) #define _H _BV(6) // رموز الأرقام #define d_0 (_A | _B | _C | _D | _E | _F) #define d_1 (_B | _C) #define d_2 (_A | _B | _G | _D | _E) // وهكذا

وبالتالي، إذا كنت بحاجة إلى عرض صفر في أقصى الموضع الأيمن من الشاشة، فما عليك سوى الكتابة في المكان الصحيح:

SCR = d_0;

إذا كنت بحاجة في مشروع آخر إلى توزيع البتات بشكل مختلف، فسوف تقوم فقط بتغيير الأرقام الموجودة في وحدات الماكرو _BV()للأجزاء الأولية، وسيتم "إعادة تشكيل" جميع الرموز تلقائيًا. بالنسبة لأبسط الحالات الموضحة في البداية، لن يتعين عليك القيام بأي شيء آخر على الإطلاق، ولكن بالنسبة لخيار "إعادة ترتيب البتات"، سيتعين عليك بالطبع التلاعب.

4.5 دعم الزر

مع النقص التقليدي في دبابيس MK، تكون مشكلة العدد الكبير من الأزرار، والتي نادرًا ما يمكن لأي جهاز الاستغناء عنها، حادة للغاية. يتم استخدام تضمينات المصفوفة المختلفة، وما إلى ذلك. ومع ذلك، من خلال تعقيد وظيفة العرض الديناميكي قليلاً، من السهل أن يكون لديك العديد من الأزرار تحت تصرفك بقدر ما توجد أشياء مألوفة في الشاشة، وفي هذه الحالة ستحتاج بالإضافة إلى ذلك إلى استخدام منفذ وحدة تحكم دقيقة واحد فقط. صحيح أنه لا يزال يتعين عليك تثبيت صمام ثنائي على كل زر.

يظهر هذا بشكل تخطيطي في الشكل.

والبرنامج يبدو هكذا:

#define keypin() (!(PIND & _BV(KEY))) ISR(TIMER0_OVF_vect)( static unsigned char pos = 0; static unsigned char input = 0; static unsigned char tmp_key = 0; ROWS = 0; if(keypin( )) tmp_key |= 1<< pos; COLS |= 0x3F; if(!(blink & (1<< pos)) || (++entry &0x80)){ ROWS = (ROWS & 0xF0) | (SCR & 0x0F); COLS &= ~(1 << pos); } if(++pos == SCR_SZ){ pos = 0; key = tmp_key; tmp_key = 0; } }

هنا مفتاح- هذا هو الماكرو الذي يقوم بتعيين بت المنفذ المحدد الذي تكون جميع الأزرار "متصلة" به، ماكرو دبوس المفاتيح ()تُرجع القيمة المنطقية TRUE إذا كان الطرف المحدد منخفضًا منطقيًا. في المثال، يتم توصيل الأزرار إلى بورتد.

في كل مرة تحدث فيها مقاطعة مؤقت، يتم إطفاء جميع المقاطع أولاً - وهذا ضروري حتى لا يتسبب التيار عبر مصابيح LED في عدم اكتشاف الزر المضغوط بشكل خاطئ. بعد ذلك، يتم استقصاء إدخال الزر - إذا كان المستوى منخفضًا، فهذا يعني أنه يتم الضغط على الزر المتصل بكاثود pos المقابل. ثابت tmp_keyيتم تجميع حالات الزر وإعادة كتابتها في متغير عام مفتاحبعد الانتهاء من دورة العرض. كل ما عليك فعله هو تحليل المعنى من وقت لآخر مفتاحومعالجة النقرات المكتشفة:

ثابت غير موقع char get_key())( unsigned char tmp = 0; tmp = key; _delay_ms(10); if(key == tmp) return tmp; else return 0; )

تضمن هذه الوظيفة البسيطة عدم ارتداد الأزرار، على الرغم من حقيقة أنه نظرًا للطبيعة "الديناميكية" لاقتراع الأزرار، فإن احتمالية الارتداد منخفضة بالفعل.

5 ماذا أيضًا؟

لقد أتقنت تقنيات نموذجية تمامًا لتنفيذ العرض الديناميكي. أعتقد أن هذا سيكون كافيًا بالنسبة لك للمرة الأولى، وربما حتى لبقية حياتك. في النهاية، الشيء الرئيسي هو فهم التقنيات والخوارزميات، ويمكنك دائمًا إضافة التفاصيل الدقيقة والفروق الدقيقة بنفسك. ولكن ما الذي يمكن أن ينتظر "بالقرب" من العرض الديناميكي؟

كما قلت سابقًا، يمكنك إضافة، حتى التنظيم المستقل لكل شريحة.

يمكنك التفكير في مدى الأمثلية لمعالج المقاطعة - للأغراض التعليمية، كتبت تعليمات برمجية أولية إلى حد ما، على سبيل المثال، استخدمتها في كل مكان SCR، على الرغم من أنه سيكون من الأفضل قراءة القيمة في متغير محلي مرة واحدة، ثم التعامل مع قيمته. على الرغم من أن المحسن سيساعد بالتأكيد في نهجي، إلا أنه لأغراض التدريب، من المفيد تجربة وتحسين نفسك، ومراقبة نفسك من حيث حجم الكود الناتج و/أو سرعة البرنامج.

يمكنك التفكير في الفكرة المثيرة للاهتمام المتمثلة في ضبط سطوع الشاشة تلقائيًا اعتمادًا على مستوى الإضاءة المحيطة. كما تعلم، تكون مؤشرات LED أقل وضوحًا كلما كانت داكنة - فهي ببساطة غير واضحة. لذلك، في الظلام، من المعقول تقليل سطوع المؤشرات، وزيادتها خلال ساعات النهار. أبسط شيء هو استخدام مقاوم ضوئي منفصل أو LED كمستشعر للضوء، ولكن يمكنك القيام بذلك بشكل مختلف: من المعروف أن LED يمكن أن يعمل أيضًا كثنائي ضوئي، لذلك، إذا كنت تستخدم المنفذ المتصل بالإدخال للإشارة أدك، ثم، إذا رغبت في ذلك، يمكنك قياس القوة الدافعة الكهربية للصورة للجزء غير المضيء من المؤشر، واستخدام هذه القيمة لضبط السطوع...

يمكنك التفكير في استخدام أجهزة الإخراج التسلسلي، والتي أشرت إليها بالفعل.

تم اقتراح نسخة مثيرة للاهتمام من نهج عالمي تمامًا للعرض الديناميكي، والذي أوصي أيضًا بالتعرف عليه مولشيك. باختصار، الجوهر: توزيع المقاطع حسب بتات الرموز، وتعيين منافذ للتحكم في المؤشر، وحتى نوع المؤشر - باختصار، كل، كل، كل المعلمات - محددة في شكل جدول تكوين في إيبروم. بناءً على هذا الجدول، يتم تنظيم كل شيء برمجيًا: بدءًا من الانقلاب اعتمادًا على نوع المؤشر، وحتى إعادة ترتيب البتات على منافذ مختلفة. في هذه الحالة، يظل الكود المصدري لبرنامج العرض الديناميكي دائمًا دون تغيير، ويتم تجميع جدول التكوين بواسطة المستخدم النهائي وفقًا لتفضيلاته. هذه الطريقة عالمية ومرنة حقًا، ولكنها مرتبطة بزيادة استهلاك ذاكرة البرنامج.


3 منشور من طرف مضادات الفيروسات القهقرية، الساعة 06:48 25/08/2010
ميشا، لو كنت مكانك، لن أعطي مثل هذه العبارات القاطعة "لا يمكنك فعل ذلك"، "لم يكتبها أحد" أو "حقوق الطبع والنشر"، لأنه أولاً، هذا ليس مهذبًا، وثانيًا:
1. لقد قمت بعمل خط زاحف على مصفوفة 10 × 16 منذ وقت طويل (هذا ما كان عليه الأمر) - يمكنك العثور على مقطع فيديو لعمله في هذه المذكرة http://site/content/view/160/38/
2. كتبت مقالًا (ستجده في الأخبار - آخر مقال لهذا اليوم) حول كيفية عمل شريط على شاشة LCD. إذا كنت تجهد عقلك قليلاً، فإن إعادة خوارزمية الإخراج إلى المصفوفة يعد أمرًا تافهًا.
3. لا يوجد مقال واحد منسوخ من مكان ما على موقع الويب الخاص بي (النسخ واللصق ليس حقوق طبع ونشر، لقد ارتكبت خطأً مطبعيًا)، وجميع المواد أصلية تمامًا. تمتلك العديد من المواقع نسخًا من هذه المواد بإذن مني (أو بإذن مؤلفي المواد، الذين لديهم كل الحق في نشر موادهم في العديد من الأماكن في وقت واحد).

يمكن للأعضاء المسجلين فقط ترك تعليقات.
يرجى التسجيل أو الدخول إلى حسابك.


مخطط اتصال لمؤشر مكون من رقم واحد مكون من سبعة أجزاء
مخطط اتصال لمؤشر مكون من سبعة أرقام متعدد الأجزاء

جهاز عرض المعلومات الرقمية. هذا هو أبسط تطبيق لمؤشر يمكنه عرض الأرقام العربية. يتم استخدام مؤشرات أكثر تعقيدًا متعددة القطاعات والمصفوفة لعرض الحروف.

كما يوحي اسمه، فهو يتكون من سبعة عناصر عرض (أجزاء) يتم تشغيلها وإيقافها بشكل منفصل. ومن خلال تضمينها في مجموعات مختلفة، يمكن استخدامها لإنشاء صور مبسطة للأرقام العربية.
يتم تحديد الأجزاء بالأحرف من A إلى G؛ الجزء الثامن - العلامة العشرية (الفاصلة العشرية، DP)، مصممة لعرض الأرقام الكسرية.
في بعض الأحيان، يتم عرض الحروف على المؤشر المكون من سبعة أجزاء.

أنها تأتي في مجموعة متنوعة من الألوان، عادة الأبيض والأحمر والأخضر والأصفر والأزرق. بالإضافة إلى ذلك، يمكن أن تكون ذات أحجام مختلفة.

أيضًا، يمكن أن يكون مؤشر LED مكونًا من رقم واحد (كما في الشكل أعلاه) أو متعدد الأرقام. بشكل أساسي، يتم استخدام مؤشرات LED المكونة من رقم واحد واثنين وثلاثة وأربعة أرقام في الممارسة العملية:

بالإضافة إلى عشرة أرقام، فإن المؤشرات المكونة من سبعة أجزاء قادرة على عرض الحروف. لكن القليل من الحروف لها تمثيل بديهي مكون من سبعة أجزاء.
في اللاتينية: العاصمة A، B، C، E، F، G، H، I، J، L، N، O، P، S، U، Y، Z، صغيرة a، b، c، d، e، g ، ح، ط، ن، س، ف، ص، ر، ش.
باللغة السيريلية: A، B، V، G، g، E، i، N، O، o، P، p، R، S، s، U، Ch، Y (رقمين)، b، E/Z.
ولذلك، يتم استخدام المؤشرات المكونة من سبعة قطاعات فقط لعرض الرسائل البسيطة.

في المجمل، يمكن لمؤشر LED المكون من سبعة أجزاء عرض 128 حرفًا:

يحتوي مؤشر LED النموذجي على تسعة أسلاك: واحد يذهب إلى كاثودات جميع القطاعات، والثمانية الأخرى تذهب إلى القطب الموجب لكل قطعة. ويسمى هذا المخطط "دائرة الكاثود المشتركة"، هناك أيضًا مخططات مع الأنود المشترك(ثم ​​هو العكس). في كثير من الأحيان، لا يتم تصنيع طرفين مشتركين في نهايات مختلفة من القاعدة - وهذا يبسط الأسلاك دون زيادة الأبعاد. هناك أيضًا ما يسمى بالأشياء "العالمية" ، لكنني شخصياً لم أواجه مثل هذه الأشياء. بالإضافة إلى ذلك، هناك مؤشرات تحتوي على سجل إزاحة مدمج، مما يقلل بشكل كبير من عدد منافذ منفذ وحدة التحكم الدقيقة المعنية، ولكنها أكثر تكلفة بكثير ونادرًا ما يتم استخدامها عمليًا. وبما أنه لا يمكن فهم الضخامة، فلن نفكر في مثل هذه المؤشرات في الوقت الحالي (ولكن هناك أيضًا مؤشرات تحتوي على عدد أكبر بكثير من القطاعات، مؤشرات المصفوفة).

مؤشرات LED متعددة الأرقامغالبًا ما تعمل على مبدأ ديناميكي: يتم توصيل مخرجات المقاطع التي تحمل نفس الاسم لجميع الأرقام معًا. لعرض معلومات حول مثل هذا المؤشر، يجب أن تقوم دائرة التحكم الدقيقة بتزويد التيار بشكل دوري إلى المحطات المشتركة لجميع الأرقام، في حين يتم توفير التيار إلى أطراف المقطع اعتمادًا على ما إذا كان الجزء المحدد مضاءًا برقم معين.

توصيل مؤشر مكون من رقم واحد مكون من سبعة أجزاء بمتحكم دقيق

ويوضح الرسم البياني أدناه كيف يتم توصيل مؤشر مكون من رقم واحد مكون من سبعة أجزاءإلى متحكم.
وينبغي أن يؤخذ في الاعتبار أنه إذا كان المؤشر مع الكاثود المشترك، ثم يتم توصيل مخرجاته المشتركة بـ "أرض"، ويتم إشعال الأجزاء عن طريق التغذية وحدة منطقيةإلى إخراج المنفذ.
إذا كان المؤشر الأنود المشترك، ثم يتم توصيله بالسلك المشترك الخاص به "زائد"الجهد، ويتم إشعال الأجزاء عن طريق تحويل إخراج المنفذ إلى الحالة الصفر المنطقي.

يتم تنفيذ الإشارة في مؤشر LED المكون من رقم واحد من خلال تطبيق رمز ثنائي على دبابيس منفذ المتحكم الدقيق للرقم المقابل للمستوى المنطقي المقابل (للمؤشرات ذات OK - المؤشرات المنطقية، للمؤشرات ذات OA - الأصفار المنطقية).

المقاومات الحد الحاليةقد تكون أو لا تكون موجودة في الرسم التخطيطي. كل هذا يتوقف على جهد الإمداد المزود للمؤشر والخصائص التقنية للمؤشرات. على سبيل المثال، إذا كان الجهد الموفر للقطاعات هو 5 فولت، وهي مصممة لجهد تشغيل قدره 2 فولت، فيجب تركيب مقاومات محددة للتيار (للحد من التيار من خلالها لزيادة جهد الإمداد وعدم حرقه) ليس فقط المؤشر، ولكن أيضًا منفذ وحدة التحكم الدقيقة).
من السهل جدًا حساب قيمة المقاومات التي تحدد التيار باستخدام صيغة الجد أوم.
على سبيل المثال، خصائص المؤشر هي كما يلي (مأخوذة من ورقة البيانات):
- جهد التشغيل - 2 فولت
— التشغيل الحالي — 10 مللي أمبير (=0.01 أ)
- جهد التغذية 5 فولت
صيغة الحساب:
R= U/I (يجب أن تكون جميع القيم في هذه الصيغة بالأوم والفولت والأمبير)
R = (جهد الإمداد - جهد التشغيل) / تيار التشغيل
R= (5-2)/0.01 = 300 أوم

مخطط اتصال لمؤشر LED مكون من سبعة أرقام متعدد الأجزاءفي الأساس هو نفسه عند توصيل مؤشر مكون من رقم واحد. الشيء الوحيد هو إضافة ترانزستورات التحكم في كاثودات (أنودات) المؤشرات:

لا يظهر في الرسم التخطيطي، ولكن بين قواعد الترانزستورات ودبابيس منفذ المتحكم الدقيق، من الضروري تضمين المقاومات، التي تعتمد مقاومتها على نوع الترانزستور (يتم حساب قيم المقاومات، ولكن يمكنك أيضًا تجربة استخدام المقاومات ذات القيمة الاسمية 5-10 كيلو أوم).

يتم تنفيذ الإشارة عن طريق التصريفات بشكل ديناميكي:
- يتم تعيين الكود الثنائي للرقم المقابل عند مخرجات منفذ PB للرقم الأول، ثم يتم تطبيق المستوى المنطقي على ترانزستور التحكم للرقم الأول
- يتم تعيين الكود الثنائي للرقم المقابل عند مخرجات منفذ PB للرقم الثاني، ثم يتم تطبيق المستوى المنطقي على ترانزستور التحكم للرقم الثاني
- يتم تعيين الكود الثنائي للرقم المقابل عند مخرجات منفذ PB للرقم الثالث، ثم يتم تطبيق المستوى المنطقي على ترانزستور التحكم للرقم الثالث
- هكذا في دائرة
وفي هذه الحالة لا بد من الأخذ بعين الاعتبار:
— للمؤشرات مع نعميتم استخدام هيكل الترانزستور التحكم نبن(التي تسيطر عليها الوحدة المنطقية)
- للمؤشر مع الزراعة العضوية- هيكل الترانزستور بنب(التي تسيطر عليها المنطق صفر)

توجد المؤشرات عادةً في أماكن ملائمة لعرض المعلومات المعروضة عليها. يمكن وضع بقية الدوائر الرقمية على لوحات دوائر مطبوعة أخرى. ومع زيادة عدد المؤشرات، يزداد عدد الموصلات بين لوحة المؤشرات واللوحة الرقمية. وهذا يؤدي إلى بعض المضايقات في تطوير تصميم وتشغيل المعدات. نفس السبب يؤدي إلى زيادة تكلفتها.

يمكن تقليل عدد موصلات التوصيل عن طريق جعل المؤشرات تعمل في وضع النبض. العين البشرية تعاني من القصور الذاتي، وإذا أجبرت المؤشرات على عرض المعلومات واحدة تلو الأخرى بسرعة عالية بما فيه الكفاية، فسيبدو للشخص أن جميع المؤشرات تعرض معلوماتها بشكل مستمر. ونتيجة لذلك، من الممكن نقل المعلومات المعروضة بالتناوب من خلال نفس الموصلات. عادةً ما يكون معدل التحديث 50 هرتز كافيًا، لكن من الأفضل زيادة هذا التردد إلى 100 هرتز.

دعونا نلقي نظرة على المخطط التفصيلي لمؤشرات LED ذات الأجزاء السبعة الموضحة في الشكل 1. يمكن لهذه الدائرة أن توفر مؤشرًا ديناميكيًا لمعلومات الإخراج الرقمية.


الشكل 1. مخطط كتلة للمؤشر الديناميكي

في الرسم البياني الموضح في الشكل 1، يتم عرض أربعة أرقام رقمية. يتم توصيل كل بت لفترة وجيزة بمدخل المحول الخاص به. يتم استخدام المولد لضبط سرعة تحديث المعلومات على المؤشرات. يقوم العداد الثنائي بتوليد أربع حالات للدائرة بشكل تسلسلي، ومن خلال المفاتيح يوفر مصدر طاقة بديل للمؤشرات ذات الأجزاء السبعة.

ونتيجة لذلك، عندما يوفر المحول رمزًا عشريًا ثنائيًا من الإدخال A إلى مدخلات وحدة فك التشفير المكونة من سبعة أجزاء، يتم عرض هذا الرمز على مؤشر HL1. عندما يقوم المحول بتزويد الرمز الثنائي العشري من الإدخال B إلى مدخلات وحدة فك التشفير المكونة من سبعة أجزاء، يتم عرض هذا الرمز على مؤشر HL2، وهكذا، في دورة.

سيكون معدل تحديث المعلومات في المخطط المدروس أقل بأربع مرات من تردد المولد. أي أنه من أجل الحصول على تردد وميض المؤشر 100 هرتز، يلزم وجود تردد مولد قدره 400 هرتز.

كم مرة قمنا بتقليل عدد الموصلات المتصلة نتيجة لذلك؟ يعتمد ذلك على المكان الذي نرسم فيه المقطع العرضي للدائرة. إذا تركنا المؤشرات فقط على لوحة المؤشرات، فسوف يتطلب تشغيلها 7 إشارات معلومات للقطاعات وأربعة إشارات تبديل. هناك 11 موصلا في المجموع. في دائرة العرض الثابتة سنحتاج إلى 7×4=28 موصلاً. كما ترون، المكاسب واضحة. عند تنفيذ وحدة عرض 8 بت، سيكون الكسب أكبر.

سيكون هناك ربح أكبر إذا تم رسم المقطع العرضي للدائرة على طول مدخلات المؤشرات. في هذه الحالة، ستتطلب وحدة العرض المكونة من أربعة أرقام فقط ستة موصلات للإشارة واثنين من موصلات طاقة الدائرة. ومع ذلك، نادرا ما يتم استخدام نقطة المقطع العرضي لدائرة العرض الديناميكية.

الآن دعونا نحسب التيار المتدفق عبر كل مقطع LED عندما يضيء. للقيام بذلك، سوف نستخدم دائرة مكافئة لتدفق التيار عبر أحد قطاعات المؤشر. يظهر هذا الرسم البياني في الشكل 2.


كما ذكرنا سابقًا، يتطلب مصباح LED تيارًا يتراوح من 3 إلى 10 مللي أمبير للتشغيل العادي. لنقم بتعيين الحد الأدنى لتيار LED على 3 مللي أمبير. ومع ذلك، في وضع التشغيل النبضي، ينخفض ​​سطوع المؤشر N مرات، حيث يساوي المعامل N دورة تشغيل النبضات الحالية الموردة لهذا المؤشر.

إذا أردنا الحفاظ على نفس سطوع التوهج، فسنحتاج إلى زيادة حجم تيار النبض المتدفق عبر المقطع بمقدار N مرة. بالنسبة للمؤشر المكون من ثمانية أرقام، فإن المعامل N يساوي ثمانية. دعونا نختار في البداية تيارًا ثابتًا من خلال LED يساوي 3 مللي أمبير. بعد ذلك، للحفاظ على نفس سطوع مؤشر LED في المؤشر المكون من ثمانية أرقام، ستكون هناك حاجة إلى تيار نبضي:

أنا seg din = أنا seg stat× ن= 3 مللي أمبير × 8 = 24 مللي أمبير.

فقط بعض سلاسل الدوائر الرقمية الدقيقة بالكاد يمكنها توفير مثل هذا التيار. بالنسبة لمعظم سلاسل الدوائر الدقيقة، ستكون مكبرات الصوت المصنوعة على مفاتيح الترانزستور مطلوبة.

الآن دعونا نحدد التيار الذي سوف يتدفق عبر المفتاح الذي يحول الطاقة إلى بتات فردية من وحدة العرض ذات الثماني بتات. كما يتبين من الرسم البياني الموضح في الشكل 2، يمكن أن يتدفق التيار من أي جزء من المؤشر عبر المفتاح. عندما يتم عرض الرقم 8، ستحتاج جميع شرائح المؤشر السبعة إلى الإضاءة، مما يعني أنه يمكن تحديد تيار النبض المتدفق عبر المفتاح في هذه اللحظة على النحو التالي:

أنا cl = أنا segدينغ× ن سيغ= 24 مللي أمبير × 7 = 168 مللي أمبير.

كيف تحب هذا التيار؟! في دوائر راديو الهواة، غالبا ما أواجه حلولا حيث يتم أخذ تيار التبديل مباشرة من إخراج وحدة فك التشفير، والتي لا يمكن أن تنتج تيارا أكبر من 20 مللي أمبير، وأسأل نفسي السؤال - أين أبحث عن مثل هذا المؤشر؟ في ظلام دامس؟ والنتيجة هي «جهاز رؤية ليلية»، أي جهاز لا يمكن رؤية قراءاته إلا في الظلام الدامس.

الآن دعونا نلقي نظرة على الرسم التخطيطي لوحدة العرض الناتجة. هو مبين في الشكل 3.



الشكل 3. رسم تخطيطي لوحدة العرض الديناميكية

الآن بعد أن تلقينا دائرة العرض الديناميكية، يمكننا مناقشة مزاياها وعيوبها. الميزة التي لا شك فيها للعرض الديناميكي هي العدد الصغير لأسلاك التوصيل، مما يجعلها لا غنى عنها في بعض الحالات، مثل العمل مع مؤشرات المصفوفة.

العيب هو وجود تيارات نبضية كبيرة، وبما أن أي موصل هو هوائي، فإن المؤشر الديناميكي يعمل كمصدر قوي للتداخل. مصدر آخر للتداخل هو مصدر الطاقة.

يرجى ملاحظة أن الحواف الأمامية لنبضات التبديل قصيرة جدًا، لذا فإن مكوناتها التوافقية تغطي نطاق التردد الراديوي حتى الموجات فائقة القصر.

لذلك، فإن استخدام المؤشر الديناميكي يجعل من الممكن تقليل عدد أسلاك التوصيل بين الجهاز الرقمي والمؤشر، ولكنه في الوقت نفسه مصدر قوي للتداخل، لذا فإن استخدامه في أجهزة استقبال الراديو غير مرغوب فيه.

إذا كانت هناك حاجة لسبب ما، على سبيل المثال، إلى استخدام مؤشرات المصفوفة، فمن الضروري استخدام مؤشر ديناميكي، فيجب اتخاذ جميع التدابير لقمع التداخل.

تتضمن إجراءات منع التداخل الناتج عن المؤشرات الديناميكية حماية الوحدة وكابل التوصيل واللوحات. استخدام الحد الأدنى من طول أسلاك التوصيل، باستخدام مرشحات مصدر الطاقة. عند حماية الكتلة، قد يكون من الضروري حماية المؤشرات نفسها. في هذه الحالة، عادة ما يتم استخدام شبكة معدنية. يمكن لهذه الشبكة أن تزيد في نفس الوقت من تباين الأحرف المعروضة.

الأدب:

جنبا إلى جنب مع المقال "العرض الديناميكي" اقرأ:

تم تصميم المؤشرات لعرض أنواع مختلفة من المعلومات للشخص. أبسط أنواع المعلومات هي...
http://site/digital/Indic.php

تُستخدم مؤشرات تفريغ الغاز للإشارة إلى معلومات البت ولعرض المعلومات العشرية. عند إنشاء المؤشرات العشرية، الكاثود...
http://site/digital/GazIndic/

في الوقت الحاضر، تُستخدم مصابيح LED في كل مكان تقريبًا لعرض المعلومات الثنائية. هذا يرجع إلى...
http://site/digital/LED.php

مبادئ تشغيل مؤشرات البلورات السائلة... أوضاع تشغيل مؤشرات البلورات السائلة... تكوين صورة ملونة...
http://site/digital/LCD.php

سنحاول اليوم توصيل ليس مؤشرًا واحدًا مكونًا من رقم واحد بوحدة التحكم الدقيقة، بل مؤشرين. أي أننا سنربط مؤشرًا آخر من هذا القبيل. فقط إذا قمنا بتوصيله بنفس الطريقة تمامًا مثل الأول، فسنستخدم تقريبًا جميع دبابيس منافذ وحدة التحكم، مما سيجعل مشروعنا غير قابل للتطبيق.

لذلك، ستأتي طريقة أخرى لمساعدتنا في هذه الحالة - هذه عرض ديناميكي.

مع العرض الديناميكي، سنعرض في كل لحظة رقمًا على مؤشر واحد فقط. أي أننا سنعرض الأرقام المخصصة لكلا المؤشرين على التوالي. لكننا سنعرضها واحدة تلو الأخرى بتكرار بحيث لن تلاحظها أعيننا. ويبدو لنا أن المؤشرات تعمل باستمرار وليس بالتناوب. يتيح لنا ذلك توصيل أجزاء من كلا المؤشرين، وبالتالي المزيد من المؤشرات، بنفس منافذ المنفذ، أي بالتوازي. باستخدام هذه الطريقة، سيتم تزويد كلا المؤشرين على الفور بالتناوب، أولاً بالرقم المخصص للمؤشر الأول، ثم بالرقم المخصص للمؤشر الثاني. وحتى لا نرى رقمين على كل مؤشر في نفس الوقت، فعند عرض رقم مخصص لمؤشر معين، سوف نقوم بتطبيق جهد موجب على القطب الموجب الخاص به، ولكن ليس على القطب الموجب الآخر، بل سنوصله بجهد موجب. سلك مشترك. لذلك، بغض النظر عن حالة كاثوداتها، لن يتوهج أي من أجزائها. إذا كان هناك صفر على القطعة، فلن يكون هناك فرق جهد على الإطلاق، وإذا كان هناك واحد، فسيكون هناك فرق جهد، ولكن سيتم توجيه التيار في الاتجاه الآخر ولن يضيء مؤشر LED هذا الاتجاه.

سنقوم بإنشاء مشروع جديد كالعادة، بنسخ الكود إلى main.c من الملف الذي يحمل نفس الاسم من المشروع السابق. دعونا اسم المشروع اختبار08.

لنقم أولاً بتجميع الدائرة في برنامج Proteus، ونسخ ملف المشروع من الدرس السابق، كالعادة، وربط المسار بالمشروع الجديد في خصائص وحدة التحكم. سنقوم أولاً بإعادة توصيل الزر بمنفذ آخر. لماذا هذا ضروري، وسوف نرى لاحقا

دعونا نفصل الأنود المشترك عن مصدر الطاقة في الوقت الحالي ونضيف مؤشرًا آخر مشابهًا للمؤشر الموجود لدينا بالفعل في المشروع.

للقيام بذلك، ما عليك سوى تحديده في اللوحة اليسرى، ولن تحتاج إلى إضافته مرة أخرى من المكتبة. ثم نقوم بتوصيل كاثودات هذا المؤشر بنفس كاثودات الأول

سنقوم بتوصيل الأنودات التي تم إصدارها بأرجل منفذ آخر. لكننا لن نتصل بشكل مباشر، ولكن من خلال الترانزستورات الرئيسية، لأنه عندما تضاء عدة قطاعات من المؤشر في نفس الوقت، سوف يتدفق الكثير من التيار عبر ساق المنفذ المتصلة بأنود المؤشر. قد يفشل المنفذ. هذا ليس مثيرا للاهتمام بالنسبة لنا على الإطلاق. ولذلك، سوف نقوم بتوصيل الأنودات لدينا إلى الساقين B0 وB1 من خلال الترانزستورات. ولهذا السبب قمنا بنقل الزر إلى الساق الأخرى. علاوة على ذلك، قمنا بنقله باحتياطي، حيث سنقوم لاحقا بتوصيل أربعة مؤشرات.

دعونا نضيف الترانزستور من المكتبة. سنقوم بتشغيله في الوضع العكسي، لذلك نختار بنية p-n-p

لنقم بتوصيل هذين الترانزستورين بالدائرة، مع إضافة مقاومتين أخريين بقدرة 2 كيلو أوم للحد من تيار القاعدة. نقوم بتوصيل الباعثات بمصدر الطاقة، والمجمعات بأنودات المؤشرات (اضغط على الصورة لتكبير الصورة)

سأعرض أيضًا الرسم التخطيطي الكامل لتجميعنا (انقر على الصورة لتكبيرها)

دمن أجل عرض رقم متعدد الأرقام على المؤشر، يجب عليك أولاً إجراء معالجة صعبة معه، والتي تتمثل في تقسيم الرقم إلى مكوناته. كمثال، سأقدم عرض الرقم 1234 على مؤشر رباعي من سبعة أجزاء مع أنود مشترك.


لعرض رقم مكون من أربعة أرقام، يتعين عليك إنشاء متغير مشترك واحد يقع فيه الرقم الذي تريد عرضه (المتغير دبليو)، أربعة متغيرات سيتم تخزين البيانات فيها لكل علامة (ن) وأربعة متغيرات أخرى للتحويلات المتوسطة (م)، حتى لا تلمس المتغير الرئيسي. يجب أن يتوافق المتغير مع القيمة التي سيتم تخزينها فيهأنا. لذلك بالنسبة للمتغيردبليوالنوع سيكون كافياعدد صحيح ، نظرًا لأن المتغير من هذا النوع قادر على التخزينقم بتغيير القيم من -32768 إلى +32767 (أوكلمة إلا إذا كنت تخطط لاستخدام الأرقام السالبة). في المتغيراتنسيكون هناك أرقام من 0 إلى 9، وذلك باستخدام متغير مثلبايت
. وفي المتغيراتم سوف يكوننفس القيم كما في المتغيردبليولذلك قمنا بتعيين النوع عدد صحيح .

خافت W كعدد صحيح
خافت N1 كبايت
خافت N2 كبايت
خافت N3 كبايت
خافت N4 كبايت
خافت M1 كعدد صحيح
خافت M2 كعدد صحيح
خافت M3 كعدد صحيح
خافت M4 كعدد صحيح


بعد الإعلان عن المتغيرات، نقوم بتكوين منافذ الإخراجوالتي سيتم استخدامها لتوصيل المؤشر:

DDRC = &B11111111
DDRD = &B11111111


DDRC =&B 00001111 وDDRD =&B 01111111 (المحطات الأربع الأولى للمنفذ Cللأنودات والمنافذ الستة الأولىد للقطاعات).

ثم نسند للمتغيردبليو القيمة التي سنعرضها على المؤشر:

ث = 1234

"أريال"، "بلا الرقيق""> في الحلقة الرئيسية للبرنامج نقوم بإسناد قيمة المتغير للمتغيرات MW، أفعل هذا:

م1 = ث
م2 = م1
م3 = م1
م4 = م1


"أريال"، "بلا الرقيق""> هذا ليس جنون العظمة)))، ويتم ذلك بهدف أن تحتوي جميع المتغيرات M على نفس الرقم، لأنه أثناء عملية التعيين يمكن للمقاطعة أن تقتحم بسهولة (إذا كان هناك واحدة ولم يتم تعطيلها)، والتي في معالجها عاملدبليو يمكن أن تتغير. وإذا سار التكليف على هذا النحو: M1=ث , م 2= ث , م 3= ث , م 4= ث في المتغيرات M سوف تكمن معان مختلفةالأمر الذي سيؤدي إلى فوضى في القراءات.

بعد تعيين قيم للمتغيرات، نبدأ العمل بها
كل واحد منهم، يتحول بطريقة إلى متغيرن ضرب القيمة التي ستكون
المعروضة على المؤشر: في متغير
ن 1 ينبغي أن يكون "1"، فين 2 - "2"، في ن 3 - "3"، وفي ن 4 - "4".

م1 = م1 / 1000 " م1 = 1234 / 1000 = 1.234
N1 = القيمة المطلقة (m1) "N1 = القيمة المطلقة (1.234) = 1

عضلات المعدة - دالة تقوم بإرجاع عدد صحيح إلى متغيرن 1 ضرب واحد، وهو بالضبط ما هو مطلوب.

لتعيين اثنين لمتغيرن ستكون العملية 2 أكثر تعقيدًا بعض الشيء:

M2= M2 مود 1000 " M2 = 1234 مود 1000 = 234
م2 = م2 / 100 " م2 = 234 / 100 = 2.34
N2= القيمة المطلقة (م2) " N2 = القيمة المطلقة (2.34) = 2

"أريال"، "بلا الرقيق""> لتبدأ، الوظيفةعصري نعيد الثلاثة الأولى إلى المتغير
أرقام الرقم (باقي القسمة على 1000)، ثم كل شيء كما في الحالة الأولى.

إنه نفس الشيء تقريبًا مع الرقمين الأخيرين:

M3 = M3 Mod100
م3 = م3 / 10
N3 = القيمة المطلقة (م3)

M4 = M4 مود 10
N4= القيمة المطلقة (م4)


الآن تحتوي متغيراتنا على القيم التي نريد عرضها، لقد حان الوقت لكي يبدأ المتحكم الدقيق عرض هذه القيم على المؤشر، وللقيام بذلك نسميه الروتين الفرعي لمعالجة العرض:

"أريال"، "بلا الرقيق"">

بقيادة جوسوب

"أريال"، "بلا الرقيق""> سينتقل المعالج إلى الروتين الفرعي الذي يحمل الملصققاد:

قاد:

بورتك = &B00001000

"أريال"، "بلا الرقيق""> هنا نحن نخدم مستوى عال منبورتك .3، لدينا أنود الفئة الأولى المتصل بهذه الساق. ثم نختار الأجزاء التي يجب إضاءتها لعرض قيمة المتغير الأول. هي واحدة بالنسبة لنا، لذلك سيكون الصفر على قدميهابورتد .1 و بورتد .2، والذي يتوافق مع القطاعاتمؤشر B وC.

حدد الحالة رقم 1









إنهاء التحديد
الانتظار 5

"أريال"، "بلا الرقيق""> بعد إضاءة الأجزاء الضرورية، انتظر 5 مللي ثانية وتابع لعرض الأرقام التالية:

بورتك = &B00000100
حدد الحالة رقم 2
الحالة 0: المنفذ = &B11000000
الحالة 1: المنفذ = &B11111001
الحالة 2: المنفذ = &B10100100
الحالة 3: المنفذ = &B10110000
الحالة 4: المنفذ = &B10011001
الحالة 5: المنفذ = &B10010010
الحالة 6: المنفذ = &B10000010
الحالة 7: المنفذ = &B11111000
الحالة 8: المنفذ = &B10000000
الحالة 9: المنفذ = &B10010000
إنهاء التحديد

الانتظار 5

بورت = &B00000010

حدد الحالة رقم 3
الحالة 0: المنفذ = &B11000000
الحالة 1: المنفذ = &B11111001
الحالة 2: المنفذ = &B10100100
الحالة 3: المنفذ = &B10110000
الحالة 4: المنفذ = &B10011001
الحالة 5: المنفذ = &B10010010
الحالة 6: المنفذ = &B10000010
الحالة 7: المنفذ = &B11111000
الحالة 8: المنفذ = &B10000000
الحالة 9: المنفذ = &B10010000
إنهاء التحديد

الانتظار 5

بورت = &B00000001

حدد الحالة رقم 4
الحالة 0: المنفذ = &B11000000
الحالة 1: المنفذ = &B11111001
الحالة 2: المنفذ = &B10100100
الحالة 3: المنفذ = &B10110000
الحالة 4: المنفذ = &B10011001
الحالة 5: المنفذ = &B10010010
الحالة 6: المنفذ = &B10000010
الحالة 7: المنفذ = &B11111000
الحالة 8: المنفذ = &B10000000
الحالة 9: المنفذ = &B10010000
إنهاء التحديد

الانتظار 5

"أريال"، "بلا الرقيق""> بعد عرض المعلومات على المؤشر، يجب عليك العودة إلى حلقة البرنامج الرئيسية، حيث تحتاج إلى إكمال الحلقة والإشارة إلى نهاية البرنامج.

"أريال"، "بلا الرقيق""> وهذا ما حصلنا عليه في النهاية:

"أريال"، "بلا الرقيق"">

"أريال"، "بلا الرقيق""> نظرًا للتأخير البسيط في التبديل، لن يكون التبديل ملحوظًا بالعين البشرية وسنرى العدد الصحيح 1234.

يمكنك تنزيل المصدر والمشروع في Proteus أدناه:"أريال"، "بلا الرقيق"">