مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: الميكروكونترولر PIC والبرجة بلغة السى والمترجم مسكروسى برو :: الميكروكونترولر PIC والبرمجة بلغة السى والمترجم ميكروسى برو
صفحة 1 من اصل 1
مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
مقدمة :
يمكن برمجة الميكروكونترولر باستخدام أحد اللغات عالية المستوى . من اللغات عالية المستوى الشائعة الاستخدام : البيسك BASIC والبسكال PASCAL والسى "C" . ولغة السى ، على الأرجح هى اللغة الأكثر استخداما فى برمجة الميكروكونترولر بسبب سهولتها وقوتها . لقد استخدمت لغة السى خلال المدة من 10 إلى 15 سنة الماضية ومرت خلال نمو هائل . اليوم ، يبدو أنه لا نهاية للأمداد بمترجمات (كومبيلر) للغة السى ، ذات سعر منخفض وجودة عالية ، موجهة إلى أى نوع من الأجهزة القائمة على الكمبيوتر ، من الكمبيوتر الشخصى PC إلى أصغر شريحة ميكروكونترولر 8 طرف .
قبل إنشاء لغة السى ، كانت الميكروبروسسور والميكروكونترولر يجرى برمجة الشريحة المستهدفة باستخدام اللغة الأصلية (الأم) وهى "لغة الأسمبلى أو التجميع " . لغة الأسمبلى كانت لغة صعبة التعلم . أيضا ، كان من الصعب ويستغرق وقتا طويلا لإنشاء (تطوير) وصيانة التطبيقات المعقدة باستخدام لغة الأسمبلى . على سبيل المثال ، إنشاء تطبيق رياضى باستخدام حساب الأعداد الحقيقية (بعلامة العشرية) يستغرق أياما ، إن لم يكن أسابيع . كان الكود (التعليمات البرمجية) التى يتم إنشاؤها كبيرة بحيث كان من الصعب تعديله أوتصحيحه . بالإضافة إلى ذلك ، فإن الكود كان محددا من أجل الميكروبروسسور المستهدف . فإذا ما كان مطلوبا التحديث (الترقية) إلى ميكروبروسسور مخالف عندئذ ، فى معظم الحالات ، فإنه من الضرورى إعادة كتابة الكود بالكامل ، واستهلاك الكثير من الوقت والجهد .
فى المقابل ، لغة السى هى لغة محمولة (قابلة للنقل) . وبشكل عام ، البرنامج المكتوب بلغة السى من أجل ميكروبروسسور معين يمكن بسهولة تعديله واستخدامه من أجل ميكروبروسسور آخر . كما أنه يمكن إنشاء وصيانة البرامج المعقدة للغاية باستخدام لغة السى .
الهدف الرئيسى من هذا الموضوع هو تعريف القراء الجدد على لغة السى ، من خلال لمحة بسيطة على معالمها الأساسية ، فى محاولة منهم لبدء البرمجة فى وقت مبكر . يتم شرح لغة السى بطريقة التدريبات ، مع العديد من الأمثلة ، وبهذه الطريقة يمكن للقراء اكتساب الثقة والبدء فى عمل برامج (كود) على الفور . ولكن على القارىء أن يقدر أن لغة السى هى لغة غنية بالعديد من الميزات ، وأن هذا الموضوع ليس بكتاب عن لغة السى ، ولكن هنا سوف يتم تغطية الأجزاء ذات الصلة بالموضوع .
مقدمة :
يمكن برمجة الميكروكونترولر باستخدام أحد اللغات عالية المستوى . من اللغات عالية المستوى الشائعة الاستخدام : البيسك BASIC والبسكال PASCAL والسى "C" . ولغة السى ، على الأرجح هى اللغة الأكثر استخداما فى برمجة الميكروكونترولر بسبب سهولتها وقوتها . لقد استخدمت لغة السى خلال المدة من 10 إلى 15 سنة الماضية ومرت خلال نمو هائل . اليوم ، يبدو أنه لا نهاية للأمداد بمترجمات (كومبيلر) للغة السى ، ذات سعر منخفض وجودة عالية ، موجهة إلى أى نوع من الأجهزة القائمة على الكمبيوتر ، من الكمبيوتر الشخصى PC إلى أصغر شريحة ميكروكونترولر 8 طرف .
قبل إنشاء لغة السى ، كانت الميكروبروسسور والميكروكونترولر يجرى برمجة الشريحة المستهدفة باستخدام اللغة الأصلية (الأم) وهى "لغة الأسمبلى أو التجميع " . لغة الأسمبلى كانت لغة صعبة التعلم . أيضا ، كان من الصعب ويستغرق وقتا طويلا لإنشاء (تطوير) وصيانة التطبيقات المعقدة باستخدام لغة الأسمبلى . على سبيل المثال ، إنشاء تطبيق رياضى باستخدام حساب الأعداد الحقيقية (بعلامة العشرية) يستغرق أياما ، إن لم يكن أسابيع . كان الكود (التعليمات البرمجية) التى يتم إنشاؤها كبيرة بحيث كان من الصعب تعديله أوتصحيحه . بالإضافة إلى ذلك ، فإن الكود كان محددا من أجل الميكروبروسسور المستهدف . فإذا ما كان مطلوبا التحديث (الترقية) إلى ميكروبروسسور مخالف عندئذ ، فى معظم الحالات ، فإنه من الضرورى إعادة كتابة الكود بالكامل ، واستهلاك الكثير من الوقت والجهد .
فى المقابل ، لغة السى هى لغة محمولة (قابلة للنقل) . وبشكل عام ، البرنامج المكتوب بلغة السى من أجل ميكروبروسسور معين يمكن بسهولة تعديله واستخدامه من أجل ميكروبروسسور آخر . كما أنه يمكن إنشاء وصيانة البرامج المعقدة للغاية باستخدام لغة السى .
الهدف الرئيسى من هذا الموضوع هو تعريف القراء الجدد على لغة السى ، من خلال لمحة بسيطة على معالمها الأساسية ، فى محاولة منهم لبدء البرمجة فى وقت مبكر . يتم شرح لغة السى بطريقة التدريبات ، مع العديد من الأمثلة ، وبهذه الطريقة يمكن للقراء اكتساب الثقة والبدء فى عمل برامج (كود) على الفور . ولكن على القارىء أن يقدر أن لغة السى هى لغة غنية بالعديد من الميزات ، وأن هذا الموضوع ليس بكتاب عن لغة السى ، ولكن هنا سوف يتم تغطية الأجزاء ذات الصلة بالموضوع .
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
لغة السى للميكروكونترولر PIC مع المترجم ميكروسى برو :
اكتسب المترجم (الكومبيلر) mikroC Pro شعبية كبيرة فى السنوات الأخيرة ، وذلك بسبب انخفاض سعرة ، وسهولة استخدامه والدعم الكامل للوح تطوير مختلفة . لقد تم تطوير هذا المترجم بمعرفة MikroElektronika ( الموقع www.mikroe.com ) وهو واحد من أسهل المترجمات للتعلم مع موارد غنية ، مثل عدد كبير من مكتبات الدول المتضمنة (المدمجة) فى بنائه . يوفر المترجم "بيئة تطوير متكاملة" IDE مع "محرر مدمج" ، و"مترجم" ، و"محاكى" و"مصحح بالدائرة ". يمكن للمستخدمين كتابة البرنامج باستخدام المحرر المدمج ، ثم ترجمته ، ومحاكلة البرنامج بنقر بضعة أزرار . يمكن تحميل البرنامج النهائى إلى الميكروكونترولر المستهدف عن طريق النقر على زر . بالإضافة إلى المحاكاة ، يمكن للمستخدمين تنفيذ التصحيح فى "الوقت الحقيقى" للتطبيقات باستخدام المصحح المدمج . موقع MikroElektronika يوفر نسخة تجريبية من المترجم محدودة لبرنامج بسعة 2 كيلوبايت من أجل اتعليم الخصائص الأساسية للمترجم .
روابط تحميل النسخة التجريبية :
http://www.mikroe.com/mikroc/pic/
http://mediafire.com/?bz8fav2dwyee5o4
برنامجك الأول لبرمجة الميكروكونترولر PIC مع المترجم ميكروسى برو :
اكتسب المترجم (الكومبيلر) mikroC Pro شعبية كبيرة فى السنوات الأخيرة ، وذلك بسبب انخفاض سعرة ، وسهولة استخدامه والدعم الكامل للوح تطوير مختلفة . لقد تم تطوير هذا المترجم بمعرفة MikroElektronika ( الموقع www.mikroe.com ) وهو واحد من أسهل المترجمات للتعلم مع موارد غنية ، مثل عدد كبير من مكتبات الدول المتضمنة (المدمجة) فى بنائه . يوفر المترجم "بيئة تطوير متكاملة" IDE مع "محرر مدمج" ، و"مترجم" ، و"محاكى" و"مصحح بالدائرة ". يمكن للمستخدمين كتابة البرنامج باستخدام المحرر المدمج ، ثم ترجمته ، ومحاكلة البرنامج بنقر بضعة أزرار . يمكن تحميل البرنامج النهائى إلى الميكروكونترولر المستهدف عن طريق النقر على زر . بالإضافة إلى المحاكاة ، يمكن للمستخدمين تنفيذ التصحيح فى "الوقت الحقيقى" للتطبيقات باستخدام المصحح المدمج . موقع MikroElektronika يوفر نسخة تجريبية من المترجم محدودة لبرنامج بسعة 2 كيلوبايت من أجل اتعليم الخصائص الأساسية للمترجم .
روابط تحميل النسخة التجريبية :
http://www.mikroe.com/mikroc/pic/
http://mediafire.com/?bz8fav2dwyee5o4
برنامجك الأول لبرمجة الميكروكونترولر PIC مع المترجم ميكروسى برو :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
برنامجك الأول لبرمجة الميكروكونترولر PIC مع المترجم ميكروسى برو :
الشكل أدناه يبين برنامج بسيط جدا لبرمجة الميكروكونترولر PIC مع المترجم ميكروسى برو .
هذا البرنامج يقوم بتوصيل on لثمانية ليدات متصلة بالمنفذ port B للميكروكونترولر PIC . ثم بعد تأخير 500 ملى ثانية يتم فصل off لليدات الثمانية .
لا تقلق إذا كنت لا تفهم عمل هذا البرنامج فى هذه المرحلة ، حيث أن كل شىء سوف يكون واضحا كلما تقدمنا. فيما يلى شرح لتفاصيل بعض العناصر المستخدمة فى البرنامج :
1- التعليقات Comments
تستخدم التعليقات فى البرامج لتوضيح عمل البرنامج . على لرغم من أن استخدام التعليقات هو أمر اختيارى ، إلا أنه من المستحسن بشدة أن تستخدم العديد من التعليقات قدر الممكن فى برامجك ، حيث أن التعليقات تجعل برامجك قابلة للقراءة وسهلة الصيانة . تخيل كيف أنه سيكون من الصعب كتابة برنامج معقد بدون أى تعليقات ، ثم محاولة تعديله بعد عدة أشهر . يتم تجاهل جميع سطور التعليقات بواسطة المترجم .
فى المترجم ميكروسى برو ، يمكن أن تكون التعليقات من نوعين : "التعليقات الطويلة" ، و"التعليقات القصيرة" .
التعليقات الطويلة :
تبدأ التعليقات الطويلة بزوج الحروف ( /* ) وتنتهى بزوج الحروف ( */ ) . عادة تستخدم التعليقات الطويلة فى بداية البرنامج لوصف تفاصيل البرنامج ، مثل ما يقوم به البرنامج ، وأنى نوع من الهاردوير يستخدم ، ومن هو المؤلف ، وتاريخ إنشاء البرنامج ، واسم ملف البرنامج ، وتاريخ الإصدار ، وهلم جرا (كما هو مبين بالشكل أدناه) . كما تستخدم التعليقات الطويلة أيضا بداخل البرنامج لوصف عمل جزء من البرنامج ، على سبيل المثال بارامترات (أدلة ، معلمات) الدوال ، والخوارزمية (إسلوب البرمجة) المستخدمة وهلم جرا .
التعليقات القصيرة :
تبدأ التعليقات القصيرة بزوج الحروف ( // ) . لا يتم إنهاء التعليقات القصيرة بحروف ، ويمكن استخدامها فى سطر واحد فقط ، بدءا من أى مكان بالسطر وحتى نهايته فقط . عموما ، تستخدم التعليقات القصيرة بعد عبارات البرنامج لتصف ما تقوم به العبارة ( كما هو مبين بالشكل أدناه) .
2- بداية ونهاية البرنامج :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
2- بداية ونهاية البرنامج :
فى الميكروسى برو :
· "يبدأ البرنامج" مع الكلمات الأساسية (المخصوصة – المحجوزة) :
· بعدها ، يتم استخدام قوس الفتح المجعد ( { ) للإشارة (لبيان) إلى بداية "جسم البرنامج" .
· يتم إنهاء البرنامج بقوس الغلق المجعد ( } ) . وبالتالى يكون هيكل بناء البرنامج بالصيغة التالية :
· يتكون جسم البرنامج من عبارات statements . كل عبارة برنامج يجب أن تنتهى بحرف الفاصلة المنقوطة ( ; ) للإشارة إلى نهاية العبارة ، وإلا يتم توليد خطأ بواسطة المترجم .
أمثلة :
3- المسافات البيضاء :
فى الميكروسى برو :
· "يبدأ البرنامج" مع الكلمات الأساسية (المخصوصة – المحجوزة) :
- الكود:
void main()
· بعدها ، يتم استخدام قوس الفتح المجعد ( { ) للإشارة (لبيان) إلى بداية "جسم البرنامج" .
· يتم إنهاء البرنامج بقوس الغلق المجعد ( } ) . وبالتالى يكون هيكل بناء البرنامج بالصيغة التالية :
- الكود:
void main()
{
Program body
}
· يتكون جسم البرنامج من عبارات statements . كل عبارة برنامج يجب أن تنتهى بحرف الفاصلة المنقوطة ( ; ) للإشارة إلى نهاية العبارة ، وإلا يتم توليد خطأ بواسطة المترجم .
أمثلة :
- الكود:
k = 50; //correct
i = k+5; //correct
k = 50 //error
3- المسافات البيضاء :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
4- المسافات (المساحات) البيضاء :
تتكون المسافات (المساحات) البيضاء فى البرنامج من "المسافات" spaces ، و "التبويبات" tabs ، ،وحروف "السطر الجديد" newline ، و"الفراغات" blanks . يتم تجاهل هذه لحروف من قبل المترجم . وبالتالى فإن السطور التالية متطابقة :
فى بعض التطبيقات ، قد يكون لدينا سلسلة نصية طويلة والتى قد نرغب فى تمديدها على عدة أسطر . يتم استخدام الشرطة المائلة للخلف ( \ ) لربط السلاسل النصية الممتدة على عدة أسطر . على سبيل المثال :
تترجم على أنها :
5- أسماء المتغيرات :
تتكون المسافات (المساحات) البيضاء فى البرنامج من "المسافات" 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"
5- أسماء المتغيرات :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
4- أسماء المتغير:
• فى المترجم ميكروسى برو ، أسماء المتغير يمكن أن تبدأ بحرف أو الشرطة السفلية ( _ ) .
• أسماء المتغير يمكن أن تتضمن أى حرف من ( 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
TOTal5- الأسماء المحجوزة :
فى المترجم ميكروسى برو يتم حجز بعض الأسماء من أجل المترجم ، وهذه الأسماء لا يمكن أن تستخدم كأسماء للمتغيرات . الجدول أدناه يعطى قائمة بهذه الأسماء المحجوزة . على سبيل المثال ، أسماء المتغيرات التالية غير قانونية :
for
while
char
int
return
signed
const
6- أنواع المتغيرات :
• فى المترجم ميكروسى برو ، أسماء المتغير يمكن أن تبدأ بحرف أو الشرطة السفلية ( _ ) .
• أسماء المتغير يمكن أن تتضمن أى حرف من ( 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
فى المترجم ميكروسى برو يتم حجز بعض الأسماء من أجل المترجم ، وهذه الأسماء لا يمكن أن تستخدم كأسماء للمتغيرات . الجدول أدناه يعطى قائمة بهذه الأسماء المحجوزة . على سبيل المثال ، أسماء المتغيرات التالية غير قانونية :
for
while
char
int
return
signed
const
6- أنواع المتغيرات :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
6- أنواع المتغير:
المترجم ميكروسى برو هو مترجم لغة مكتوبة بدقة ، وهذا يعنى أن كل كائن ، أو تعبير ، أو دالة يجب أن يكون له" نوع معرف" قبل أن يتم ترجمة البرنامج . مترجم الميكروسى برو يدعم العديد من أنواع البيانات "المعرفة مسبقا" و "المعرفة بمعرفة المستخدم" ، بما فى ذلك "البايتات بإشارة أو بدون إشارة" ، و"الأعداد الصحيحة بالاحجام المختلفة" ، و"الأعداد الحقيقية بمختلف الدقة" ، و"المصفوفات" ، و"الهياكل أو الأبنية" ، وهلم جرا . نوع المتغير يعرف "كم عدد مساحات الذاكرة" التى يجب أن تخصص (تعين) من أجل المتغير بالذاكرة ، وكيف يتم "التعامل مع بتات" المتغير .
يمكن تقسيم أنواع المتغير إلى مجموعتين : أنواع "أساسية" ، وأنواع "مشتقة" .
الأنواع الأساسية تمثل الأنواع التى لا يمكن تقسيمها إلى أجزاء أصغر . هذه الأنواع هى : void (خالى) ، وchar (حرف) ، و int (عدد صحيح) و float (عدد حقيقيى أى يحتوى على علامة عشرية متحركة) ، و double ( عدد حقيقى مضاعف ) ، جنبا إلى جنب مع التهيئة المختلفة : short (قصير) و long (طويل) و signed (بإشارة) و unsigned (بدون إشارة) .
الأنواع المشتقة معروفة أيضا بالأنواع المشيدة (المبنية) وهى تتضمن : "المؤشرات" ، و"الأبنية" ، و"المصفوفات" ، و"الاتحادات" .
مترجم الميكروسى برو يدعم الأنواع الأساسية للمتغير المبينة بالجدول التالى :
فيما يلى أمثلة لهذه الأنواع من المتغير :
· المتغيرات :
هى متغيرات "بدون إشارة" 8 بت ، تحتل "واحد بايت" فقط من الذاكرة ولها قيم فى المدى من (0) إلى (255) . فى المثال التالى ، المتغير Sum يخصص (يعين) له القيمة (255) :
· والمتغيرات :
هى متغيرات "بدون إشارة" 16 بت ، تحتل "2 بايت" من الذاكرة ولها قيم فى المدى من (0) إلى (65 535) . فى المثال التالى ، المتغير Total يخصص له القيمة (64 500) :
· والمتغيرات :
هى متغيرات بدون إشارة 32 بت ، تحتل 4 بايت من الذاكرة ولها قيم فى المدى من (0) إلى
4 294 967 295 . فى المثال التالى ، المتغير Sum يخصص له القيمة 4 200 000 000 :
· والمتغيرات :
هى متغيرات "بإشارة" 8 بت ، نحتل واحد بايت فقك من الذاكرة ولها قيم فى المدة من (-128) إلى (+127) . فى المثال التالى المتغير Total يخصص له القيمة (-240) :
· والمتغيرات :
هى متغيرات بإشارة 16 بت ، تحتل 2 بايت من الذاكرة ولها قيم فى المدى من (-32 768) إلى (+32 767) . فى المثال التالى ، المتغير Sum يخصص له القيمة (-31 500) :
· والمتغيرات :
هى متغيرات بإشار 32 بت ، تحتل 4 بايت من الذاكرة ولها قيم فى المدى من (-2 147 483 648) إلى
(+2 147 483 647) . فى المثال التالى ، المتغير Sum يخصص له القيمة (2 050 480 000) :
· أنواع بيانات العدد الحقيقى هى : float, double , long double . فى المثال التالى ، المتغير Volume يخصص له القيمة (23.45) :
7- الثوابت :
المترجم ميكروسى برو هو مترجم لغة مكتوبة بدقة ، وهذا يعنى أن كل كائن ، أو تعبير ، أو دالة يجب أن يكون له" نوع معرف" قبل أن يتم ترجمة البرنامج . مترجم الميكروسى برو يدعم العديد من أنواع البيانات "المعرفة مسبقا" و "المعرفة بمعرفة المستخدم" ، بما فى ذلك "البايتات بإشارة أو بدون إشارة" ، و"الأعداد الصحيحة بالاحجام المختلفة" ، و"الأعداد الحقيقية بمختلف الدقة" ، و"المصفوفات" ، و"الهياكل أو الأبنية" ، وهلم جرا . نوع المتغير يعرف "كم عدد مساحات الذاكرة" التى يجب أن تخصص (تعين) من أجل المتغير بالذاكرة ، وكيف يتم "التعامل مع بتات" المتغير .
يمكن تقسيم أنواع المتغير إلى مجموعتين : أنواع "أساسية" ، وأنواع "مشتقة" .
الأنواع الأساسية تمثل الأنواع التى لا يمكن تقسيمها إلى أجزاء أصغر . هذه الأنواع هى : void (خالى) ، وchar (حرف) ، و int (عدد صحيح) و float (عدد حقيقيى أى يحتوى على علامة عشرية متحركة) ، و double ( عدد حقيقى مضاعف ) ، جنبا إلى جنب مع التهيئة المختلفة : short (قصير) و long (طويل) و signed (بإشارة) و unsigned (بدون إشارة) .
الأنواع المشتقة معروفة أيضا بالأنواع المشيدة (المبنية) وهى تتضمن : "المؤشرات" ، و"الأبنية" ، و"المصفوفات" ، و"الاتحادات" .
مترجم الميكروسى برو يدعم الأنواع الأساسية للمتغير المبينة بالجدول التالى :
فيما يلى أمثلة لهذه الأنواع من المتغير :
· المتغيرات :
- الكود:
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 يخصص له القيمة (-240) :
- الكود:
signed char Total = -240;
· والمتغيرات :
- الكود:
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;
7- الثوابت :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
7- الثوابت :
الثوابت مهمة جدا فى برمجة الميكروكونترولر PIC مع المترجم ميكروسى برو ، وخاصة إذا كانت ذاكرة البيانات RAM لها حجم محدود . يتم تخزين المتغيرات الثابتة فى ذاكرة البرنامج (الفلاش) ، وبالتالى تحرير مساحة ذاكرة بيانات RAM قيمة .
فى المترجم ميكروسى برو ، يمكن أن تكون الثوابت : حروف ، أعداد صحيحة ، أعداد حقيقية ، سلاسل نصية ، ومتغيرات التعداد المرتبة .
7-1 الثوابت الحرفية Character Constants :
الثابت الحرفى يحتل بايت واحد من ذاكرة البرنامج . يتم إعلان (تعريف) الثابت عن طريق تحديد الحرف بين علامتى اقتباس فردية 'F'. فى المثال التالى ، يتم إعلان المتغير FirstName كحرف ثابت وتخصيص القيمة ‘D’ له :
الثوابت مهمة جدا فى برمجة الميكروكونترولر PIC مع المترجم ميكروسى برو ، وخاصة إذا كانت ذاكرة البيانات RAM لها حجم محدود . يتم تخزين المتغيرات الثابتة فى ذاكرة البرنامج (الفلاش) ، وبالتالى تحرير مساحة ذاكرة بيانات RAM قيمة .
فى المترجم ميكروسى برو ، يمكن أن تكون الثوابت : حروف ، أعداد صحيحة ، أعداد حقيقية ، سلاسل نصية ، ومتغيرات التعداد المرتبة .
7-1 الثوابت الحرفية Character Constants :
الثابت الحرفى يحتل بايت واحد من ذاكرة البرنامج . يتم إعلان (تعريف) الثابت عن طريق تحديد الحرف بين علامتى اقتباس فردية 'F'. فى المثال التالى ، يتم إعلان المتغير FirstName كحرف ثابت وتخصيص القيمة ‘D’ له :
- الكود:
const FirstName;
FirstName = ‘D’;
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
7-2 ثوابت العدد الصحيح Integer Constants :
· ثوابت العدد الصحيح تحتل 2 بايت من ذاكرة البرنامج . هذه الثوابت يمكن تحديدها باستخدام الأساس العشرى ، أو السداسى عشر ، أو الثمانى ، أو الثنائى . نوع بيانات الثابت يتم اشتقاقه بواسطة المترجم تلقائيا ، استنادا على قيمة الثابت . على سبيل المثال ، الثابت بالقيمة (130) يتم حفظه كنوع حرفى بدون إشارة unsigned char ، والثابت بالقيمة 12 000 يتم حفظه كعدد صحيح بدون إشارة unsigned int ، والثابت بالقيمة -22 500)) يتم حفظه كعدد صحيح بإشارة signed int .
فى المثال التالى يتم تعريف كل من MIN و MAX كثوابت بالقيمة (0) و (200) على الترتيب :
· الأعداد السداسية عشر لها مدى من (0) إلى (9) ومن (A) إلى (F) . يتم تحديد الثوابت السداسية عشر عن طريق إدراج الحروف (0x) أو (0X) أمام العدد . فى المثال التالى ، يتم تعريف الثابت MAX ليكون له القيمة السداسية عشر (FFF) :
· الأعداد الثمانية لها مدى من (0) إلى (7) . يتم تحديد الثوابت الثمانية عن طريق إدراج الرقم صفر (0) أمام العدد . فى المثال التالى ، يتم تعريف الثابت MAX ليكون له القيمة الثمانية (177) :
· الأعداد الثنائية يمكن أن تكون (0) أو (1) . يتم تحديد هذه الأعداد عن طريق إدراج الحروف (0b) أو (0B) أمام العدد . فى المثال التالى ، يتم تعريف الثابت MIN ليكون له القيمة الثنائية 01101111
· ثوابت العدد الصحيح تحتل 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 ليكون له القيمة الثنائية 01101111
- الكود:
const MIN = 0b01101111;
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
7-3 ثوابت الأعداد الحقيقية Floating Point Constants :
ثوابت الأعداد الحقيقية هى ثوابت أعداد غير صحيحة لها جزء عشرى ، ونقطة (علامة عشرية) ، وجزء كسرى . بالإضافة إلى ذلك ، من أجل الأعداد الكبيرة جدا أو الأعداد الصغيرة جدا يمكن تحديد الجزء الأسى عن طريق إدراج الحرف ( e ) أو الحرف ( E ) مع قيمة الأس فى نهاية العدد . فى المثال التالى ، المتغير MIN يعطى القيمة 0.15E-2 والمتغير MAX يعطى القيمة 25.5E10 :
ثوابت الأعداد الحقيقية هى ثوابت أعداد غير صحيحة لها جزء عشرى ، ونقطة (علامة عشرية) ، وجزء كسرى . بالإضافة إلى ذلك ، من أجل الأعداد الكبيرة جدا أو الأعداد الصغيرة جدا يمكن تحديد الجزء الأسى عن طريق إدراج الحرف ( e ) أو الحرف ( E ) مع قيمة الأس فى نهاية العدد . فى المثال التالى ، المتغير MIN يعطى القيمة 0.15E-2 والمتغير MAX يعطى القيمة 25.5E10 :
- الكود:
const MIN = 0.15E-2;
const MAX = 25.5E10;
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
7-4 ثوابت السلسلة النصية String Constants :
تتكون ثوابت السلسة النصية من مجوعات من الحروف محاطة بعلامتى اقتباس مزدوجة ("..") . فيما يلى مثال لثابت سلسلة نصية :
- الكود:
"This is a string"
كما سوف نرى لاحقا أن السلاسل النصية تصنع من مصفوفات الحروف .
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
7-5 ثوابت التعداد المرتب Enumerated Constants :
يستخدم نوع بيانات التعداد من أجل تمثيل "ملخص لمجموعة متقطعة من القيم مع الأسماء الرمزية المناسبة". التعداد المرتب يجعل البرنامج أسهل فى المتابعة .
يتم إعلان (تعريف) المتغيرات من النوع enum بنفس طريقة المتغيرات الأخرى . على سبيل المثال ، فيما يلى إعلان لنوع التعداد المرتب :
- الكود:
enum colours
{
Black,
Red,
Green,
Blue,
Cyan
} clr;
فى هذا المثال : Black=0, Red=1, Green=2 وهلم جرا . المعرف (clr) يمكن أن يأخذ أى قيمة من الألوان المحددة ، أو أى قيمة لعدد صحيح :
- الكود:
clr = Red; //clr = 1
or
clr = 1; //same as above
ت
رتيب الثوابت فى نوع التعداد المرتب يمكن أن يكون مصرح به بإعادة الترتيب باستخدام قيم محددة . أى أسماء بدون تهيئة سوف تتزايد بواحد بالنسبة للقيمة السابقة ، كما فى المثال التالى :
- الكود:
enum colours
{
Black, //value 0
Red, //value 1
Green = 4, //value 4
Blue, //value 5
Cyan //value 6
} clr;
فيما يلى مثال آخر :
- الكود:
enum Weekdays
{
MON = 1; //value 1
TUE, //value 2
WED, //value 3
THU, //value 4
FRI, //value 5
SAT, //value 6
SUN //value 7
}
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
8- تسلسلات (تتابعات) الهروب Escape Sequences :
بعض حروف التحكم فى جدول كود أسكى تكون "غير قابلة للطباعة" وتعرف بتسلسلات الهروب . على سبيل المثال ، الحروف (\n) تمثل حروف "السطر الجديد" ، والتى تتسبب فى انتقال (قفز) المؤشر إلى "السطر التالى" .
الجدول أدناه قائمة بالحروف شائعة الاستخدام فى تسلسلات الهروب . لاحظ أن حروف تسلسلات الهروب يمكن الحصول عليها أيضا عن طريق "تحديد قيمتها" . على سبيل المثال ، العدد السداسى عشر (0x0A) يمكن أن يستخدم لتحديد السطر الجديد .
9- المتغيرات المتطايرة (المتبخرة) Volatile Variables :
الإعلان (التعريف) المتطاير يكون له أهمية خاصة فى التطبيقات التى تستند على "المقاطعة" . التعريف volatile يعنى أن المتغير قد تتغير قيمته أثناء وقت التشغيل ، مستقلا عن البرنامج الرئيسى . استخدام المعدل volatile يشير إلى أن المتغير يمكن أن يتم تغييره بواسطة روتين يعمل فى الخلفية ، مثل روتين المقاطعة . إعلان كائن ليكون volatile يحذر المترجم بأن لا يصنع افتراضات بشأن قيمة الكائن أثناء تقييم التعبيرات التى يحدث فيها ، لأن القيمة يمكن أن تتغير فى أى لحظة . فى المثال التالى ، يتم إعلان المتغير Cnt ليكون " حرفى char بدون إشارة unsigned متطاير volatile " :
- الكود:
volatile unsigned char Cnt;
10- الوصول إلى بتات المتغير Accessing Bits of a Variable :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
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 المصفوقات الرقمية :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
13- المصفوفات Arrays :
13-1 المصفوقات الرقمية :
أثناء تطوير (إنشاء) البرنامج ، عادة ما يكون هناك حاجة (ضرورة) لمعالجة العديد من "بنود البيانات من نفس النوع" . على سبيل المثال ، برنامج مصمم لقراءة أعمار 50 طالب فى حجرة صف ، فقد يتبادر للذهن من أول وهلة أننا بحاجة لاستخدام 50 متغير منفصل من نوع الأعداد الصحيحة . لكن ، مثل هذا النهج يجعل من الصعب معالجة البيانات ، حيث أنه علينا الوصول لكل عدد صحيح بشكل منفصل . علاوة على ذلك ، إذا زاد عدد الصف إلى 70 طالب ، على سبيل المثال ، عنئذ علينا إدخال 20 عدد صحيح أخرى و20 عبارة أخرى لمعالجة المدخلات الجديدة .
الحل لهذه المشكلة هو استخدام المصفوفة array كوسيلة سهلة لجمع البنود ذات الصلة تحت اسم متغير واحد . يتم إعلان (تعريف) المصفوفة عن طريق " تحديد اسمها ، ونوع وعدد عناصرها " التى عليها تخزينها . على سبيل المثال ، فيما يلى مصفوفة "أعداد صحيحة بدون إشارة" ، تسمى Average ، وبها خمس عناصر :
يتم حفظ المصفوفة فى أماكن (مواقع) ذاكرة متتابعة (متسلسلة) كما هو موضح بالشكل التالى :
فى هذا المثال ، أول عنصر "رقمه المسلسل صفر " index 0 ، وآخر عنصر رقمه المسلسل (4) . يتم عنونة عناصر المصفوفة عن طريق "كتابة اسم المصفوفة متبوعا بقوسين مربعين ( […] ) بداخلهما الرقم المسلسل للعنصر المحدد" . على سبيل المثال ، لتحديد "العنصر الثالث" بالمصفوفة بالقيمة "120" يمكن كتابة مايلى :
بالمثل ، على سبيل المثال ، لنسخ محتويات العنصر الثالت من المصفوفة إلى متغير يسمى MyValue يمكننا كتابة ما يلى :
كلما واجه المترجم تعريف لمصفوفة ، يتم تنفيذ عملية حسابية لتحديد متطلبات تخزين كل عنصر . يمكن "تهيئة البداية" لمحتويات المصفوفة خلال إعلان المصفوفة عن طريق تحديد عناصر المصفوفة ، مفصولة بفواصل ، ومحاطة بأقواس مجعدة ( {..,..,..} ) . فيما يلى مثال لمصفوفة تسمى numbers ، بها 10 عناصر ، وفيها العنصر الأول numbers[0] = 0 ، والعنصر الثانى numbers[1] = وهلم جرا :
يمكن إعلان نفس المصفوفة ، بدون تحديد "حجم المصفوفة" كما يلى . هنا ، "يحدد المترجم" حجم المصفوفة و "يخصص" عدد البايتات المطلوبة بالذاكرة :
لاحظ أنه ليس من الضرورى "التهيئة الابتدائية" لجميع عناصر المصفوفة . على سبيل المثال ، يمكننا التهيئة الابتدائية للعناصر الثلاثة الأولى فقط من المصفوفة وترك باقى العناصر بدون تهيئة ابتدائية ليكون التعريف كما يلى :
فى هذه الحالة تم التهيئة الابتدائية للعناصر [0] , [1] , [2] ، على الرغم من أنه سوف يتم حجز تخزين لعشر عناصر . هنا ، أى عناصر متبقية بدون تهيئة ابتدائية يتم تهيئتها ضمنيا بصفر .
ملحوظة :
من الخطأ أن يكون هناك عناصر أكثر من تعريف حجم المصفوفة . على سبيل المثال ، التعريف التالى سوف يولد خطأ للمترجم :
كلما تم تهيئة مصفوفة ، فإن المترجم ينسخ البيانات المحددة إلى عناصر المصفوفة . فإذا حدث وكانت المصفوفة داخل دالة ، عندئذ فى كل مرة يتم استدعاء الدالة ، سوف يتم إعادة تحميل عناصر المصفوفة ، مما يتسبب فى تأخير لا لزوم له . لهذا السبب ، يجب أن يتم الكلمة الخاصة static لإجبار عناصر المصفوفة ليتم تحميلها مرة واحدة فقط عند بداية البرنامج ، كما يلى :
المصفوفات ذات الأبعاد المتعددة :
فى المترجم ميكروسى برو ، يمكننا أيضا إعلان المصفوفة ذات الأبعاد المتعددة . تستخدم مثل هذه المصفوفات عادة فى العمليات الحسابية ، مثل حسابات المتجه والمصفوفات .
يتم إعلان المصفوفات ذات الأبعاد المتعددة عن طريق تحديد "نوع البيانات" ، و "اسم المصفوفة" و "حجم كل بعد بالمصفوفة" . فى المثال التالى ، يتم تعريف مصفوفة ذات بعدين باسم MyMatrix ، بها "ثلاثة صفوف" و "عمودين" :
هذه المصفوفة لها الناء التالى : المصفوفة بها أجمالى 6 عناصر . العنصر الأول من المصفوفة هو
MyMatrix[0][0] ، والعنصر الأخير هو MyMatrix[2][1] ، كما فى الجدول التالى :
يمكن التهيئة الابتدائية للمصفوفة ذات الأبعاد المتعددة كما سبق ، عن طريق تحديد العناصر داخل أقواس مجعدة ومفصولة بفواصل ، كما فى المثال التالى :
فى المثال السابق لدينا "2 صف" و "3 عامود" . قيمة كل عنصر يمكن بيانها كما يلى :
حجم "البعد الأول" اختيارى ويمكن أن يترك فارغا ، كما هو مبين فيما بعد للمثال أعلاه . يقوم المترجم بالملىء بالحجم الصحيح خلال الترجمة :
13-2 مصفوفات الحروف Character 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 :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
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 :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
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 :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
14-1 العمليات الحسابية للمؤشر :
فى لغة السى يمكننا إجراء مختلف العمليات الحسابية على المؤشر ، والتى قد تنطوى على :
• جمع أوطرح المؤشرات مع قيم إعداد صحيحة .
• جمع أو طرح اثنين من المؤشرات .
• المقارنو بين اثنين من المؤشرات .
• مقارنة مؤشر مع الصفر NULL .
• تخصيص أحد المؤشرات لمؤشر آخر .
كمثال على العمليات الحسابية للمؤشرات ، افترض أن ستة مواقع ذاكرة ، بدءا من العنوان (1000) ، تخزن متغيرات نوع الحرف ، كما هو موضح بالشكل التالى :
يمكننا الآن إعلان مؤشر لحفظ عنوان المتغير (A) ومن ثم إجراء العمليات التالية :
- الكود:
char *ptr; //ptr is a character pointer
ptr = &A; //ptr holds address 1000
ptr = ptr +2; //ptr now points to 1002
*ptr = 25; //Variable C = 25
ptr = ptr + 1; //ptr now points to 1003
E = *ptr; //Variable E = 100
ptr = ptr + 2; //ptr now points to 1005
*ptr = 0; //Variable F = 0
• السطر الأول : إعلان مؤشر نوع حرف char باسم ptr .
• السطر الثانى : نستبدل العامل (&) بالصيغة " عنوان ....." ، ومن ثم يمكن القول تخصيص قيمة "عنوان المتغير A " وهى (1000) للمؤشر ptr ومن ثم فإن هذا المؤشر فى هذه اللحظة سوف يشير إلى العنوان (1000) .
• السطر الثالث : جمع (2) على قيمة المؤشر ptr وحفظ النتيجة فى المؤشر ptr ، الآن المؤشر يشير إلى العنوان (1002) .
• السطر الرابع : نستبدل العامل (*) بالصيغة "المتغير المشار إليه بواسطة المؤشر..." ، وبالتالى يمكن القول ، تخصيص القيمة (25) إلى "المتغير المشار إلية بواسطة المؤشر ptr " وهو فى هذه الحالة المتغير ( C ) ليكون ( C = 25 ) .
• السطر الخامس : إضافة واحد إلى المؤشر ليصبح ptr = 1003 ليشير الآن إلى العنوان 1003 .
• السطر السادس : هنا نجد *ptr أى تخصيص "المتغير المشار إليه بواسطة المؤشر " وهو المتغير ( D ) إلى المتغير ( E ) فيصبح E = 100 .
• السطر السابع إضافة ( 2 ) إلى المؤشر لتصبح قيمته 1005 ويشير الأن إلى العنوان 1005 .
• السطر الثامن : تخصيص الصفر ( 0 ) إلى " المتغير المشار إليه بواسطة المؤشر الآن" وهو المتغير ( F ) ليصبح F = 0 .
14-2 مؤشرات المصفوفة Array Pointers :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
14-2 مؤشرات المصفوفة Array Pointers :
فى لغة السى ، "اسم المصفوفة" هو أيضا "مؤشر للعنصر الأول" بالمصفوفة . وبالتالى فإنه فى المصفوفة :
الاسم Sum هو أيضا مؤشر للعنصر الأول Sum[0] بالمصفوفة (بداية المواقع المحجوزة للمصفوفة بالذاكرة) ، وهو يحفظ عنوان المصفوفة . بالمثل ، فإن العبارات التالية يمكن استخدامها أيضا للإشارة إلى المصفوفة :
العبارتان التاليتان متكافئتان ، لأن Sum هو أيضا عنوان المصفوفة Sum :
من المثير للاهتمام أن نلاحظ أن العبارة التالية صواب ، لنفس السبب :
14-3 استخدام المؤشرات فى عمليات السلسلة النصية Using Pointers in String Operations :
فى لغة السى ، "اسم المصفوفة" هو أيضا "مؤشر للعنصر الأول" بالمصفوفة . وبالتالى فإنه فى المصفوفة :
- الكود:
int Sum[10];
الاسم Sum هو أيضا مؤشر للعنصر الأول Sum[0] بالمصفوفة (بداية المواقع المحجوزة للمصفوفة بالذاكرة) ، وهو يحفظ عنوان المصفوفة . بالمثل ، فإن العبارات التالية يمكن استخدامها أيضا للإشارة إلى المصفوفة :
- الكود:
int *ptr; //ptr is an integer pointer
ptr = &Sum[0]; //ptr points to first element of array Sum
العبارتان التاليتان متكافئتان ، لأن Sum هو أيضا عنوان المصفوفة Sum :
- الكود:
Sum[2] = 0;
*(Sum + 2) = 0;
من المثير للاهتمام أن نلاحظ أن العبارة التالية صواب ، لنفس السبب :
- الكود:
&Sum[3] = Sum + 3;
14-3 استخدام المؤشرات فى عمليات السلسلة النصية Using Pointers in String Operations :
رد: مارس 2014: متعة برمجة الميكروكونترولر PIC بلغة السى والمترجم (الكومبيلر) ميكروسى برو :
14-3 استخدام المؤشرات فى عمليات السلسلة النصية Using Pointers in String Operations :
تطبيق أخر مفيد للمؤشرات وهو إنشاء والتعامل مع "متغيرات السلسلة النصية " . تذكر أن السلسلة النصية هى "مجموعة مصفوفات حرف تنتهى بحرف الصفر NULL .
باستخدام المؤشرات ، يمكننا إنشاء سلسلة نصية كما هو مبين بالمثال التالى :
هنا ، تم إنشاء "مصفوفة حروف مخفية" عند وقت الترجمة ، تحتوى على الحروف ‘JOHN’ ، وتنتهى بحرف NULL . يتم التهيئة الابتدائية لمؤشر الحرف ( p ) وتحميلها بعناوين الذاكرة لهذه السلسلة . وهذا أى عنوان الحرف الأول بها وهو حرف ( J ) . المبرمج لا يكون لديه على حجم السلسلة التى تم إنشاؤها ، وبالتالى يجب لا تحاول تغيير محتوياتها باستخدام المؤشر .
فى العديد من التطبيقات قد نرغب فى إنشاء سلاسل ثابتة طويلة . يتم عمل ذلك بسهولة باستخدام المؤشرات وإعلان السلاسل كثوابت . فيمل يلى مثال يوضح ذلك :
من المهم أن ندرك الفروق بين الطريقتين التاليتين فى إنشاء السلاسل التالية :
· فى العبارة الأولى : يتم إنشاء مصفوفة تسمى Text وإنهائها بحرف NLL . يمكن الوصول للحروف بشكل فردى بواسطة الترقيم التسلسلى (فهرس) index للمصفوفة .
· فى العبارة الثانية : الحروف “An example text” وصفر الانتهاء يتم تخزينها فى مكان ما بالذاكرة ، ويتم تحميل المؤشر ( p ) بعنوان أول حرف بهذا النص ، وهو الحرف ( A ) .
يمكننا إنشاء مصفوفات لسلاسل نصية باستخدام المؤشرات . فى المثال التالى ، يتم إنشاء سبع مؤشرات بالأسماء من Days[0] إلى Days[6] ويتم تحميل كل مؤشر بالعنوان المقابل لاسم اليوم . يتم تعيين بعد مصفوفة المؤشرات تلقائيل بالقيمة ( 7 ) بواسطة المترجم .
15- الأبنية Structures :
تطبيق أخر مفيد للمؤشرات وهو إنشاء والتعامل مع "متغيرات السلسلة النصية " . تذكر أن السلسلة النصية هى "مجموعة مصفوفات حرف تنتهى بحرف الصفر NULL .
باستخدام المؤشرات ، يمكننا إنشاء سلسلة نصية كما هو مبين بالمثال التالى :
- الكود:
char *p = “JOHN”;
هنا ، تم إنشاء "مصفوفة حروف مخفية" عند وقت الترجمة ، تحتوى على الحروف ‘JOHN’ ، وتنتهى بحرف NULL . يتم التهيئة الابتدائية لمؤشر الحرف ( p ) وتحميلها بعناوين الذاكرة لهذه السلسلة . وهذا أى عنوان الحرف الأول بها وهو حرف ( J ) . المبرمج لا يكون لديه على حجم السلسلة التى تم إنشاؤها ، وبالتالى يجب لا تحاول تغيير محتوياتها باستخدام المؤشر .
فى العديد من التطبيقات قد نرغب فى إنشاء سلاسل ثابتة طويلة . يتم عمل ذلك بسهولة باستخدام المؤشرات وإعلان السلاسل كثوابت . فيمل يلى مثال يوضح ذلك :
- الكود:
const char *p1 = “My very long text string”;
من المهم أن ندرك الفروق بين الطريقتين التاليتين فى إنشاء السلاسل التالية :
- الكود:
cont char Text[ ] = “An example text”;
const char *p = “An example text”;
· فى العبارة الأولى : يتم إنشاء مصفوفة تسمى Text وإنهائها بحرف NLL . يمكن الوصول للحروف بشكل فردى بواسطة الترقيم التسلسلى (فهرس) index للمصفوفة .
· فى العبارة الثانية : الحروف “An example text” وصفر الانتهاء يتم تخزينها فى مكان ما بالذاكرة ، ويتم تحميل المؤشر ( p ) بعنوان أول حرف بهذا النص ، وهو الحرف ( A ) .
يمكننا إنشاء مصفوفات لسلاسل نصية باستخدام المؤشرات . فى المثال التالى ، يتم إنشاء سبع مؤشرات بالأسماء من Days[0] إلى Days[6] ويتم تحميل كل مؤشر بالعنوان المقابل لاسم اليوم . يتم تعيين بعد مصفوفة المؤشرات تلقائيل بالقيمة ( 7 ) بواسطة المترجم .
- الكود:
char *Days[ ] ={ “Monday”,
“Tuesday”,
“Wednesday”,
“Thursday”,
“Friday”,
“Saturday”,
“Sunday”
};
15- الأبنية Structures :
مواضيع مماثلة
» ترجمة أجزاء من كتاب برمجة الميكروكونترولر بلغة السى والمترجم ميكروسى
» مراجعة برمجة الميكروكونترولر PIC من خلال مشاريع الميكروكونترولر PIC16F877A مع الدايودات المشعة للضوء والمترجم ميكروسى برو :
» تدريبات كتاب برمجة الميكروكونترولر PIC بلغة السى والمترجم mikroC PRO : التدريب الثالث
» تدريبات كتاب برمجة الميكروكونترولر PIC بلغة السى والمترجم mikroC PRO : التدريب الثانى
» ]دروس وتجارب لمراجعة الميكروكونترولر PIC16F88 ولغة السى والمترجم ميكروسى :
» مراجعة برمجة الميكروكونترولر PIC من خلال مشاريع الميكروكونترولر PIC16F877A مع الدايودات المشعة للضوء والمترجم ميكروسى برو :
» تدريبات كتاب برمجة الميكروكونترولر PIC بلغة السى والمترجم mikroC PRO : التدريب الثالث
» تدريبات كتاب برمجة الميكروكونترولر PIC بلغة السى والمترجم mikroC PRO : التدريب الثانى
» ]دروس وتجارب لمراجعة الميكروكونترولر PIC16F88 ولغة السى والمترجم ميكروسى :
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: الميكروكونترولر PIC والبرجة بلغة السى والمترجم مسكروسى برو :: الميكروكونترولر PIC والبرمجة بلغة السى والمترجم ميكروسى برو
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى