اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه KEYPAD

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

    مشکل در برنامه KEYPAD

    سلام خدمت دوستان
    یک سوال داشتم
    در برنامه ای که برای KEYPADنوشتم وقتی برنامه اجرا میشه اعداد بی ربط چا÷ میشه و حتی منتظر زدن دکمه هم نمیشه اگر ممکنه به برنامه یک نگاهی بندازید و راهنمایی کنید
    کد:
    int key,i;
       for(i=0;i<4;i++)
       {
       PORTD=(2^i);
       if(PIND&&0xf0==0x10){
       key=keys[0][i];
       break;}
       else if(PIND&&0xf0==0x20){
       key=keys[1][i];
       break;
       }
       else if (PIND&&0xf0==0x40){
       key=keys[2][i];
       break;
       }
       else if (PIND&&0xf0==0x80){
       key=keys[3][i];
       break;
       }
       }
        delay_ms(1000);
        lcd_clear();
        sprintf(a,"%d",key);
        lcd_gotoxy(0,0);
        lcd_puts(a);
        delay_ms(300);
    و این که 4 تا pinاخر رو outکردم

    #2
    پاسخ : مشکل در برنامه KEYPAD

    سلام
    اگه ممکنه برنامه تنظیمات اولیه رو هم بذار. احتمالاً ورودی هاتو pollup نکردی.
    تشکر لازم نیست!

    دیدگاه


      #3
      پاسخ : مشکل در برنامه KEYPAD

      سلام
      به صورت دستی pulldownesh کردم(ورودی ها رو با مقاومت 10k) با این حال اینم کد کاملش ممنون
      کد:
      #include <mega16.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <delay.h>
      #include <math.h>
      int keys[4][4]={{1,2,3,13},{4,5,6,14},{7,8,9,15},{10,0,11,12}};
      
      // Alphanumeric LCD Module functions
      #asm
        .equ __lcd_port=0x15 ;PORTC
      #endasm
      #include <lcd.h>
      
      // Declare your global variables here
      
      void main(void)
      {
      char a[20];
      // Declare your local variables here
      
      // Input/Output Ports initialization
      // Port A initialization
      // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
      // State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T 
      PORTA=0xff;
      DDRA=0xF0;
      
      // Port B initialization
      // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
      // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
      PORTB=0x00;
      DDRB=0xFF;
      
      // Port C initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
      PORTC=0x00;
      DDRC=0x00;
      
      // Port D initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
      PORTD=0x00;
      DDRD=0xFF;
      
      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: Timer 0 Stopped
      // Mode: Normal top=FFh
      // OC0 output: Disconnected
      TCCR0=0x00;
      TCNT0=0x00;
      OCR0=0x00;
      
      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: Timer 1 Stopped
      // Mode: Normal top=FFFFh
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer 1 Overflow Interrupt: Off
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      TCCR1A=0x00;
      TCCR1B=0x00;
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;
      
      // Timer/Counter 2 initialization
      // Clock source: System Clock
      // Clock value: Timer 2 Stopped
      // Mode: Normal top=FFh
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;
      
      // External Interrupt(s) initialization
      // INT0: Off
      // INT1: Off
      // INT2: Off
      MCUCR=0x00;
      MCUCSR=0x00;
      
      // Timer(s)/Counter(s) Interrupt(s) initialization
      TIMSK=0x00;
      
      // Analog Comparator initialization
      // Analog Comparator: Off
      // Analog Comparator Input Capture by Timer/Counter 1: Off
      ACSR=0x80;
      SFIOR=0x00;
      
      // LCD module initialization
      lcd_init(16);
      
      while (1)
         {
         
         int key,i;
         for(i=0;i<4;i++)
         {
         delay_ms(100);
         PORTA=(2^i);
         if(PINA&&0xf0==0x10){
         
         key=keys[0][i];
         break;}
         else if(PINA&&0xf0==0x20){
         key=keys[1][i];
         break;
         }
         else if (PINA&&0xf0==0x40){
         key=keys[2][i];
         break;
         }
         else if (PINA&&0xf0==0x80){
         key=keys[3][i];
         break;
         }
         }
          delay_ms(1000);
          lcd_clear();
          sprintf(a,"key=%d",key);
          lcd_gotoxy(0,0);
          lcd_puts(a);
          delay_ms(300);
         
      
         };
      }

      دیدگاه


        #4
        پاسخ : مشکل در برنامه KEYPAD

        من مشکلاتت رو توی شرط ها دیدم :
        کد:
        if(PINA&&0xf0==0x10)
        اگه منظورت اینه که حاصل and کردن PINA و 0xf0 باشه باید اینطوری باشه:PINA&0XF0 نه PINA&&0XF0
        توی همه شرط ها این اشکال بود.

        اینجا یه نمونه برنامه گذاشتم:
        http://www.iranled.com/forum/showthread.php?tid=9744&pid=60522#pid60522
        تشکر لازم نیست!

        دیدگاه


          #5
          پاسخ : مشکل در برنامه KEYPAD

          این برنامه اسکن صفحه کلید 4*4 است
          DDRA=0xf0;
          PORTA=0x0f;
          a=PINA;
          delay_ms(5);
          DDRA=0x0f;
          PORTA=0xf0;
          a=(a|PINA);
          if(a!=0xff){
          for(i=0;i<16;i++){
          if(a==b[i]){
          sprintf(buff,"number=%d",i);
          lcd_clear();
          lcd_puts(buff);}}}
          من رقص دختران هندي را بيش از نماز پدر و مادرم دوست دارم چون آنها از روي عشق و علاقه ميرقصند و پدر و مادرم از روي عادت نماز ميخوانند.
          دكتر شريعتي

          دیدگاه


            #6
            پاسخ : مشکل در برنامه KEYPAD

            نوشته اصلی توسط ehsanabedi
            این برنامه اسکن صفحه کلید 4*4 است
            DDRA=0xf0;
            PORTA=0x0f;
            a=PINA;
            delay_ms(5);
            DDRA=0x0f;
            PORTA=0xf0;
            a=(a|PINA);
            if(a!=0xff){
            for(i=0;i<16;i++){


            سلام اینها همش باید تو while نوشته بشه؟؟
            if(a==b[i]){
            sprintf(buff,"number=%d",i);
            lcd_clear();
            lcd_puts(buff);}}}

            دیدگاه


              #7
              پاسخ : مشکل در برنامه KEYPAD

              حلقه شما در صورتی که هیچ کلیدی فشار داده نشده باشه باز هم خاتمه پیدا میکنه در این صورت متغیر key هر مقداری میتونه داشته باشه. یک مقدار بیخود.

              دیدگاه

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