التعليق على البرنامج : 1- مقدمة (رأس) البرنامج /*
PIC16F628
Seven segment display
*/
2- تعريفات وإعلانات : # تعريف أطراف الميكروكونترولر بأسماء الشرائح لتسهيل فهم وتتبع البرنامج فعلى سبيل المثال الطرف RB0 متصل بالشريحة a فيعرف : sbit seg_a at RB0_bit; . // Define seven segment connections
sbit seg_a at RB0_bit;
sbit seg_b at RB1_bit;
sbit seg_c at RB2_bit;
sbit seg_d at RB3_bit;
sbit seg_e at RB4_bit;
sbit seg_f at RB5_bit;
sbit seg_g at RB6_bit;
# الإعلان عن متغير بالاسم count مع إسناد (تخصيص) قيمة ابتدائية له هى الصفر count=0 unsigned short count=0;
3- بداية الدالة الرئيسية : void main() {
· تهيئة المنافذ والأطراف : جميع أطراف المنفذ PORTB والمنفذ PORTA كمخارج فيما عدا الطرف RA5 فهو مدخل الإعادة MCLR
TRISB = 0b00000000; // PORTC All Outputs
TRISA = 0b00100000; // PORTA All Outputs, Except RA5 = MCLR
· الدخول فى حلقة غير منتهية do{….} while(1) وفيها يتم تنفيذ : do {
# تنفيذ تعبير switch (count) أى : أ- تقييم قيمة المتغير count (وهو فى الوضع الابتدائى بصفر) ثم ب- مقارنة نتيجة التقييم بجميع الحالات التى يذكر فى بدايتها كلمة case يليها ثابت وهو هنا من صفر إلى 15 . ت- الحالة التى يتم فيها تطابق التقييم مع المقارنة يتم تحويل مسار البرنامج إليها أى تنفيذ التعليمات التى تتضمنها . وبما أن المتغير count يبدأ بالصفر فإن التطابق يحدث مع case 0 : ومن ثم يتم تنفيذ محتويات هذه الحالة وهى : جعل الشرئح المناظرة للرقم صفر فى الحالة المرتفعة 1 حتى تضىء هذه الشرائح لعرض الرقم صفر . تنتهى محتويات الحالة بكلمة break حيث يتم الخروج عبارة switch (count){ …..} switch (count) {
case 0 : seg_a=1; seg_b=1; seg_c=1;
seg_d=1; seg_e=1; seg_f=1; seg_g=0;
break;
case 1 : seg_a=0; seg_b=1; seg_c=1; seg_d=0;
seg_e=0; seg_f=0; seg_g=0;
break;
case 2 : seg_a=1; seg_b=1; seg_c=0; seg_d=1;
seg_e=1; seg_f=0; seg_g=1;
break;
case 3 : seg_a=1; seg_b=1; seg_c=1; seg_d=1;
seg_e=0; seg_f=0; seg_g=1;
break;
case 4 : seg_a=0; seg_b=1; seg_c=1; seg_d=0;
seg_e=0; seg_f=1; seg_g=1;
break;
case 5 : seg_a=1; seg_b=0; seg_c=1; seg_d=1;
seg_e=0; seg_f=1; seg_g=1;
break;
case 6 : seg_a=1; seg_b=0; seg_c=1; seg_d=1;
seg_e=1; seg_f=1; seg_g=1;
break;
case 7 : seg_a=1; seg_b=1; seg_c=1; seg_d=0;
seg_e=0; seg_f=0; seg_g=0;
break;
case 8 : seg_a=1; seg_b=1; seg_c=1; seg_d=1;
seg_e=1; seg_f=1; seg_g=1;
break;
case 9 : seg_a=1; seg_b=1; seg_c=1; seg_d=0;
seg_e=0; seg_f=1; seg_g=1;
break;
case 10 : seg_a=1; seg_b=1; seg_c=1; seg_d=0;
seg_e=1; seg_f=1; seg_g=1;
break;
case 11 : seg_a=0; seg_b=0; seg_c=1; seg_d=1;
seg_e=1; seg_f=1; seg_g=1;
break;
case 12 : seg_a=1; seg_b=0; seg_c=0; seg_d=1;
seg_e=1; seg_f=1; seg_g=0;
break;
case 13 : seg_a=0; seg_b=1; seg_c=1; seg_d=1;
seg_e=1; seg_f=0; seg_g=1;
break;
case 14 : seg_a=1; seg_b=0; seg_c=0; seg_d=1;
seg_e=1; seg_f=1; seg_g=1;
break;
case 15 : seg_a=1; seg_b=0; seg_c=0; seg_d=0;
seg_e=1; seg_f=1; seg_g=1;
break;
} //case end
# بعد الخروج من عبارة switch يتم تزايد العداد بواحد فيصبح count = 1 للتجهيز لعرض الرقم 1 count ++;
# بعد الانتهاء من عرض الأرقام من 0 إلى 15 يتم إعادة العرض مرة أوخرى ويتم ذلك عن طريق عبارة الشرط if بمعنى إذا كانت محتويات المتغير تساوى 16 يتم وضع صفر بدلا منها .
if(count ==16) count =0;
# فترة تأخير أو انتظار 1 ثانية بين عرض رقم وآخر للسماح بمشاهدة المعروض
Delay_ms(1000); // Wait for 1 sec before updating the display
# تكرار ما سبق بصفة مستمرة
} while(1); // Infinite Loop
# نهاية الدالة الرئيسية }