اطلاعیه

Collapse
No announcement yet.

مقدماتی:شمارنده سون سگمنت

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

    مقدماتی:شمارنده سون سگمنت

    به نام خدا
    من می خوام به کمک دکمه سوئیچی که به پورت سی وصله، یک شمارنده درست کنم که اعداد یک تا نه رو روی سون سگمنت نشون بده. و با هر بار فشار روی دکمه فقط یک عدد جلو بره .ولی اگه این دکمه رو یک ثانیه مثلا فشار می دیم، چند عدد به جلو میره.
    راه حل چیه؟
    while (1)
    {
    if(PINC.0==0){
    a++;
    PORTA=digits[a];

    if (a==9)
    a=0;
    }

    #2
    پاسخ : مقدماتی:شمارنده سون سگمنت

    سلام.

    راه حلهای زیادی هست.از جمله استفاده از دستور bitwait

    دیدگاه


      #3
      پاسخ : مقدماتی:شمارنده سون سگمنت

      اگر کدی که قید کردین همون کد مورد استفاده تون باشه که دو مورد عمده داره. اولا debouncing انجام نمیشه. ثانیا روال درستی انتخاب نکردین. چون ممکنه بعضی وقتها هم از یک به دو بره اما مطمئن باشین با این کد در این حالت هم یکی جلو نرفته. بلکه ممکنه هزار و یکی جلو رفته باشه. چون اجرای حلقه شما چیزی حدود 30 الی 40 تیک بیشتر طول نمیکشه و این روی یک میکروی 1 مگا هرتزی یعنی 25 هزار بار در ثانیه!!
      چرا؟ چون بعد از فشار دادنی برداشتنی هم هست. در صورتیکه شما فقط فشار دادن کلید رو امتحان میکنین.

      دیدگاه


        #4
        پاسخ : مقدماتی:شمارنده سون سگمنت

        به نام خدا
        توضیح بیشتر. لینکی. سورسی...

        دیدگاه


          #5
          پاسخ : مقدماتی:شمارنده سون سگمنت

          دقیقا کد شما معادل اینه که بگیم.


          int i=0;
          int a=0;

          while(i==0)
          {
          a++;
          PORTA = a;
          }


          و این یعنی انجام عمل بدون در نظر گرفتن حرکات فرد روی کلید.

          شاید یک کد درستتر این باشه که بگیم:


          int a=0;
          int d;

          while(1)
          {
          PORTA = digits[a];
          while( PORTC.0 == 1 ) // wait for key PRESS
          continue;
          for(d=0; d<10
          {
          if( PORTC.0 == 0 ) // debouncing
          d++;
          else
          d = 0;
          delay_ms(1);
          }
          a++;
          if( a == 10)
          a = 0;
          while( PORTC.0 == 0 ) // wait for key RELEASE
          continue;
          }


          البته مسلما این کد تمام وقت میکرو رو تلف میکنه ولی اصل ایده رو نشون میده.

          دیدگاه

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