بسم الله الرحمن الرحيم
شكرا اخى
الامر فى غاية البساطة
اولا
هذا هو الكود
كود:
char segment[] ={255,249,164,176,153,146,130};
signed char x1=-1;
char x2;
char x3;
char x4[]={32,16,8,4,2,1};
char x5[]={0,0,0,0,0,0};
void main () {
adcon1=6;trisc=0;portc=0;trisb=0;portb=0;trisa=255;trisd=255;
while(1){
x1++;
if (x1==6){x1=0;}
if(portd.f0==1) { x5[0]=0;}
if(portd.f1==1) { x5[1]=0;}
if(portd.f2==1) { x5[2]=0;}
if(portd.f3==1) { x5[3]=0;}
if(portd.f4==1) { x5[4]=0;}
if(portd.f5==1) { x5[5]=0;}
///////////////////////////////////////////////////////////////////
if(porta.f0==1) { x5[0]=1;}
if(porta.f1==1) { x5[1]=2;}
if(porta.f2==1) { x5[2]=3;}
if(porta.f3==1) { x5[3]=4;}
if(porta.f4==1) { x5[4]=5;}
if(porta.f5==1) { x5[5]=6;}
x3=x5[x1];
x2=x4[x1];
portc=x2;portb=segment[x3];delay_ms(100);portc=x2;portb=segment[0];delay_ms(50);}
}
شرح بسيط للكود ::
كود:
char segment[] ={255,249,164,176,153,146,130};
هذه المصوفة هى مصوفة ارقام ال7سيجمنت اى كل قيمة فيها عندما تطبق على البروت B يظهر رقم .
سوف تعرف فائدة -1 فى شرح الكود .
متغيريين وستعرف فائدتهم فى شرح الكود .
كود:
char x4[]={32,16,8,4,2,1};
هذه المصوفة تتحكم فى تناوب ال7سيجمنت
حيث ان كل رقم منها يعطى كهرباء لل7سيجمنت
مثلا الرقم 1 يعنى
والرقم 32 يعنى
وهكذا .... واستخدمتها فى التحكم فى البورت C .
كود:
char x5[]={0,0,0,0,0,0};
اما هذه فا فائدتها عدم اظهار 000000
ايضا سوف نغير فى ارقامها لكى نظهر الارقام وسوف تعرف الفائدة فى الشرح .
كود:
adcon1=6;trisc=0;portc=0;trisb=0;portb=0;trisa=255;trisd=255;
دى طبعا التعريفات معروفة دى .
هذا المر فائدتة زيادة المتغير x1 بنسبة 1 كل مرة
وهذا اذا ساوى 6 يصبح 0 مرة اخرى
وهنا ياتى فائدة انى جعلته يساوى -1 فى اول البرنامج
لانة عند بداية البرنامج كما ترى اول امر هو زيادة بمقدار 1
اى اننى اذا وضعته يساوى 0 اول ما يدخل جوة جملة while هيزيد قيمتة الى 1
وطبعا انا مش عايز كدة انا عايزة يساوى 0 لهذا اول ما يبدء فى دخول جملة while سوف تصبح قيمتة 0 .
كود:
if(portd.f0==1) { x5[0]=0;}
if(portd.f1==1) { x5[1]=0;}
if(portd.f2==1) { x5[2]=0;}
if(portd.f3==1) { x5[3]=0;}
if(portd.f4==1) { x5[4]=0;}
if(portd.f5==1) { x5[5]=0;}
هذه اختبرات البورت D وعند الضغط على اى زرار سوف يجعل قيمة x5 تساوى 0
وطبعا دة على حسب الترتيب فى المصفوفة .
اما هذا
كود:
if(porta.f0==1) { x5[0]=1;}
if(porta.f1==1) { x5[1]=2;}
if(porta.f2==1) { x5[2]=3;}
if(porta.f3==1) { x5[3]=4;}
if(porta.f4==1) { x5[4]=5;}
if(porta.f5==1) { x5[5]=6;}
فهو يغير المصوفة على حسب كل زرار برقمة يعنى رقم 1 يجعل اول خانة فى المصوفة يساوى 1 ورقم 2 يجعل ثانى خانة تساوى 2 وهكذا....
اما هذا فهو عصب العملية كلها
هنا جعل x3 تساوى الرقم الذى سوف يوضع فى المصوفة بتاعت ارقام ال 7سيجمنت
سوف اوضح اكثر
هنا جعلت x3 تساوى الرقم الذى يكون فى خانة المصوفة x5 على حسب مقدار x1
بمعنى اذا ضغط انت على زر من الازرار البورت A سوف يغير من قيمة خانة فى المصفوفة كما فى الاعلى وليكن الخانة الاولى
كود:
if(porta.f0==1) { x5[0]=1;}
هنا اصبحت الخانة الاولى من المصفوفة x5 تساوى 1
اذن لما x1 يساوى 0 اى الخانة الاولى فى المصوفة سوف تكون x3 =1
وهذا كله من اجل اختيار الارقام التى سوف تظهر على 7 سيجمنت .
اما هذا
فهى نفس الكلام
زى الى فوق لكن الفرق ان x4 مصفوفة مسؤلة عن الاطراف بتاعت بورت C
يعنى بنتحكم فى انهى شاشة هيظهر عليها العرض زى ما قولت فوق
ناتى داله العرض وهى التى تجعلا لفلاش يحدث
كود:
portc=x2;portb=segment[x3];delay_ms(100);portc=x2;portb=segment[0];delay_ms(50);
وهى مقسمة لجزئين اول جزء
كود:
portc=x2;portb=segment[x3];delay_ms(100);
وهنا يتم جعل PORTC يساوى x2 زى ما قولتلك فوق
ويتم جعل PORTB يساوى x3 علشان يعرض زى ما قولتلك
وبعد كدة امر انتظار
وكل هذا طبيعى اما ما يحدث الفلاشر هو هذا المر
كود:
portc=x2;portb=segment[0];delay_ms(50);
وهنا جعلت البورت سى هو هو ولكن جعلت ال7سيجمنت تساوى 0 اى لا تعرض شىء
وهنا يحدث انها تظهر الرقم وبعد ذلك تغلقة ويتم ذلك باستمرار على مدار 6 ارقام
وكل هذا ايضا مع اختبار الازرار بسرعه
ولهذا قلت لك لا تاخر الوقت عن 200 مللى حتى يتم اختبار الازرار بسرعه
وفائدة عمل زيادة x1 باستمرار انه فى كل مرة سوف يعرض رقم محدد
يعنى x1 بتساوى 2 يبقى ترتيب الرقم 2 فى المصفوفة x5 مثلا 3 وهذا بعض ان ضغط على الزرار اذن x3 تساوى 3 اذن ترتيب الرقم 3 فى المصوفة segment هو 176 وهذا ما سوف يعرض وهكذا مع البروت C
واذا لم تفهم تابع المشاركة القادمة واعذرنى انا عارف شرحى صعب
وغير مفهوم