الله يبارك فيك وبكل من يحاول تقديم المساعدة لاي شخص في هذا المنتدى اخي انا لااكتب على البك ولكن ساشرح لك البرنامج وان كانت عندك خبرة ولو بسيطة ستستطيع تحويل البرنامج الى البك او يقوم احد الاخوة بتحويله لك الفرق فقط على مااعتقد بتهيئة الدخل والخرج والتايمر اما باقي الاوامر فهي نفسها نحن سنقوم بتفعيل التايمر لعمل مقاطعة كل ثانية وقد هيئنا لكل مفتاح بت ومتحول من نوع انتجر وقلنا عند الضغط على اي مفتاح سيقوم المايكرو بتشغيل المخرج الخاص في المفتاح وتحويل البت الخاص بالمفتاح من 0 الى واحد وداخل مقاطعة التايمر قلنا انه عندما تكون قيمة اي بت من هذه البتات =1 سيقوم باضافة واحد للمتحول الخاص بالمفتاح وطالما ان قيمة البت =1 فكل ثانية سيقوم باضافة واحد للمتحول وعند الوصول الى القيمة اللتي حددناها سيقوم المايكرو باطفاء المخرج وتصفير البت وتصفير المتحول الخاص به
كود:
#include <mega8.h>
unsigned int x=0,x1=0,x2=0,x3=0,x4=0,x5=0; // المتحولات نوع انتجر
bit u=0,u1=0,u2=0,u3=0,u4=0,u5=0; // البتات الخاصة بكل مفتاح
interrupt [TIM1_OVF] void timer1_ovf_isr(void) // مقاطعة التايمر تحدث
//كل ثانية
{
TCNT1H=0xE17A >> 8;
TCNT1L=0xE17A & 0xff;
if(u==1) x++; // عند الضغط على احد المفاتيح وتحول احد هذه البتات
if(u1==1)x1++; // ال 1 سنقوم باضافة 1 للمتحول كل ثانية
if(u2==1)x2++;
if(u3==1)x3++;
if(u4==1)x4++;
if(u5==1)x5++;
}
void main(void)
{
PORTB=0xFF; // تهيئة المداخل والمخارج
DDRB=0x00;
PORTC=0x00;
DDRC=0x7F;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xE1;
TCNT1L=0x7A;
TIMSK=0x04;
#asm("sei")
while (1)
{
if(PINB.0==0){PORTC.0=1;u=1;} //عند الضغط على المفتاح سيعمل
//المخرج وسيتحول البت من الصفر الى الواحد ليبدأ العد في التايمر
if(x==5){u=0;x=0;PORTC.0=0;} //عند وصول المتحول الى عدد الثواني
//المطلوبة نصفر البت لوقف العد ونصفر المتحول ونطفئ المخرج
if(PINB.1==0){PORTC.1=1;u1=1;}
if(x1==10){u1=0;x1=0;PORTC.1=0;}
if(PINB.2==0){PORTC.2=1;u2=1;}
if(x2==15){u2=0;x2=0;PORTC.2=0;}
if(PINB.3==0){PORTC.3=1;u3=1;}
if(x3==20){u3=0;x3=0;PORTC.3=0;}
if(PINB.4==0){PORTC.4=1;u4=1;}
if(x4==25){u4=0;x4=0;PORTC.4=0;}
if(PINB.5==0){PORTC.5=1;u5=1;}
if(x5==30){u5=0;x5=0;PORTC.5=0;}
}
}