|
اخي ممكن عمل شرح في .txt
و ارفقه و انا ساحمل لاني فعلا حاولة و لم افهم الامر و شرحكم كما عودتني يسهل علي الامر
تحياتي
|
اخي كريم
اذا دخا مايكرو في وضع sleep فأنه لايمكن ان يعود مايكرو للعمل الا عن طريق انتربت وبطبع تايمرات كلها سوف تتوقف لان هزاز او كرستاله سوف تتوقف وبطبع هنا سوف نستخدم سويج على RB0 ونقون بتفعيل انتربت اي مقاطعه عند حدوث تغير جهد على RB0
INT0IE_bit=1;//Enables the INT0 external interrupt
INTEDG0_bit=0;//Interrupt on falling edge
وبالطبع يجب جعل RB0 هو دخل
trisb=1; // RB0 is input
وبالطبع عند ضغط على سويج on_off سوف يحدث انتربت ولهذا انا لم أكتب شيئ عند ضغط على سويج سوى امر تاخير
if(sw_on_off==0) delay_ms(200);// happend interrupts
بعد الضغط على سويج تجري عده عمليات
في داله انتربت
if(INT0F_bit==1)
{
on_off=~on_off;
INT0F_bit=0;
}
هنا متغير on_off سوف يصبح اما 255 او 0 وعندما يصبح 255 يحدث التالي
if(on_off==255 && state_on_off==0 )
{
sw_dec_flag_sleep=1;
sw_dec_cont_sleep =0;
porta=0;
portb=0;
portc=0;
portd=0;
transfer_display=6;
state_on_off=1;
kk=0;
}
حيث بالبدايه state_on_off =0 وبتالي سوف يتم تفعيل sw_dec_flag_sleep لغرض اعطاء وقت كافي لاظهار رساله OFF على سفن سكمنت
ايضا تلاحظ جعلنا كل بورتات =0 لكي نطفئ كل شيئ لان يورت يبقى شغال لانه يحتفظ بالقيمه لذا وجب أطفاء كل احمال
ومن ثم state_on_off=1 حتى لايدخل مايكرو لتنفيذ هذه اوامر بأستمرار لان مطلوب منه تنفيذها مره واحده فقط
وهنا تلاحظ كتبنا transfer_display=6 وذلك لغرض اظهار كلمه OFF على سفن سكمنت
وبالطبع لابد من جعل kk=0 حتى يتوقف عن تنفيذ اوامر اخرى التي لها علاقه مع KK
وهذه لاظهار رساله off
else if(transfer_display==6)
{
for(x=0;x<8;x++) //
{
if(Check_bit(message_off[colomn] ,7-x))DS1=1;
else DS1=0;
SH1=0;SH1=1;
}
}
'طبعا مصفوفه message_off
هي
const char message_off[]={192,142,142,255,255,255};// 192 : O , 142 F , 255 off 7seg
===============================================
بعد أنتهاء وقت يتم تنفيذ هذا الكود
else if(on_off==255 && state_on_off==1 && sw_dec_cont_sleep>2500)
{
sw_dec_flag_sleep=0;
sw_dec_cont_sleep=0;
storeing_data();// storing data before stand by becaues if press sw_on_off without storing will losses data (price)
transfer_display=7;
}
في هذا الكود شيئ مهم هو
لانه اثناء مايكون العداد شغال ومن ثم يتم الضغط على سويج ON_OFF فأنه سوف نخسر البيانات مسجله وعليه هنا نخبره قبل ماتطفئ جهاز قم بخزن البيانات السعر في ايبروم
طبعا عندنا خطأ وهو اثناء تشغيل جهاز سوف تكون ليدات مطفيه يعني أقصد ليد خزن داتا (( السعر و مسافه )) ولكن يمكنك تشغيلها بأضافتها الى الكود الذي سنذكره لاحقا
ومن ثم سوف نجعل transfer_display=7 وهذه مهمتها أطفاء سفن سكمنت بالكامل
else if(transfer_display==7)
{
for(x=0;x<8;x++) //
{
if(Check_bit(message_shut_down[colomn] ,7-x))DS1=1;
else DS1=0;
SH1=0;SH1=1;
}
if(colomn==5)
{
state_on_off=0;// reset
kk=255;
colomn=0;
start=0;
show_speed_price=0;
start2=0;
transfer_display_cont=5000;
asm sleep;
}
}
طبعا مصفوفه message_shut_down
const char message_shut_down[]={255,255,255,255,255,255};// 192 : O , 142 F , 255 off 7seg
وعند اطفاء كل سفن سكمنت السته وعندها colom=5
نصفر كل متغيرات اساسيه
ومهم في الامر هو هذا الامر transfer_display_cont=5000;
لماذا لكي يقوم بتشغيل سفن سكمنت مباشره بعد ضغط سويج ON_OFF والا فانه سفن سكمنت لن تعمل لمده 10 ثواني لان 5000 تعني زمن 10 ثواني
والامر asm sleep سوف يدخل مايكرو في نوم عميق
وعندما نعيد الضغط على سويج ON_OFF سوف يحدث انتربت مره اخرى فسيستقيظ
مايكرو ويصبح متغير ON_OFF=0