اطلاعیه

Collapse
No announcement yet.

راهنمایی برای راه اندازی keypad با استفاده از ماشین حالت

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

    راهنمایی برای راه اندازی keypad با استفاده از ماشین حالت

    با سلام خدمت اساتید.
    اگر امکان داره راهنمایی بکنید (یا کتاب یا سایتی معرفی کنید )که چه طوری میشه یک keypad 4*4 را با استفاده از ماشین حالت راه انداخت.
    به طوری که تو برنامه برای چک کردن اینکه ایا کلید فشرده شده یا نه از دستورات delay کامپایلر استفاده نشه چون در عمل اگر در محیطی قرار گرفته باشیم که نویز وجود داشته باشه امکان این که فشرده شدن کلید اشتباه تشخیص داده بشه وجود داره.


    با تشکر.

    #2
    پاسخ : راهنمایی برای راه اندازی keypad با استفاده از ماشین حالت

    یه چیزی به ذهنم رسیده امتحان کن ببین به دردت میخوره یا نه البته زیاد وارد نیستم

    مثلا براش تعریف کن اگر کلید ۱ فشرده شد بره به زیر برنامه مخصوص کلید ۱ بعد براش شرط بزار که اگه کلید ۱ هنوز فشرده شده بود فلان عمل رو انجام بده در غیر اینصورت برگرده به برنامه اصلی اینطوری چون توی زیر برنامت حرفی از کلید های دیگه زده نشده حتی اگه یه کلید دیگه ای نویز بگیره هیچ کاری انجام نمیشه

    دیدگاه


      #3
      پاسخ : راهنمایی برای راه اندازی keypad با استفاده از ماشین حالت

      با سلام مجدد.
      ببخشید من برای صفحه کلیدی که چهار سطر (D4:0) و پنج ستون (C5:C0) دارد برنامه زیر را با استفاده از ماشین حالت نوشتم. الان مشکلی که دارم اینه که هرجور سعی کردم نتونستم شماره سطری که کلید فشرده شده است را به دست بیارم.
      اگر امکان داره راهنمایی کنید که چه طور این کار را انجام بدم.؟؟؟؟
      البته این رو هم بگم تابع scankey که تا وقتی کلید را نگه داشتیم هیچ واکنشی نشان نمیدهد. و وقتی کلید را رها میکنیم یک پالس به پهنای اون تابع delay ایجاد میکند.
      اون روتین وقفه هم هر 2.5 میلی ثانیه (اگر فرکانس کلاک 16 مگاهرتز باشد.) وقفه میدهد که میزان debounce timer را برای ما تنظیم میکند.

      باز هم ممنون از راهنمایی دوستان.
      /* * scan_keypad_2.c
      *
      * Created: 5/2/2019 9:15:49 PM
      * Author :
      */



      #include <avr/io.h>
      #include <avr/interrupt.h>
      #define F_CPU 16000000UL
      #include <util/delay.h>


      unsigned char debounce_timer;


      unsigned char scankey (void)
      {
      static unsigned char state=0; /* state = 0 ==> release
      state = 1 ==> debounce release2press
      state = 2 ==> press
      state = 3 ==> debounce press2release
      */
      static unsigned char output_keypd;
      unsigned char pin;
      pin = (PINC & 0x1F);

      switch (state)
      {
      case 0:
      if (pin != 0x1F) //pressed one key or noise
      {
      state=1;
      switch (pin)
      {
      case 0x1E:
      output_keypd= 0x01;
      break;
      case 0x1D:
      output_keypd= 0x02;
      break;
      case 0x1B:
      output_keypd= 0x04;
      break;
      case 0x17:
      output_keypd= 0x08;
      break;
      case 0x0F:
      output_keypd= 0x10;
      break;

      }
      debounce_timer=5;
      }
      break;
      case 1:
      if ((pin & 0x1F) == 0x1F)
      {
      state=0;
      }
      else if (debounce_timer == 0)
      {
      state=2;
      }
      break;
      case 2:
      if ((pin & 0x1F) == 0x1F)
      {
      state=3;
      debounce_timer=5;

      }
      break;
      case 3:
      if ((pin & 0x1F) != 0x1F)
      {
      state=2;
      }
      else if (debounce_timer == 0)
      {
      state=0;
      return output_keypd;
      }
      break;
      }
      _delay_us(1);
      return 0;
      }




      int main(void)
      {
      TCCR1A = 0;
      TCCR1B = 0;
      TCNT1 = -20000;
      sei ();
      TIMSK = (1<<TOIE1);
      TCCR1A= 0x00;
      TCCR1B= 0x01; //normal mode , no prescale
      DDRB=0xff;
      DDRD = 0xFF;
      PORTD=0x00;
      PORTB = 0xff;
      while (1)
      {


      }



      }


      ISR (TIMER1_OVF_vect)
      {
      TCCR1B= 0x00; //stop timer1

      if (debounce_timer != 0)
      {
      debounce_timer--;
      }

      TCNT1 = -20000;
      TCCR1B = 0x01; //run timer1 , normal mode , no prescale
      }


      جدیدترین ویرایش توسط saati.sms; ۰۹:۲۳ ۱۳۹۸/۰۲/۱۳.

      دیدگاه


        #4
        پاسخ : راهنمایی برای راه اندازی keypad با استفاده از ماشین حالت

        سلام.
        می تونی از برنامه برای پروژه ایده بگیرد.
        برنامه کیپد 4*4
        #include <mega16.h>  
        #include <delay.h>
        #asm
        .equ __lcd_port=0x1B ;// PORTA
        #endasm
        #include <lcd.h>
        #define c1 PINB.4
        #define c2 PINB.5
        #define c3 PINB.6
        #define c4 PINB.7
        flash char row[]={0xfe,0xfd,0xfb,0xf7};
        flash char data_key[]={
        '1','2','3','A',
        '4','5','6','B',
        '7','8','9','C',
        '*','0','#','D'};
        unsigned char ac,table;
        unsigned int r;
        //________________________________________
        void keypad(){
        lcd_gotoxy(0,1);
        lcd_putsf("~");
        while (1){
        for (r=0;r<4;r++){
        ac=4;
        PORTB=row[r];
        DDRB=0x0f;
        if (c1==0) ac=0;
        if (c2==0) ac=1;
        if (c3==0) ac=2;
        if (c4==0) ac=3;
        if (!(ac==4)){
        table=data_key[(r*4)+ac];
        lcd_putchar(table);
        while (c1==0){}
        while (c2==0){}
        while (c3==0){}
        while (c4==0){}
        delay_ms(50);
        }
        }
        }
        }
        //_________________________________________
        void main(){
        PORTB=0xff;
        DDRB=0x0f;
        lcd_init(16);
        lcd_gotoxy(0,0);
        lcd_putsf("test keypad");
        keypad();
        while(1){
        };
        }

        دیدگاه

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