السلام عليكم ورحمة الله وبركاته.
مرحبا بإخواني مرة أخرى مع التفكير المعقد والمتعة وعصرة الدماغ.
مسابقة اليوم لن تكون سهلة كالمسابقة الأولى.
يمكنك في هذه المسابقة استخدام المتغيرات واستخدام حلقة for ولكن لا تفرح كثيرا.. فأنت في هذه المسابقة محروم من استخدام المقاطعات والتايمرات.. كما أنه مطلوب منك أن تستخدم الكيباد بدون استخدام مكتبة الكيباد.
أولا الهاردوير:
سنستخدم كيباد 4×4
سنضعها على أي بورت في أي متحكم بشرط عدم الاستفادة من مقاومة الرفع الداخلية التي تتمتع بها بعض المتحكمات... بمعنى أن هناك بعض المتحكمات تحتوي بعض بورتاتها داخليا على مقاومة رفع يمكن تشغيلها أو تعطيلها بحيث عند تشغيلها كدخل (مع مفتاح واصل للأرضي) لا تحتاج أن تضع لها مقاومة رفع خارجيا من عندك... الشرط يقول أنه لا يجوز الاستفادة من إحدى مقاومات الرفع الداخلية لبعض المتحكمات.
سنستخدم أربع مقاومات رفع على الأطراف 4 و5 و6 و7
ولا يجوز استخدام مقاومات رفع أو خفض على الأطراف 0 و1 و2 و3
هذا بالنسبة للبورت الذي عليه الكيباد.
أما البورت الآخر سيكون عليه ليدات.
هذا عن الهاردوير.
ثانيا الوظيفة المطلوبة:
لاحظ أن الكيباد تحتوي على 16 زر.
سيكون هناك 16 برنامج.
البرنامج الأول هو أن الليد الأول يضيء 5 ثوان ويطفئ 5 ثوان ثم تضيء كل الليدات ما عدا الأول 5 ثوان وتطفئ 5 ثوان.
البرنامج الثاني مثله لكن بوضع كلمة الليد الثاني مكان كلمة الليد الأول.
وهكذا البرنامج الثالث والرابع والخامس والسادس والسابع والثامن.
البرنامج التاسع يجعل الليد الأول يضيء 10 ثوان ثم يطفئ.. ثم يضيء الليد الثاني 15 ثانية ثم يطفئ.. ثم يضيء الليد الثالث 20 ثانية ثم يطفئ.
البرنامج العاشر مثل البرنامج التاسع لكن بزيادة زمن كل ليد 3 ثوان.
البرنامج الحادي عشر مثل التاسع والعاشر لكن زمن إضاءة الليد الأول 8 ثوان وزمن إضاءة الليد الثاني 3 ثوان وزمن إضاءة الليد الثالث 19 ثانية.
البرنامج الثاني عشر مثل البرنامج الحادي عشر لكن بمضاعفة زمن كل ليد من الثلاثة.
البرنامج الثالث عشر مثل الذي قبله لكن مع زيادة زمن كل ليد 5 ثوان.
البرنامج الرابع عشر مثل الذي قبله لكن مع زيادة زمن كل ليد 5 ثوان.
البرنامج الخامس عشر مثل الذي قبله لكن مع زيادة زمن كل ليد 5 ثوان.
البرنامج السادس عشر مثل الذي قبله لكن مع زيادة زمن كل ليد 5 ثوان.
الضغط على الزر الأول معناه الدخول في البرنامج الأول وتكراره وعدم الخروج منه إلا بالضغط على زر غير الزر الأول.
إذا تم الضغط على الزر الأول مرة أخرى لا يعاد تنفيذ البرنامج الأول من بدايته.. وإنما يستمر في خطواته وكأن شيئا لم يحدث.
عند الضغط على الزر العاشر يقطع البك تنفيذه لأي برنامج كان ينفذه ويذهب للبرنامج العاشر.
عند الضغط على الزر السابع يذهب البك فورا لتنفيذ البرنامج السابع.
الصعوبة هنا أنك إذا استخدمت أمر delay لمدة خمس ثوان فإن المستخدم عندما يضغط على أحد الأزرار لن يعرف البك بذلك حتى ينتهي من تنفيذ الأمر delay
هناك حل سهل جدا باستخدام مقاطعة التايمر زيرو حيث يعد البك الزمن وفي نفس الوقت يراقب البورتات وينفذ التعليمات ولكن من الشروط عدم استخدام التايمرات.
كما أنه هناك حل آخر باستخدام المقاطعة الخارجية على الأطراف B4 و B5 و B6 و B7 ولكن أيضا من الشروط عدم استخدام أي مقاطعات.
قد يقول قائل إن تنفيذ هذا البرنامج سهل جدا باستخدام التايمر زيرو فَلِمَ حرمتنا منه؟
الإجابة لأن تنفيذ هذا البرنامج سهل جدا باستخدام التايمر زيرو.. يعني لن تكون هناك عصرة دماغ ولا متعة.
ألم أقل لكم مسابقة اليوم ليست كالمسابقة الأولى؟!!
الإعلان عن متغير 8 بت سنعده ثلاث تعليمات.
بينما المتغير ال16 بت سنعده 6 تعليمات.
حلقة for سنعدها ثلاث تعليمات.
بقية الأوامر سنعدها بالطريقة التي وردة في المسابقة الأولى في المسابقة الأولى:
http://www.qariya.info/vb/showthread...94#post1018194
والسلام عليكم ورحمة الله وبركاته.