بداية ممارسة برمجة الليد ماتريكس بشكل احترافى

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

بداية ممارسة برمجة الليد ماتريكس بشكل احترافى

مُساهمة من طرف Admin في الأربعاء أغسطس 05, 2015 4:28 pm

[SIZE="4"]بداية ممارسة برمجة الليد ماتريكس بشكل احترافى :
نحن نأمل أن نحصل على كود أساسى ، وأن هذا الكود الأساسى يبقى كما هو ، أو تقريبا كما هو ، لكننا سوف نكون بحاجة إلى تنظيمه بطريقة تساعد فى جعله مناسبا للاستخدام بواسطة المستخدمين ذات المستويات المختلفة ، وكذلك تكييف نفس الكود للعروض الأكبر مع الحد الأدنى أو حتى مع عدم التغيير فى كود المستخدم .
ما نحن بصدده هنا هو تجزئة الكود إلى العديد من المستويات ، ووضع مستوى أعلى المستوى الآخر . هذا النوع من النهج هو الاحتراف الحقيقى . فعلى الرغم من أنه من السهل جدا بناء التطبيق الخاص بك فى ملف واحد ، لكنه يكون أكثر احترافية أن يتم توزيع الكود على ثلاثة مستويات على الأقل .




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

المستوى الأول : مشغل جهاز الليد ماتريكس :
الطبقة أو المستوى الأول للتطوير هو برنامج تشغيل الجهاز "الدرايفر" device driver ، والذى يكون فى تماس مباشر مع الهاردوير الطبيعى . سوف يتم بناء هذا الدرايفر بغرض كشف الوظائف الأساسية لتشغيل الشاشة وكذلك عدد قليل من الدوال الأساسية لتشغيلها . هذا المشغل سوف يكون مسؤولا عن عمل مصفوفات ذاكرة الفديو الخاصة بالعرض ، وإعداد روتينات المقاطعة ونسخ محتويات الذاكرة فى سجلات الإزاحة ، والتنقل خلال الصفوف وتتبع عداد الصفوف . فهو سوف يغطى الشاشة ويعطينا وجهة النظر المنطقية للعرض كمصفوفة من الصفوف والأعمدة ، مما سوف يعطينا القدرة على معالجة كل بكسل (نقطة ضوء) أو ليد عن طريق إحداثياتها ، ونقوم بعد ذلك ، بناء على التسلسل الهرمى الأساسى ، ببناء المستوى التالى للمكتبة .
[/SIZE]

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

ذاكرة الفيديو Video Memory :

مُساهمة من طرف Admin في الأربعاء أغسطس 05, 2015 4:30 pm

ذاكرة الفيديو Video Memory :
سبق أن رأينا كيف يمكننا إرسال البيانات مباشرة إلى مسجلات الإزاحة ثم تنسيقها مع مسح الصف لعمل صورة . تذكر أنه لا يمكننا توصيل on جميع الصفوف فى نفس الوقت ، لأننا نرسل بيانات أعمدة صف واحد فى نفس الوقت عبر مسجلى إزاحة. لذلك ، للقيام بعملية المسح scanning ، نحن بحاجة لنظام "الاختيار من متعدد" multiplexing ، حيث نقوم بإرسال بيانات أعمدة صف واحد ، وتفعيل هذا الصف ، وإرسال بيانات أعمدة الصف الثانى ، وتعطيل الصف السابق وتفعيل الصف التالى . وبالتالى فإننا سوف نرسل بيانات أعمدة صف واحد فى كل مرة (انتخاب) . كل ذلك سوف يتم بسرعة بحيث أن أعيننا لن تكون قادرة على إدراك الفرق ونرى الصور كصورة واحدة . للقيام بذلك فإننا نلخص (نمثل) الليد ماتريكس 8X8 كخريطة ذاكرة مكونة من 64 بت ، كل بت تمثل ليد واحد . ونظرا لأن هذه الخريطة سوف تكون فى متغيرات الذاكرة ، فيمكن معالجتها بأى طريقة نريدها عن طريق البرنامج .
برنامج التشغيل "الدرايفر" سوف يكون ذكيا بما فيه الكفاية لنسخ محتويات خريطة الذاكرة هذه إلى شاشة العرض الطبيعية بشكل مستمر .
ولأن لدينا اثنين من المصفوفات 8X8 ( قد يكونا فى قطعة واحدة , أى لونين) ، وسوف نعتبرهم كخرائط منفصلة . كل ما نحتاج إليه هو مصفوفات ثنائية الأبعاد 2 dimensional array بثمانى صفوف وثمانى أعمدة . نحن بحاجة إلى اثنين من هذه المصفوفات ، واحدة للمصفوفة الأولى (الليدات الحمراء) والأخرى للمصفوفة الثانية (الليدات الخضراء) . المصفوفة 8X8 من نوع الحرف char سوف تتطلب 64 بايت من ذاكرة RAM وكلا المصفوفتين سوف يأخذا 128 بايت . لذلك تأكد من أن الميكروكونترولر لديه هذا الكم من ذاكرة RAM المتاحة .



يمكننا تبسيط ذلك قليلا ، عن طريق استخدام وحدة عرض واحدة فقط (الحمراء ، على سبيل المثال ) ، ومن ثم نحتاج إلى 8 بايت ، بواقع بايت لكل صف ، والبتات فى كل بايت سوف تمثل الأعمدة .
يمكن الوصول إلى صفوف المصفوفة باستخدام رقم مسلسل (رقم الرتبة) index ، ويمكن الوصول إلى الأعمدة عن طريق البتات الفردية فى المصفوفة المحددة . لاحظ لأنه يتم إرسال قيم بيانات الأعمدة المخزنة فى نموذج البت من خلال مسجلات الإزاحة إلى كاثودات الليدات ، فإن قيمة الصفر سوف تؤدى إلى توصيل on الليد المقابل . لكن ، من المعتاد عمليا أن يتم تمثيل التوصيل on ، فى نموذج البت ، بالمنطق واحد “1” ، كل ما علينا هو عكس البتات قبل إرسالها إلى مسجلات الإزاحة ، هذا يجعل المستخدم يفكر بطريقة منطقية باعتبار المنطق واحد يقوم بالتوصيل on والمنطق صفر يقوم بالفصل off .
عند استخدام وحدتين (الأحمر والأخضر) سوف يكون لدينا فى الذاكرة اثنين من مثل هذه المصفوفة واحدة لكل شاشة ، ولكل صف معين سوف يتم إرسال بايت من كل مصفوفة إلى مسجل الإزاحة المناسب .

اختيار الصف Selecting a Row

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

اختيار الصف Selecting a Row و تحديث الإطار تلقائيا Automatic Frame Refresh

مُساهمة من طرف Admin في الأربعاء أغسطس 05, 2015 4:33 pm

اختيار الصف Selecting a Row
الآن نحن بحاجة إلى معالجة بيانات مسجل الإزاحة الثالث ، والذى يقوم باختيار الصف فى المصفوفة بغرض المسح . لدينا ما مجموعه 8 صفوف ، وعلينا اختيار صف واحد فى كل مرة . المنطق “1” فى البت المناظرة لمسجل الإزاحة سوف يختار الصف (الأنود المشترك لليدات) . لاختيار الصف الأول نحتاج إلى إرسال البايت “00000001” ، ولاختيار الصف التالى سوف نحتاج البايت “00000010” ولاختيار الصف الثالث نحتاج البايت “00000100” وهكذا . لاحظ كيف يتم إزاحة الواحد “1” من البت b0 إلى اليسار موقع بت فى كل مرة . يمكننا ببساطة تنفيذ ذلك عن طريق وضع القيمة العشرية للواحد(1) فى متغير ثم بعد ذلك يتم إزاحة محتوياته إلى اليسارموقع بت واحدة فى كل مرة نريد فيها اختيار الصف التالى . هذا هو الحل العملى ، لكن ماذا لو قررنا زيادة الصفوف إلى 16 ؟ الميكروكونترولر ذات 8 بت لا يستطيع القيام برياضيات ذات 16 بت . الحل هو تخزين القيم المكافئة فى مصفوفة أخرى ذات ثمانية عناصر ، ونستخدم متغير كعداد لاستخدام القيمة المناظرة فى كل مرة نريد فيها اختيار الصف .

تحديث الإطار تلقائيا Automatic Frame Refresh :
من أجل الحفاظ على تحديث العرض ، نحن بحاجة إلى نسخ مصفوفات خريطة نموذج البت إلى مصفوفة العرض بشكل دورى . يمكن القيام بذلك بسهولة بداخل حلقة . لكن عندما يحتاج البرنامج أو التطبيق إلى القيام بعمل آخر ، مثل قراءة المنفذ التسلسلى ، أو بعض المهام الأخرى ، سوف يتم مقاطعة هذه الحلقة وسوف لا يكون العرض منتظما . لذلك ، فإن العرض يجب أن يتم تحديثه تلقائيا وعلى فترات محددة مسبقا . يتم تنفيذ ذلك باستخدام نظام المقاطعة .
معظم أجهزة الميكروكونترولر لديها نظام المقاطعة هذا ، ويمكن تهيئته بعدد من التكوينات . سوف نستخدم مقاطعة المؤقت Timer 0 للميكروكونترولر PIC16F877A لتوليد إشعال (بدء) دورى عندما نقوم بتحديث العرض .

لمحة عامة عن المقاطعات :

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

لمحة عامة عن المقاطعات :

مُساهمة من طرف Admin في الأربعاء أغسطس 05, 2015 4:36 pm

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




هنا ، سوف نستخدم المؤقت Timer 0 للميكروكونترولر من أجل إشعال (بدء) هذه المقاطعة . وفى كل مقاطعة سوف نرسل بيانات أعمدة صف واحد إلى وحدة العرض . فى الميكروكونترولر هناك العديد من السجلات التى تحتاج إلى التكوين (التهيئة) من أجل تحديد نظام المقاطعة . علاوة على ذلك علينا عمل دالة مهمتها التعامل مع روتين المقاطعة .
عائلات الميكروكونترولر المختلفة لها سجلات مختلفة لتحديد سلوك المؤقتات . فى الوقت الراهن ، سوف نستخدم الميكروكونترولر PIC16F877A عند تردد 4MHz للسهولة فى الحسابات . يمكنك ضبط القيم والسجلات وفقا للميكروكونترولر المستخدم .

معلومات إضافية عن الميكروكونترولر PIC16F877A والمؤقت Timer 0

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

معلومات إضافية عن الميكروكونترولر PIC16F877A والمؤقت Timer 0

مُساهمة من طرف Admin في الأربعاء أغسطس 05, 2015 4:40 pm

معلومات إضافية عن الميكروكونترولر PIC16F877A والمؤقت Timer 0
الميكروكونترولر PIC  مجهز بنظام أو أكثر للتوقيت الدقيق يعرف باسم المؤقتات Timers والتى يمكن استخدامها لتنفيذ مجموعة متنوعة من وظائف التوقيت الدقيقة مثل توليد أحداث في أوقات محددة ، وقياس مدة (فترة دوام) duration حدث وحفظ تسجيل التاريخ والوقت وعد الأحداث counting وما إلى ذلك.
العنصر الرئيسي فى وحدة (موديول) المؤقت هو عداد ثنائى حر يتزايد عند كل نبضة ترد إليه . ونظرا لأنه يعمل بشكل مستقل فإنه يمكن أن يعد النبضات فى وقت واحد (بالتزامن) مع تنفيذ البرنامج الرئيسى .
يمتلك الميكروكونترولر  PIC16F877A ثلاثة من المؤقتات كأجهزة hardware مدمجة به وتسمى :
Timer0 و Timer1و Timer2 وسوف نتناول وحدة (موديول) المؤقت    Timer0.

وحدة (موديول) المؤقت Timer 0 :
وحدة (موديول) المؤقت / العداد timer/counter module ببساطة هى عداد ثنائى binary counter  مستقل والذى يمكن تهيئته (إعداده) لكى يقوم بعد نبضات ساعة دورات التعليمات الداخلية أو عد نبضات ساعة خارجية .
المؤقت Timer 0 هو عداد متزامن بسعة 8 بتات  8-bit والذى يقوم بحفظ (تخزين) قيمة العداد فى سجل وظائف خاصة يسمى TMR0 . هذا السجل قابل للقراءة وللكتابة فى أى وقت عن طريق البرنامج . إذا كتبت قيمة عليه فسوف يبدأ العداد التزايد من هذه القيمة .
عندما يتم تشغيل الموديول Timer 0 بنبضات ساعة تعليمات المعالج فيقال أنه يعمل كمؤقت timer  لأنه يتزايد بمعدل ثابت ( يتحدد بنبضات ساعة المعالج) ، وإذا علمت عدد النبضات التى قام بعدها يمكنك إشتقاق (إستنتاج) الوقت المنقضى بمعلومية زمن الدورة الواحدة .
يمكن للمؤقت Timer 0 أيضا عد النبضات الخارجية الواصلة إلى الطرف RA4  واسمه البديل هو :
T0CKI (Timer Zero Clock Input) " مدخل نبضات الساعة للمؤقت صفر " . عندما يقوم الموديول بعد النبضات الخارجية يقال أنه يعمل كعداد counter .



نظام المؤقت Timer mode
• يتم اختيار نظام المؤقت بمسح clear بت اختيار مصدر الساعة للمؤقت timer 0 وهى البت :
 T0CS (OPTION register, bit 5) .
• فى نظام المؤقت يتزايد السجل TMR0 عند كل دورة تعليمة . ولأن هذا السجل ذو سعة 8-bit فيمكنه العد من الصفر 00 إلى  FF (255) ، وعندما يصل إلى أقصى قيمة له وهى FF (255) ويتقدم فى التزايد يلف (يدور – يقلب)  العد عائدا إلى الصفر 00 وتعرف هذه الحالة بالطفحان overflow (تجاوز الحد الأقصى) ويتم تسجيلها بواسطة بت علم المقاطعة بالمؤقت timer 0 وهى البت :
 T0IF (Timer0 Interrupt Flag) بالسجل INTCON (Interrupt Control) بجعلها بالقيمة set  أى 1 , حيث يمكن لهذه الحالة بدء (توليد) مقاطعة والتى تعرف باسم " المقاطعة بالمؤقت صفر " Timer0 Interrupt إذا ما كانت ممكنة لعمل مقاطعة .
• يتم تمكين المقاطعة بالمؤقت Timer 0 بجعل بت تمكين المقاطعة بالمؤقت timer 0 وهى البت :
T0IE (Timer0 Interrupt Enable) بسجل التحكم فى المقاطعة INTCON بواحد أى set بالأضافة إلى بت التمكين العام GIE . هذه المقاطعة هى التى يجب أن تبين أن الوقت إنتهى وتحدث عند حدوث طفحان بالسجل TMR0 .
• يجب مسح clear البت  T0IF " علم المقاطعة بالمؤقت صفر " بواسطة روتين خدمة المقاطعة بحيث يمكن حدوث مقاطعة بالمؤقت من جديد .
نفترض أن الميكروكونترولر PIC يعمل على مذبذب ساعة بتردد Fosc =4 MHz فإن تردد نبضات ساعة التعليمات سوف تكون Fosc /4 = 1 MHz . نتيجة لذلك يقوم العداد بالتزايد كل واحد ميكروثانية 1 μs بالضبط . وهذا يعنى أن المؤقت Timer 0 سوف يستغرق 256 μs لكى يعد من الصفر إلى الصفر التالى . عن طريق تحميل سجل المؤقت TMR0 بقيمة مسبقة مناسبة يمكن اختيار فترات زمنية أصغر .على سبيل المثال إذا تم تحميل السجل TMR0 مسبقا بالقيمة  206 فإن المؤقت Timer 0 سوف يحدث له طفحان بعد 50 μs فقط . علاوة على ذلك يوجد قاسم تردد مبرمج بسعة 8-bit يعرف باسم  prescaler "المقياس المسبق " أو " معامل القسمة " وهو متاح لقياس الفترات الزمنية الطويلة . والمقياس المسبق هو دائرة قسمة تقع بين مصدر نبضات الساعة والمؤقت وتقوم بقسمة التردد الداخل على قيمة من ثمانى قيم ثنائية تقع ما بين القيمة 2 والقيمة 256 .إذا كان تردد نبضات ساعة التعليمات 1MHz فإن أقصى فترة زمنية سوف تكون  256 x 256 μs = 65.536 ms وهى التى تناظر معامل قسمة 256 . قيم معامل القسمة يتم اختيارها برمجيا بواسطة الخانات PS0, PS1,PS2 " خانات اختيار معامل القسمة " بالسجل OPTION .
من أجل تخصيص استخدام معامل القسمة مع موديول المؤقت Timer 0 يجب مسح clear = 0  الخانة  PSA " تخصيص معامل القسمة " . إما إذا كانت الخانة PSA بواحد set = 1  فلا يتم تخصيص أى معامل قسمة لموديول المؤقت .
سجل التحكم فى الخيارات OPTION_REG :



سجل التحكم فى المقاطعة :




معدلات الأطار Frame Rates :

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

معدلات الأطار Frame Rates :

مُساهمة من طرف Admin في الأربعاء أغسطس 05, 2015 4:46 pm

معدلات الأطار Frame Rates :
والآن وبعد أن تكلمنا عن المقاطعات ، وعرفنا كيفية تكوين نظام أتوماتيكى لتحديث العرض الطبيعى من المحتويات فى الذاكرة . السؤال الذى يطرح نفسه الآن هو كم من المرات ينبغى علينا تكرار ذلك . إذا فعلت ذلك بتكرار سريع (تردد سريع يساوى زمن دورى طويل) ، فنحن نميل إلى إنفاق بعض الوقت الإضافى فى خدمة المقاطعات ، وسوف يكون أداء التطبيق الرئيسى ضعيف . وإذا فعلنا ذلك ببطء شديد ، فإن العرض سوف يبدو غير مستقر وقد يكون مرتعشا . لذلك علينا أن أن نجد معدل الإطار المناسب .
العين البشرية لا يمكن أن تكشف التغيير إذا كان معدل الإطار فوق 30 إطار كل ثانية . سوف نختار معدل إطار 50 إطار كل ثانية لإعطاء العرض مظهر أكثر استقرارا . لذلك نحن بحاجة إلى أن يتم تحديث الإطار بمعدل 1/50 = 0.02 seconds أو 20mS . ونظرا لأنه سوف يتم تحديث صف واحد فى كل مقاطعة فإن الزمن 20mS يجب أن يقسم على 8 صفوف ، أى يجب تكرار كل صف بمعدل 2.5mS ، ويمكننا تقريبه ليكون 2mS وهو من شأنه أن يعطى معدل إطار أعلى قليلا من المعدل المطلوب (تقليل الزمن يعنى زيادة التردد) ولكن لا بأس فى ذلك فى المهمة التى نقوم بها .
إشعال (بدء) المقاطعة يعتمد على سرعة الساعة ، وطول العداد (المؤقت) . سوف يتم إشعال المقاطعة عندما يلف العداد عائدا إلى الصفر ، يتم ذلك فى النبضة 256th فى المؤقت 8 بت وفى النبضة 65536th فى المؤقت 16 بت . حساب العدد الدقيق للتكات المطلوبة لتوليد فترة زمنية 2mS يحتاج قليل من الرياضيات .

لإنتاج معدل تحديث الصف كل 2mS ، أى 2000us ، نقسم 2000 على 256 نحصل على 7.8 ، وباستخدام أقرب معامل قسمة وهو “8” تحدث المقاطعة كل “256x8=2048us” وهو مناسب للحالة التى نحن بصددها, وتكون الأعدادات اللازمة فى هذه الحالة :
• إعدادات داخل روتين خدمة المقاطعة :

الكود:


//================================
TMR0 = 0;        // TMR0 returns to its initial value
 INTCON.T0IF = 0;  // Bit T0IF is cleared so that the interrupt could reoccur
//=============================


• إعدادات فى بداية الدالة الرئيسية :
الكود:


//==============================
OPTION_REG = 0x02; // Prescaler (1:8) is assigned to the timer TMR0
TMR0 = 0;          // Timer T0 counts from 0 to 255
INTCON = 0xA0;    // Enable interrupt TMR0 and Global Interrupts
//========================================

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

دالة الإعدادات الابتدائية للشاشة void Init_Matrix()

مُساهمة من طرف Admin في الأربعاء أغسطس 05, 2015 5:14 pm

دالة الإعدادات الابتدائية للشاشة void Init_Matrix()
الآن نصل إلى الدالة التى تقوم بتهيئة (إعداد) تشغيل الشاشة . من المفضل إنشاء دالة تضم جميع إعدادات الميكروكونترولر والتى يتم كتابتها فى بداية الدالة الرئيسية . هذه الدالة سوف تقوم بتحديد أتجاهات الأطراف التى سوف يتم توصيل الشاشة بها وكذلك تحديد تهيئة المؤقت Timer0 ونظام المقاطعة عن طريقه ، وإذا أردت تغيير الإعدادات لأى سبب فسوف يتم التغيير فى هذه الدالة فقط .
نموذج الدالة :

الكود:

void Init_Matrix(void);

كود الدالة :

الكود:


// Initialize the matrix, set Tris registers, and setup the interrupt system on Timer 0
void Init_Matrix()
{
//==========================================
Tris_Mat_DS=0;             //set as output
Tris_Mat_CLK=0;             //set as output
Tris_Mat_LAT=0;             //set as output
Mat_DS=0; Mat_CLK=0; Mat_LAT=0;    //clear all pins
//========================================
// setup interrupt on timer 0 2ms interrupt
//==============================
OPTION_REG = 0x02; // Prescaler (1:8) is assigned to the timer TMR0
TMR0 = 0;          // Timer T0 counts from 0 to 255
INTCON = 0xA0;    // Enable interrupt TMR0 and Global Interrupts
}
//==============================

ملحوظة :
الأسماء المستخدمة تم تعريفها مسبقا فى رأس البرنامج (حتى يتعرف عليها المترجم حين يجدها) بالمتجة #define أو بالكلمة المحجوزة sbit ، بالشكل التالى :

الكود:


//======= Definitions ============
sbit Mat_DS at PORTC.B0;
sbit Mat_CLK at PORTC.B1;
sbit Mat_LAT at PORTC.B2;
//========================
sbit Tris_Mat_DS at TRISC.B0;
sbit Tris_Mat_CLK at TRISC.B1;
sbit Tris_Mat_LAT at TRISC.B2;
//========================

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى