نجحت معي الطريقة التالية , طويلة شوي ولكن يمكن نسخها واستخدامها على شكل دالة
الطريقة على الشكل التالي : نقوم بتعريف متغير حجمه حسب عدد المنافذ التي تريد استخدامها
مثلاً اذا اردت استخدام منفذين سيكون الحجم 2 بايت ( نوع int )
اما اذا استخدمت 4 منافذ يجب ان تعرفه كـ ( long )
في مثالنا استخدمت متغير حجمه 2 بايت البايت الاول للبورت الاول والبايت الثاني للبورت الثاني وعند كل تغيير في قيمة المتغير ستتغير حالة المنافذ ولذلك يجب استدعاء الدالة بعد كل تغيير في قيمة المتغير
وعليه فان قيمة المتغير ستحدد حالة المنافذ
شرح البرنامج : باستخدام دالة if
اذا كانت قيمة البت الاول في المتغير الذي عرفناه تساوي الواحد ستكون الرجل الاولى في البوابة الاولى تساوي 1 والا ستساوي الصفر
واذا كانت قيمة البت الثانية في المتغير تساوي الواحد ستكون الرجل الثانية تساوي الواحد وهكذا الى ان نصل الى نهاية البورت الاول الان يجب الانتقال الى البورت الثاني ولكن يجب ان ننتبه الى ان المتغير الذي استخدمناه فيه 16 بت لانه من نوع int اما اذا اردت تعريف المنافذ كلها ستعرف المتغير كـ long وسيصبح عندك 32 بت
بقية البرنامج اذا كانت البت التاسعة في المتغير تساوي الواحد ستكون قيمة الرجل الاولى في البورت الثاني تساوي الواحد والا تساوي الصفر واذا كانت قيمة البت العاشرة في المتغير تساوي الواحد ستكون قيمة الرجل الثانية في البورت الثاني تسواي الواحد وهكذا حتى نكمل جميع الارجل
وهذا البرنامج الذي جربته : الازاحة مع تشغيل واطفاء اضواء البورتين وعمل بدون مشاكل على بورتين
كود:
int i=1;
porti (){
if(i&1)porta.b0=1;else porta.b0=0;if(i&2)porta.b1=1;else porta.b1=0;if(i&4)porta.b2=1;else porta.b2=0;if(i&8)porta.b3=1;else porta.b3=0;
if(i&16)porta.b4=1;else porta.b4=0;if(i&32)porta.b5=1;else porta.b5=0;if(i&64)porta.b6=1;else porta.b6=0;if(i&128)porta.b7=1;else porta.b7=0;
if(i&256)portc.b0=1;else portc.b0=0;if(i&512)portc.b1=1;else portc.b1=0;if(i&1024)portc.b2=1;else portc.b2=0;if(i&2048)portc.b3=1;else portc.b3=0;
if(i&4096)portc.b4=1;else portc.b4=0;if(i&8192)portc.b5=1;else portc.b5=0;if(i&16384)portc.b6=1;else portc.b6=0;if(i&32768)portc.b7=1;else portc.b7=0;
}
void main()
{
while(1){
porti();
delay_ms(500);
i<<=1;
if(i==0){i=43690;porti();delay_ms(1000);i=~i;porti();delay_ms(1000);
i=43690;porti();delay_ms(1000);i=~i;porti();delay_ms(1000);i=1;}
}
}
رابط الملفات مع المحاكاة
http://www.mediafire.com/?zlckljlzkkz8k4z