اطلاعیه

Collapse
No announcement yet.

مشکل با keypad

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

    #16
    پاسخ : مشکل با keypad

    با سلام
    مطالبی که گفتید خیلی مفید بود.
    فقط یه سوال...
    چرا وقتی درون تابع،برنامه خودم رو مینویسم جواب نمیده؟
    علت اینکه میخوام اینکارو بکنم اینه که روش کد گزاریتون رو توی تابع نمیفهمم(از اونجایی که شما DDRD =0x0F کردید پس نباید ورودی رو در حالات مختلف چک کنید؟)
    یعنی به جای
    کد:
    DDRD =0x0F;
      PORTD=0xF0;
    char key (void)
    { PORTD=0xF0;
      if(PIND == 0xF0)return 'v';
      else delay_ms(10);
      PORTD=0xFE;
      if(PIND.4==0)return '+';
      if(PIND.5==0)return '-';
      if(PIND.6==0)return '*';
      if(PIND.7==0)return '/';
      PORTD=0xFD;
      if(PIND.4==0)return 'e';
      if(PIND.5==0)return '3';
      if(PIND.6==0)return '6';
      if(PIND.7==0)return '9';
      PORTD=0xFB;
      if(PIND.4==0)return '0';
      if(PIND.5==0)return '2';
      if(PIND.6==0)return '5';
      if(PIND.7==0)return '8';
      PORTD=0xF7;
      if(PIND.4==0)return '.';
      if(PIND.5==0)return '1';
      if(PIND.6==0)return '4';
      if(PIND.7==0)return '7';
      return 'v';
    نباید اینجوری بنویسم(؟):
    کد:
    char key(void){
       DDRD=0x0f;
       PORTD=0xff;
    
      if(PORTD == 0xFF)return 'v';
      else delay_ms(10);
      PORTD.0=0;
      if(PIND.4==0)return '+';
      if(PIND.5==0)return '-';
      if(PIND.6==0)return '*';
      if(PIND.7==0)return '/';
     delay_ms(2);
      PORTD.1=0;
      if(PIND.4==0)return 'e';
      if(PIND.5==0)return '3';
      if(PIND.6==0)return '6';
      if(PIND.7==0)return '9';
     delay_ms(2);
      PORTD.2=0;
      if(PIND.4==0)return '0';
      if(PIND.5==0)return '2';
      if(PIND.6==0)return '5';
      if(PIND.7==0)return '8';
     delay_ms(2);
      PORTD.3=0;
      if(PIND.4==0)return '.';
      if(PIND.5==0)return '1';
      if(PIND.6==0)return '4';
      if(PIND.7==0)return '7';
      return 'v';
     delay_ms(2);
    البته کدی که من نوشتم توی proteus جواب نمیده.وقتی RUN میکنم.پورت D که به KEYPAD وصله رو همشو 1 میکنه و دیگه تغییری نمیکنه پس برنامه تو خط اول تابع من گیر میکنه.چرا؟

    با تشکر

    دیدگاه


      #17
      پاسخ : مشکل با keypad

      با سلام
      جواب سوال قبلیمو پیدا کردم،یه سوال دیگه پیدا شد!
      من برنامه شما رو نوشتم ولی فقط قسمت تابعش رو اونجوری که بلد بودم نوشتم و جواب داد(یعنی تونستم عدد رو روی lcd نشون بدم)
      حالا میخوام یه برنامه بنویسم که علاوه بر اعداد موجود در keypad،اون علامتهای /*-+و... رو نشون بده که فایلش اینه:>>>keypad-new(with Function)
      مشکل این برنامه اینه که تا وقتی اعداد 0 تا 9 رو میزنم مشکلی نیست ولی وقتی یکی از علامتهای روی keypad رو میزنم برنامه متوقف میشه درواقع دیگه تابع،عمل نمیکنه.
      حالا یه سوال:مگه نباید این تابع خودش به طور مداوم کار کنه؟(به عنوان مثال دستور while(key()=='v' رو ماقبل از تابع نوشتیم ولی برنامه کار میکنه پس دیده میشه که این تابع قبل از حلقه while نیز شروع به کار کرده.درسته؟{سوال اضافه:اگه حرف من درست باشه پس میکرو داره همزمان دو کار میکنه:یکی اسکن keypad و یکی انجام دستورات حلقه while در حالی که micro بیش از یه کار رو در یه لحظه نمیتونه انجام بده.پس آیا میشه گفت که وقتی تابع مینویسیم،میکرو به صورت جاروب،دستورات رو انجام میده؟(یعنی یه دستور از دستورات اصلی در حلقه while و یه دستور از تابع رو}
      بنظرتون مشکل از کجاست؟؟؟
      و اینکه چجوری مشکلو حل کنم؟

      با تشکر

      دیدگاه


        #18
        پاسخ : مشکل با keypad

        وای ی ی ی ی ی خدای من . . . :eek: :eek: :eek:
        یه سوال کردی که هزارتا سوال دیگه زیر مجموعه اون بود . . . :biggrin:

        عجب کد خفنی نوشتی . . . ایول
        ولی مشکل شما اینجاست که همه چیزها رو با هم قاطی میکنی . . . و دقت نمیکنی.
        نوشته اصلی توسط cortex-m3
        چرا وقتی درون تابع،برنامه خودم رو مینویسم جواب نمیده؟
        علت اینکه میخوام اینکارو بکنم اینه که روش کد گزاریتون رو توی تابع نمیفهمم(از اونجایی که شما DDRD =0x0F کردید پس نباید ورودی رو در حالات مختلف چک کنید؟)
        یعنی به جای
        کد:
        PORTD=0xFE;
        نباید اینجوری بنویسم(؟):
        کد:
          PORTD.0=0;
        البته کدی که من نوشتم توی proteus جواب نمیده.وقتی RUN میکنم.پورت D که به KEYPAD وصله رو همشو 1 میکنه و دیگه تغییری نمیکنه پس برنامه تو خط اول تابع من گیر میکنه.چرا؟
        شما زمانی که دستور PORTD.0=0 رو مینویسی تو مرحله دوم که میخوای دستور PORTD.1=0 رو بنویسی باید قبلش دستور PORTD.0=1 بزارین . . .
        من این کار رو با هم یکجا انجام دادم . . . ( PORTD=0xFD گذاشتم ) در ضمن اینجا یک دستور به حساب میاد !!!!

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

        و اما . . .
        اینکه میگید
        کد:
        while(key()=='v')
        دو دستور یکجا صورت میگیرد ...
        خیر عزیزم
        این دستور از لحاظ زبان C دو دستور حساب میاد ولی باز ، همین کد هم تبدیل به اسمبلی میشه و ((چند ده)) دستور میشه (شاید هم بیشتر)
        کاربرد این دستور این هست که زمانی که کلیدی نزنیم میکرو منتظر مینشیند و زمانی صفحه کلید را بزنیم از این حلقه خارج میشود
        چون ما شرط حلقه را Void گذاشتیم ; یعنی اگر کلیدی زده نشد دور سر خودت بچرخ

        شما رو همون کدهایی که نوشتم پیش بری بهتره
        سوالی بود در خدمتم
        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
        معرفی نرم افزار Codewizard PWM
        با من بیشتر آشنا شوید

        دیدگاه

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