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

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 21-02-2016, 06:21 AM المشاركة 57   
sun مبروك لاخ مجدي



بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
أعلن انتهاء المسابقة وأن الفائز الأول هو المتاسبق الرابع الأخ مجدي المسجل باسم magdy_3.
ولقد تمكن من وضع كود كامل يتكون من 29 تعليمة فقط بالطريقة التي نعد بها.
والآن إليكم الكود النهائي:
كود:
#define sw1 porta.f0 #define sw2 porta.f1 #define is == #define click 0 //////////////////////////////////////////////////////////////// void main() { porta=portb=trisb=0; trisa=3; while(porta<12) { delay_ms(200); porta+=((portb.f7)*4); portb=(portb<<1)+(!portb); } do { delay_ms(200); porta-=((portb.f0)*4); portb=(portb>>1)+((!portb)*128); } while((porta<12)+portb); while(1) { if(sw1 is click) { delay_ms(25); portb=(portb<<1)+(!portb); while(!sw1){} delay_ms(25); } if(sw2 is click) { delay_ms(25); portb=(portb>>1)+(!portb*128); while(!sw2){} delay_ms(25); } } }
بالنسبة للسطر:
كود:
while((porta<12)+portb);
إن اعتبرتم أن بداخل القوسين شرط واحد فسيكون الكود 29 تعليمة.. أما إن اعتبرتموه شرطين فسيكون الكود 30 تعليمة.
في هذا الكود تمكن الأخ مجدي من استخدام porta كمتغير... وهذا الذي ساعده على تقليل عدد التعليمات... كما أن مشتاق الله تمكن من الوصول لنفس الفكرة لكنه لم يتمكن من تقليل عدد التعليمات لهذا القدر.
في المشاركات القادمة إن شاء الله سأستعرض أكواد الفائز الثاني والثالث والرابع والخامس والسادس... وسأستعرض أول كود تقدم به الأخ مجدي لأنظر هل ستستطيعون استنباط الأخطاء الخفية التي كانت فيه؟!!
أستاذ عريبي محمود...
لقد حان الوقت لأجيب على سؤالك الذي سألته في أول المسابقة عن لماذا لا يجوز وضع مقاومة رفع على A4 ؟
أفضل فكرة لتقليل عدد الأكواد هي استخدام porta كمتغير.
هناك 2 بت فقط من porta يمكن الاستفادة منهم وهم A2 و A3 .
فإذا وضعنا مقاومة رفع على A4 فسيكون هناك 3 بت يمكن الاستفادة منهم.
كان التحدي هل تستطيع استخدام 2 بت فقط لأداء الوظيفة؟
أرجو أن تكونوا استمتعتم واستفدتم من هذه المسابقة.
لقد كلفتني هذه المسابقة الكثير من الوقت والجهد الذهني والتركيز والتدبر... أما عن الجهد الذهني والتركيز والتدبر فلا أحزن على ذلك لأن هذه مُتْعَتِي.. فقد استمتعت كثيرا وأنا أعصر دماغي في التركيز وتدبر أكواد المتسابقين لأفهم كيف كان يفكر هذا المتسابق وهل أخطأ وهل هناك ما هو أفضل من ذلك وهل هناك تعليمة يمكنه حذفها لا فائدة منها؟؟
أتمنى أن يتقدم أحد الأعضاء بمسابقة مثل هذه.
انتظروا المشاركات القادمة التي أذكر فيها المزيد من الأكواد.
والسلام عليكم ورحمة الله وبركاته.
السلام عليكم
اولا مبروك لاخ مجدي على كود رائع
عندي ملاحظات
1- انا شخصيا لااتعامل مع البورت port بشكل مباشر لان هناك مشكله بالحقيقه عندما تكتب portb=1 مثلا فالنتيجه لاتظهر بشكل مباشر على بورتb وانما في ريجيستر داخلي وبعد ذلك تظهر النتيجه هنا بالضبط مشكله قد لاتظهر النتيجه نفس ماتريد ماهو سبب ذلك
السبب ان port خارجي مربوط بشكل مع مباشر مع ريجيستر ولهذا ممكن ان يحدث تغير في قيمه 1 ربما تتحول الى 0 اثناء تحويل قيمه من ريجيستر الى port طبعا بسبب متسعات داخليه
طبعا عندي كتاب صغير سوف تستفادون منه اعطاني اياه احد الاجانب في احدى منتديات ونشرته بالقريه ولكن حاليا لاأتذكر ولكن سوف ابحث عنه
لهذا السبب مايكروشيب حلت مشكله عن طريق ريحيستر LAT وهو ريجيستر معزول عزل تام عن الاطراف ولهذا سوف نضمن نقل بيانات داخل ريجيستر بشكل صحيح
هذا شيئ الذي اتكلم عنه هو فقط في مخارج وليس مداخل

2- ارى يتم تعامل مع porta كقيمه كامله وهذا ليس صحيح لانه لاتنسى توجد مفاتيح خارجيه مربوطه على RA0 , RA1 وهذه ممكن لو تم الضغط عليها سوف تحدث تغير في قيمه porta

ولكن ممكن حل مشكله
ان شاء الله اذا ترغبون اشرح لكم طريقه تتعامل مع bit معين من port بدون ان يتأثر قيمه البورت بشكل كامل

تحياتي الطيبه للجميع


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 21-02-2016 الساعة 06:26 AM
اعلانات

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,040
نشاط [ محمد ع يسى ]
قوة السمعة:
قديم 21-02-2016, 07:01 AM المشاركة 58   
افتراضي


السلام عليكم
اولا مبروك لاخ مجدي على كود رائع
عندي ملاحظات
1- انا شخصيا لااتعامل مع البورت port بشكل مباشر لان هناك مشكله بالحقيقه عندما تكتب portb=1 مثلا فالنتيجه لاتظهر بشكل مباشر على بورتb وانما في ريجيستر داخلي وبعد ذلك تظهر النتيجه هنا بالضبط مشكله قد لاتظهر النتيجه نفس ماتريد ماهو سبب ذلك
السبب ان port خارجي مربوط بشكل مع مباشر مع ريجيستر ولهذا ممكن ان يحدث تغير في قيمه 1 ربما تتحول الى 0 اثناء تحويل قيمه من ريجيستر الى port طبعا بسبب متسعات داخليه
طبعا عندي كتاب صغير سوف تستفادون منه اعطاني اياه احد الاجانب في احدى منتديات ونشرته بالقريه ولكن حاليا لاأتذكر ولكن سوف ابحث عنه
لهذا السبب مايكروشيب حلت مشكله عن طريق ريحيستر LAT وهو ريجيستر معزول عزل تام عن الاطراف ولهذا سوف نضمن نقل بيانات داخل ريجيستر بشكل صحيح
هذا شيئ الذي اتكلم عنه هو فقط في مخارج وليس مداخل

2- ارى يتم تعامل مع porta كقيمه كامله وهذا ليس صحيح لانه لاتنسى توجد مفاتيح خارجيه مربوطه على RA0 , RA1 وهذه ممكن لو تم الضغط عليها سوف تحدث تغير في قيمه porta

ولكن ممكن حل مشكله
ان شاء الله اذا ترغبون اشرح لكم طريقه تتعامل مع bit معين من port بدون ان يتأثر قيمه البورت بشكل كامل

تحياتي الطيبه للجميع
السلام عليكم ورحمة الله وبركاته.
جزاك الله أخي على المعلومات المفيدة. ونحن في انتظار المزيد من الشرح والتوسع.. وفي انتظار أن تشرح التعامل مع بت معين.
ولكن لي تعليق على فقرة واحدة وهي خوفك من تأثير الضغط على السويتشات...
هذه المسألة لا خوف منها أبدا.
فتخيل أنك لم تضغط على السويتشات سيكون بورت A أثناء أول دورة شمال يساوي 3 فبعد انتهاء الدورة سيتلقى الأمر بورت A تساوي 7 فيظهر 5 فولت على A2 فقط ولا يحدث شيء للبت الأول والثاني.
كذلك لو كان الضغط على مفتاح واحد أو ضغطت على المفتاحين لن يؤثر أبدا على سير الخطة.
والسلام عليكم ورحمة الله وبركاته.

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

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,040
نشاط [ محمد ع يسى ]
قوة السمعة:
قديم 21-02-2016, 12:39 PM المشاركة 59   
افتراضي الإعلان عن الفائز الثاني


بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
أعلن أن الفائز الثاني هو محمد عيسى الذي يحدثكم الآن.
ولقد استخدمت أيضا فكرة استهدام بورت A كمتغير.
والآن إليكم الكود وهو يتكون من 53 تعليمة بالطريقة التي نعد بها:

كود:
void main() { trisb = 0; trisa = 3; porta = 0; portb = 0; while (1) { delay_ms(1000); if (portb == 0 ) if (porta > 11) { portb =128; while (1) { delay_ms(1000); if (portb == 0 ) { if (porta > 3) {portb = 128; porta-=4;} else while (1) { if (~porta.f0) { if (portb == 0) portb = 1; else portb*=2 ; while (~porta.f0) {} } if (~porta.f1) { if (portb == 0) portb = 128; else portb/=2; while (~porta.f1) {} } } } else portb/=2; } } else {portb = 1; porta+=4;} else portb*=2; } }


التعديل الأخير تم بواسطة : محمد ع يسى بتاريخ 21-02-2016 الساعة 12:42 PM

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,040
نشاط [ محمد ع يسى ]
قوة السمعة:
قديم 21-02-2016, 12:43 PM المشاركة 60   
افتراضي الإعلان عن الفائز الثالث


بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
أعلن أن الفائز الثالث هو المتسابق الثاني مشتاق الله.
ولقد تقدم بكودين.. الكود الأول غير كامل ويحتوي على 62 تعليمة بالطريقة التي نعد بها.. وقد استخدم فكرة استخدام بورت A كمتغير.. وهو الكود الذي بسببه حصل على الرتبة الثالثة.
أما الكود الثاني فلم أفهم منه شيئا... لذلك أرجو من الأخ مشتاق الله هو وغيره من المتسابقين أن يقدموا بعض الشرح لكن ليس الآن.. عندما يأتي الوقت المناسب بعد استعراض الأكواد.
والآن إليكم الكود الأول لمشتاق الله:
كود:
#define  butt_1   porta==2
#define  butt_2   porta==1
void main() {
trisa=0x03;
porta=0;
trisb=0;
EEPROM_Write(1,0);
                                 portb=1;
                      while((porta & 0b00001100)<=8){
                                                      delay_ms(1000);
                                                      if(portb==0){  porta+=4;
                                                                   if((porta & 0x0C)==12){continue ;}
                                                                    portb=1;
                                                                   continue ; }
                                                        portb<<=1;
 
 while((porta & 0b00001100)<=12){
                                                      delay_ms(1000);
                                                      if(portb==0){     if((porta & 0x0C)==12){porta=0 ; portb|=1<<7 ; continue; }
                                                                           else porta+=4;
                                                                    portb|=1<<7 ;
                                                                   continue ; }
                                                        portb>>=1;
                                                       if((porta & 0x0C)==12 && (portb==0)) {break;}
                                                     }
       porta=0;
       while(1){      if( butt_1 && portb==0){ portb=1;while(butt_1){}}
                if( butt_2 && portb==0){ portb|=1<<7;while(butt_2){}}
                if( butt_1){ portb <<=1; while(butt_1){}  }
                if( butt_2){portb >>=1 ; while(butt_2){}  }

             }               
             
      }
بالنسبة للسطر:
كود:
EEPROM_Write(1,0);
فلا أعرف ما فائدته... أظنه بلا فائدة.. لهذا لم أعده من التعليمات.
العلامة & تعتبر هناك شرط واحد.
بينما العلامة && تعتبر هناك شرطان مما يعني زيادة تعليمة إضافية.
وهذا الكود كامل من ناحية الإزاحة شمال ويمين لكنه ليس كاملا من ناحية السويتشات... فقد أخبرته في رسالة خاصة قائلا:
السلام عليكم ورحمة الله وبركاته.
معذرة على تأخر الرد.
إليك ملاحظاتي على كود فكرتك الأولى.
حلقة الإزاحة يمين وضعتها:
while(porta&0b00001100<=12)j
حرف j من عندي حتى يظهر الكود بشكل مفهوم.
هذه الحلقة كان بإمكانك اختصارها بهذا الشكل:
while(1)j
هذا الكلام لا ينطبق على حلقة الإزاحة شمال.. فهناك الشرط بين القوسين ضروري.
ملاحظة أخرى وهو في أداء السويتشات:
لو كان بورت B لا يساوي صفر فإن الأمور ستمشي كما هو مخطط لها... أما إن كان يساوي صفر فعند الضغط على السويتش قد يقع حظنا عند حلقة if الأولى وقد يقع حظنا عند حلقة if الأخرى.
لو وقع حظنا على حلقة if الأولى فإن بورت B سيساوي 1 أو 128 أقصد كما نخطط.. لكن إن وقع حظنا في حلقة if الثانية فيظل بورت B يساوي صفر.
أظن أني شرحت بطريقة معقدة.. أليس كذلك؟
إذا لم تفهم هذه الملاحظة أخبرني.
ولكن في النهاية أريد أن أقول شيئا...
هذا الكود يدل على العبقرية لأنه معقد جدا ويحتاج لعبقري حتى يضعه... ولكنه يحتاج لتقليل عدد تعليماته كثيرا.. فالأخ مجدي تمكن من الوصول ل29 تعليمة بسبب أنه اهتدى لاستخدام بورت A كمتغير.
أما عن الفكرة الثانية فلا أعرف عنها شيئا.
سأتركك تعد تعليماتها وتخبرني بالرقم.
ولكني لم أجربها على المحاكاة حتى الآن... سأجربها إن شاء الله غدا.
في انتظار المزيد من التقدم والتفاعل.
والسلام عليكم ورحمة الله وبركاته.

لا تنسوا أننا سنخصم 9 تعليمات من كود مشتاق الله لأنه المتسابق الثاني لنعتبر كوده 53 تعليمة فقط.
والآن إليكم الكود الثاني:

كود:
#define  butt_1   porta==2
#define  butt_2   porta==1
void main() {
trisa=0x03;
porta=0;
trisb=0;
EEPROM_Write(1,0);
        
           portb=1;
       while(EEPROM_Read(1)<3){  delay_ms(1000);

                                     if(portb==0 && EEPROM_Read(1)==0){eeprom_write(1,1);}
                                else if(portb==0 && EEPROM_Read(1)==1){eeprom_write(1,2);}
                                else if(portb==0 && EEPROM_Read(1)==2){eeprom_write(1,3);}
                              
                                  if(portb == 0 && EEPROM_Read(1)<3){ portb =1  ; continue ;}
                                 portb <<= 1 ;

                            }



                     eeprom_write(1,0);
                portb |= 1<< 7  ;
       while(EEPROM_Read(1)<4){    delay_ms(1000);

                                     if(portb==0 && EEPROM_Read(1)==0){eeprom_write(1,1);}
                                else if(portb==0 && EEPROM_Read(1)==1){eeprom_write(1,2);}
                                else if(portb==0 && EEPROM_Read(1)==2){eeprom_write(1,3);}
                                else if(portb==0 && EEPROM_Read(1)==3){eeprom_write(1,4);}
                        
                              if(portb == 0 && EEPROM_Read(1)<4 ){ portb |= 1<< 7  ; continue ;}

                                  portb >>= 1 ;
                               }

       porta=0;
       while(1){      if( butt_1 && portb==0){ portb=1;while(butt_1){}}
                if( butt_2 && portb==0){ portb|=1<<7;while(butt_2){}}
                if( butt_1){ portb <<=1; while(butt_1){}  }
                if( butt_2){portb >>=1 ; while(butt_2){}  }
               }
    }


التعديل الأخير تم بواسطة : محمد ع يسى بتاريخ 21-02-2016 الساعة 12:54 PM

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,040
نشاط [ محمد ع يسى ]
قوة السمعة:
قديم 21-02-2016, 01:04 PM المشاركة 61   
افتراضي الإعلان عن الفائز الرابع


بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
أعلن أن الفائز الرابع هو المتسابق الأول حسن هادي محمود والذي تقدم بأفضل استخدام للدوال... وهو كود كامل.
تعليمات كوده 73 تعليمة.. سنخصم منها 10 تعليمات لأنه المتسابق الأول ليصبح الكود 63 تعليمة.
والآن إليكم الكود:

كود:
#define led  portb
//*******************************************//


void right_to_left()
{
  do
    {
     delay_ms(1000);
     if(led==0)led=1;
     else led=led<<1;
    }while(led!=0);
}
//***************************************************//
void left_to_right()
{
    do
    {
     delay_ms(1000);
     if(led==0)led=128;
     else led=led>>1;
    }while(led!=0);
}
//****************************************************//
void main()
{
 trisb=0;
 trisa.f0=1;
 trisa.f1=1;
   led=0;

   right_to_left();
   right_to_left();
   right_to_left();

   left_to_right();
   left_to_right();
   left_to_right();
   left_to_right();

    while(1)
    {
     if(RA0_bit==0)
        {
          delay_ms(10);// delete bounce
          if(led==0)led=1;
          else led=led<<1;
          while(RA0_bit==0){};
          delay_ms(10);// delete bounce
        }
     if(RA1_bit==0)
        { 
          delay_ms(10);// delete bounce
          if(led==0)led=128;
          else led=led>>1;
          while(RA1_bit==0){};
          delay_ms(10);// delete bounce
        }

    }

}
كما أن هناك تعليمة يمكنه خصمها وهو يعرفها كما أخبرني بها في رسالة خاصة ليصبح كوده 62 تعليمة.
هذه التعليمة هي وضع:
كود:
trisa=3;
في تعليمة واحدة بدلا من:

كود:
trisa.f0=1;
 trisa.f1=1;
وشكر خاص للمتسابق حسن هادي محمود لأنه هو أول متسابق يتقدم بكود كامل.
والسلام عليكم ورحمة الله وبركاته.


محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,040
نشاط [ محمد ع يسى ]
قوة السمعة:
قديم 21-02-2016, 02:21 PM المشاركة 62   
افتراضي إعلان عن الفائز الخامس


بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
أعلن أن الفائز الرابع هو المتسابق الثالث رشاد.
ولقد تقدم بكود لم أفهم منه شيئا فاكتفيت بإجراء محاكاة على البروتس لأجد أنه يعمل بشكل كامل.
ولقد طلبت منه أن يعد تعليماته فأخبرني أنها 76 تعليمة بالطريقة التي نعد بها... سيخصم منها 8 تعليمات لأنه المتسابق الثالث ليصبح الكود 68 تعليمة.
والآن إليكم الكود:
كود:
/* * File: main.c * Author: rashad shubita * * Created on 10 ????, 2016, 12:54 ? */ #include <xc.h> // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (Power-up Timer is disabled) #pragma config CP = OFF // Code Protection bit (Code protection disabled) #define _XTAL_FREQ 4e6 //EEADR =0 for left shift && EEADR =1 for right shift void shift() { PORTB |= (1<<(EEDATA-1)); __delay_ms(1000); PORTB &= ~(1<<(EEDATA-1)); if(EEADR==0)EEDATA = EEDATA+1; if(EEADR==1)EEDATA = EEDATA-1; } void main(void) { TRISB =PORTB=TRISA=TMR0=EEDATA=EEADR= 0x00; TRISA = 0x03; while(TMR0 <= 2) { EEDATA=1; while(EEDATA <= 8)shift(); PORTB = 0x00; __delay_ms(1000); TMR0++; } EEADR=1; while(TMR0 <= 6) { EEDATA=8; while(EEDATA >= 1)shift(); PORTB = 0x00; __delay_ms(1000); TMR0++; } EEDATA=TMR0=0; // endless loop while(1) { if(PORTAbits.RA0 == 0) { PORTB =0x00; if(TMR0==0){EEDATA=0; TMR0=2; PORTB |= (1<<EEDATA); } else { EEDATA++; PORTB |= (1<<EEDATA); } if(EEDATA>7)EEDATA=-1; while(PORTAbits.RA0 == 0); } if(PORTAbits.RA1 == 0) { PORTB =0x00; if(TMR0==0){EEDATA=7; TMR0=2; PORTB |= (1<<EEDATA); } else { if(EEDATA > 0 && EEDATA <=8){ EEDATA--; PORTB |= (1<<EEDATA); } else EEDATA=8; } while(PORTAbits.RA1 == 0); } } return; }
أرجو من الأخ رشاد شرح كوده بعد الانتهاء من استعراض الأكواد.
والسلام عليكم ورحمة الله وبركاته.


التعديل الأخير تم بواسطة : محمد ع يسى بتاريخ 21-02-2016 الساعة 02:41 PM

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,040
نشاط [ محمد ع يسى ]
قوة السمعة:
قديم 21-02-2016, 02:28 PM المشاركة 63   
افتراضي إعلان عن الفائز السادس


بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
أعلن أن الفائز السادس هو المتسابق السادس عمر.
ولقد وضع كودا كاملا من 98 تعليمة.
سيخصم منه 4 تعليمات لأنه المتسابق السابع لنعتبر الكود 94 تعليمة.
ولقد اعتمت على الدوال.
والآن إليكم الكود:
كود:
void Right()
{
portb=0b00000001;delay_ms(1000);
while(portb!=0)
{
portb=portb<<1;delay_ms(1000);
}
}
void Left()
{
portb=0b10000000;delay_ms(1000);
while(portb!=0)
{
portb=portb>>1;delay_ms(1000);
}
}
void main() {
trisb=0; portb=0;delay_ms(1000);
Right();Right(); Right();
Left();Left();Left(); Left();
trisa=0b00000011;
loop:
if(porta.f0==0)
{
if(portb==0){portb=0b00000001;while(1){if(porta.f0==1){goto loop;}}}
if(portb!=0){portb=portb<<1;while(1){if(porta.f0==1){goto loop;}}}
}
if(porta.f1==0)
{
if(portb==0){portb=0b10000000;while(1){if(porta.f1==1){goto loop;}}}
if(portb!=0){portb=portb>>1;while(1){if(porta.f1==1){goto loop;}}}
}
goto loop;
}
كان الواجب عليَّ أن أخبره في الرسائل الخاصة بأن هناك تعليمات كثيرة يمكنه التخلص منها.. ولكنني للأسف فاتني ذلك.
آسف أخ عمر لنسياني ذلك وانشغالي.
والسلام عليكم ورحمة الله وبركاته.


التعديل الأخير تم بواسطة : محمد ع يسى بتاريخ 21-02-2016 الساعة 03:04 PM

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,040
نشاط [ محمد ع يسى ]
قوة السمعة:
قديم 21-02-2016, 02:36 PM المشاركة 64   
افتراضي إعلان عن الفائز السابع


بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
أعلن أن الفائز السابع هو المتسابق الخامس عبد الله حجازي.
ولقد وضع كود يؤدي الوظيفة المطلوبة على أتم وجه باستخدام 168 تعليمة بالطريقة التي نعد بها.
كما أنه سيخصم منه 6 تعليمات لأنه المتسابق الخامس ليصبح الكود 162 تعليمة.
والآن إليكم الكود:
كود:
    #define  Time  delay_ms(350);
    #define  LED   portb

          void LED_lift() {
     Time
     portb = 1;  Time  portb = 2;   Time
     portb = 4;  Time  portb = 8;   Time
     portb = 16; Time  portb = 32;  Time
     portb = 64; Time  portb = 128; Time
     portb = 0;
  }
  
         void LED_right() {

     Time
     portb = 128; Time  portb = 64; Time
     portb = 32;  Time  portb =16;  Time
     portb = 8;   Time  portb = 4;  Time
     portb = 2;   Time  portb = 1;  Time
     portb = 0;

  }
  
           void main() {

      trisb = 0;   portb = 0;
      trisa = 3;   porta = 0;
  //*************************//
  
     LED_lift();  LED_lift();
     LED_lift(); 
     
  //*************************//
    LED_right();  LED_right();
    LED_right();  LED_right();

  //************************//

         while (1) {
           loop:

    if(porta.F0==0) { LED ++;  

    if(portb==3  ) { LED = 4;  }
    if(portb==5  ) { LED = 8;  }
    if(portb==9  ) { LED = 16; }
    if(portb==17 ) { LED = 32; }
    if(portb==33 ) { LED = 64; }
    if(portb==65 ) { LED = 128;}
    if(portb>128 ) { LED = 0 ; }

   while (1) { if(porta.F0==1){ goto loop; }}}

   //***************************************//

   if(porta.F1==0) { LED --;
   
   if(portb==255 ) { LED = 128;}
   if(portb==127 ) { LED = 64; }
   if(portb==63  ) { LED = 32; }
   if(portb==31  ) { LED = 16; }
   if(portb==15  ) { LED = 8;  }
   if(portb== 7  ) { LED = 4;  }
   if(portb==3   ) { LED = 2;  }

   while (1) { if(porta.F1==1){ goto loop; }}}

  }
 }
كما أوجه شكرا خاصا للأخ عبد الله حجازي لأنه أول من تقدم بكود غير كامل حيث ساعد ذلك على إحماء المسابقة ودخول متسابقين آخرين.
والسلام عليكم ورحمة الله وبركاته.



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