اطلاعیه

Collapse
No announcement yet.

چرا کیپد رو یکبار می زنم،چندبار عدد نشون میده

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    چرا کیپد رو یکبار می زنم،چندبار عدد نشون میده

    سلام.
    وقتی یکی از اعداد روی کیپد رو میزنم:بجای یکبار چندبار نشون داده میشه؟چطوری میشه این مشکلو حل کرد؟
    این کد برنامه است.اگه با دستور خاصی حل میشه،لطفا بگید چه چیزی رو کجا قرار بدم
    کد:
    کد:
    #include <mega16a.h>
    #include <delay.h>
    #include <lcd.h>
    #include <stdlib.h>
    #include <math.h>
    
    #asm
      .equ __lcd_port=0x18
    #endasm
    //#############################################
    int key(void);
    float _Main(void);
    void Mohandes(void);
    void Mohasebe(void);
    void Alamat(int,int);
    float Emoji(int);
    //#############################################
    float a = 0 , b = 0 , c = 0 , q , t;
    int i ;
    char y=0 , lcd[25] , z  ;
    //#############################################
    void main(void){
    
    DDRB=0x0F;
    DDRC=0x07;
    DDRD=0x0F;
    
    lcd_init(16);
    while (1){
    _Main();
    }
    }
    //#############################################################
    float _Main(void){
    int Loop = 1 ;
    y = key();
    if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
    if( y < 10 ){
        a = (a*10)+y ;
        itoa(y , lcd);
        lcd_puts(lcd);
        delay_ms(50);
    }
    
    
    
    if( y > 9 && y < 16 ){
        if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
        z = y ;
        Alamat(y,1);
        while(Loop){
        y = key();
        if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
        if( y < 10 ){
            b = (b*10)+y ;
            itoa(y , lcd);
            lcd_puts(lcd);
            delay_ms(50);
        }else if(y == 14){
            lcd_putchar('=');
            Mohasebe();
            y = 0 ;
            Loop = 0 ;
        }
        }
    }
    if( y > 15 ){
    lcd_clear();
    a= 0 ; b = 0 ; c = 0;
    Alamat(y , 2);
    z = y ;
    Loop = 1 ;
    while(Loop){
    y = key();
    if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
    if(y < 10){
        a = (a*10) + y ;
        itoa(y , lcd);
        lcd_puts(lcd);
        delay_ms(50);
    }else if ( y == 14){
        lcd_putchar('=');
        Mohandes();
    }
    Loop = 1 ;
    }
    }
    return 0;
    }
    //##########################################################
    void Mohasebe(void){                     
    if(z == 10)c = a / b ;
    if(z == 11)c = a * b ;
    if(z == 12)c = a - b ;
    if(z == 13)c = a + b ;
    ftoa(c , 3 , lcd);      
    lcd_puts(lcd);
    delay_ms(100);
    }
    //#########################################################
    float Emoji(int rr){
    q=1;
    for(i=0;i<rr;i++)q = q * 2.71728 ;
    return q;  
    }
    //######################################################### 
    void Mohandes(void){
    t = (3.1415926535897932384626433832795/180)*a ;
    if(z == 16)c = sin(t) ;
    if(z == 17)c = cos(t) ;
    if(z == 18)c = tan(t) ;
    if(z == 19)c = 1/tan(t) ;
    if(z == 20)c = asin(t) ;
    if(z == 21)c = acos(t) ;
    if(z == 22)c = log(a) ;
    if(z == 23)c = sqrt(a) ;
    if(z == 24)c = Emoji(a) ;
    ftoa(c , 3 , lcd);      
    lcd_puts(lcd);
    delay_ms(100);
    }
    //#########################################################
    void Alamat(int Moji,int Halat){
    if(Halat == 1){
        if(Moji == 10)lcd_putchar('/') ;
        if(Moji == 11)lcd_putchar('*') ;
        if(Moji == 12)lcd_putchar('-') ;
        if(Moji == 13)lcd_putchar('+') ;
        delay_ms(100);   
    }
    if(Halat == 2){
        if(Moji == 16)lcd_putsf("Sin ") ;
        if(Moji == 17)lcd_putsf("Cos ") ;
        if(Moji == 18)lcd_putsf("Tan ") ;
        if(Moji == 19)lcd_putsf("Cot ") ; 
        if(Moji == 20)lcd_putsf("aSin") ;
        if(Moji == 21)lcd_putsf("aCos") ;
        if(Moji == 22)lcd_putsf("Log ") ;
        if(Moji == 23)lcd_putsf("Sqrt ") ; 
        if(Moji == 24)lcd_putsf("exp ") ;
        delay_ms(100);
    
    }
    }
    //#########################################################
    int key(void){
    char KEY = 1 ;
    while(KEY){
    
        PORTD.0 = 1 ;
        PORTD.1 = 0 ;
        PORTD.2 = 0 ;
        PORTD.3 = 0 ;
        if(PIND.4 == 1){return 7 ; KEY = 0;delay_ms(50);}  
        if(PIND.5 == 1){return 8 ; KEY = 0;delay_ms(50);}  
        if(PIND.6 == 1){return 9 ; KEY = 0;delay_ms(50);} 
        if(PIND.7 == 1){return 10; KEY = 0;delay_ms(50);}   
        //==========================================
        PORTD.0 = 0 ;
        PORTD.1 = 1 ;
        PORTD.2 = 0 ;
        PORTD.3 = 0 ;
        if(PIND.4 == 1){return 4 ; KEY = 0;}  
        if(PIND.5 == 1){return 5 ; KEY = 0;}  
        if(PIND.6 == 1){return 6 ; KEY = 0;}
        if(PIND.7 == 1){return 11; KEY = 0;}   
        //==========================================
        PORTD.0 = 0 ;
        PORTD.1 = 0 ;
        PORTD.2 = 1 ;
        PORTD.3 = 0 ;
        if(PIND.4 == 1){return 1 ; KEY = 0;}    
        if(PIND.5 == 1){return 2 ; KEY = 0;}   
        if(PIND.6 == 1){return 3 ; KEY = 0;}   
        if(PIND.7 == 1){return 12; KEY = 0;}    
        //==========================================
        PORTD.0 = 0 ;
        PORTD.1 = 0 ;
        PORTD.2 = 0 ;
        PORTD.3 = 1 ;
        if(PIND.4 == 1){return 15; KEY = 0;}    
        if(PIND.5 == 1){return 0 ; KEY = 0;}    
        if(PIND.6 == 1){return 14; KEY = 0;}   
        if(PIND.7 == 1){return 13; KEY = 0;}
    
        //=============================================================================
        PORTC.0 = 1 ;
        PORTC.1 = 0 ;
        PORTC.2 = 0 ;
        if(PINC.5 == 1){return 16 ; KEY=0;}
        if(PINC.6 == 1){return 17; KEY=0;}
        if(PINC.7 == 1){return 18 ; KEY=0;}
        //=====================================================
        PORTC.0 = 0 ;
        PORTC.1 = 1 ;
        PORTC.2 = 0 ;
        if(PINC.5 == 1){return 19 ; KEY=0;}    
        if(PINC.6 == 1){return 20 ; KEY=0;}
        if(PINC.7 == 1){return 21 ; KEY=0;}
        //=====================================================
        PORTC.0 = 0 ;
        PORTC.1 = 0 ;
        PORTC.2 = 1 ;
        if(PINC.5 == 1){return 22 ; KEY=0;}
        if(PINC.6 == 1){return 23 ; KEY=0;}
        if(PINC.7 == 1){return 24 ; KEY=0;}
    
    KEY = 1 ;   
    }
    }
    //############################################################

    #2
    پاسخ : چرا کیپد رو یکبار می زنم،چندبار عدد نشون میده

    حوصله نکردم کدتو نگاه کنم ولی احتمالآ مبحث debouncing رو رعایت نکردید
    این فیلم آقای کی نژاد رو نگاه کنید کامل توضیح داده
    http://www.aparat.com/v/52aX3
    [آموزشی] کنترل رله با پیامک توسط sim800l
    [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
    [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
    [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
    صفحه اینستاگرام : ecdco_ir

    دیدگاه


      #3
      پاسخ : چرا کیپد رو یکبار می زنم،چندبار عدد نشون میده

      اگه چندبار مینداز عدد مشکلت زمان یا delay یا debounce
      یکی از اینا رو کنترل کن
      زمانتو یکم بیشتر کن
      من با دانش و آکاهی ام تمام جهالت ها رو به زانو در خواهم اورد.

      دیدگاه


        #4
        پاسخ : چرا کیپد رو یکبار می زنم،چندبار عدد نشون میده

        کد:
        float _Main(void){
        int Loop = 1 ;
        y = key();
        _delay_ms(2000)
        if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
        if( y < 10 ){
            a = (a*10)+y ;
            itoa(y , lcd);
            lcd_puts(lcd);
            delay_ms(50);
        }
        اینو تست کن احتمالا مشکلت حل بشه

        دیدگاه


          #5
          پاسخ : چرا کیپد رو یکبار می زنم،چندبار عدد نشون میده


          ممنونم فقط میشه بگید این دستور رو کجای برنامه قرار بدم؟

          دیدگاه


            #6
            پاسخ : چرا کیپد رو یکبار می زنم،چندبار عدد نش

            نوشته اصلی توسط soltanisoft
            کد:
            float _Main(void){
            int Loop = 1 ;
            y = key();
            _delay_ms(2000)
            if( y == 15 ){a = 0 ;b = 0 ;c = 0 ;lcd_clear();return 0 ;}
            if( y < 10 ){
                a = (a*10)+y ;
                itoa(y , lcd);
                lcd_puts(lcd);
                delay_ms(50);
            }
            اینو تست کن احتمالا مشکلت حل بشه
            چه تغییری کرده ؟؟؟
            إِنَّ الَّذِینَ یُحِبُّونَ أَنْ تَشِیعَ الْفاحِشَهُ فِی الَّذِینَ آمَنُوا لَهُمْ عَذابٌ أَلِیمٌ فِی الدُّنْیا وَ الْآخِرَهِ وَ اللَّهُ یَعْلَمُ وَ أَنْتُمْ لا تَعْلَمُونَ.
            کسانى که دوست دارند زشتی ها در میان مردم با ایمان شیوع یابد عذاب دردناکى براى آنها در دنیا و آخرت است، و خداوند میداند و شما نمی‏دانید. (نور19)

            دیدگاه


              #7
              پاسخ : چرا کیپد رو یکبار می زنم،چندبار عدد نشون میده

              نوشته اصلی توسط alikiller990
              ممنونم فقط میشه بگید این دستور رو کجای برنامه قرار بدم؟
              این تابع main_ از برنامه ی خودتونه. در اصل فقط باید بین خط 2 و 3 از این تابع دستور _delay_ms(2000) را قرار بدی.
              به این معنی که وقتی یک بار تابع اسکن رو فراخوانی میکنیم، باید دیلی بدیم تا از سرعت اجرا کم بشه و مجدد این تابع را فراخوانی نکنه

              دیدگاه


                #8
                پاسخ : چرا کیپد رو یکبار می زنم،چندبار عدد نشون میده

                استفاده از تاخیر برای حذف لرزش کلید در جاهای صنعتی کاربردی نداره و بهتره با ترفندهای برنامه نویسی مشکلات رو به صورت درست و حسابی حل کنید.
                یکی از راهها نوشتن برنامه به صورته زیره :

                کد:
                    ref_key();
                    key_number = k_data;
                    do
                    {
                      ref_key();
                    }while(k_data != 16);

                موفق باشید
                چرا ناراحتی پاتریک!
                + امروز ی بچه دیدم سرچهارراه گل میفروخت
                - از دیدنش ناراحت شدی؟
                + نه
                پس چی ناراحتت کرده
                + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                ------------------------------------------------------------------------------------------------------
                تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                ------------------------------------------------------------------------------------------------------
                محصولات

                دیدگاه

                لطفا صبر کنید...
                X