قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-07-2012, 01:05 PM المشاركة 25   
افتراضي أشكال وطريقة تمثيل الأعداد



أشكال وطريقة تمثيل الأعداد
المترجم الميكروسى يمكنه التعامل مع البيانات من النوع : العشرى و الثنائى و السداسى عشرى والثمانى . يمكننا تمثيل القيمة العددية بعدة طرق .
للتوضيح , نفترض أننا نريد تحميل القيمة 187 بالسجل PORTB باستخدام الميكروسى :
· التمثيل العشرى Decimal:
لتمثيل عدد عشرى فقط ضع قيمته بدون أى اختصار كما فى السطر التالى :


PORTB = 187;//التمثيل العشرى


كود:
PORTB = 187;//التمثيل العشرى

ملحوظة هامة :
يجب ألا يبدأ العدد العشرى بالصفر على الأطلاق , لأن الميكروسى سوف يفسره على أنه عدد ثمانى .
مثال :
PORTB = 25 تمثل 25 عشرى .
PORTB = 025 تمثل ثمانى .

· التمثيل السداسى عشرى Hexadecimal :
لتمثيل العدد السداسى عشرى يجب أن يبدأ "بالبادئة prefix " 0x (أو 0X ) قبل العدد السداسى عشرى
( من 0 إلى F) .
مثال :


PORTB = 0Xbb; // تمثيل سداسى عشرى للعدد العشرى 187
Or
PORTB = 0XBB; // تمثيل سداسى عشرى للعدد العشرى 187


كود:
PORTB = 0Xbb; // تمثيل سداسى عشرى للعدد العشرى 187 Or PORTB = 0XBB; // تمثيل سداسى عشرى للعدد العشرى 187

· التمثيل الثنائى Binary :
لتمثيل العدد الثنائى يجب أن يبدأ "بالبادئة prefix " 0b (أو 0B ) قبل العدد الثنائى .
مثال :



PORTB; = 0b10111011; // التمثيل الثنائى للعدد العشرى 187
Or
PORTB; = 0B10111011; // التمثيل الثنائى للعدد العشرى 187

كود:
PORTB; = 0b10111011; // التمثيل الثنائى للعدد العشرى 187 Or PORTB; = 0B10111011; // التمثيل الثنائى للعدد العشرى 187

ملحوظة :
الخانة ذات الأهمية القصوى (الأعلى) MSB هى أقصى خانة جهة اليسار . أى خطأ فى تمثيل العدد الثنائى يسبب عدم عمل البرنامج بالطريقة الصحيحة .

· التمثيل الثمانى Octal :
النظام الثمانى ليس واسع الانتشار اليوم . على الرغم من ذلك فإن الميكروسى يدعم تمثيل هذا النوع من الأعداد , يجب علينا استخدامها فقط عند الحاجة .
لتمثيل العدد الثمانى يجب أن يبدأ "بالبادئةprefix "0 (zero) قبل العدد الثمانى .
مثال :




PORTD = 0273; // التمثيل الثمانى للعدد العشرى 187

كود:
PORTD = 0273; // التمثيل الثمانى للعدد العشرى 187
تحذير :
ينبغى عدم الخلط مع الأعداد الثمانية . الأعداد الثمانية يسبقها بادئة هو الصفر مثل 0140 هو عدد ثمانى . الأعداد العشرية لا يسبقها بادئة مثل 140 هو عدد عشرى .
مثال 1 :
نريد إرسال الحالات التالية لأطراف المنفذ PORTB :


RB0 = 0
RB1 = 1
BR2 = 1
RB3 = 0
RB4 = 0
RB5 = 1
RB6 = 0
RB7 = 0


ما هى القيمة العددية التى نضعها فى التعليمة لتمثيل حالات أطراف المنفذ PORTB .

الحل :

التمثيل العشرى :
PORTB=38;

كود:
PORTB=38;

التمثيل الثنائى :

PORTB = 0b00100110;

كود:
PORTB = 0b00100110;
التمثيل السداسى عشرى :


PORTB = 0x26;

كود:
PORTB = 0x26;

النظام الثمانى :


PORTB = 046;


كود:
PORTB = 046;
ثانيا : الحساسية لنوع الحرف فى الميكروسى :
فى الميكروسى (على خلاف لغة السى القياسية) يمكننا استخدام الحروف الصغيرة (السفلية) lowercase والكبيرة (العلوية) uppercaseفى البرنامج أى لا توجد حساسية لنوع الحرف فى الحالة الافتراضية .


ثالثا : الوصول إلى البتات المفردة للمتغيرات والسجلات 8-bit فى المترجم mikroC PRO
يسمح لك المترجم mikroC PRO بالوصول إلى البتات الفردية للمتغيرات ذات الثمانى خانات . كما أنه يعتمد البيانات من النوع sbit و bit .


الوصول إلى بت فردية فى المتغير :
  • إذا كنت معتاد على الميكروكونترولر فيمكنك الوصول إلى الخانات بإسمها مباشرة كما يلى :
GIE_bit = 0 ; //Clear Global Interupt Bit (GIE)


كود:
GIE_bit = 0 ; //Clear Global Interupt Bit (GIE)
  • كما يمكنك ببساطة استخدام رمز إنتقاء (اختيار) الرقم وهو النقطة (.) مع المتغير متبوعا بواحد من المعرفات : B0 , B1 , ……, B7 أو F1 , F2 , ……F7
حيث F7 هى البت ذات القيمة القصوى MSB :

أمثلة :
PORTA.F5 = 0; // refers to the PIC pin RA5.
PORTD.F7 = 1; // refers to the PIC pin RD7.
TRISB.RB0 = 1; // makes reference to the bit 0 of register TRISB
INTCON . B0 = 0 ; // Clear bit 0 in INTCON register


كود:
PORTA.F5 = 0; // refers to the PIC pin RA5. PORTD.F7 = 1; // refers to the PIC pin RD7. TRISB.RB0 = 1; // makes reference to the bit 0 of register TRISB INTCON . B0 = 0 ; // Clear bit 0 in INTCON register
  • لا توجد حاجة لإى إعلانات خاصة .هذا النوع من الوصول الانتقائى هو خاصية جوهرية فى المترجم mikroC PRO ويمكن استخدامه فى أى مكان فى الكود .
  • المعرفات B0-B7 ليست حساسة لنوع الحرف كبير أم صغير .
الخانات نوع sbit :

يمتلك المترجم mikroC PRO نوع من بيانات الخانات يسمى sbit والذى يوفر الوصول لخانة بسجلات الوظائف الخاصة SFR .
يمكن تعريفها والوصول اليها بالطريقة التالية :
sbit LEDA at PORTA.B0 ;
sbit bit_name at sfr-name.B <bit-position> ;

sbit LEDB at PORTB.F0 ;
sbit bit_name at sfr-name.F <bit-position> ;

كود:
sbit LEDA at PORTA.B0 ; sbit bit_name at sfr-name.B <bit-position> ;
sbit LEDB at PORTB.F0 ; sbit bit_name at sfr-name.F <bit-position> ;

بيانات البتات من النوع bit :
يوفر المترجم mikroC PRO بيانات بتات من نوع bit والتى يمكن استخدامها فى الإعلان عن المتغير.
bit bf ; // bit variable

كود:
bit bf ; // bit variable

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-07-2012, 03:40 PM المشاركة 26   
افتراضي أنواع المتغيرات Variables والبيانات Data :


أنواع المتغيرات Variables والبيانات Data :
المحتويات :
1- المعرفات Identifiers
2- أنواع البيانات .
3- معدلات نوع البيانات modifiers
4- إعلان (تعريف) المتغيرات Declaration.
5- المتغيرات الشاملة (العامة) Global variables .
6- المتغيرات المحلية Local variables .

1- المعرفات
المعرفات هى أسماء محددة بأى طول تعطى للدوال والمتغيرات والثوابت الرمزية والعلامات labels . يشار إلى كل عناصر البرنامج هذه ككائنات .
يمكن أن تحتوى المعرفات على حروف " a to z " و A to Z "" والشرطة السفلية “_” والأرقام
" 0 to 9" . القيد الوحيد هو أن الحرف الأول يجب أن يكون حرف هجائى أو الشرطة السفلية .
الحساسية لنوع الحرف :
المترجم ميكروسى برو , فى وضعه الافتراضى, ليس حساس لنوع الحرف أى أن Sum, sum, suM تمثل نفس المعرف .
أمثلة للمعرفات :
فيما يلى بعض معرفات الصحيحة (الصالحة) :


كود:
temperature_V1 Pressure no_hit dat2string SUM3 _vtext

وفيما يلى بعض المعرفات الغير صحيحة :


كود:
7temp // NO -- cannot begin with a numeral %higher // NO -- cannot contain special characters int // NO -- cannot match reserved word j23.07.04 // NO -- cannot contain special characters (dot)

1- أنواع البيانات Data Type :
يوجد خمسة أنواع أساسية للبيانات والمعتمدة بالمترجم ميكروسى برو وهى : الأحرف (الرموز) character و الأعداد الصحيحة integer والأعداد الحقيقية (العشرية)( float/double) floating point وعديمة القيمة worthless .
الكلمات المحجوزة التى تستخدم فى إعلان (تعريف) المتغيرات من تلك الأنواع هى :
char, int, float/double , voidعلى الترتيب .
الجدول التالى يوضح قيمة ومدى كل نوع من البيانات :






البيانات من نوع char تستخدم لتمثيل أحرف كود أسكى ASCII characters . كل متغير من نوع char يمكن إن يمثل حرف من أحرف كود أسكى .
البيانات من نوع int تستخدم فى تمثيل الأعداد الصحيحة بسعة 8 bits (0-255) . هذه الأنواع من البيانات تستخدم على نطاق واسع فى البرمجة بلغة السى .
البيانات من النوع char و النوع int تمثل أعداد صحيحة ولا يمكن أن تستخدم فى تمثيل الأعداد الكسرية . لهذا الغرض يجب أن تستخدم بيلنات من النوع float , يسمى أيضا floating-point .
هذا النوع من البيانات يجب تجنبه إلى أقصى حد ويستخدم فقط عند الحاجة الفعلية لمثل هذه البيانات .

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-07-2012, 03:41 PM المشاركة 27   
افتراضي


3- معدلات نوع البيانات modifiers .
يمكننا استخدام أوامر خاصة بلغة السى للحصول على أنوع أخرى من البيانات . هذه الأوامر تسمى "معدلات" modifiers الأنواع الخاصة وهى :signed, unsigned, short, long.
معدل نوع "بإشارة" signed
يمكن أن يستخدم فى تعديل النوع الأساسى من البيانات بحيث يمكن أن يمثل الأعداد الموجبى والسالبة .
معدل نوع "القصير" short يستخدم فى تعريف متغير صغير الحجم أصغر من النوع الأساسى أى أنه شكل مخفض من النوع المحدد .
معدل نوع "الطويل" long يستخدم فى توسعة مقياس تمثيل النوع المحدد .







ملاحظة :
الأنواع float, double
, long double تعتبر من نفس النوع فى المترجم ميكروسى .

1- إعلان (تعريف) المتغيرات Declaration

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

كود:
<type> name_of_variable;


النوع type يجب أن يكون نوع صالح (متاح) من أنواع البيانات مثل char, int, floatسواء بدون معدلات أو بالمعدلات unsigned, signed, short , long.
فى لغة السى يمكننا إعلان عدة متغيرات فى نفس السطر بوضع فاصلة "," بين كل متغير وآخر .
أمثلة :


كود:
int sum; unsigned char i, j, k; float salary; unsigned int age; short int y; long way, state; unsigned value;

جانب هام آخر فى إعلان المتغيرات وهو "المكان" الذى يتم الإعلان عنده .
يمكن إعلان المتغير أساسا عند نقطنين متميزتين فى البرنامج :





الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-07-2012, 03:43 PM المشاركة 28   
افتراضي


  • المتغيرات العمومية (الشاملة) Global variables :
المتغيرات التى تذكر فى الجسم الرئيسى للبرنامج هى متغيرات عمومية وهى التى "يمكن الوصول إليها من أى دالة فى البرنامج" .


هذه البمتغيرات تكون "خارج أى دالة" من دوال البرنامج بما فى ذلك الدالة الرئيسية main () .
مثال :
كود:
int count; // sets the global variable "count" as integer char a; // sets the global variable "a" as char
void main () // main function of the program { counter = counter + 10; }

لاحظ أن المتغير "counter" والمتغير a"" تم تعريفهما خارج أى دالة من دوال البرنامج , هذه المتغيرات تعالج كمتغيرات عمومية ويمكن تناول ومعالجة بياناتهما عن طريق أى دالة فى البرنامج .

مثال آخر للمتغيرات العمومية :

كود:
int count; // sets the global variable "count" as integer char a; // sets the global variable "a" as char
void subroutine () // function subroutine any program { count = count - 20; a = 100; }
void main () // main function of the program { count = count + 10; a = 55; }



لاحظ أنه فى هذا المثال أن المتغير "count" والمتغير "a" تم تناولهما فى جسم الدالة الرئيسية
main () وفى جسم الدالة subroutine () .



  • المتغيرات المحلية Local variables :
على خلاف المتغيرات العمومية , فإن المتغيرات المحلية "تتواجد فقط داخل الدالة التى تم إعلانها فيها" . هذا يعنى أن المتغير المحلى يتواجد فقط "أثناء تنفيذ الدالة" , و فى لحظة إنتهاء الدالة والحصول على عائدها يتم التخلص من المتغير .


مثال :
كود:
void main () // main function of the program { int count; // define the local variable "count" as int count = count + 10; }

لاحظ أن المتغير "count" تم إعلانه بداخل الدالة الرئيسية main (), هذا المتغير المحلى سوف يكون متاحا فقط بداخل الدالة التى أعلن فيها , فى هذه الحالة المتغير "count" يمكن فقط تناوله فى البرنامج داخل الدالة الرئيسية main () .
مثال آخر لتوضيح المتغير المحلى :



كود:
void subroutine () // any sub-program function { int time; time = time * 2; }
void main () // main function of the program { int time; time = time / 2; }



لاحظ أنه فى هذا المثال لدينا دالتان : الدالة الرئيسية main () ودالة فرعية subroutine () . بداخل كا دالة تم إنشاء متغير يسمى "time" من نوع int , ولأن المتغير المحلى قابل للاستخدام فقط داخل الدالة التى يتم إعلانه فيها فإن " المتغير "time" الموجود بالدالة الفرعية subroutine () ليس له أى إرتباط بالمتغير "time" الموجود بالدالة الرئيسية main () " لأنهما متغيرين محليين .
إذا وحدث أن ارتكبنا الخطأ التالى :

كود:
void subroutine () // any sub-program function { time = time * 2; }
void main () / / main function of the program { int time; }

لاحظ ن المتغير "time" تم إعلانه فقط داخل الدالة الرئيسية main () بينما تم تناول بياناتك داخل دالة أخرى تسمى subroutine () . عندما تترجم هذا البرنامج فسوف يظهر المترجم بالقطع رسالة خطأ مفادها "أن المتغير "time" غير معرف" . وهذا خطأ شائع نقع فيه فى بداية تعلم البرمجة لأننا ننسى أن المتغير المحلى متاح فقط داخل الدالة التى أعلن فيها .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-07-2012, 08:57 PM المشاركة 29   
افتراضي هيكل (بناء) برنامج لغة السى Structure of a C program


هيكل (بناء) برنامج لغة السى Structure of a C program
وضع البرنامج فى صورة هيكل محدد المعالم يسهل عملية البرمجة وتتبع أخطاء البرنامج وتصحيحها بسهولة.
كل برنامج مكتوب بلغة السى يتكون من دالة أو أكثر , فكرة الدالة تجعل من الممكن إنشاء برامج مكونة من وحدات (موديولات) modulesوهياكل structures .
البرنامج الرئيسى main program المكتوب بلغة السى هو "دالة" function . لغة السى هى لغة بناء بحت وتتطلب من المبرمج الإلمام الكافى بهذا المفهوم . فيما يلى أصغر برنامج يمكن كتابه بلغة السى :

main ()
{

}

كود:
main () {
}
حيث :
main (): هى الدالة الأولى والرئيسية التى يتم تنفيذها .
{ : بدأ أو فتح جسم الدالة .
} : نهاية أو غلق جسم الدالة .

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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-07-2012, 08:58 PM المشاركة 30   
افتراضي


سنلقى نظرة على نموذج لبرنامج مكتوب بلغة السى مع جميع التعريفات والتعليقات , فلنتتبعه :


كود:
[Comment blocks of great importance in the program documentation]
[<declaration of global variables-headers>]
[<type>] function_name ([<parameters>])
[<declaration of parameter settings>]
{ / * This section is reserved for the body of function_name, with the declaration of its local variables, commands and functions work. This function can be called a subroutine of the program. * /
[return or return () or return (value)]
}
void main ([<parameters>]) { / * This section is reserved for the function body with the declaration of its local variables, commands and functions work. Here are the first commands that will execute the program. * / }
ملحوظة :
جميع المعلومات الموجودة بين القوسين "[" و "]" هى معلومات اختيارية قد تكون موجودة أو قد لا تكون موجودة فى البرنامج .
سوف نتناول كل قسم (بلوك) من البرنامج :
القسم (البلوك) الأول : هو "تعليقات عامة"
التعليقات العامة شديدة الأهمية فى توثيق البرنامج . يمكن للمبرمج إدراج أو عدم إدراج تعليقات فى البرنامج . من المتفق عليه , أنه من المهم أن تضع دائما بعض التعليقات كمقدمة للبرنامج .

القسم الثانى "رأس البرنامج" Header :
فى هذا القسم من البرنامج يمكنك إعلان جميع رؤوس البرنامج علاوة على تعيين المتغيرات العمومية
global variables والتى يمكن استخدامها فى جميع دوال البرنامج .

مثال لقسم الرأس :



كود:
# Include "file_name.h" // included file file_name.h int a; // define the variable a as global int b; // define the variable b as global
القسم الثالث : دوال البرامج الفرعية subroutines
الصيغة :



كود:
[<type>] function_name ([<parameters>]) [<declaration of parameters >] { /* This section is reserved for the body of function_name with the declaration of its local variables, commands and their job functions. This function can be called a subroutine of the program. * / [Return or return () or return (value)] }
هذا القسم يمثل دالة تحمل الاسم function_name . قد تحدد نوع typeعائد (نتيجة) الدالة قبل اسمها أو قد لا تحدد . إذا لم تحدد النوع فإن الدالة سوف تكون من نوع int كوضع إفتراضى .
هذه الدالة ليست جزء من الدالة الرئيسية main () ويجب أن تستدعى فى أى وقت عن طريق الدالة الرئيسية main () أو عن طريق أى دالة أخرى تتطلب تنفيذ أوامرها . عند استدعاء الدالة يجب تحديد بارامتراتها (أدلتها) .
فى نهاية الدالة نجد عبارة العودة والغرض منها عودة الدالة بقيمة (نتيجة) الدالة .
ليس من الضرورى استخدام عبارة العودة إذا لم نحتاج للعودة بإى قيمة للدالة .

مثال على دالة فرعية :



كود:
void function (void) { PORTB = ~ PORTB; return; }
القسم الرابع : الدالة الرئيسية main () :
الصيغة :


كود:
void main ([<parameters>]) { /* This section is reserved for the function body with the declaration of its local variables, commands and their job functions. Here are the first commands that will execute the program. */ }
الدالة الرئيسية main () سوف تكون أول ما ينفذ بواسطة المعالج processor . بالدالة الرئيسية main () لدينا معدل بيانات من النوع "فارغ" void بغرض أعلان الدالة الرئيسية main () على أنها يجب ألا تعود بأى قيمة . يجب دائما أن نبدأ الدالة الرئيسية main () بمعدل البيانات من النوع void .
مثال على الدالة الرئيسية :




كود:
void main () { PORTB = 0; TRISB = 0; PORTB = ~ PORTB; Delay_ms (1000); }
ملحوظة هامة جدا :
"الدوال الفرعية function (void) يجب أن توضع قبل الدالة الرئيسية main () " وإلا حدث خطأ عند ترجمة البرنامج . وذلك بسبب أننا لا نستطيع أن نستخدم دالة قبل إعلانها مسبقا .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-07-2012, 09:00 PM المشاركة 31   
افتراضي


تدريب :
المطلوب التعرف على الأقسام (البلوكات) الرئيسية فى البرنامج (ليس المطلوب الآن فهم طريقة عمل البرنامج ):

كود:
/* * Project name: PWM_Test_01 (PWM library Demonstration ) MCU: PIC16F877A Oscillator: XT, 4.0 MHz SW: mikroC PRO * NOTES: None. */ unsigned short i, j;
InitMain void () { PORTB = 0; TRISB = 0; ADCON1 = 0x0F; PORTA = 255; TRISA = 255; PORTC = 0x00; TRISC = 0; Pwm_Init (5000); } // ~!
void main () { initMain (); i = 127; j = 0; Pwm_Start ();
while (1) { if (Button (& PORTA, 0,1,1)) i + +; if (Button (& PORTA, 1,1,1)) i--; if (j !=i) { Pwm_Change_Duty (i); j = i; PORTB = j; } Delay_ms (200); } }//~!

الأقسام :
القسم الأول : التعليقات Comments:
كود:
/* * Project name: PWM_Test_01 (PWM library Demonstration ) MCU: PIC16F877A Oscillator: XT 4.0 MHz SW: mikroC PRO * NOTES: None. */

هذا الجزء من البرنامج هو تعليقات وهو مسؤول عن توثيق البرنامج . عند ترجمة البرنامج فإن هذه النصوص لن تؤخذ فى الاعتبار من جانب المترجم .

القسم الثانى : الرأس headerوإعلان المتغيرات العمومية global variables:


كود:
unsigned short i, j;
فى هذا القسم تم إعلان متغيرات عمومية global variable للبرنامج .

القسم الثالث : الدوال الفرعية subroutines :

كود:
InitMain void () { PORTB = 0; TRISB = 0; ADCON1 = 0x0F; PORTA = 255; TRISA = 255; PORTC = 0x00; TRISC = 0; Pwm_Init (5000); } // ~!



هذه الدالة هى دالة فرعية للبرنامج وتستدعى بواسطة المبرمج بالعبارة :

كود:
InitMain ();


القسم الرابع : الدالة الرئيسية :




كود:
void main () { InitMain (); i = 127; j = 0; Pwm_Start ();
while (1) { if (Button (& PORTA, 0,1,1)) i + +; if (Button (& PORTA, 1,1,1)) i--; if (j !=i) { Pwm_Change_Duty (i); j = i; PORTB = j; } Delay_ms (200); } }//~!




على الرغم من أن الدالة الرئيسية تأتى فى آخر ترتيب كتابة البرنامج إلا أنها سوف تكون أول دالة يتم تنفيذها عن طريق المعالج .

إرشادات :

لماذا نستخدم الدوال الفرعية ؟
  • للسماح بإعادة استخدام الكود الذى تم بناءه (سواء بواسطتك أو بواسطة مبرمج آخر) .
  • لمنع تكرار مقطع من الكود عدة مرات داخل نفس البرنامج .
  • للسماح بتغيير قطعة من الكود بسرعة أكثر . عند استخدام الدالة تحتاج فقط لتغيير ما هو مطلوب داخل الدالة .
  • تستخدم خاصة فى البرامج الطويله والصعبة على الفهم .
  • قراءة وتتبع البرنامج بسهولة .
  • تقسيم البرنامج إلى أجزاء (بلوكات) والتى يمكن فهم منطق عمل كل على حدة (الوظيفة – المهمة).


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-07-2012, 09:01 PM المشاركة 32   
افتراضي


نماذج (عينات) الدالة Function Prototypes :
لا يمكننا استخدام الدالة بدون إعلانها مسبقا . نموذج (عينة) الدالة هو عبارة توضع فى بداية البرنامج للتعرف على الدالة ويجب أن يسبق التعرف إستدعاء الدالة . هذا النموذج (العينة) يخبر المترجم بنوع بيانات نتيجة عودة (رجوع) الدالة وباسم الدالة وبالبارامترات التى تستقبلها .
مثال :

كود:
void Function_Prototypes void () /* function prototype, this program line should be placed on top of the program, along with the statements;*/ //....
void main () { // Here is my main program }
//***************** Function subroutine ******************** void Function_Prototypes void () { // Here are the commands of its subroutine }


لاحظ أن الدالة الفرعية Function_Prototypes قد جاءت بعد الدالة الرئيسية main () , فى هذه الحالة من الضرورى وضع "نموذج الدالة" function prototype ( سطر من البرنامج به رأس الدالة الفرعية) عند قمة البرنامج وإلا فإن المترجم سوف يعطى خطأ لأننا لا نستطيع إستخدام أى دالة قبل إعلانها . فى حالة وضع الدالة الفرعية قبل الدالة الرئيسية main () فى البرنامج , فإننا لن نحتاج لإعلان نموذج الدالة فى البرنامج .



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 06:00 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)