NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3240 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 7 از 7

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

  1. #1
    عضو جدید
    تاریخ عضویت
    Apr 2015
    نوشته ها
    6
    تشکر
    2
    تشکر شده 0 بار در 0 پست

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

    سلام.
    وقتی یکی از اعداد روی کیپد رو میزنم:بجای یکبار چندبار نشون داده میشه؟چطوری میشه این مشکلو حل کرد؟
    این کد برنامه است.اگه با دستور خاصی حل میشه،لطفا بگید چه چیزی رو کجا قرار بدم
    کد:

    کد:
    #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. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    Banned
    تاریخ عضویت
    Apr 2013
    نام
    صادق علی بخشی
    نوشته ها
    1,148
    تشکر
    1,183
    تشکر شده 1,276 بار در 702 پست

    پیش فرض

    سلام
    یک تاخیر چند میلی ثانیه ای بعد از اولین باری که کلید رو میخونی ایجاد کن مشکل حل میشه

  4. #3
    کاربر دائمی
    تاریخ عضویت
    Jul 2009
    نوشته ها
    415
    تشکر
    218
    تشکر شده 531 بار در 212 پست

    پیش فرض

    براي تشخيص كليد شرط بزار ... اگر كليد زده شد دوباره كليدي رو قبول نكنه مگر اينكه .... كليد به حالت عادي برگشته باشه .. يكم فكر كني معلوم ميشه

  5. #4
    کاربر فعال
    تاریخ عضویت
    Feb 2012
    نام
    مصطفی
    نوشته ها
    273
    تشکر
    195
    تشکر شده 128 بار در 93 پست

    پیش فرض

    سلام
    1- شما باید بعد از هر بار خوندن کیبورد یه تاخیر داشته باشی.
    2- دستوراتی که بعد از return نوشتی اجرا نمیشن.

  6. #5
    کاربر فعال Hesam1984 آواتار ها
    تاریخ عضویت
    Sep 2007
    نام
    مهره مار
    نوشته ها
    315
    تشکر
    45
    تشکر شده 108 بار در 77 پست

    پیش فرض

    با اینتراپت بنویسش

  7. #6
    تازه وارد
    تاریخ عضویت
    Jun 2015
    نوشته ها
    1
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض

    دوست عزیز پایه کیپد رو با یه خازن کنارش بای پس کن به زمین مشکلت انشاالله حل میشه

    Sent from my K019 using Tapatalk

  8. #7
    کاربر علاقه مند Shapour_Ardebil آواتار ها
    تاریخ عضویت
    Jun 2007
    نام
    ٍShapour
    نوشته ها
    98
    تشکر
    49
    تشکر شده 104 بار در 49 پست

    پیش فرض

    با سلام

    با توجه به اینکه مدت زمان فشردن کلید ها در افراد مختلف فرق میکند وسرعت انجام عملیات توسط میکرو بسیار زیاد است لذا در هر بار فشردن کلید بیش از یکبار عملیات اسکن کیبرد انجام میگردد با افزودن تاخیر ممکن است که برای شما که این موضوع را می دانید مشکل حل شود ولی اگر تاخیر بزرگ قرار دهید برای کسی که سریعتر بخواهد کار کند مشکل باقی می ماند ویا اگر تاخیر کوچک باشد برای کسی که کند باشد (مدت فشار کلید ) زیاد باشد باز هم مشکل باقی است بهترین روشی که من تا حالا استفاده کردم در تابع اسکن کیبرد قبل از ترک تابع میکرو را تا زمانی که کلیه کلید ها از فشردن خارج نشود(معمولا عدد 16 برگشت داده میشود) صبر میکنم سپس مقدار به فراخوان برگشت داده میشود

موضوعات مشابه

  1. اتصال کیپد به میکرو چگونه؟
    توسط masoodhashemy در انجمن AVR
    پاسخ: 33
    آخرين نوشته: 04-08-2015, 04:16
  2. برنامه کیپد 4*4
    توسط payameashena در انجمن AT91 series (ATMEL)
    پاسخ: 0
    آخرين نوشته: 09-11-2013, 20:29
  3. مشکل با کیپد 4*4
    توسط payameashena در انجمن AT91 series (ATMEL)
    پاسخ: 3
    آخرين نوشته: 20-09-2013, 22:40
  4. مشکل با تایمر 0 و کیپد!
    توسط behnam6500 در انجمن AVR
    پاسخ: 2
    آخرين نوشته: 19-04-2013, 19:59
  5. مشکل با کیپد
    توسط M3R در انجمن AT91 series (ATMEL)
    پاسخ: 1
    آخرين نوشته: 01-08-2010, 12:12

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •