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

   

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





كود:
 void main()
{
  TRISB.F0 = 0; 		//Makes PORTB0 or RB0 Output Pin
   PORTB=0; 			//LED OFF
  while(1) 			//Infinite Loop
  {
    PORTB.F0 = 1; 		//LED ON
    Delay_ms(1000); 		//1 Second Delay
    PORTB.F0 = 0; 		//LED OFF
    Delay_ms(1000); 		//1 Second Delay
  }
}
قد يكون من المفيد أن تتخيل سير تنفيذ البرنامج كما يلى :
نبدأ من عند الدالة الرئيسية main :
• قبل الدخول إلى حلقة التكرار الغير منتهى :
1- الأمر (TRISB.F0=0) هو أمر إعداد لبت فى المنفذ ، هنا نأمر الميكروكونترولر بإرسال “0” إلى البت bit0 للسجل TRISB . هذا الصفر يجعلها فى الحالة المنخفضة فتقوم بناء على ذلك بجعل البت bit0 للسجل PORTB طرف خرج Output .
2- الأمر (PORTB=0) هو أمر بإرسال “0” إلى سجل المنفذ PORTB فتكون جميع بتاته ، بما فى ذلك البت bit0 ، عند الجهد المنخفض (0V) كحالة ابتدائية .
• الدخول إلى حلقة تكرار غير منتهى بالصيغة (while(1){…}) وفيها يتم :
1- الأمر بإرسال “1” إلى البت bit0 للمنفذ PORTB بالصيغة (PORTB.F0=1) مما يعنى ظهور الجهد +5V على الطرف RB0 ، هذا الطرف متصل بالليد خلال مقاومة تحديد التيار فيمر تيار فى هذه الدائرة فيتسبب فى إضاءة الليد .
2- الأمر بالانتظار (تأخير) وعدم القيام بفعل أى شىء والليد فى حالة إضاءة لمدة واحد ثانية ، ويتم ذلك من خلال استخدام الأمر (Delay_ms(1000 .
3- الأمر بإرسال “0” إلى البت bit0 للمنفذ PORTB بالصيغة (PORTB.F0=0) مما يعنى ظهور الجهد المنخفض “0V” على الطرف RB0 فينقطع مرور التيار خلال الليد وينطفىء.
4- الأمر بالانتظار (تأخير) وعدم القيام بفعل أى شىء والليد فى حالة إطفاء لمدة واحد ثانية ، ويتم ذلك من خلال استخدام الأمر (Delay_ms(1000 .
5- تكرار الخطوات السابقة بشكل متكرر غير منتهى .


اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 20-05-2017, 02:24 PM المشاركة 10   
افتراضي بعض مفاهيم البرمجة


فيما يلى بعض مفاهيم البرمجة :

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

التعليقات الطويلة :
تبدأ التعليقات الطويلة بزوج الحروف ( /* ) وتنتهى بزوج الحروف ( */ ) . عادة تستخدم التعليقات الطويلة فى بداية البرنامج لوصف تفاصيل البرنامج ، مثل ما يقوم به البرنامج ، وأى نوع من الهاردوير يستخدم ، ومن هو المؤلف ، وتاريخ إنشاء البرنامج ، واسم ملف البرنامج ، وتاريخ الإصدار ، وهلم جرا (كما هو مبين بالشكل أدناه) . كما تستخدم التعليقات الطويلة أيضا بداخل البرنامج لوصف عمل جزء من البرنامج ، على سبيل المثال بارامترات (أدلة ، معلمات) الدوال ، والخوارزمية (إسلوب البرمجة) المستخدمة وهلم جرا .

التعليقات القصيرة :
تبدأ التعليقات القصيرة بزوج الحروف ( // ) . لا يتم إنهاء التعليقات القصيرة بحروف ، ويمكن استخدامها فى سطر واحد فقط ، بدءا من أى مكان بالسطر وحتى نهايته فقط . عموما ، تستخدم التعليقات القصيرة بعد عبارات البرنامج لتصف ما تقوم به العبارة ( كما هو مبين بالشكل أدناه) .




بداية ونهاية البرنامج :
فى الميكروسى برو :
• "يبدأ البرنامج" بالدالة الرئيسية :
void main()

• بعدها ، يتم استخدام قوس الفتح المجعد ( { ) للإشارة (لبيان) إلى بداية "جسم البرنامج" .
• يتم إنهاء البرنامج بقوس الغلق المجعد ( } ) . وبالتالى يكون هيكل بناء البرنامج بالصيغة التالية :

كود:
void main()
{
Program body
}

• يتكون جسم البرنامج من عبارات statements . كل عبارة برنامج يجب أن تنتهى بحرف الفاصلة المنقوطة ( ; ) للإشارة إلى نهاية العبارة ، وإلا يتم توليد خطأ بواسطة المترجم .

أمثلة :

كود:
 k = 50; 	//correct
i = k+5; 	//correct
k = 50		 //error

لتكرار البرنامج دون توقف تستخدم حلقة تكرار غير منتهى بالصيغة :

كود:
while(1) {
………
………
}

المسافات (المساحات) البيضاء :
تتكون المسافات (المساحات) البيضاء فى البرنامج من "المسافات" spaces ، و "التبويبات" tabs ، ،وحروف "السطر الجديد" newline ، و"الفراغات" blanks . يتم تجاهل هذه الحروف من قبل المترجم . وبالتالى فإن السطور التالية متطابقة :

كود:
k = 20; p = 50;
or
k = 20;
p = 50;
or
k = 20;
p =50;
or
k=20;
p=
20;
فى بعض التطبيقات ، قد يكون لدينا سلسلة نصية طويلة والتى قد نرغب فى تمديدها على عدة أسطر . يتم استخدام الشرطة المائلة للخلف ( \ ) لربط السلاسل النصية الممتدة على عدة أسطر . على سبيل المثال :

كود:
"My new mikroC\
Compiler"

تترجم على أنها :

كود:
"My new mikroC Compiler"

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

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


المتغيرات Variables :
المتغير هو مجرد مكان (وعاء) لحفط قيم لبيانات من نوع معين . مكان الحفظ هو مواقع ذاكرة RAM والنوع يمكن أن يكون لأحرف Character أو أعداد صحيحة Integers (بدون علامة عشرية) أو أعداد بعلامة أو نقطة عشرية تسمى Float .



يمكن تصنيف المتغيرات تبعا "لنوع البيانات" التى تخزنها بداخلها :
1- متغير يحفظ بيانات لعدد صحيح integer ، ويشار إليه بكلمة “int” .
2- متغير يحفظ بيانات لحرف character ، ويشار إليه بكلمة “char” .
3- متغير يحفظ بيانات لعدد بنقطة عشرية float ، ويشار إليه بكلمة “float” .
4- متغير يحفظ بيانات عدد بنقطة عشرية "مضاعف" double ، ويشار إليه بكلمة double .



كما يمكن تصنيف المتغيرات تبعا لعدد المتغيرات التى يمكن أن تحفظها :
1- متغيرات تحفظ "قيمة مفردة" فى نفس الوقت ومن أى نوع من البيانات ، وتسمى متغيرات عادية .
2-متغيرات تحفظ "قيم متعددة" من نفس نوع البيانات وتسمى "المصفوفات" Array .
3-متغيرات تحفظ "قيم متعددة" من أنواع مختلفة من البيانات وتسمى "الهياكل" Structure .

بيانات الأعداد الصحيحة Integer Type :
النوع char والنوع int ، وتعديلاتها ، تعتبر أنواع لبيانات أعداد صحيحة . يمكن إنشاء التعديلات باستخدام واحد من بادئات التعديل التالية : short , long , signed , unsigned . الجدول التالى يبين أنواع بيانات الأعداد الصحيحة ، يمكن إهمال الكلمات الموجودة بين الأقواس :



• فى حالة غياب البادئة unsigned فيفترض تلقائيا النوع signed لبيانات أنواع العدد الصحيح ، على سبيل المثال int تعنى signed int. الاستثناء الوحيد هو char حيث يكون unsigned فى الوضع الافتراضى وتقتصر على كتابة char.
• الكلمات signed و unsigned عندما يتم استخدامها فى حد ذاتها ، تعنى signed int و unsigned int على الترتيب ، على سبيل المثال unsigned تعنى unsigned int .
• كلمات التعديل short و long يمكن فقط تطبيقها على النوع int .
• الكلمات short و long عند استخدامها فى حد ذاتها ، تعنى short int و long int على ، سبيل المثال short تعنى signed short int .

بيانات الأعداد الحقيقية (التى تحتوى على نقطة عشرية)من نوع Float point :
الأنواع float و double مع النوع long double تعتبر أنواع الأعداد الحقيقية التى تحتوى على نقطة عشرية وتسمى float . المترجم ميكروسى برو يعتبر الثلاثة أنواع من نفس النوع ، كما هو مبين بالجدول التالى :


عامل التخصيص (التعيين) Assignment Operator :
• يستخدم عامل التخصيص لتخصيص (تعيين) قيمة إلى متغير .
• عامل التخصيص يشار إليه بعلامة التساوى “=” .
• عامل التخصيص يتعامل مع قيمتان ، قيمة على جانبه الأيسر ، وقيمة على جانبه الأيمن ، ويقوم العامل بنسخ القيمة التى على جانبه الأيمن إلى القيمة التى على جانبه الأيسر .



إعلان المتغير Variable Declaration :
مفهوم إعلان المتغير هو إعطاء أمر للمترجم لكى يقوم بحجز مواقع ذاكرة تتناسب مع نوع البيانات التى يقوم هذا المتغير بتخزينها .
صيغ إعلان المتغير :
الصيغة الأولى : نوع البيانات يليه اسم المتغير .

كود:
dataType   variableName;

هذه الصيغة تعلن عن متغير ، فهى تعلن عن نوع بياناته ، وحجز ذاكرة له وإطلاق اسم على هذه الذاكرة . هذه الصيغة لا تذكر شيئا حول القيمة الموجودة بالذاكرة .

الصيغة الثانية : نوع البيانات ، يليه اسم المتغير ، ثم تخصيص قيمة لهذا المتغير .

كود:
dataType   variableName  =  initialValue ;
هذه الصيغة تعلن عن المتغير ، وتعلن عن نوع بياناته ، وتحجز ذاكرة له ، وتضع قيمة ابتدائية فى هذه الذاكرة .

الصيغة الثالثة :

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

الصيغة الرابعة :

كود:
dataType   variableNameOne  =  initialValueOne, 
           	       variableNameTwo  =  initialValueTwo ;
هذه الصيغة تعلن عن متغيرين ، كلاهما له نفس نوع البيانات ، وتحجز الذاكرة اللازمة ، وتضع قيمة ايتدائية فى كل متغير . يمكنك كتابة الصيغة فى سطر واحد ، كما يمكنك إعلان أكثر من متغيرين بنفس الطريقة .
لعلك لاحظت الفاصلة “,” الموجودة بين المتغيرات ، والفاصلة المنقوطة “;” فى نهاية عبارة الإعلان .


فيما يلى أمثلة للأنواع المختلفة من المتغيرات :
• المتغيرات :


كود:
unsigned char 
or
unsigned short int
هى متغيرات "بدون إشارة" 8 بت ، تحتل "واحد بايت" فقط من الذاكرة ولها قيم فى المدى من (0) إلى (255) .
فى المثال التالى ، المتغير Sum يخصص (يعين) له القيمة (255) :

كود:
unsigned char Sum = 225;
 or
unsigned char Sum;
Sum = 225;

• والمتغيرات :

كود:
unsigned int
هى متغيرات "بدون إشارة" 16 بت ، تحتل "2 بايت" من الذاكرة ولها قيم فى المدى من (0) إلى (65 535) . فى المثال التالى ، المتغير Total يخصص له القيمة (64 500) :

كود:
unsigned int Total = 64500;
• والمتغيرات :

كود:
unsigned long int
هى متغيرات بدون إشارة 32 بت ، تحتل 4 بايت من الذاكرة ولها قيم فى المدى من (0) إلى
4 294 967 295 . فى المثال التالى ، المتغير Sum يخصص له القيمة 4 200 000 000 :

كود:
unsigned long int Sum = 4200000000;
• والمتغيرات :

كود:
signed char 
or 
signed short int
هى متغيرات "بإشارة" 8 بت ، نحتل واحد بايت فقك من الذاكرة ولها قيم فى المدة من (-128) إلى (+127) . فى المثال التالى المتغير Total يخصص له القيمة (-40) :

كود:
signed char Total = -40;
• والمتغيرات :

كود:
signed int
هى متغيرات بإشارة 16 بت ، تحتل 2 بايت من الذاكرة ولها قيم فى المدى من (-32 768) إلى (+32 767) . فى المثال التالى ، المتغير Sum يخصص له القيمة (-31 500) :

كود:
signed int Sum = -31500;
• والمتغيرات :

كود:
signed long int
هى متغيرات بإشار 32 بت ، تحتل 4 بايت من الذاكرة ولها قيم فى المدى من (-2 147 483 648) إلى
(+2 147 483 647) . فى المثال التالى ، المتغير Sum يخصص له القيمة (2 050 480 000) :

كود:
signed long int Sum = 2050480000;
• أنواع بيانات العدد الحقيقى هى : float, double , long double . فى المثال التالى ، المتغير Volume يخصص له القيمة (23.45) :

كود:
float Volume = 23.45;
or
float Volume;
Volume = 23.45;


أسماء المتغيرات:
• فى المترجم ميكروسى برو ، أسماء المتغيرات يمكن أن تبدأ بحرف أو الشرطة السفلية ( _ ) .
• أسماء المتغير يمكن أن تتضمن أى حرف من ( a ) إلى ( z ) ومن ( A ) إلى ( Z ) والأرقام من ( 0 ) إلى ( 9 ) .
• اسم المتغير يمكن أن يكون بطول حتى 31 حرف .
• بعض أمثلة أسماء المتغير الصحيحة :

كود:
Total 
Sum 
Average 
My_Variable 
username 
MaxTotal
 _Name
• وفيما يلى بعض الأمثلة لأسماء متغير غير صحيحة :



كود:
 %name 
?Total 
7Sum 
(Max 
12count

• الأسماء حساسة لحالة الحرف وبالتالى فإن المتغيرات بأسماء بحروف صغيرة تختلف عن المتغيرات بأسماء بحروف كبيرة . وبالتالى فأن المتغيرات التالية جميعها مختلفة :

كود:
 Total 
total 
ToTal 
TotaL 
TOTAL 
TOTal
الأسماء المحجوزة :
فى المترجم ميكروسى برو يتم حجز بعض الأسماء من أجل المترجم ، وهذه الأسماء لا يمكن أن تستخدم كأسماء للمتغيرات . الجدول أدناه يعطى قائمة بهذه الأسماء المحجوزة .




يمكن تقسيم المتغيرات إلى :
• متغيرات عمومية Global
• متغيرات محلية Local



المتغيرات العمومية Global : هى التى يتم إعلانها عند بداية البرنامج خارج أى دالة ، مجال هذه المتغيرات يكون عمومى global وهذا يعنى أنه يمكن الوصول إليها واستخدامها فى أى مكان بالبرنامج وفى داخل جميع الدوال . هذا النوع يستهلك الذاكرة نظرا لوجودة طوال البرنامج .
المتغيرات المحلية Local : هى التى يتم إعلانها داخل دالة ، ويكون مجالها محلى وهذا يعنى أنه يمكن الوصول إليها واستخدامها فقط داخل الدالة حيث تم إعلانها . هذا النوع يوفر من الذاكرة حيث يتم تحرير الذاكرة بعد نهاية الدالة .





التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 31-05-2017 الساعة 12:49 PM

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 20-05-2017, 04:17 PM المشاركة 12   
افتراضي


الثوابت Constants:
الثوابت مهمة جدا فى برمجة الميكروكونترولر PIC مع المترجم ميكروسى برو ، وخاصة إذا كانت ذاكرة البيانات RAM لها حجم محدود . يتم تخزين المتغيرات الثابتة فى ذاكرة البرنامج (الفلاش) ، وبالتالى توفير تحرير مساحة ذاكرة بيانات RAM المحدودة . الثوابت أو القيم المحددة تمثل قيم ثابتة لعدد أو لحرف .
فى المترجم ميكروسى برو ، يمكن أن تكون الثوابت : حروف ، أعداد صحيحة ، أعداد حقيقية ، سلاسل نصية ، ومتغيرات التعداد المرتبة .

الثوابت الحرفية Character Constants :
الثابت الحرفى يحتل بايت واحد من ذاكرة البرنامج . يتم إعلان (تعريف) الثابت عن طريق تحديد الحرف بين علامتى اقتباس فردية 'F'. فى المثال التالى ، يتم إعلان الثابت المسمى FirstName كحرف ثابت وتخصيص القيمة ‘D’ له بالصيغة التالية :

كود:
const FirstName;
FirstName = ‘D’;

ثوابت العدد الصحيح Integer Constants :
• ثوابت العدد الصحيح تحتل 2 بايت من ذاكرة البرنامج . هذه الثوابت يمكن تحديدها باستخدام الأساس العشرى ، أو السداسى عشر ، أو الثمانى ، أو الثنائى . نوع بيانات الثابت يتم اشتقاقه بواسطة المترجم تلقائيا ، استنادا على قيمة الثابت . على سبيل المثال ، الثابت بالقيمة (130) يتم حفظه كنوع حرفى بدون إشارة unsigned char ، والثابت بالقيمة 12 000 يتم حفظه كعدد صحيح بدون إشارة unsigned int ، والثابت بالقيمة -22 500)) يتم حفظه كعدد صحيح بإشارة signed int .
فى المثال التالى يتم تعريف كل من MIN و MAX كثوابت بالقيمة (0) و (200) على الترتيب :

كود:
const MIN = 0;
const MAX = 200;

• الأعداد السداسية عشر لها مدى من (0) إلى (9) ومن (A) إلى (F) . يتم تحديد الثوابت السداسية عشر عن طريق إدراج الحروف (0x) أو (0X) أمام العدد . فى المثال التالى ، يتم تعريف الثابت MAX ليكون له القيمة السداسية عشر (FFF) :

كود:
const MAX = 0xFFF;
• الأعداد الثمانية لها مدى من (0) إلى (7) . يتم تحديد الثوابت الثمانية عن طريق إدراج الرقم صفر (0) أمام العدد . فى المثال التالى ، يتم تعريف الثابت MAX ليكون له القيمة الثمانية (177) :

كود:
const MAX = 0177;
• الأعداد الثنائية يمكن أن تكون (0) أو (1) . يتم تحديد هذه الأعداد عن طريق إدراج الحروف (0b) أو (0B) أمام العدد . فى المثال التالى ، يتم تعريف الثابت MIN ليكون له القيمة الثنائية
(01 101 111) :

كود:
const MIN = 0b01101111;
ثوابت الأعداد الحقيقية Floating Point Constants :
ثوابت الأعداد الحقيقية هى ثوابت أعداد غير صحيحة لها جزء عشرى ، ونقطة (علامة عشرية) ، وجزء كسرى . بالإضافة إلى ذلك ، من أجل الأعداد الكبيرة جدا أو الأعداد الصغيرة جدا يمكن تحديد الجزء الأسى عن طريق إدراج الحرف ( e ) أو الحرف ( E ) مع قيمة الأس فى نهاية العدد . فى المثال التالى ، الثابت MIN يعطى القيمة 0.15E-2 والمتغير MAX يعطى القيمة 25.5E10 :

كود:
 const MIN = 0.15E-2;
const MAX = 25.5E10;
ثوابت السلسلة النصية String Constants :
تتكون ثوابت السلسة النصية من مجوعات من الحروف محاطة بعلامتى اقتباس مزدوجة ("..") . فيما يلى مثال لثابت سلسلة نصية :

كود:
"This is a string"
كما سوف نرى لاحقا أن السلاسل النصية تصنع من مصفوفات الحروف .


مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 20-05-2017, 11:22 PM المشاركة 13   
sun


السلام عليكم و رحمة الله و بركاته

استأذن الاخ مهندسنا فتح الله فى الاضافة هذه ,
بخصوص موضوع تسمية المتغيرات و الاعلان عنهم

http://www.qariya.info/vb/showthread.php?t=180767

و ما توفيقى الا بالله





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


الوصول إلى بتات السجلات :
هناك العديد من الحالات حيث قد نرغب فى الوصول إلى البتات الفردية لسجل 8 بت .
إذا أردنا الوصول إلى بت لسجل داخلى بالميكروكونترولر :
• إذا كنا نعرف اسم بت السجل المراد الوصول إليها ، عندئذ يمكننا ببساطة "كتابة اسم البت ويتم تحديدها set (جعلها بواحد) أو مسحها clear (تصفيرها) كما هو مطلوب . فيما يلى مثال على ذلك :

كود:
GIE_bit = 0; 		//Clear GIE bit
• يمكننا أيضا استخدام معرفات البتات B0, B1, . . . . B7 أو F0, F1, . . . . . F7 ، باعتبار أن (0) هى البت الأدنى قيمة LSB (أقصى اليمين) ، و (7) هى البت الأقصى قيمة MSB . فيما يلى مثال ، لتحديد البت bit 0 بالسجل INCON نستخدم الصيغة التالية :

كود:
INTCON.B0 = 1; 	//Set bit 0 of register INTCON
ولتحديد البت bit 3 يمكن كتابة مايلى :

كود:
INTCON.F3 = 1; 	//Set bit 3 of register INTCON

البت من نوع sbit :
المترجم ميكروسى برو به نوع من بيانات البتات يسمى sbit ، والذى يوفر "الوصول إلى البتات الخاصة بسجلات الوظائف الخاصة SFRs الداخلية للميكروكونترولر " . يمكنك الوصول إلى البتات الداخلية للسجلات كما فى الأمثلة التالية :

كود:
sbit LEDA at PORTA.B0; 		//LEDA is assigned to bit 0 of PORT A
sbit LEDB at PORTA.B7; 		//LEDB is assigned to bit 7 of PORT A
أو بدلا من ذلك ومكافىء له :

كود:
 sbit LEDA at RA0_bit; 		//LEDA is assigned to bit 0 of PORT A
sbit LEDB at RA7_bit; 		//LEDB is assigned to bit 7 of PORT A
البت من نوع bit :
المترجم ميكروسى برو يدعم أيضا "تعريف بت واحدة باستخدام النوع bit . فيما يلى مثال يوضح ذلك :

كود:
bit xf;


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


المصفوفات Arrays :

المصفوقات الرقمية :
أثناء تطوير (إنشاء) البرنامج ، عادة ما يكون هناك حاجة (ضرورة) لمعالجة العديد من "بنود البيانات من نفس النوع" . على سبيل المثال ، برنامج مصمم لقراءة أعمار 50 طالب فى حجرة صف ، فقد يتبادر للذهن من أول وهلة أننا بحاجة لاستخدام 50 متغير منفصل من نوع الأعداد الصحيحة . لكن ، مثل هذا النهج يجعل من الصعب معالجة البيانات ، حيث أنه علينا الوصول لكل عدد صحيح بشكل منفصل . علاوة على ذلك ، إذا زاد عدد الصف إلى 70 طالب ، على سبيل المثال ، عنئذ علينا إدخال 20 عدد صحيح أخرى و20 عبارة أخرى لمعالجة المدخلات الجديدة .
الحل لهذه المشكلة هو استخدام المصفوفة array كوسيلة سهلة لجمع البنود ذات الصلة تحت اسم متغير واحد . يتم إعلان (تعريف) المصفوفة عن طريق " تحديد اسمها ، ونوع وعدد عناصرها " التى عليها تخزينها . على سبيل المثال ، فيما يلى صيغة إعلان مصفوفة "أعداد صحيحة بدون إشارة" ، تسمى Average ، وبها خمس عناصر :

كود:
unsigned int Average[5];
يتم حفظ المصفوفة فى أماكن (مواقع) ذاكرة متتابعة (متسلسلة) كما هو موضح بالشكل التالى :



فى هذا المثال ، أول عنصر "رقمه المسلسل صفر " index 0 ، وآخر عنصر رقمه المسلسل (4) . يتم عنونة عناصر المصفوفة عن طريق "كتابة اسم المصفوفة متبوعا بقوسين مربعين ( […] ) بداخلهما الرقم المسلسل للعنصر المحدد" . على سبيل المثال ، لتحديد "العنصر الثالث" بالمصفوفة بالقيمة "120" يمكن كتابة مايلى :

كود:
Average[2] = 120;
بالمثل ، على سبيل المثال ، لنسخ محتويات العنصر الثالت من المصفوفة إلى متغير يسمى MyValue يمكننا كتابة ما يلى :

كود:
MyValue = Average[2];
كلما واجه المترجم تعريف لمصفوفة ، يتم تنفيذ عملية حسابية لتحديد متطلبات تخزين كل عنصر .
يمكن "تهيئة البداية" لمحتويات المصفوفة خلال إعلان المصفوفة عن طريق تحديد عناصر المصفوفة ، مفصولة بفواصل ، ومحاطة بأقواس مجعدة ( {..,..,..} ) . فيما يلى مثال لمصفوفة تسمى numbers ، بها 10 عناصر ، وفيها العنصر الأول numbers[0] = 0 ، والعنصر الثانى numbers[1] = وهلم جرا :


كود:
unsigned int numbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
يمكن إعلان نفس المصفوفة ، بدون تحديد "حجم المصفوفة" كما يلى . هنا ، "يحدد المترجم" حجم المصفوفة و "يخصص" عدد البايتات المطلوبة بالذاكرة :

كود:
unsigned int numbers[ ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
لاحظ أنه ليس من الضرورى "التهيئة الابتدائية" لجميع عناصر المصفوفة . على سبيل المثال ، يمكننا التهيئة الابتدائية للعناصر الثلاثة الأولى فقط من المصفوفة وترك باقى العناصر بدون تهيئة ابتدائية ليكون التعريف كما يلى :

كود:
int MyNumbers[10] = {0, 2, 5};
فى هذه الحالة تم التهيئة الابتدائية للعناصر [0] , [1] , [2] ، على الرغم من أنه سوف يتم حجز تخزين لعشر عناصر . هنا ، أى عناصر متبقية بدون تهيئة ابتدائية يتم تهيئتها ضمنيا بصفر .
ملحوظة :
من الخطأ أن يكون هناك عناصر أكثر من تعريف حجم المصفوفة . على سبيل المثال ، التعريف التالى سوف يولد خطأ للمترجم :

كود:
int numbers[2] = {0, 3, 7, 8, 9};
كلما تم تهيئة مصفوفة ، فإن المترجم ينسخ البيانات المحددة إلى عناصر المصفوفة . فإذا حدث وكانت المصفوفة داخل دالة ، عندئذ فى كل مرة يتم استدعاء الدالة ، سوف يتم إعادة تحميل عناصر المصفوفة ، مما يتسبب فى تأخير لا لزوم له . لهذا السبب ، يجب أن نستخدم الكلمة الخاصة static لإجبار عناصر المصفوفة ليتم تحميلها مرة واحدة فقط عند بداية البرنامج ، كما يلى :

كود:
static int numbers[2] = {0, 5};
المصفوفات ذات الأبعاد المتعددة :
فى المترجم ميكروسى برو ، يمكننا أيضا إعلان المصفوفة ذات الأبعاد المتعددة . تستخدم مثل هذه المصفوفات عادة فى العمليات الحسابية ، مثل حسابات المتجه والمصفوفات .
يتم إعلان المصفوفات ذات الأبعاد المتعددة عن طريق تحديد "نوع البيانات" ، و "اسم المصفوفة" و "حجم كل بعد بالمصفوفة" . فى المثال التالى ، يتم تعريف مصفوفة ذات بعدين باسم MyMatrix ، بها "ثلاثة صفوف" و "عمودين" :

كود:
int MyMatrix[3][2];
هذه المصفوفة لها البناء التالى : المصفوفة بها أجمالى 6 عناصر . العنصر الأول من المصفوفة هو
MyMatrix[0][0] ، والعنصر الأخير هو MyMatrix[2][1] ، كما فى الجدول التالى :



يمكن التهيئة الابتدائية للمصفوفة ذات الأبعاد المتعددة كما سبق ، عن طريق تحديد العناصر داخل أقواس مجعدة ومفصولة بفواصل ، كما فى المثال التالى :

كود:
 int numbers[2][3] = { {0, 2, 5}, {6, 8, 5} };
فى المثال السابق لدينا "2 صف" و "3 عامود" . قيمة كل عنصر يمكن بيانها كما يلى :



حجم "البعد الأول" اختيارى ويمكن أن يترك فارغا ، كما هو مبين فيما بعد للمثال أعلاه . يقوم المترجم بالملىء بالحجم الصحيح خلال الترجمة :

كود:
int numbers[ ][3] = { { 0, 2, 5}, {6, 8, 5} };
مصفوفات الحروف Character Arrays :
يتم إعلان مصفوفات الحروف بطريقة مشابهة لإعلان مصفوفات الأرقام ، حيث يتم فصل كل حرف بفاصلة واحاطتها داخل زوج من الأقواس المعرجة . فى المثال التالى ، مصفوفة الحروف MyName بها أربعة عناصر :

كود:
unsigned char MyName[4] = {‘J’, ‘O’, ‘H’, ‘N’};
كما سبق ، يمكننا ترك حجم المصفوفة فارغا كما يلى :

كود:
unsigned char MyName[ ] = {‘J’, ‘O’, ‘H’, ‘N’};
السلاسل النصية Strings :
السلاسل النصية هى مصفوفات حروف تنتهى بحرف NULL ( قيمته بالسداسى عشر 0x0 ويكتب "\0" ) . فى المثال أدناه ، MyName هى سلسلة نصية ( مصفوفة حروف) بها خمس عناصر ، بما فى ذلك حرف الانتهاء NULL :

كود:
unsigned char MyName[ ] = {‘J’, ‘O’, ‘H’, ‘N’, ‘\0’};
كما ترى من المثال أعلاه ، علينا الفصل بين كل حرف باستخدام الفاصلة وإنهاء السلسلة النصية بحرف NULL .
الطريقة البديلة والأسهل لإعلان نفس السلسة النصية تكون بالشكل التالى :

كود:
unsigned char MyName[ ] = “JOHN”;
هنا ، يتم إنهاء الحروف تلقائيا بحرف NULL وهذا الخيار الثانى هو الأكثر قابلية للقراءة ، وخاصة عندما يكون المطلوب هو إعلان سلسلة طويلة . بالإضافة إلى ذلك ، سوف لن يتم إنهاء السلسة النصية بشكل صحيح إذا نسينا إدراج حرف NULL .
مثال على مصفوفات السلاسل النصية Arrays of Strings :
هناك العديد من التطبيقات ، حيث أننا قد نرغب فى إنشاء مصفوفات من السلاسل النصية فى برامجنا . فى المثال التالى ، المصفوفة Days تخزن أيام الأسبوع . لاحظ أن تحديد حجم البعد الأول "اختيارى" .

كود:
char Days[ ][10] = { “Monday”,
“Tuesday”,
“Wednesday”,
“Thursday”,
“Friday”,
“Saturday”,
“Sunday”
};
فى المثال أعلاه ، يتم تعيين (تحديد) حجم البعد الأول تلقائيا عن طريق المترجم ليكون 7 عناصر . يتم تعيين حجم البعد الثانى ليكون 10 عناصر ، والذى هو حجم أطول كلمة فى المصفوفة . لاحظ أن كل كلمة فى المصفوفة هى سلسلة نصية ومن ثم يتم إنهاؤها بحرف NULL .
الشكل التالى يبين بناء هذه المصفوفة :




ثابت السلاسل النصية Constant Strings :
فى العديد من التطبيقات قد يكون هناك حاجة لإنشاء "سلاسل نصية طويلة ثابتة" فى ذاكرة البرنامج الفلاش بالميكروكونترولر . مثل هذه السلاسل يمكن إنشاؤها كثابت لسلسلة نصية لتوفير مساحة فى ذاكرة البيانات RAM .

كود:
 const unsigned char Text[ ] = “This is the main menu of the program”;
ملاحظات على الأحرف ومصفوفة الأحرف :
• تخزين الأحرف يختلف قليلا عن تخزين الأعداد . "الأحرف" characters فى لغة السى هى الحروف الهجائية المنفصلة letters ، والأعداد numbers والرموز الخاصة . يتم تخزين هذه الأحرف باستخدان بايت واحد أى 8 بت باستخدام "قيم" رموز أحرف كود أسكى . ومن ثم عندما نخزن الحرف ‘A’ فى متغير ، فإن لغة السى تخزن قيمة كود أسكى للحرف ‘A’ ، والتى هى العدد الصحيح 65 . لذلك يكون من الصحيح تماما ، فى لغة السى ، كتابة ما يلى :

كود:
 result = ‘A’ + 32;
النتيجة result سوف تكون الآن العدد العشرى 97 ، والتى هى قيمة كود أسكى للحرف ‘a’ .
فى لغة السى يتم تخزين الأحرف المنفصلة فى شكل مصفوفة بالشكل التالى :

كود:
char MenuOption[4] = {‘A’, ‘E’, ‘D’, ‘Q’};
لاحظ استخدام علامة التنصيص المفردة ‘A’ .
يتم تخزين مجموعة من الأحرف ، تسمى فى لغة السى "سلسلة" string ، بالشكل التالى :

كود:
char callsign[6] = “9w2gu”;
هذا يعنى ، إعلان المتغيرcallsign بطول 6 عناصر مع تخصيص القيمة الابتدائية 9w2gu لهذه العناصر .
لعلك لاحظت أن القيمة الابتدائية 9w2gu موكنة من خمس أحرف فقط فلماذا حددنا العناصر 6 عناصر ؟
المترجم يحتاج إلى أن يعرف متى يتم إنهاء السلسلة ، يقوم المترجم بعمل ذلك عن طريق إضافة الحرف ‘\0’ ، يسمى حرف NUL ، عند نهاية السلسلة .
أيضا يمكن إعلان السلسلة عن طريق بدايتها ونهايتها بعلامة التنصيص المزدوجة “..” ، فى هذه الحالة لا تحتاج السلسة للأقواس { } المستخدمة من أجل مصفوفة البعد الواحد . لذلك كن حذرا عند إعلان السلاسل .
لإعلان وتخصيص قيمة ابتدائية لمصفوفة متغيرات سلسلة أحرف نستخدم الشكل التالى :

كود:
char callsign[] = “9W2DTR”; // let compiler find the size     
char handle[7] = ”Dexter”; // max char handle is 6 and 1 for ’\0’ NUL
لعرض محتويات السلسلة ، فقط يتم استخدام اسم المتغير كما يلى :
Lcd_Out(1,1,callsign);

إذا تم الإعلان بالشكل التالى :

كود:
 char callsign[6];
callsign = “9w2dtr”
سوف يتم طباعة 9w2dt فقط ، أو طباعة نتيجة غير مرغوب فيها ، تذكر أنك تحتاج إلى تحديد حيز لحرف NUL أيضا . الشكل التالى يوضح مصفوفة الحروف .



مصفوفات الأحرف متعددة الأبعاد :

كود:
 char dow[7][4] = {“Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”, “Sun”};
فى هذه الصيغة يتم إنشاء مصفوفة لها 7 صفوف rows ، وبكل صف 4 أحرف ، كما فى الشكل التالى :



لعرض يوم الجمعة Friday ، سوف يجب علينا تحديد فقط عنصر الصف كما يلى :

كود:
lcd_out(1,1,dow[4]);
هذا سوف يتم عرض Fri على وحدة العرض LCD .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-05-2017, 09:16 PM المشاركة 16   
افتراضي العوامل والمترجم ميكروسى برو C Operators :


العوامل والمترجم ميكروسى برو C Operators :
العوامل operators هى رموز تطبق على المتغيرات للقيام ببعض العمليات . على سبيل المثال ، رمز الجمع “+” هو عامل ويتسبب فى تغيير قيمة المتغير . فى المترجم ميكروسى برو يمكن تصنيف العوامل على أنها "أحادية" unary أو "ثنائية" binary . العوامل الأحادية تتطلب متغير واحد فقط وتعمل على هذا المتغير ، على سبيل المثال تغيير إشارة المتغير . ومن الجهة الأخرى ، العوامل الثنائية تعمل على متغيرين ، على سبيل المثال جمع عددين .
العوامل فى الميكروسى برو يمكن أن تكون عوامل رياضية arithmetical ، عوامل منطقية logical ، عوامل مختصة بالبت bitwise ، عوامل العلاقات (المقارنة) relational ، عوامل التخصيص أو التعيين assignment . فى هذه الجزء سوف نتناول هذه العوامل بالتفصيل ونتعرف على كيفية استخدامها فى البرامج .

العوامل الرياضية Arithmetic Operators :
تستخدم العوامل الرياضية فى إجراء العمليات الحسابية . الجدول المبين أدناه يوضح قائمة بالعوامل الرياضية . جميعنا نعرف عوامل الجمع والطرح والضرب . باقى العوامل الرياضية تحتاج لبعض الشرح والفهم قبل استخدامها .



معامل "القسمة" “\” يقوم بقسمة عددين . إذا كانت الأعداد حقيقية (عدد حقيقى وكسر عشرى) ، عندئذ فإن استخدام رياضة الكسور العشرية floating point سوف تعطى نتائج صحيحة . ولكن ، إذا كان العدديت أعداد صحيحة integer ، فإن القسمة قد تعطى نتائج خاظئة ، كما هو مبين بالمثال التالى :

كود:
int x, y, z;
x = 3;
y = 4;
z = x/y; //The result is 0
• نتيجة قسمة عددين صحيحين تكون عدد صحيح ، ويتم التخلص من باقى القسمة ، كما فى المثال التالى :

كود:
7 / 4;          /* equals 1 */
7 * 3 / 4;      /* equals 5 */

/* but: */
7. * 3. / 4.;   /* equals 5.25 because we are working with floats */
عامل "الباقى" “%” يستخدم للحصول على الباقى بعد أن يتم قسمة عددين صحيحين . فى المثال التالى ، العددين 5 و 7 يتم قسمتهما باستخدام عامل الباقى والنتيجة تكون 2 وهى الباقى (فى حين أن خارج القسمة يكون 1 )

كود:
int x, y, z;
x = 5;
y = 7;
z = 7 % 5; //z = 2 (the remainder)
عامل التزايد التلقائى “++” يستخدم فى تزايد قيمة المتغير بواحد “1” ، بدون استخدام عامل التخصيص “=” ، كما فى المثال التالى :

كود:
int x;
x = 5;
x++; 	//x = 6
بالمثل ، عامل "التناقص" التلقائى “--" يستخدم فى تناقص قيمة المتغير بواحد “1” ، بدون استخدام عامل التخصيص ، كما فى المثال التالى :

كود:
int x;
x = 8;
x--; //x = 7
عامل التزايد وعامل التناقص يمكن أن يستخدما فى عمليات التخصيص . القيمة المخصصة للمتغير تتغير تبعا لمكان وضع الرمز “++” أو الرمز“--" ، إلى يسار أو إلى يمين المتغير . فى المثال التالى ، قيمة المتغير Sum الابتدائية هى “10” . يتم تخصيص المتغير Sum إلى المتغير Total ثم بعد ذلك يتم يتم تزايده تلقائيا . نتيجة لذلك ، عند النهاية ، المتغير Sum يحتوى على “11” والمتغير Total يحتوى على “10” (التخصيص أولا ثم التزايد (بعد)) .

كود:
int Sum, Total;
Sum = 10;
Total = Sum++; //Total = 10, Sum = 11
فى المثال التالى ، يتم تزايد المتغير Sum ثم بعد ذلك التخصيص إلى المتغير Total . نتيجة لذلك ، فى نهاية المطاف ، المتغير Sum يحتوى على “11” والمتغير Total يحتوى على “11” (التزايد أولا (قبل) ، ثم التخصيص) .

كود:
int Sum, Total;
Sum = 10;
Total = ++Sum; //Total = 11; Sum = 11
ونفس الشىء يحدث عندما نستخدم عامل التناقص ، كما فى المثال التالى :  
int Sum, Total;
Sum = 10;
Total = Sum--; //Total 10, Sum = 9
Total = --Sum; //Total = 8, Sum = 8
ملحوظة :
يمكن استخدام العوامل الرياضية من أجل التعامل مع الأحرف ، كما فى المثال التالى :

كود:
'A' + 32;         		 /* equals 'a' */
'G' - 'A' + 'a';  		 /* equals 'g' */




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