قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

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

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 06-07-2017, 06:04 AM المشاركة 1   
افتراضي اقدم لكم عداد تصاعد مسبوق الضبط بستخدام 7SEGMENT Twitter FaceBook Google+



السلام عليكم ورحمه الله ..

تحياتي للجميع ..
أقدم لكم مشروع عداد تصاعدي بستخدام شاشه ال 7SEGMENT >>

مميزات العداد ..
هو عداد مسبوق الضبط يمكنك ضبط العداد علي أي رقم وتشغيل العداد وعند الوصول الي هذا الرقم يتم تنبيهك بهذا ويتوقف العداد ..
وايضااا جميع البينات الموجوده علي الشاشات لا يتم فقدانها حتي في حاله فصل التيار عن الدائرة وذالك لإستخدام الذاكرة الدائمه .. في الميكرو كنترولر .. ايبروم ..

يوجد عدد من اليدات لكي تخبر المستخدم بحاله سير البرنامج وما يتطلب فعله ..

اليكم المشروع ..





كود البرنامج ..

اللغه المستخدمه هي ( C ) المترجم ميكرو سي برو ..


كود:
        
            // ENG _ ABDALLA HYGAZY  //
      
           // DATA _ 2017 / 7 / 6  //
      
     // Counter program using  7SEGMENT  //
    
    //  Save all data in  eeprom memory //
      
      unsigned short mask(unsigned short num);
      unsigned int SEGMENT1=0,SEGMENT2=0,SEGMENT3=0,SEGMENT4=0,SEGMENT5=0,X=0,START=0,OUT_LOOP=0,CONTER=0;
      unsigned int COPY_SEGMENT1=0,COPY_SEGMENT2=0,COPY_SEGMENT3=0,COPY_SEGMENT4=0,X1=0,X2=0,X3=0;
     
    #define  BUZZER  PORTD.F7=1; delay_ms(40); PORTD.F7=0; delay_ms(30); PORTD.F7=1; delay_ms(40); PORTD.F7=0;
    #define  button  PORTD.F7=1; delay_ms(20); PORTD.F7=0; delay_ms(10); PORTD.F7=1; delay_ms(20); PORTD.F7=0;
    #define TEMER2        delay_ms(30);
    #define TEMER_conter  delay_ms(30);
    #define TEMER3        delay_ms(300);
    //.......................................................................
    #define LED_SEGMENT1  PORTC.F0=1;  PORTC.F1=0; PORTC.F2=0; PORTC.F3=0;
    #define LED_SEGMENT2  PORTC.F1=1;  PORTC.F0=0; PORTC.F2=0; PORTC.F3=0;
    #define LED_SEGMENT3  PORTC.F2=1;  PORTC.F0=0; PORTC.F1=0; PORTC.F3=0;
    #define LED_SEGMENT4  PORTC.F3=1;  PORTC.F0=0; PORTC.F1=0; PORTC.F2=0;
    #define SEGMENTS_OFF  SEGMENT1=0;  SEGMENT2=0; SEGMENT3=0; SEGMENT4=0;
    #define LED_OFF       PORTC.F0=0;  PORTC.F1=0; PORTC.F2=0; PORTC.F3=0;
    #define COPY_SEGMENT_delete     COPY_SEGMENT1=0;  COPY_SEGMENT2=0; COPY_SEGMENT3=0;  COPY_SEGMENT4=0;
    //.......................................................................
    #define Test_the_values_of_screens   if(SEGMENT1==COPY_SEGMENT1&&SEGMENT2==COPY_SEGMENT2&&SEGMENT3==COPY_SEGMENT3&&SEGMENT4==COPY_SEGMENT4){ BUZZER BUZZER  X2=1; START=0; OUT_LOOP=1;}
   //........................................................................
    #define  Clear_the_screens   if(PORTD.F3==1){ button   delay_ms(200);if(PORTD.F3==0){goto loop;} button if(PORTD.F3==1){ delay_ms(150); if(PORTD.F3==1){ eeprom_DATA_Clear(); X2=0; PORTC.F4=0; COPY_SEGMENT_delete  SEGMENTS_OFF button button button  }   }}
      void interrupt(){
      
     PORTA=1;  PORTB=mask(SEGMENT1); delay_ms(2);
     PORTA=2;  PORTB=mask(SEGMENT2); delay_ms(2);
     PORTA=4;  PORTB=mask(SEGMENT3); delay_ms(2);
     PORTA=8;  PORTB=mask(SEGMENT4); delay_ms(2);
     PORTA=16; PORTB=mask(SEGMENT5); delay_ms(2);
     //....................................
     if(SEGMENT1>10){SEGMENT1=0;}
     if(SEGMENT2>10){SEGMENT2=0;}
     if(SEGMENT3>10){SEGMENT3=0;}
     if(SEGMENT4>10){SEGMENT4=0;}
    //....................................
     if(COPY_SEGMENT1>10){COPY_SEGMENT1=0;}
     if(COPY_SEGMENT2>10){COPY_SEGMENT2=0;}
     if(COPY_SEGMENT3>10){COPY_SEGMENT3=0;}
     if(COPY_SEGMENT4>10){COPY_SEGMENT4=0;}
    //....................................
    



     
    INTCON=0b00100000;
    TMR0=0;
 }
     
      void eeprom_DATA_Clear() {
     eeprom_write(0,0);
     eeprom_write(1,0);
     eeprom_write(2,0);
     eeprom_write(3,0);
    }





      void main() {
      TRISB=0; PORTB=0; TRISD=15; PORTD=0;
      TRISC=0; PORTC=0; TRISA=0; PORTA=0;
      adcon1=0x06;
      OPTION_REG=0x81;  INTCON=0b10100000;
      TMR0=217;
     //*******************************************//
      COPY_SEGMENT1 = eeprom_read(0);delay_ms(5);
      COPY_SEGMENT2 = eeprom_read(1);delay_ms(5);
      COPY_SEGMENT3 = eeprom_read(2);delay_ms(5);
      COPY_SEGMENT4 = eeprom_read(3);delay_ms(5);  //eeprom_read DATA  read && write
      SEGMENT1  = COPY_SEGMENT1 ;
      SEGMENT2  = COPY_SEGMENT2 ;
      SEGMENT3  = COPY_SEGMENT3 ;
      SEGMENT4  = COPY_SEGMENT4 ;
     //*****************************************//
      //........................................................................................................
         BUZZER
        while(1){
        loop:
        if( PORTD.F2==1     ){button START=1; X2=0; LED_OFF    TEMER2}
        if( PORTD.F1==1     ){ X++;                           TEMER2}
        if(X==1&&PORTD.F0==1){ SEGMENT1++; COPY_SEGMENT1++; eeprom_write(0,COPY_SEGMENT1);     TEMER2 } // Select the numbers and display them on (7SEGMENT1 )
        if(X==2&&PORTD.F0==1){ SEGMENT2++; COPY_SEGMENT2++; eeprom_write(1,COPY_SEGMENT2); TEMER2 } // Select the numbers and display them on (7SEGMENT2 )
        if(X==3&&PORTD.F0==1){ SEGMENT3++; COPY_SEGMENT3++; eeprom_write(2,COPY_SEGMENT3); TEMER2 } // Select the numbers and display them on (7SEGMENT3 )
        if(X==4&&PORTD.F0==1){ SEGMENT4++; COPY_SEGMENT4++; eeprom_write(3,COPY_SEGMENT4); TEMER2 } // Select the numbers and display them on (7SEGMENT4 )
       //......................................................................
        if(X==1){ LED_SEGMENT1 } // To select a screen LED (1)
        if(X==2){ LED_SEGMENT2 } // To select a screen LED (2)
        if(X==3){ LED_SEGMENT3 } // To select a screen LED (3)
        if(X==4){ LED_SEGMENT4 } // To select a screen LED (4)
        if(X>4 ){X=0; LED_OFF }
        OUT_LOOP=0;
      //......................................................................
        PORTC.F5=1;
        if( X2==1){X3++;delay_ms(1); }
        if( X3==30){ PORTC.F4=1; }
        if( X3==60){ PORTC.F4=0; }
        if( X3>60){ X3=0; }
      //......................................................................
      //===================
       Clear_the_screens // Clear_the_screens
      //===================




        if(START==1)  // Start the counter
        
        {  SEGMENTS_OFF  PORTC.F5=0;
        
           while(OUT_LOOP==0)
           {
           
           if(CONTER==0){ TEMER_conter SEGMENT4++;}
          //....................................
           if( SEGMENT4>9 ){SEGMENT3++; SEGMENT4=0;   }
           if( SEGMENT3>9 ){SEGMENT2++; SEGMENT3=0;   }
           if( SEGMENT2>9 ){SEGMENT1++; SEGMENT2=0;   }
          //....................................
          
           if(PORTD.F2==1){ button   OUT_LOOP=1;}
           
           //....................................
            Test_the_values_of_screens  // Test the screen numbers and exit the program
           //....................................
        
          }
        
        }





   }
}
 unsigned short mask(unsigned short num){
               switch (num){
 case 0 : return 0xC0;
 case 1 : return 0xF9;
 case 2 : return 0xA4;
 case 3 : return 0xB0;
 case 4 : return 0x99;
 case 5 : return 0x92;
 case 6 : return 0x82;
 case 7 : return 0xD8;
 case 8 : return 0x80;
 case 9 : return 0x90;
 case 10 : return 0x90;
}
}


المشروع كامل للتحميل https://drive.google.com/file/d/0Bxg...ew?usp=sharing


رابط أخر للتحميل CONTER.rar - 87 KB



منتظر أي استفسار أو اضافات علي البرنامج ..

تحياتي لكم ...


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 06-07-2017 الساعة 06:07 AM
اعلانات

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 620
نشاط [ مشتاق الله ]
قوة السمعة:0
قديم 06-07-2017, 06:34 AM المشاركة 2   
sun


بسم الله الرحمن الرحيم

ما شاء الله اخ عبد الله , ربنا يتقبل منك .
عندى استفسار , هل لو انقطع التيار عن الميكرو فجأة سيكون محتفظ باخر قيمة للعد ام سيفقدها ؟

عندى بعض النصائح لك :
- حضرتك تكثر من استخدام MACRO as functions و هذا ليس جيد ف
ى اكتشاف الاخطاء الداخلية لهذه الدوال , و خصوصا حضرتك تستخدم دوال multi line ,
بينما هى ان استخدمت تستخدم اصلا فى دوال one line func

- يفضل استخدام الاقواس مع الماكرو ( )

و الله الموفق و المستعان



احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً رسول العراق, عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

رسول العراق
:: مهندس متواجد ::
تاريخ التسجيل: Oct 2009
المشاركات: 90
نشاط [ رسول العراق ]
قوة السمعة:0
قديم 06-07-2017, 11:40 AM المشاركة 3   
افتراضي


بارك الله فيك اخي

اذا ممكن تعديل الكود ليصبح العد تنازلي

وتشكر على المشروع المفيد


wisama
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2007
المشاركات: 58
نشاط [ wisama ]
قوة السمعة:0
قديم 06-07-2017, 05:22 PM المشاركة 4   
افتراضي


بارك الله فيك اخي ولدي طلب اذا أمكن أن تتكرم به علي أريد العداد يعد بالضغط على زر بحيث إذا ضغطت عليه يعد واحد واذا ضغطت مرة أخرى يعد اثنان وهكذا مع جزيل الشكر والتقدير .


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 07-07-2017, 01:34 AM المشاركة 5   
افتراضي اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما


بسم الله الرحمن الرحيم

ما شاء الله اخ عبد الله , ربنا يتقبل منك .
عندى استفسار , هل لو انقطع التيار عن الميكرو فجأة سيكون محتفظ باخر قيمة للعد ام سيفقدها ؟

عندى بعض النصائح لك :
- حضرتك تكثر من استخدام MACRO as functions و هذا ليس جيد ف
ى اكتشاف الاخطاء الداخلية لهذه الدوال , و خصوصا حضرتك تستخدم دوال multi line ,
بينما هى ان استخدمت تستخدم اصلا فى دوال one line func

- يفضل استخدام الاقواس مع الماكرو ( )

و الله الموفق و المستعان


السلام عليكم ورحمه الله وبركاته

بارك الله فيك أخي وحبيبي " مشتاق الله ""

أخي بالنسبه لحفظ البينات تم أضافه كود تكميلي لحفظ جميع البينات بصفه مستمره حتي لو انقطع التيار عن الدائرة في أي مرحله من مراحل البرنامج ..

البرنامج عليه رقابه مشدده أي خطوه هيخطوها هي مسجله .. ههههههههههه

بالفعل أخي كنت نسيت أن اضيف أمر لحفظ الأرقام اللتي عدها العداد .. كان يحفظ فقط الأرقام المدخله من قبل المستخدم ..
الأن بعد تعديل كود البرنامج .. هو يحفظ الأرقام المدخله من قبل المستخدم وايضااا يحفظ الأرقام اللتي عدها .. وهي ستظل محفوظه بصفه دائمه ولا يتم فقدانها الا في حاله الضغط علي مفتاح تصفير العداد ..


الكود المعدل ..

كود:
       
            // ENG _ ABDALLA HYGAZY  //
      
           // DATA _ 2017 / 7 / 6  //
      
     // Counter program using  7SEGMENT  //
    
    //  Save all data in  eeprom memory //
      
      unsigned short mask(unsigned short num);
      unsigned int SEGMENT1=0,SEGMENT2=0,SEGMENT3=0,SEGMENT4=0,SEGMENT5=0,X=0,START=0,OUT_LOOP=0,CONTER=0;
      unsigned int COPY_SEGMENT1=0,COPY_SEGMENT2=0,COPY_SEGMENT3=0,COPY_SEGMENT4=0,X1=0,X2=0,X3=0;
      unsigned int COPY1=0,COPY2=0,COPY3=0,COPY4=0,X4=0;
     
    #define  BUZZER  PORTD.F7=1; delay_ms(40); PORTD.F7=0; delay_ms(30); PORTD.F7=1; delay_ms(40); PORTD.F7=0;
    #define  button  PORTD.F7=1; delay_ms(20); PORTD.F7=0; delay_ms(10); PORTD.F7=1; delay_ms(20); PORTD.F7=0;
    #define TEMER2        delay_ms(30);
    #define TEMER_conter  delay_ms(30);
    #define TEMER3        delay_ms(300);
    //.......................................................................
    #define LED_SEGMENT1  PORTC.F0=1;  PORTC.F1=0; PORTC.F2=0; PORTC.F3=0;
    #define LED_SEGMENT2  PORTC.F1=1;  PORTC.F0=0; PORTC.F2=0; PORTC.F3=0;
    #define LED_SEGMENT3  PORTC.F2=1;  PORTC.F0=0; PORTC.F1=0; PORTC.F3=0;
    #define LED_SEGMENT4  PORTC.F3=1;  PORTC.F0=0; PORTC.F1=0; PORTC.F2=0;
    #define SEGMENTS_OFF  SEGMENT1=0;  SEGMENT2=0; SEGMENT3=0; SEGMENT4=0;
    #define LED_OFF       PORTC.F0=0;  PORTC.F1=0; PORTC.F2=0; PORTC.F3=0;
    #define COPY_SEGMENT_delete     COPY_SEGMENT1=0;  COPY_SEGMENT2=0; COPY_SEGMENT3=0;  COPY_SEGMENT4=0; COPY1=0; COPY2=0; COPY3=0; COPY4=0;
    //.......................................................................
    #define Test_the_values_of_screens   if(SEGMENT1==COPY_SEGMENT1&&SEGMENT2==COPY_SEGMENT2&&SEGMENT3==COPY_SEGMENT3&&SEGMENT4==COPY_SEGMENT4){ BUZZER BUZZER  X2=1; START=0; OUT_LOOP=1;}
   //........................................................................
    #define  Clear_the_screens   if(PORTD.F3==1){ button   delay_ms(130);if(PORTD.F3==0){goto loop;} button if(PORTD.F3==1){ delay_ms(150); if(PORTD.F3==1){ eeprom_DATA_Clear(); X2=0; PORTC.F4=0; COPY_SEGMENT_delete  SEGMENTS_OFF button button button  }   }}
     void interrupt(){
     PORTA=1;  PORTB=mask(SEGMENT1); delay_ms(2);
     PORTA=2;  PORTB=mask(SEGMENT2); delay_ms(2);
     PORTA=4;  PORTB=mask(SEGMENT3); delay_ms(2);
     PORTA=8;  PORTB=mask(SEGMENT4); delay_ms(2);
     PORTA=16; PORTB=mask(SEGMENT5); delay_ms(2);
     //....................................
     if(SEGMENT1>10){SEGMENT1=0;}
     if(SEGMENT2>10){SEGMENT2=0;}
     if(SEGMENT3>10){SEGMENT3=0;}
     if(SEGMENT4>10){SEGMENT4=0;}
    //....................................
     if(COPY_SEGMENT1>10){COPY_SEGMENT1=0;}
     if(COPY_SEGMENT2>10){COPY_SEGMENT2=0;}
     if(COPY_SEGMENT3>10){COPY_SEGMENT3=0;}
     if(COPY_SEGMENT4>10){COPY_SEGMENT4=0;}
    //....................................
    INTCON=0b00100000;
    TMR0=0;
 }
      void eeprom_DATA_Clear() {
     eeprom_write(0,0);
     eeprom_write(1,0);
     eeprom_write(2,0);
     eeprom_write(3,0);
     eeprom_write(4,0);
     eeprom_write(5,0);
     eeprom_write(6,0);
     eeprom_write(7,0);
    }

    //*******************************************//
      void main() {
      TRISB=0; PORTB=0; TRISD=15; PORTD=0;
      TRISC=0; PORTC=0; TRISA=0; PORTA=0;
      adcon1=0x06;
      OPTION_REG=0x81;  INTCON=0b10100000;
      TMR0=217;
     //*******************************************//
      COPY_SEGMENT1 = eeprom_read(0);delay_ms(5);
      COPY_SEGMENT2 = eeprom_read(1);delay_ms(5);
      COPY_SEGMENT3 = eeprom_read(2);delay_ms(5);
      COPY_SEGMENT4 = eeprom_read(3);delay_ms(5);  //eeprom_read DATA  read && write
      SEGMENT1  = COPY_SEGMENT1 ;
      SEGMENT2  = COPY_SEGMENT2 ;
      SEGMENT3  = COPY_SEGMENT3 ;
      SEGMENT4  = COPY_SEGMENT4 ;
     //*****************************************//
      //........................................................................................................
        BUZZER
        while(1){
        loop:
        if( PORTD.F2==1     ){button START=1; X2=0; LED_OFF    TEMER2}
        if( PORTD.F1==1     ){ X++;                           TEMER2}
        if(X==1&&PORTD.F0==1){ SEGMENT1++; COPY_SEGMENT1++; eeprom_write(0,COPY_SEGMENT1);     TEMER2 } // Select the numbers and display them on (7SEGMENT1 )
        if(X==2&&PORTD.F0==1){ SEGMENT2++; COPY_SEGMENT2++; eeprom_write(1,COPY_SEGMENT2); TEMER2 } // Select the numbers and display them on (7SEGMENT2 )
        if(X==3&&PORTD.F0==1){ SEGMENT3++; COPY_SEGMENT3++; eeprom_write(2,COPY_SEGMENT3); TEMER2 } // Select the numbers and display them on (7SEGMENT3 )
        if(X==4&&PORTD.F0==1){ SEGMENT4++; COPY_SEGMENT4++; eeprom_write(3,COPY_SEGMENT4); TEMER2 } // Select the numbers and display them on (7SEGMENT4 )
       //......................................................................
        if(X==1){ LED_SEGMENT1 } // To select a screen LED (1)
        if(X==2){ LED_SEGMENT2 } // To select a screen LED (2)
        if(X==3){ LED_SEGMENT3 } // To select a screen LED (3)
        if(X==4){ LED_SEGMENT4 } // To select a screen LED (4)
        if(X>4 ){X=0; LED_OFF }
        OUT_LOOP=0;
      //......................................................................
        PORTC.F5=1;
        if( X2==1){X3++;delay_ms(1); }
        if( X3==30){ PORTC.F4=1; }
        if( X3==60){ PORTC.F4=0; }
        if( X3>60){ X3=0; }
      //......................................................................
      //===================
       Clear_the_screens // Clear_the_screens
      //===================

        if(START==1)  // Start the counter
        
        {  SEGMENTS_OFF  PORTC.F5=0;  SEGMENT4 = COPY1 = eeprom_read(4);delay_ms(5);  SEGMENT3 = COPY2 = eeprom_read(5);delay_ms(5);
                                      SEGMENT2 = COPY3 = eeprom_read(6);delay_ms(5);  SEGMENT1 = COPY4 = eeprom_read(7);delay_ms(5);

           while(OUT_LOOP==0)
           {

           SEGMENT4 = COPY1;  SEGMENT3 = COPY2;  SEGMENT2 = COPY3;  SEGMENT1 = COPY4;
           if(CONTER==0){ TEMER_conter COPY1++; eeprom_write(4,COPY1); delay_ms(2); }
          //....................................
           if( COPY1>9 ){COPY2++; eeprom_write(5,COPY2); delay_ms(2); COPY1=0;   }
           if( COPY2>9 ){COPY3++; eeprom_write(6,COPY3); delay_ms(2); COPY2=0;   }
           if( COPY3>9 ){COPY4++; eeprom_write(7,COPY4); delay_ms(2); COPY3=0;   }
          //....................................
           if(PORTD.F2==1){ button   OUT_LOOP=1;}
           //....................................
            Test_the_values_of_screens  // Test the screen numbers and exit the program
           //....................................

          }
        
        }
        
   }
}
 unsigned short mask(unsigned short num){
               switch (num){
 case 0 : return 0xC0;
 case 1 : return 0xF9;
 case 2 : return 0xA4;
 case 3 : return 0xB0;
 case 4 : return 0x99;
 case 5 : return 0x92;
 case 6 : return 0x82;
 case 7 : return 0xD8;
 case 8 : return 0x80;
 case 9 : return 0x90;
 case 10 : return 0x90;
}
}


اشكركم جميعااا .. وأرحب بالأقتراحات ..



التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 07-07-2017 الساعة 02:01 AM

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 07-07-2017, 03:02 AM المشاركة 6   
افتراضي اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما


بارك الله فيك اخي ولدي طلب اذا أمكن أن تتكرم به علي أريد العداد يعد بالضغط على زر بحيث إذا ضغطت عليه يعد واحد واذا ضغطت مرة أخرى يعد اثنان وهكذا مع جزيل الشكر والتقدير .
السلام عليكم ورحمه الله ..

تحت أمرك أخي تفضل اليك التعديل ..

تم اضافه عدد 2 مفتاح ..

المفتاح k6 هو لتبديل حاله العداد "" يدوي "" أو "" اوتماتيك "" ويوجد عدد 2 ليد لتخبرك بحاله العداد قبل التشغيل أن كان عداد يدوي أو اتوماتيكي ..

أيضاا يوجد مفتاح وهو k5 هذا المفتاح كل ضغطه عليه يعد العداد بواحد ..

ملحوظه عند الضغط علي مفتاح k5 ينتظر العداد لرفع يدك من علي المفتاح لكي يبدأ بزياده الأرقام بواحد ..

لو تحب تعديل أخر اخبرني ..

اليك صورة للتعديل الجديد ..


[IMG][/IMG]


واليك كود البرنامج المعدل ..

كود:
       
            // ENG _ ABDALLA HYGAZY  //
      
           // DATA _ 2017 / 7 / 6  //
      
     // Counter program using  7SEGMENT  //
    
    //  Save all data in  eeprom memory //
      
      unsigned short mask(unsigned short num);
      unsigned int SEGMENT1=0,SEGMENT2=0,SEGMENT3=0,SEGMENT4=0,SEGMENT5=0,X=0,START=0,OUT_LOOP=0,CONTER=0;
      unsigned int COPY_SEGMENT1=0,COPY_SEGMENT2=0,COPY_SEGMENT3=0,COPY_SEGMENT4=0,X1=0,X2=0,X3=0;
      unsigned int COPY1=0,COPY2=0,COPY3=0,COPY4=0,X4=0,X5=0;
     
    #define  BUZZER  PORTD.F7=1; delay_ms(40); PORTD.F7=0; delay_ms(30); PORTD.F7=1; delay_ms(40); PORTD.F7=0;
    #define  button  PORTD.F7=1; delay_ms(20); PORTD.F7=0; delay_ms(10); PORTD.F7=1; delay_ms(20); PORTD.F7=0;
    #define TEMER2        delay_ms(30);
    #define TEMER_conter  delay_ms(30);
    #define TEMER3        delay_ms(300);
    //.......................................................................
    #define LED_SEGMENT1  PORTC.F0=1;  PORTC.F1=0; PORTC.F2=0; PORTC.F3=0;
    #define LED_SEGMENT2  PORTC.F1=1;  PORTC.F0=0; PORTC.F2=0; PORTC.F3=0;
    #define LED_SEGMENT3  PORTC.F2=1;  PORTC.F0=0; PORTC.F1=0; PORTC.F3=0;
    #define LED_SEGMENT4  PORTC.F3=1;  PORTC.F0=0; PORTC.F1=0; PORTC.F2=0;
    #define SEGMENTS_OFF  SEGMENT1=0;  SEGMENT2=0; SEGMENT3=0; SEGMENT4=0;
    #define LED_OFF       PORTC.F0=0;  PORTC.F1=0; PORTC.F2=0; PORTC.F3=0;
    #define COPY_SEGMENT_delete     COPY_SEGMENT1=0;  COPY_SEGMENT2=0; COPY_SEGMENT3=0;  COPY_SEGMENT4=0; COPY1=0; COPY2=0; COPY3=0; COPY4=0;
    //.......................................................................
    #define Test_the_values_of_screens   if(SEGMENT1==COPY_SEGMENT1&&SEGMENT2==COPY_SEGMENT2&&SEGMENT3==COPY_SEGMENT3&&SEGMENT4==COPY_SEGMENT4){ BUZZER BUZZER  X2=1; START=0; OUT_LOOP=1;}
   //........................................................................
    #define  Clear_the_screens   if(PORTD.F3==1){ button   delay_ms(130);if(PORTD.F3==0){goto loop;} button if(PORTD.F3==1){ delay_ms(150); if(PORTD.F3==1){ eeprom_DATA_Clear(); X2=0; PORTC.F4=0; COPY_SEGMENT_delete  SEGMENTS_OFF button button button  }   }}
     void interrupt(){
     PORTA=1;  PORTB=mask(SEGMENT1); delay_ms(2);
     PORTA=2;  PORTB=mask(SEGMENT2); delay_ms(2);
     PORTA=4;  PORTB=mask(SEGMENT3); delay_ms(2);
     PORTA=8;  PORTB=mask(SEGMENT4); delay_ms(2);
     PORTA=16; PORTB=mask(SEGMENT5); delay_ms(2);
     //....................................
     if(SEGMENT1>10){SEGMENT1=0;}
     if(SEGMENT2>10){SEGMENT2=0;}
     if(SEGMENT3>10){SEGMENT3=0;}
     if(SEGMENT4>10){SEGMENT4=0;}
    //....................................
     if(COPY_SEGMENT1>10){COPY_SEGMENT1=0;}
     if(COPY_SEGMENT2>10){COPY_SEGMENT2=0;}
     if(COPY_SEGMENT3>10){COPY_SEGMENT3=0;}
     if(COPY_SEGMENT4>10){COPY_SEGMENT4=0;}
    //....................................
    INTCON=0b00100000;
    TMR0=0;
 }
      void eeprom_DATA_Clear() {
     eeprom_write(0,0);
     eeprom_write(1,0);
     eeprom_write(2,0);
     eeprom_write(3,0);
     eeprom_write(4,0);
     eeprom_write(5,0);
     eeprom_write(6,0);
     eeprom_write(7,0);
    }

    //*******************************************//
      void main() {
      TRISB=0; PORTB=0; TRISD=63; PORTD=0;
      TRISC=0; PORTC=0; TRISA=0; PORTA=0;
      adcon1=0x06;
      OPTION_REG=0x81;  INTCON=0b10100000;
      TMR0=217;
     //*******************************************//
      COPY_SEGMENT1 = eeprom_read(0);delay_ms(5);
      COPY_SEGMENT2 = eeprom_read(1);delay_ms(5);
      COPY_SEGMENT3 = eeprom_read(2);delay_ms(5);
      COPY_SEGMENT4 = eeprom_read(3);delay_ms(5);  //eeprom_read DATA  read && write
      SEGMENT1  = COPY_SEGMENT1 ;
      SEGMENT2  = COPY_SEGMENT2 ;
      SEGMENT3  = COPY_SEGMENT3 ;
      SEGMENT4  = COPY_SEGMENT4 ;
      X4 = eeprom_read(8);delay_ms(5);
     //*****************************************//
      //........................................................................................................
        BUZZER
        while(1){
        loop:
        if( PORTD.F2==1     ){button START=1; X2=0; LED_OFF    TEMER2}
        if( PORTD.F1==1     ){ X++;                           TEMER2}
        if(X==1&&PORTD.F0==1){ SEGMENT1++; COPY_SEGMENT1++; eeprom_write(0,COPY_SEGMENT1);     TEMER2 } // Select the numbers and display them on (7SEGMENT1 )
        if(X==2&&PORTD.F0==1){ SEGMENT2++; COPY_SEGMENT2++; eeprom_write(1,COPY_SEGMENT2); TEMER2 } // Select the numbers and display them on (7SEGMENT2 )
        if(X==3&&PORTD.F0==1){ SEGMENT3++; COPY_SEGMENT3++; eeprom_write(2,COPY_SEGMENT3); TEMER2 } // Select the numbers and display them on (7SEGMENT3 )
        if(X==4&&PORTD.F0==1){ SEGMENT4++; COPY_SEGMENT4++; eeprom_write(3,COPY_SEGMENT4); TEMER2 } // Select the numbers and display them on (7SEGMENT4 )
       //......................................................................
        if(X==1){ LED_SEGMENT1 } // To select a screen LED (1)
        if(X==2){ LED_SEGMENT2 } // To select a screen LED (2)
        if(X==3){ LED_SEGMENT3 } // To select a screen LED (3)
        if(X==4){ LED_SEGMENT4 } // To select a screen LED (4)
        if(X>4 ){X=0; LED_OFF }
        OUT_LOOP=0;
      //......................................................................
        PORTC.F5=1;
        if( X2==1){X3++; delay_ms(1); }
        if( X3==30){ PORTC.F4=1;      }
        if( X3==60){ PORTC.F4=0;      }
        if( X3>60){ X3=0; }
      //......................................................................
      //===================
       Clear_the_screens // Clear_the_screens
      //===================
        if(PORTD.F5==1){ X4++; eeprom_write(8,X4); delay_ms(15);    }
        if(X4==1      ){ PORTC.F6=1; PORTC.F7=0; }
        if(X4==0      ){ PORTC.F7=1; PORTC.F6=0; }
        if(X4>1       ){ X4=0;                   }
        if(START==1   )  // Start the counter
        
        {  SEGMENTS_OFF  PORTC.F5=0;  SEGMENT4 = COPY1 = eeprom_read(4);delay_ms(5);  SEGMENT3 = COPY2 = eeprom_read(5);delay_ms(5);
                                      SEGMENT2 = COPY3 = eeprom_read(6);delay_ms(5);  SEGMENT1 = COPY4 = eeprom_read(7);delay_ms(5);

           while(OUT_LOOP==0)
           {

           SEGMENT4 = COPY1;  SEGMENT3 = COPY2;  SEGMENT2 = COPY3;  SEGMENT1 = COPY4;
           if(CONTER==0 && X4==0){ TEMER_conter COPY1++; eeprom_write(4,COPY1); delay_ms(2); }
           //...............................................................................
           if(PORTD.F4==1&&X4==1){ delay_ms(15);while(PORTD.F4==1){}  COPY1++; eeprom_write(4,COPY1); delay_ms(2); }
          //....................................
           if( COPY1>9 ){COPY2++; eeprom_write(5,COPY2); delay_ms(2); COPY1=0;   }
           if( COPY2>9 ){COPY3++; eeprom_write(6,COPY3); delay_ms(2); COPY2=0;   }
           if( COPY3>9 ){COPY4++; eeprom_write(7,COPY4); delay_ms(2); COPY3=0;   }
          //....................................
           if(PORTD.F2==1){ button delay_ms(15);   OUT_LOOP=1; START=0;  goto loop;  }
           //....................................
            Test_the_values_of_screens  // Test the screen numbers and exit the program
           //....................................

          }
        
        }
        
   }
}
 unsigned short mask(unsigned short num){
               switch (num){
 case 0 : return 0xC0;
 case 1 : return 0xF9;
 case 2 : return 0xA4;
 case 3 : return 0xB0;
 case 4 : return 0x99;
 case 5 : return 0x92;
 case 6 : return 0x82;
 case 7 : return 0xD8;
 case 8 : return 0x80;
 case 9 : return 0x90;
 case 10 : return 0x90;
}
}

المشروع كامل " كود البرنامج + ملف المحكاة "" للتحميل من هنا https://drive.google.com/file/d/0Bxg...ew?usp=sharing

تحياتي وبالتوفيق أخي


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 07-07-2017 الساعة 04:08 AM

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 07-07-2017, 03:19 AM المشاركة 7   
افتراضي


بارك الله فيك اخي

اذا ممكن تعديل الكود ليصبح العد تنازلي

وتشكر على المشروع المفيد
السلام عليكم ورحمه الله

أخي الكريم لقد صممت مثل هذا المشروع لأحد الأخوه هنا .. واليك المشروع

اليك صورة للمشروع


[/IMG]


هذا العداد هو عداد تصاعدى أو تنازلى حسب اختيارك للعداد ..

يوجد مفاتيح مكتوب أمام كل مفتاح الوظيفة المخصصة لة ..



مثال أو شرح للعداد ..

من خلال مفتاحان "" أختار العدد "" يمكنك أختيار رقم ما بين ( 1 ) أو ( 99 ) وبعد ذالك أضغط على مفتاح "" تصاعدى "" وتلاحظ أن العداد قد تم تصفير الشاشات وبدأ فى العد التصاعدى وأيضااا يوجد لدات للدالة على حالة العداد لاحظ الصورة .. وعند وصول العداد الى الرقم اللذى تم ادخالة تلاحظ وقوف العداد وأضاء ليد : أنتهى الوقت .. وللعد مرة أخرى بنفس الأرقام المدخلة أضغط على مفتاح "" تضاعدى " ليبدأ العد من جديد ..

وهناك مفتاح " تصفير العداد " لكى تبدل حالة العداد من تصاعدى الى تنازاى أضغط على " تصفير " العداد .. ولأختيار عداد تنازلى يبدأ من رقم ( 99 ) الى ( 00 ) أضغط على " تنازلى " ولاحظ عندما يصل العداد الى ( 00 ) يضئ ليد أنتهى الوقت ..

واليك كود البرنامج ..


كود:
   // ENG ABDALLA HYGAZY  //
  
   // TEMR ++  7SEGMENT    //
   
  //  DATDA / 2016 / 11 / 20 //
  
  #define LED_OF PORTD.F0=0;

unsigned short mask(unsigned short num);
unsigned int SEGMENT1=0,SEGMENT2=0,SEGMENT3=0,SEGMENT4=0,X=0;
unsigned int SEGcopy1=0,SEGcopy2=0;

  void interrupt(){
    porta=1;
    portb=mask(SEGMENT1);
    delay_ms(2);
    porta=2;
    portb=mask(SEGMENT2);
    delay_ms(2);
    INTCON=0b00100000;
    TMR0=0;
}
 //-------------------------------------------------------------//

    void SEGMENT_up() {
      SEGMENT1=0;  SEGMENT2=0; LED_OF PORTD.F3=0;
      while(X==0){
      if( PORTC.F2==1 ) { delay_ms(100);  X=1;   }
      PORTD.F4=1; PORTD.F1=1;
      delay_ms(100);
      SEGMENT2++;
      if( SEGMENT2==10){SEGMENT2=0;SEGMENT1++;  }
      if( SEGMENT1==10){SEGMENT1=0;  }
      if( SEGMENT1&&SEGMENT2==10)
      { SEGMENT1=0; SEGMENT2=0; }
      if(SEGMENT2==SEGcopy2&&SEGMENT1==SEGcopy1){PORTD.F0=1; X=1;  }
   }
  }
//-------------------------------------------------------------------//
   void SEGMENT_dwen() {
     SEGMENT2=9;  SEGMENT1=9; X=0; LED_OF PORTD.F3=0;
     while(X==0){
     if( PORTC.F2==1 ) { delay_ms(100);  X=1;   }
     PORTD.F4=1;  PORTD.F2=1;
     delay_ms(100);
     SEGMENT2--;
     if( SEGMENT2<1){SEGMENT2=9;SEGMENT1--;  }
     if( SEGMENT1<1){SEGMENT1=9;  }
     if( SEGMENT1==9&&SEGMENT2==9)
     { SEGMENT1=9; SEGMENT2=9; PORTD.F0=1; X=1; }
  }
 }

//------------------------------------------------------//
     void main() {
   OPTION_REG=0b10000101;
   INTCON=0b10100000;
   TMR0=217;
   TRISB=0;   PORTB=0;   TRISD=0; PORTD=0;
   TRISC=255; PORTC=0;   TRISA=0; PORTA=0;
   
    while(1){
    PORTD.F4=0;  PORTD.F3=1; PORTD.F1=0; PORTD.F2=0;

    if( PORTC.F3==1 ) { delay_ms(100); SEGMENT_up(); X=0;   }
    if( PORTC.F4==1 ) { delay_ms(100); SEGMENT_dwen();X=0; }
     if(PORTC.F0==1){SEGMENT2++; delay_ms(100);
     if( SEGMENT2==10){SEGMENT2=0;SEGMENT1++;  }
     if( SEGMENT1==10){SEGMENT1=0;  }
     if( SEGMENT1&&SEGMENT2==10)
     { SEGMENT1=0; SEGMENT2=0; }
       SEGcopy1=SEGMENT1;  SEGcopy2=SEGMENT2;
   }
    //****************************************//
     if(PORTC.F1==1){
     delay_ms(100);
     SEGMENT2--;
     if( SEGMENT2<1){SEGMENT2=9;SEGMENT1--;  }
     if( SEGMENT1<1){SEGMENT1=9;  }
     if( SEGMENT1&&SEGMENT2==0)
     { SEGMENT1=9; SEGMENT2=9; }
     SEGcopy1=SEGMENT1;  SEGcopy2=SEGMENT2;
    }
//*******************************************//
   
    if(PORTC.F5==1){SEGcopy1=SEGMENT1=0; SEGcopy2=SEGMENT2=0; X=0; LED_OF }

  }
 }
unsigned short mask(unsigned short num){
switch (num){
case 0 : return 0xC0;
case 1 : return 0xF9;
case 2 : return 0xA4;
case 3 : return 0xB0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xD8;
case 8 : return 0x80;
case 9 : return 0x90;
}
}





وايضااا المشروع كامل للتحميل ..

رابط التحميل ..
https://drive.google.com/open?id=0Bx...3hZUHBpSzlWS28

تحياتى لك ..

لو محتاج أى توضيح لا تتردد ..

بالتوفيق


التعديل الأخير تم بواسطة : عبدالله حجازى بتاريخ 07-07-2017 الساعة 04:04 AM
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً رسول العراق ( شكر العضو على هذه المشاركة )

wisama
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2007
المشاركات: 58
نشاط [ wisama ]
قوة السمعة:0
قديم 07-07-2017, 04:14 AM المشاركة 8   
افتراضي


الشكر قليل بحقك الف الف الف شكر .

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 06:35 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025