ندخل في قائمه while
كود:
if(only_display_one==1)// this mean display message only one
{
lcd_out(1,1,"Press Button" );
only_display_one=0;
}
هذه رساله سوف تظهر لنا عند أكتمال التهيئه ومهمه متغير only_display_one
هو يعرض رساله مره واحده داخل قائمه while حتى لانكرر كتابه مرات على شاشه
=================================================
كود:
if(measuring_switch==0 )//Now press switch but must be srart=0 ;
{
LCD_cmd(1);
lcd_out(1,1,"WAIT PLEASE");
delay_ms(20);// to remove debounce
while(measuring_switch==0);
delay_ms(20); //to remove debounce
if(distance !=0xFFFF){
distance= HCSR04_Read() *10 ;// using 10 //For the purpose of the display values accurately
// note function HCSR04_Read() return distance measuring in mm unit
// this mean if using real value for distance must be divide by 100 the result in cm
distance_display(2);
}
else distance_display(1);
}
كود بلون احمر داله شرطيه تختبر هل تم ضغط على سويج اذا كان نتيجه اختبار لا فلايقوم مايكرو بتنفيذ اي شي
اما اذا تم ضغط على سويج
كود:
LCD_cmd(1);
lcd_out(1,1,"WAIT PLEASE");
هنا أخبرته مسح شاشه وكتب رساله جديده WAIT PLEASE
كود:
delay_ms(20);// to remove debounce
while(measuring_switch==0);
delay_ms(20); //to remove debounce
هنا انتظر زمن 20 ملي ثانيه ثم أختبر هل لايزال سويج مضغوط لاحظو كود بلون أحمر اذا كان جواب نعم فان مايكرو سوف يبقى مشغول بتنفيذ اوامر while وطبعا لايوجد اي شيء ينفذه
حالما يتم رفع ضغط عن سويج انتظر زمن مره اخرى ليكن 20 ملي ثانيه
مافائده هذا الكود اولا لتخصل من bounce وهي ان سويج لحظه ضغط عليه مفروض يعطي 0 او 1 حسب طريقه ربطه الا انه في حقيقه لايحدث ذلك مباشره لانه لحظه ضغط على سويج سوف يتغير من 0 الى 1 ومن 1 الى 0 بسرعه كبيره ولكن لبرهه من زمن ثم تستقر حاله سويج ولهذا وضعنا زمن 20 ملي لضمان استقرار سويج
اما
كود:
while(measuring_switch==0)
فهو يعني لاتقم بتنفيذ شيئ حتى تبعد يدك عن سويج
اما زمن 20 ملي ثانيه ثاني هو ايضا لضمان استقرار سويج لانه عندما ترفع اليد عن سويج يحدث تقلبات في سويج من 0 الى 1 ومن 1 الى 0 الى ان يستقر
https://www.google.iq/search?q=bounc...2F%3B550%3B450
=============================================
كود:
distance= HCSR04_Read();
هنا يتم قراءه مسافه من مكتبه حساس وهي بترجع قيمه اما قيم عاديه او 0XFFFF وهذه قيم تعني ان زمن رجوع الاشاره الى حساس تجاوز 36ms وهذا يعني لايوجد جسم
=======================================
كود:
if( distance !=0xFFFF){
distance=distance*10;
// using 10 //For the purpose of the display values accurately
// note function HCSR04_Read() return distance measuring in mm unit
// this mean if using real value for distance must be divide by 100 the result in cm
distance_display(2);
}
هنا نختبر هل distance !=0XFFFF
!= تعني لايساوي
فاذا كان جواب نعم
distance=distance*10 لماذا ضربت نتيجه في 10
سوف نبينه بعد قليل
وبعدها أستدعي هذه داله
كود:
distance_display(2);
اما اذا كان جواب لا
استدعي هذه داله
كود:
else distance_display(1);
================================================
نشرح هذه داله
كود:
void distance_display(char state)
{
lcd_cmd(1);
if(state==1)lcd_out(1,1,"NOT OBJECT DETE.");
else if(state==2)
{
lcd_out(1,1,"DIST=");
// eample distance =123.45 now cancel . then distance=12345
txt[0]=(distance/10000 )+48; // 12345/10000=1.2345 =1
txt[1]=(distance/1000)%10 +48;//12.345 =12 %10=2
txt[2]=(distance/100)%10 +48;//123.45 =123 %10=3
txt[4]=(distance/10 )%10 +48;//1234.5 =1234 %10=4
txt[5]=distance%10 +48;// %10 from distance =5
lcd_out_cp(txt);
}
only_display_one=1;
delay_ms(1000);// wait for see distance in display
}
داله تاخذ متغير
اذا كان متغير =1 معناه اعرض هذه رساله
كود:
if(state==1)lcd_out(1,1,"NOT OBJECT DETE.");
وهذا يعني لايوجد اي جسم
اما اذا كان متغير=2
فهنا نعرض قيمه مسافه
نحيطكم علما ان مكتبه حساس ترجع قيمه بملي ميتر وليس بــ cm
هذا هو شكل رساله التي تظهر فيها مسافه
كود:
char *txt="000.00cm";
طبعا تلاحظون وجود فارزه عشريه وعلامه تظهر cm
خلونا نفترض حساس رجع هذه قيمه لنفهم كيف تعرض البيانات
distance=100.50mm
اذن راح أضربها في 10 (( هذه قيمه فقط عند العرض ولكن عند استقاده من قيمه distance في تنفيذ اوامر معينه علينا أعاده قسمه على 10 ))
الغايه منها للحصول على الارقام بعد فارزه عشريه لان distance منتغير من نوع long وهو لايأخذ الارقام عشريه ولهذا عليه بضرب نتيجه للحصول على الارقام بعد عشريه
distance=100.50 *10=1005.0
نتيجه بتظهر على شاشه
010.5cm
لكن لو لم أضربه في 10 سوف أحصل فقط على 10cm
وهذه طريقه عرض البيانات
كود:
lcd_out(1,1,"DIST=");
// eample distance =123.45 now cancel . then distance=12345
txt[0]=(distance/10000 )+48; // 12345/10000=1.2345 =1
txt[1]=(distance/1000)%10 +48;//12.345 =12 %10=2
txt[2]=(distance/100)%10 +48;//123.45 =123 %10=3
txt[4]=(distance/10 )%10 +48;//1234.5 =1234 %10=4
txt[5]=distance%10 +48;// %10 from distance =5
lcd_out_cp(txt);
ارجو مراجعه الكود فقد وضعت تعليق للدلاله على كيفيه عمله
بعد تعرض القيمه على الشاشه
ننتظر زمن
وهو زمن بقاء قيمه مسافه على شاشه
طبعا نحن مسحنا الرساله Press Button
وهنا سوف نجعل متغير only_display_one=1 وبتالي سوف يعرض لنه رساله Press Button مره واحده فقط