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

   

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



10- الوصول إلى بتات المتغير Accessing Bits of a Variable :
هناك العديد من الحالات حيث قد نرغب فى الوصول إلى البتات الفردية لمتغير 8 بت . إذا أردنا الوصول إلى بت لسجل داخلى بالميكروكونترولر :
· إذا كنا نعرف اسم السجل المراد الوصول إليه ، عندئذ يمكننا ببساطة "كتابة اسم البت ويتم تحديدها set (جعلها بواحد) أو إعادة تعينها reset (تصفيرها)كما هو مطلوب . فيما يلى مثال على ذلك :

كود:
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


11- البت من نوع 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
12- البت من نوع bit :
المترجم ميكروسى برو يدعم أيضا "تعريف بت واحدة ) باستخدام النوع bit . فيما يلى مثال يوضح ذلك :

كود:
bit xf;

13- المصفوفات Arrays :

13-1 المصفوقات الرقمية :

اعلانات

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


13- المصفوفات Arrays :

13-1 المصفوقات الرقمية :
أثناء تطوير (إنشاء) البرنامج ، عادة ما يكون هناك حاجة (ضرورة) لمعالجة العديد من "بنود البيانات من نفس النوع" . على سبيل المثال ، برنامج مصمم لقراءة أعمار 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} };
13-2 مصفوفات الحروف Character Arrays :

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-02-2014, 12:31 AM المشاركة 19   
افتراضي


13-2 مصفوفات الحروف Character Arrays :

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

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

كود:
unsigned char MyName[ ] = {‘J’, ‘O’, ‘H’, ‘N’};
13-3 السلاسل النصية Strings :

السلاسل النصية هى مصفوفات حروف تنتهى بحرف NULL ( قيمته بالداسى عشر 0x0 أو "\0" ) . فى المثال أدناه ، MyName هى سلسلة نصية ( مصفوفة حروف) بها خمس عناصر ، بما فى ذلك حرف الانتهاء NULL :

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

كود:
unsigned char MyName[ ] = “JOHN”;

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


13-4 ثابت السلاسل النصية Constant Strings :


Tico
:: عضو ذهبي ::
تاريخ التسجيل: May 2012
المشاركات: 1,423
نشاط [ Tico ]
قوة السمعة:
قديم 23-02-2014, 01:30 AM المشاركة 20   
افتراضي


استمر أخي العزيز أعانك الله ..


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-02-2014, 01:42 AM المشاركة 21   
افتراضي


13-4 ثابت السلاسل النصية Constant Strings :

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

كود:
const unsigned char Text[ ] = “This is the main menu of the program”;
13-5 مصفوفات السلاسل النصية Arrays of Strings :
هناك العديد من التطبيقات ، حيث أننا قد نرغب فى إنشاء مصفوفات من السلاسل النصية فى برامجنا . فى المثال التالى ، المصفوفة Days تخزن أيام الأسبوع . لاحظ أن تحديد حجم البعد الأول "اختيارى" .


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








14- المؤشرات Pointers :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 23-02-2014, 01:45 AM المشاركة 22   
افتراضي


استمر أخي العزيز أعانك الله ..

أخى الكريم شكرا جزيلا لك
مع تمنياتى بدوام التوفيق


الصورة الرمزية المظلوم
المظلوم
:: مهندس متميز ::
تاريخ التسجيل: Oct 2011
الدولة: BH
المشاركات: 636
نشاط [ المظلوم ]
قوة السمعة:
قديم 23-02-2014, 03:01 AM المشاركة 23   
افتراضي


متابعون أخي الكريم ولكن بصمت ،، حتى لا نزعج الأخوة أثناء متابعة الدروس


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


وفقك الله أخي العزيز


التعديل الأخير تم بواسطة : المظلوم بتاريخ 23-02-2014 الساعة 08:26 AM

الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 23-02-2014, 04:45 AM المشاركة 24   
افتراضي


أشكرك أخي من اجل تعبك

حبذا لو يوجد أشئلة تطبيقية على الأمثلة التي قدمتها حضرتك

وطبعا يكون هناك أسئلة نقوم نحن بحلّها وعرض النتائج للمناقشة

مع كل التوفيق



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