تفاصيل الخطوات : // Header
- الإعلان عن متغير حلقة for وهو من نوع "عدد صحيح" int واسمه k قبل استخدامه (لا تنسى الفاصلة المنقوطة)
int k;
- نبدأ كأى برنامح بتعبير الدالة الرئيسية
void main( ) {
- تهيئة المنافذ : فى هذا البرنامج نستخدم الميكروكونترولر PIC16F887 ولن نستخدم سوى المداخل / المخارج الرقمية ونظرا لأننا سوف نستخدم المنفذ PORT B وهو يحتوى على مداخل تماثلية لذلك يجب جعل سجلات اختيار المداخل التماثلية ANSEL و ANSELH بأصفار كما يلى :
ANSEL = 0; // All I/O are configured as digital
ANSELH = 0; - باقى تهيئة وإعداد المنافذ : ينصح بتعيين الحالة الابتدائية لمنقذ الخرج PORTB وفى هذا البرنامج نبدأ والليدات مضاءة لذلك نجعل جميع خانات المنفذ PORTB والمتصلة بالليدات فى الحالة المرتفعة أى 0Xff = 0b11111111
PORTB = 0xFF; // Reset port B
- ولتعيئة (إعداد) جميع خانات المنفذ PORTB كمخارج يجب جعل جميع خانات سجل التحكم فى المنفذ TRISB بأصفار
TRISB = 0; // Port B pins are configured as outputs
- الأن جميع الليدات مضاءة ، ننتظر فى هذه الحالة لمدة ثانية (1000ملى ثانية) باستخدام دالة التأخير الزمنى
Delay_ms(1000); // 1 s delay
- بعد انقضاء زمن التأخير يتم أطفاء الليدات بجعل خانات المنفذ PORTB بأصفار
PORTB = 0;
- المطلوب تكرار ما سبق لعدد معين من المرات لنحصل على وميض لجميع الليدات عدد من المرات وليكن 20 مرة (لاحظ أنه قد تم تنفيذ مرة واحدة ومتبقى 19 مرة ) .لتنفيذ ذلك نستخدم حلقة تكرار for والمتغير k والتى تحتوى على 3 معاملات أو أدلة :
المعامل الأول k=1 وهو القيمة الابتدائية لعداد تكرار الحلقة (أى العداد يبدأ من الرقم 1 وذلك لأننا قد نفذنا العمل مرة بالفعل وباقى 19 مرة ).
المعامل الثانى : شرط انتهاء (الخروج من )الحلقة وهو k<20 ليكون عدد مرات تكرار الحلقة هو 19 مرة أى 1<k<20 .
المعامل الثالث : الفعل الذى يتم بعد عمل حلقة واحدة وهو k++ ويعنى زيادة المتغير k بقيمة 1 بعد كل حلقة . وبعد القوس { يبدأ تعليمات البرنامج المطلوب تنفيذها داخل كل حلقة .
for(k=1; k<20; k++) // Remain in the loop as long as 1<k<20 ,
{ // k is incremented by 1 after each iteration - داخل حلقة for نستخدم عبارة switch الشرطية : بعد كلمة switch نجد بين قوسين المتغير موضع المراقبة ففى هذا البرنامج فإن switch تراقب حالة المنفذ PORTB وتبعا لذلك يكون أمامنا حالات خيارات متعددة باستخدام case والتى يأتى بعدها ثابت "فأن تطابق هذا الثابت مع حالة متغير switch يتم تنفيذ برنامج هذه الحالة . تبدأ الخيارات بعد القوس { .
switch (PORTB) { // Switch operator monitors port B state - الحالة الأولى عندما يكون متغير switch وهو PORTB بصفر أى مطابق للثابت الذى يلى case يتم تنفيذ التعليمة المرفقة والموجودة بعد نقطتى التنصيص وهى جعل جميع خانات المنفذ PORTB فى الحالة المرتفعة أى إضاءة الليدات أى تغيير حالة المنفذ.
case 0x00: PORTB = 0XFF; // If PORTB=0 , change its state
// into 0Xff , and provide 100mS delay
- التأخير لفترة 100 ملى ثانية ضمن برنامج case 0x00 أى أضاة لمدة 100 ملى ثانية
Delay_ms(100);
- ننهى مجموعة التعليمات التى تتبع case 0x00 بعبارة break .
break;
- الحالة الثانية : تحدث فى الحلقة التالية عندما يكون متغير switch مطابق للثابت 0XFF الذى يلى case يتم تنفيذ التعليمة الموجودة بعد نقطتى التنصيص وهى جعل خانات المنفذ PORTB بأصفار , بعبارة أخرى عندما تكون الليدات مضاءة يتم تغير حالتها إلى المطفأة .
case 0xFF: PORTB = 0x00 // If PORTB=0Xff , change its state
- التأخير لمدة 500 ملى ثانية ضمن case 0xFFأى أطفاء لمدة 500 ملى ثانية . ننهى case وفى نفس الوقت ننهى switch بقوس النهاية }
Delay_ms(500); } // into 0 , and provide 500mS delay
} // End of for loop
ماذا بعد وميض جميع الليدات 20 مرة ؟
نقوم بعمل مثال لنموذج إضاءة مركب من مزيج من الخانات كما يلى : - وضع (تحميل) النموذج المطلبوب فى المنفذ PORTB فى الشكل الثنائى , الواحد يعنى أضاءة الليد المتصل بهذا الطرف بينما الصفر يعنى ان الليد مطفأ .
PORTB = 0b01010101; // Binary combination on port B
- إنشاء حلقة غير منتهية باستخدام العبارة while(1) ويبدأ البرنامج المطلوب تنفيذه بالقوس {
while(1) { // Endless loop
- استخدم مؤثر العاكس ~ فى عكس جميع خانات المنفذ PORTB أى عكس حالة إضاءة الليدات
PORTB = ~ PORTB; //Invert port B logic state
- التأخير لفترة 200 ملى ثانية
Delay_ms(200); // 200mS delay
- نهاية حلقة while وتتكرر إلى مالانهاية }
}
}