بسم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
أعلن أن الفائز الثالث هو المتسابق الثاني مشتاق الله.
ولقد تقدم بكودين.. الكود الأول غير كامل ويحتوي على 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){} }
}
}
بالنسبة للسطر:
فلا أعرف ما فائدته... أظنه بلا فائدة.. لهذا لم أعده من التعليمات.
العلامة & تعتبر هناك شرط واحد.
بينما العلامة && تعتبر هناك شرطان مما يعني زيادة تعليمة إضافية.
وهذا الكود كامل من ناحية الإزاحة شمال ويمين لكنه ليس كاملا من ناحية السويتشات... فقد أخبرته في رسالة خاصة قائلا:
|
السلام عليكم ورحمة الله وبركاته.
معذرة على تأخر الرد.
إليك ملاحظاتي على كود فكرتك الأولى.
حلقة الإزاحة يمين وضعتها:
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){} }
}
}