شرح كل قسم من أقسام البرنامج :
القسم الأول : التعليقات comments
// البرنامج الأول
/* برنامج وميض ليد كل واحد ثانية
هذا البرنامج يهدف إلى إضاءة وإطفاء ليد متصل بطرف لمنفذ الميكروكونترولر
إعداد :
Eng.F.Abdelaziz
http://www.eeecb.com/vb/index.php
Online Course: PIC Microcontrollers - Programming in C */
كود:
// البرنامج الأول
/* برنامج وميض ليد كل واحد ثانية
هذا البرنامج يهدف إلى إضاءة وإطفاء ليد متصل بطرف لمنفذ الميكروكونترولر
إعداد :
Eng.F.Abdelaziz
http://www.eeecb.com/vb/index.php
Online Course: PIC Microcontrollers - Programming in C */
هذا الجزء خاص بكتابة التعليقات (الملاحظات) على البرنامج . التعليقات مهمة لتوثيق البرنامج .
يمكننا إضافة التعليقات إلى البرنامج بطريقتين :
· التعليقات "البسيطة" (سطر واحد) : عندما نرغب فى التعليق فى مجرد سطر واحد من البرنامج . نبدأ التعليق بالحروف "//" فى سطر ما وينتهى هذا التعليق بنهاية هذا السطر .
· التعليقات "المركبة" أو المتعددة , يمكننا كتابة تعليقات فى أكثر من سطر من البرنامج باستخدام الحروف "/*" كبداية للتعليق و الحروف "*/" كنهاية له .
القسم الثانى الثانى : الدالة الرئيسة main ()
void main ()
{
TRISB = 0; // إعداد أطراف المنفذ كمخارج بوضع أصفار فى سجل التحكم
PORTB = 0; // كتابة أو إرسال أصفار إلى أطراف المنفذ لإطفاء الليدات كحالة إبتدائية
while (1)
{
PORTB.F1 = 1; // تحديد الطرف بالحالة المرتفعة لإضاءة الليد
Delay_ms (1000); // تأخير أو انتظار لمدة واحد ثانية
PORTB.F1 = 0; //تحديد الطرف بالحالة المنخفضة لإطفاء الليد
Delay_ms (1000); // تكرار التأخير
}
}
كود:
void main ()
{
TRISB = 0; // إعداد أطراف المنفذ كمخارج بوضع أصفار فى سجل التحكم
PORTB = 0; // كتابة أو إرسال أصفار إلى أطراف المنفذ لإطفاء الليدات كحالة إبتدائية
while (1)
{
PORTB.F1 = 1; // تحديد الطرف بالحالة المرتفعة لإضاءة الليد
Delay_ms (1000); // تأخير أو انتظار لمدة واحد ثانية
PORTB.F1 = 0; //تحديد الطرف بالحالة المنخفضة لإطفاء الليد
Delay_ms (1000); // تكرار التأخير
}
}
العبارة main () تحدد اسم دالة .
الدالة main () فى لغة السى , هى دائما أول ما يتم تنفيذه ويجب أن تكون وحيدة (فريدة) unique فى البرنامج .
ينتهى البرنامج عندما يتم إنتهاء تنفيذ الدالة main () .
الدالة فى لغة السى ليست أكثر من مجرد مجموعة من التعليمات التى يمكن تنفيذها من أى نقطة فى البرنامج . نستخدم إشارة لبدء الدالة "{" (قوس الفتح) وإشارة لإنهاء الدالة "}" (قوس الغلق) لكى تكتمل الدالة .
جميع التعليمات يجب أن تكون بين القوسين ويتم تنفيذها حسب الترتيب الذى نكتبها به . فى هذا البرنامج البسيط لا تستقبل الدالة أى بارامترات ولا تعود بأى بارامتر . وهذا هو ما تم التصريح به قبل اسم الدالة من خلال الكلمة void (فارغ) فى مقدمة البرنامج (سوف يتم تناول الدوال بالتفصيل لاحقا) .
داخل الدالة الرئيسية يتم تنفيذ التعليمات التالية :
إعدادات الميكروكونترولر كما يلى :
TRISB = 0; // إعداد أطراف المنفذ كمخارج بوضع أصفار فى سجل التحكم
PORTB = 0; // كتابة أو إرسال أصفار إلى أطراف المنفذ لإطفاء الليدات كحالة إبتدائية
كود:
TRISB = 0; // إعداد أطراف المنفذ كمخارج بوضع أصفار فى سجل التحكم
PORTB = 0; // كتابة أو إرسال أصفار إلى أطراف المنفذ لإطفاء الليدات كحالة إبتدائية
كما نعرف , الأمر TRISB يعرف إتجاه البيانات للمنفذ PORTB بالميكروكونترولر .
فى هذا المثال TRISB = 0 , يؤدى ذلك إلى إعداد جميع أطراف المنفذ PORTB كمخارج .
الأمر PORTB = 0 يؤدى إلى جعل حالة الأطراف RB0 إلى RB7 فى الحالة المنطقية المخفضة low=0)).
التعليمات يجب أن تنتهى دائما بالفاصلة المنقوطة ";" . الفاصلة المنقوطة هى جزء من التعليمة وليست تبويب منفرد لذلك يجب ألا ننسى إضافة الفاصلة المنقوطة بعد نهاية كل تعليمة .
بعد ذلك يتم إنشاء حلقة تكرار غير منتهية كما يلى :
while (1)
العبارة while (1)أمر تحكم يستخدم فى تكرار مجموعة (بلوك) معينة من التعليمات . . يتم تنفيذ عبارات تلك المجموعة (البلوك) طالما أن الشرط صواب true أى غير صفرى . فى هذا المثال القيمة المستخدمة فى حلقة whileتضمن أن الشرط صواب دائما (سوف نتناول ذلك بالتفصيل لاحقا) .
الأوامر التالية تنتمى إلى مجموعة (بلوك) عبارة while:
{
PORTB.F0 = 1; // تحديد الطرف بالحالة المرتفعة لإضاءة الليد
Delay_ms (1000); // تأخير أو انتظار لمدة واحد ثانية
PORTB.F0 = 0; //تحديد الطرف بالحالة المنخفضة لإطفاء الليد
Delay_ms (1000); // تكرار التأخير
}
كود:
{
PORTB.F0 = 1; // تحديد الطرف بالحالة المرتفعة لإضاءة الليد
Delay_ms (1000); // تأخير أو انتظار لمدة واحد ثانية
PORTB.F0 = 0; //تحديد الطرف بالحالة المنخفضة لإطفاء الليد
Delay_ms (1000); // تكرار التأخير
}
ونظرا لعدم وجود أمر يوقف حلقة while , يتم تنفيذ مجموعة الأوامر إلى أجل غير مسمى حتى يتم إيقاف العملية shut down أو إعادتها restarted .
العبارة PORTB.F0 = 1 : تؤدى إلى جعل الطرف RB0 للمنفذ PORTB فى الحالة المنطقية المرتفعة (high=1) .
للإشارة لطرف بمنافذ الميكروكونترولر PORTA, PORTB, PORTC, PORTD, PORTE يجب أن نكتب اسم المنفذ ثم نقطة ثم الحرف Fثم رقم الطرف المطلوب .
مثال :
PORTB.F0 = 0 يشير للطرف RB0 بالمنفذ PORTB .
PORTD.F5 = 1 يشير للطرف RD5بالمنفذ PORTD .
PORTE.F1 = 1 يشير للطرف RE1 بالمنفذ PORTE .
العبارة delay_ms (1000): هى دالة داخلية للمترجم mikroCتستخدم فى توليد تأخير (إنتظار) زمن بالملى ثانية .
فى هذا المثال , تؤدى هذه العبارة إلى التأخير (الإنتظار) بقيمة 1000 ملى ثانية أو 1 ثانية .
العبارة PORTB.F0 = 0: تستخدم لوضع الطرف RB0 بالمنفذ PORTB فى الحالة المنخفضة low=0.
نتيجة لذلك : عند برمجة (تحميل) الميكروكونترولر PIC بنتيجة ترجمة هذا البرنامج فإن الطرف RB0 سوف يتحول بين الحالة المنطقية المنخفضة والحالة المنطقية المرتفعة ويتكرر ذلك كل 1ثانية بصفة مستمرة.