منتديات الالكترونيات العصرية  
yoursite.com page title .

استرجاع كلمة المرور طلب كود تفعيل العضوية تفعيل العضوية
العودة   منتديات الالكترونيات العصرية > منتدى الحاكمات الدقيقة Microcontroller > منتدى المتحكمات ميكرو بلغة السي MikroC > منتدى مشاريع البرمجه بلغة السي Mikro C

  #11  
قديم 09-12-2019, 10:19 PM
الصورة الرمزية F.Abdelaziz
F.Abdelaziz F.Abdelaziz غير متواجد حالياً
استاذ الكترونيان
 
تاريخ التسجيل: May 2009
المشاركات: 2,701
معدل تقييم المستوى: 22
F.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to behold
افتراضي رد: شرح ساعة وقت وتاريخ تستخدم pic16f877a و ds130

القسم الثانى : استخدام المفاتيح للتحكم فى العرض
يحتوى البرنامج على أربعة مفاتيح : المفتاح Button1 يعمل بنظام القائمة لعرض التاريخ (يوم وشهر) ، وعرض الثوانى ، والعودة لعرض الزمن (ساعة ودقائق) . والمفتاح Button2 يساعد فى عملية ضبط الساعة وهو يعمل أيضا بنظام القائمة لعرض كل من الزمن والتاريخ والعام فى شكل وامض لتغييرها عن طريق المفتاح Button1 ، وحفظ التغييرات . والمفتاح Button3 لعرض الزمن أو الخروج من عملية ضبط الساعة من دون حفظ التغييرات . والمفتاح Button4 لعرض العام year .

1- المفتاح Button1 :


كود:
 if (Button1 == 0 && Button2 == 0){hold = 1;}
		//Button1////////////////////
if (Button1 == 1 && hold == 1)  //Show Date & Second
        {
           hold = 0;
           convert = GotoDate;  //Goto Interrupt
           MenuDateSecond();   //Goto MenuDateSecond();
           //break;
        }
/////////////////////////////////////

if (convert == GotoDate)    //A-Show Date(Date & Month)
     {
        portd = 1;   portb = date_d1;       delay_ms(1);
        portd = 2;   portb = date_d2 + 128; delay_ms(1);//128 to DP on  d1d2.m1m2
        portd = 4;   portb = month_d1;      delay_ms(1);
        portd = 8;   portb = month_d2;      delay_ms(1);
     }


• فى الحالة الابتدائية يكون دخل كل من المفتاح Button1 و Button2 فى الحالة المنخفضة ويتم تذكر هذه الحالة بجعل المتغير hold=1 :

كود:
if (Button1 == 0 && Button2 == 0){hold = 1;}

• عند الضغط على المفتاح Button1 يتحقق شرط العبارة :

كود:
if (Button1 == 1 && hold == 1)  //Show Date & Second

نتيجة لذلك يتم تصفير المتغير hold=0 ثم يتم :
أ*- عرض بيانات التاريخ (يوم وشهر) . لاحظ إضافة العدد 128 لإضاءة ليد النقط العشرية DP لتوضيح العرض:

كود:
 if (convert == GotoDate)    //A-Show Date(Date & Month)
     {
        portd = 1;   portb = date_d1;       delay_ms(1);
        portd = 2;   portb = date_d2 + 128; delay_ms(1);//128 to DP on  d1d2.m1m2
        portd = 4;   portb = month_d1;      delay_ms(1);
        portd = 8;   portb = month_d2;      delay_ms(1);
     }


ب*- بعد ذلك يتم الدخول إلى دالة عرض قائمة التاريخ والثوانى :

كود:
 MenuDateSecond();   //Goto MenuDateSecond();

فى هذه الدالة يتم إعلان متغير العداد set وتعينه بالصفر (تصفيره)
char set;

كود:
  set = 0;

ثم الدخول إلى حلقة غير منتهية وفيها يتم :
• تحديث البيانات باستدعاء دوال إنشاء الساعة :

كود:
   ReadI2C();
  Hour12_AM_PM();
 TransformTime();
 DisplayTime();


• عند الضغط على المفتاح Button1 يتم تزايد العداد set بواحد وبناء على ذلك يتم اتخاذ القرارات :
1- إذا كان set=0 يتم عرض التاريخ Date .
2- إذا كان set=1 أى الضغطة التالية يتم عرض الثوانى Second .
3- إذا كانت set>1 إى بعد الضغطة التالية يتم العودة لعرض الزمن والخروج من الحلقة الغير منتهية .
4- إذا كانت set>=1 وتم الضغط على المفتاح Button2 يتم تصفير الثوانى وحفظ الزمن والتاريخ والسنة .

كود:
//----Show Date & Second for Button1-------------------//
void MenuDateSecond()
{
     char set;
     set = 0;
     while(1)
     {
        ReadI2C();
        Hour12_AM_PM();
        TransformTime();
        DisplayTime();
        //DateSecond(set);//set=0 >> GotoDate , set=1 >> GotoSecond , set>1 >> GotoTime

        if (Button1 == 0){hold = 1;}
        if (Button1 == 1 && hold == 1)
        {
           hold = 0;
           set++;
		   /////////////
if(set==0) convert = GotoDate;
if(set==1) convert = GotoSecond;
		   ///////////
           if (set > 1)
           {
              delay_ms(2);
              convert = GotoTime;   //Goto Time in Interrupt
              break;
           }
        }
        //-----------------------------//
        if (set >= 1)
        {
           if (Button2 == 1) //---Second = 0
           {
              second = 0;
              SaveTime();   //---Save Time
           }
        }
     }
}

• دالة حفظ الزمن هى دالة كتابة إلى الشريحة ds1307 بعد تحويل البيانات المحدثة من النظام العشرى إلى النظام الثنائى المكود عشرى :

كود:
//----Save Time & Date for Change------------------//
void SaveTime()
{
     i2c1_start();
     i2c1_wr(0xd0);
     i2c1_wr(0);

     i2c1_wr(dec2bcd(second));
     i2c1_wr(dec2bcd(minute));
     i2c1_wr(dec2bcd(hour));
     i2c1_wr(dec2bcd(day));
     i2c1_wr(dec2bcd(date));
     i2c1_wr(dec2bcd(month));
     i2c1_wr(dec2bcd(year));
     i2c1_stop();
}
رد مع اقتباس
  #12  
قديم 09-13-2019, 04:03 PM
الصورة الرمزية F.Abdelaziz
F.Abdelaziz F.Abdelaziz غير متواجد حالياً
استاذ الكترونيان
 
تاريخ التسجيل: May 2009
المشاركات: 2,701
معدل تقييم المستوى: 22
F.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to beholdF.Abdelaziz is a splendid one to behold
افتراضي رد: شرح ساعة وقت وتاريخ تستخدم pic16f877a و ds130

2- المفتاح Button2 :
فى البداية يعمل مثل المفتاح Button1 حتى يتم استدعاء دالة قائمة تغيير الزمن والتاريخ والعام MenuChangeTime .


كود:
if (Button1 == 0 && Button2 == 0){hold = 1;}

//Button2////////////////////////////
        if (Button2 == 1 && hold == 1)
        {
           hold = 0;
           convert = GotoTime;   //Goto Time in Interrupt
           MenuChangeTime();

////////////////////////////////////////////////////////////////////////////////////////////////////
//----Change Time & Date for Button2----------------------//
void MenuChangeTime()
{
     char set;
     set = 0;
     while(1)
     {
        DisplayTime();// update after off for flashing item  
        SetChangeTime(set);////flashing item >>> set=0:hour, set=1:minute, set=2:date, set=3:month, set=4:year

        if (Button2 == 0){hold = 1;}
        if (Button2 == 1 && hold == 1)
        {
           hold = 0;
           set ++;
		   
           if (set > 4)   //Save Time
           {
              convert = GotoTime;   //Goto Time in Interrupt
              second = 0;
              SaveTime();
              break;
           }
		   
           if (set > 1) convert = GotoDate;   //Goto Interrupt
           if (set > 3) convert = GotoYear;   //Goto Interrupt
        }
		
        if (Button1 == 1)      //Time & Date ++
        {
           //SetChangeTime(set);//flashing item >>> set=0:hour, set=1:minute, set=2:date, set=3:month, set=4:year
           ChangeTime(set, 0); //Time & Date ++ sccording to set value : hr, min , date ,....
        }

        if (Button3 == 1)   //No Save, Goto Normal Time
        {
           convert = GotoTime;   //Goto Time in Interrupt
           break;
        }
     }
}

//////////////////////////////////////////////////////////////////////////////////////

• فى بداية هذه الدالة يتم إعلان متغير عداد القائمة set وتصفيره والدخول إلى حلقة غير منتهية .

كود:
 //----Change Time & Date for Button2----------------------//
void MenuChangeTime()
{
     char set;
     set = 0;
     while(1)
     {

• فى هذه الحلقة يتم استدعاء دالة عرض الزمن DisplayTime() لتحديث العنصر المعروض لتوصيل بياناته بعد عمل عملية فصلها لنحصل على وميض العنصر المطلوب بالدالة SetChangeTime(set)

كود:
DisplayTime();// update after off for flashing item  

SetChangeTime(set);////flashing item >>> set=0:hour, set=1:minute, set=2:date, set=3:month, set=4:year

• عند الضغط على المفتاح Button2 يتم زيادة عداد القائمة set بواحد عند كل ضغطة

كود:
  if (Button2 == 0){hold = 1;}
        if (Button2 == 1 && hold == 1)
        {
           hold = 0;
           set ++;

• تبعا لقيمة المتغير set ( تساوى القيمة 1 أو 2 أو 3 أو 4 ) يتم اتخاذ القرارات وفقا للدالة SetChangeTime(set) حيث يتم فصل العنصر المحدد والتأخير لمدة 500 ملى ثانية ثم إعادة توصيله بالدالة DisplayTime() لنحصل على وميض هذا العنصر (الساعات على سبيل المثال)

كود:
//----Change Time & Date for Button2----------------------//
void SetChangeTime(char set)
{
     switch(set)
     {
        case 0:
             hour_d1 = hour_d2 = 0xff;     delay_us(500);
             break;
        case 1:
             minute_d1 = minute_d2 = 0xff; delay_us(500);
             break;
        case 2:
             date_d1 = date_d2 = 0xff;     delay_us(500);
             break;
        case 3:
             month_d1 = month_d2 = 0xff;   delay_us(500);
             break;
        case 4:
             year_d3 = year_d4 = 0xff;     delay_us(500);
             break;
     }
}

• إذا كانت set > 4 يتم العودة لعرض الزمن (ساعة ودقيقة) ، وتصفير الثوانى second وحفظ التغيرات والخروج من الحلقة الغير منتهية .

كود:
if (set > 4)   //Save Time
           {
              convert = GotoTime;   //Goto Time in Interrupt
              second = 0;
              SaveTime();
              break;
           }

• إما إذا حدث أثناء الوميض (set =1 : set =4) أن تم الضغط على المفتاح Button1 فإنه يتم إستدعاء دالة تغيير العنصر المعروض ChangeTime لزيادة قيمته بواحد عند كل ضغطة :

كود:
            if (set > 1) convert = GotoDate;   //Goto Interrupt
           if (set > 3) convert = GotoYear;   //Goto Interrupt
        }
		
        if (Button1 == 1)      //Time & Date ++
        {
           //SetChangeTime(set);//flashing item >>> set=0:hour, set=1:minute, set=2:date, set=3:month, set=4:year
           ChangeTime(set, 0); //Time & Date ++ sccording to set value : hr, min , date ,....
        }

• فى أى لحظة يتم فيها الضغط على المفتاح Button3 يتم العودة لعرض الزمن (ساعة ودقائق) من دون حفظ التغييرات والخروج من الحلقة الغير منتهية :

كود:
 if (Button3 == 1)   //No Save, Goto Normal Time
        {
           convert = GotoTime;   //Goto Time in Interrupt
           break;
        }


////////////////////////////////////////////////////////////////////////////////////////////////////////
المفتاح Button3 والمفتاح Button4 تعمل بالطريقة العادية :
• الضغط على المفتاح Button3 يعرض الزمن (الساعة والدقائق) .
• الضغط على المفتاح Button4 يعرض العام year .

كود:
if (Button3 == 1)
        {
           convert = GotoTime;   //Goto Time in Interrupt
        }
		/////////////////////
        if (Button4 == 1)
        {
           convert = GotoYear;  //Goto Year in Interrupt
           delay_ms(10);
        }
رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)

أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة



الساعة الآن 11:51 PM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
الحقوق محفوظة لمنتديات الاليكترونيات العصرية

Security team

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77