اطلاعیه

Collapse
No announcement yet.

یه سوال مبتدیانه از کیبرد

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

    یه سوال مبتدیانه از کیبرد

    سلام دوستان
    من یه تازه کار هستم و AVR را از این پست یاد گرفتم http://www.eca.ir/forum2/index.php?topic=7070.0
    همین جا از آقای nex2004 سپاس گذاری میکنم واسه این پست عالیشون :applause: :job:و امیدوارم که این آموزشها ادامه داشته باشه
    میخوام بدونم چطوری میشه یه عدد چند رقمی را ذخیره کرد مثلا با کیبرد اعداد 5و4و3و6و2 را که وارد میکنیم بعد مثلا * را که بزنیم عدد26345 ذخیره شود من برنامه ای که نوشتم فقط عدد آخر ذخیره میشه یعنی هر عددی که وارد میکنم میره جای عدد فعلی را میگیره(فقط عدد آخر ذخیره میشه) :angry: :cry2:
    از دوستان اگه کسی میدونه یه راهنمایی کنید لطفا :redface:
    ممنون :bye


    The harder I work, the luckier I get

    #2
    پاسخ : یه سوال مبتدیانه از کیبرد

    سلام دوست عزیز

    مشکلی نیست اصلا روال کار با کی پد همین است برای این کار شما باید یک while بنویسی

    شما دو تا متغییر تعریف کن مثلا num و num_temp

    وقتی اولین عدد را دریافت کردی آنرا در num_temp بریز بعد وقتی دومین عدد وارد شد مقدار num_temp را در 10 ضرب کن و داخل num بریز
    وقتی سومین عدد وارد شد آنرا در num_temp بریز و سپس مقدار num را در 10 ضرب کن و با num_temp جمع کن و دوباره در num بریز همین کار را تا آخر انجام بده

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

    راستی من یک سایت پیدا کردم که بورد آموزشی ARM و AVR جایزه میده www.ne-ir.com

    دیدگاه


      #3
      پاسخ : یه سوال مبتدیانه از کیبرد

      نوشته اصلی توسط MAJID-PM
      سلام دوست عزیز

      مشکلی نیست اصلا روال کار با کی پد همین است برای این کار شما باید یک while بنویسی

      شما دو تا متغییر تعریف کن مثلا num و num_temp

      وقتی اولین عدد را دریافت کردی آنرا در num_temp بریز بعد وقتی دومین عدد وارد شد مقدار num_temp را در 10 ضرب کن و داخل num بریز
      وقتی سومین عدد وارد شد آنرا در num_temp بریز و سپس مقدار num را در 10 ضرب کن و با num_temp جمع کن و دوباره در num بریز همین کار را تا آخر انجام بده

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

      راستی من یک سایت پیدا کردم که بورد آموزشی ARM و AVR جایزه میده www.ne-ir.com
      با سلام دوباره
      دوست عزیز من هر چی ور رفتم نتونستم برنامشو بنویسم عددهای عجیب قریب نشون میده :sad: oo:
      اگه میشه یه خورده بیشتر توضیح بدید :redface:
      ممنون
      The harder I work, the luckier I get

      دیدگاه


        #4
        پاسخ : یه سوال مبتدیانه از کیبرد

        بابا چرا کسی جواب نمیده پس؟؟؟ :sad: :sad: :sad: :cry2:
        کسی جواب سوالمو نمودونه یعنی؟؟؟؟؟؟؟ :sad:
        The harder I work, the luckier I get

        دیدگاه


          #5
          پاسخ : یه سوال مبتدیانه از کیبرد

          :cry: :cry2:
          The harder I work, the luckier I get

          دیدگاه


            #6
            پاسخ : یه سوال مبتدیانه از کیبرد

            سلام یه نیگاه به این برنامه بنداز اگه متوجه نشدی بگو تا واست توضیح بدم تو این برنامه اعداد به ترتیب در segment[i] ذخیره و روی سون سگمنت نمایش داده میشن
            #include <mega32.h>
            #include <delay.h>
            flash char cathod[16]={252,96,218,242,102,182,190,228,254,246,238,62,15 6,122,158,142};
            flash char anod [8]={247,251,253,254,127,191,223,239};
            flash char kbref[4]={0xef,0xcf,0xbf,0x7f};
            void main (void)
            {
            char kb=16,i=0,j=0,num_new=0,num_old=16;
            char segment[8]={0,0,0,0,0,0,0,0};
            DDRD=0xf0;
            PORTD=255;
            DDRA=255;
            DDRC=255;
            while(1)
            {
            num_new=16;
            for(i=0;i<4;i++)
            {
            PORTD=kbref[i];
            delay_ms(1);
            kb=(~PIND)& 15;
            if(kb==1) num_new=4*i;
            if(kb==2) num_new=4*i+1;
            if(kb==4) num_new=4*i+2;
            if(kb==8) num_new=4*i+3;
            }
            if(num_new!=16 && num_new!=num_old)
            {
            for(j=7;j>0;j--)segment[j]=segment[j-1];
            segment[0]=num_new;
            num_old=num_new;
            }
            if(num_new!=num_old)num_old=16;
            for(i=0;i<8;i++)
            {
            PORTA=cathod[segment[i]];
            PORTC=anod[i];
            delay_ms(2);
            PORTC=255;
            }

            }
            }
            فرزندم در راه است

            دیدگاه


              #7
              پاسخ : یه سوال مبتدیانه از کیبرد

              سلام آقا علی
              خیلی ممنون از پستتون ولی راستش من زبان بیسیک بلدم اونم در حد ابتدایی :redface:
              اگه ممکنه یه خورده توضیح ببدید در مورد نحوه ی عملکرد برنامه :rolleyes:
              متشکر
              The harder I work, the luckier I get

              دیدگاه


                #8
                پاسخ : یه سوال مبتدیانه از کیبرد


                $regfile = "m323def.dat"
                Dim Key As Byte
                Dim Ar(6) As Byte
                Dim N As Byte
                Config Kbd = Porta

                Do
                Key = Getkbd()
                If Key < 10 Then
                For N = 6 To 2 Step -1
                Ar(n) = Ar(n - 1)
                Next N
                Ar(1) = Key
                Waitms 100
                End If
                If Key = 15 Then
                N = 1
                For N = 6 To 1 Step -1
                Print Ar(n);
                Ar(n) = 0
                Next N
                End If
                Loop

                End
                اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

                دیدگاه


                  #9
                  پاسخ : یه سوال مبتدیانه از کیبرد

                  نوشته اصلی توسط narek
                  سلام آقا علی
                  خیلی ممنون از پستتون ولی راستش من زبان بیسیک بلدم اونم در حد ابتدایی :redface:
                  اگه ممکنه یه خورده توضیح ببدید در مورد نحوه ی عملکرد برنامه :rolleyes:
                  متشکر
                  سلام دوست من متاسفانه من بیسیک بلد نیستم ولی کلیات اینجوری است که اول کیبورد را میخونی بعد عدد را در یک متغییر ذخیره میکنی حالا باید تو برنامه تعریف کنی که اگه دستت را روی یک کلید نگه داشتی فقط یک بار عدد را ذخیره کنی و نکته دیگه اینکه وقتی دستت را برداشتی هم نباید هیچ عددی ذخیره بشه حالا اگه یه کلید دیگه زدی این عملیات تکرار بشه
                  فرزندم در راه است

                  دیدگاه


                    #10
                    پاسخ : یه سوال مبتدیانه از کیبرد

                    می تونی به این صورت عمل کنی:
                    هر بار یه عدد دریافت کنی و اونو با حاصلضرب قبلی در 10 جمع کنی. مثلا عدد 24 از جمع عدد 4 با 2*10 بدست میاد .
                    مثل این :

                    ...
                    Dim B As Long
                    Dim A Byte

                    B = 0
                    Do
                    A = Getkbd()
                    A = Lookup(a , Key)
                    Select Acse A
                    Case Is < 10:
                    B = B * 10
                    B = B + A
                    Case 15:
                    Cls
                    Locate 1 , 6
                    Lcd B
                    End Select
                    Loop

                    End

                    Key:
                    Data 1 , 2 , 3 , 10 , 4 , 5 , 6 , 11 , 7 , 8 , 9 , 12 , 13 , 0 , 14 , 15 , 16



                    دیدگاه


                      #11
                      پاسخ : یه سوال مبتدیانه از کیبرد

                      از این برنامه استفاده کن جواب میگیری خودم نوشتم. صد درصد عملی .

                      Config Lcd = 16 * 2
                      Config Kbd = Portb , Debounce = 250 , Delay = 140
                      Cls
                      Cursor Off
                      Dim A As Byte , A1 As Word
                      Dim B As Byte , B1 As Word , E1 As Byte , F1 As Word
                      Dim C As Byte , C1 As Word , D1 As Word , D As Byte
                      Dim S1 As Byte , S2 As Byte , S3 As Byte , S4 As Byte , S5 As Byte
                      Dim R1 As Word , R2 As Word , R3 As Word , T As Byte
                      F1 = 0
                      Do
                      Locate 2 , 1
                      Lcd F1
                      Home
                      Lcd "num:"
                      M1:
                      A = Getkbd()
                      If A > 15 Then Goto M1
                      S1 = Lookup(a , Dat1)
                      If S1 > 9 Then Goto M1
                      Locate 1 , 5
                      Lcd S1
                      Waitms 20
                      M2:
                      B = Getkbd()
                      If B > 15 Then Goto M2
                      S2 = Lookup(b , Dat1)
                      If S2 > 10 Then Goto Main1
                      Locate 1 , 6
                      Lcd S2
                      Waitms 20
                      M3:
                      C = Getkbd()
                      If C > 15 Then Goto M3
                      S3 = Lookup(c , Dat1)
                      If S3 > 10 Then Goto Main2
                      Locate 1 , 7
                      Lcd S3
                      Waitms 20
                      M4:
                      D = Getkbd()
                      If D > 15 Then Goto M4
                      S4 = Lookup(d , Dat1)
                      If S4 > 10 Then Goto Main3
                      Locate 1 , 8
                      Lcd S4
                      Waitms 20
                      M5:
                      T = Getkbd()
                      If T > 15 Then Goto M5
                      S5 = Lookup(t , Dat1)
                      If S5 <> 100 Then Goto M5
                      A1 = S1 * 1000
                      B1 = S2 * 100
                      E1 = S3 * 10
                      C1 = B1 + A1
                      D1 = C1 + E1
                      F1 = D1 + S4
                      Locate 2 , 1
                      Lcd F1
                      Loop
                      Main1:
                      F1 = S1
                      Goto Main
                      Main2:
                      F1 = S1 * 10
                      F1 = F1 + S2
                      Goto Main
                      Main3:
                      R1 = S1 * 100
                      R2 = S2 * 10
                      R3 = R1 + R2
                      F1 = R3 + S3
                      Goto Main
                      Main:
                      Locate 2 , 1
                      Lcd F1
                      Goto M1

                      End
                      Dat1:
                      Data 1 , 2 , 3 , 10 , 4 , 5 , 6 , 10 , 7 , 8 , 9 , 10 , 100 , 0 , 10
                      زیباترین لحظات را کسی به تو هدیه میدهد که بدترین لحظات را از تو بگیرد

                      دیدگاه


                        #12
                        پاسخ : یه سوال مبتدیانه از کیبرد

                        سلام :biggrin:
                        بچه ها از همتون تشکر میکنم واسه کمکی که به من کردید بالاخره تونستم با راهنمایی های شما یه برنامه خودم بنویسم با پروتئوس هم چک کردم 100% جواب میده اینم برنامش میزارم اینجا حالشو ببرید :mrgreen:
                        $regfile = "m16def.dat"
                        $crystal = 80000
                        Dim A As Byte
                        Dim B As Long
                        Config Lcd = 16 * 2
                        Config Kbd = Portb
                        B = 0
                        Do
                        A = Getkbd()
                        If A < 10 Then
                        B = B * 10
                        B = B + A
                        Cls
                        Lcd B
                        Waitms 400
                        End If
                        Loop
                        End
                        فقط بازم یه سوالی واسم بی جواب مونده :sad: :redface: اونم اینکه اولش که برنامه را نوشته بودم تاخیر رو ایجاد نکرده بودم (Waitms 400) بعد مثلا یه عددی را میزدم مثلا 4 برنامه میزد 44444 :eek: بعدش که تاخیر را گذاشتم درست شد میخوام بدونم علت اون تاخیر چیه؟ چرا حتما باید تاخیر رو بذارم؟(خودم چند دلیل پیش خودم دارم میخام مطمعن شم که استدلال خودم درسته یا نه :biggrin
                        بازم از شما تشکر میکنم واسه راهنمایی هاتون ممنون :job: :bye
                        The harder I work, the luckier I get

                        دیدگاه


                          #13
                          پاسخ : یه سوال مبتدیانه از کیبرد

                          من فکر می کنم اگه دستت روی کلید باقی بمونه باز هم 4444444 رو می نویسه فقط سرعتش اول زیاد بود و بعدش تاخیر که گذاشتی کمتر شد
                          یک راه حل خیلی عالی اینه که برنامه رو اینطوری تعقیر بدی ( کبیورد مثل ماشین حساب عمل می کنه و هر بار فشردن کلید فقط یک بار عمل می کنه زمان cpu هدر نمیشه و سرعت کلید زدنت هم بالا میره )


                          $regfile = "m16def.dat"
                          $crystal = 80000
                          Dim A As Byte
                          Dim B As Long
                          Dim Slave As Byte
                          Config Lcd = 16 * 2
                          Config Kbd = Portb
                          B = 0
                          Do
                          A = Getkbd()

                          If A < 10 Then
                          Do
                          Slave = Getkbd()
                          Loop Until Slave <> A
                          B = B * 10
                          B = B + A
                          Cls
                          Lcd B
                          End If
                          Loop
                          End


                          اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

                          دیدگاه


                            #14
                            پاسخ : یه سوال مبتدیانه از کیبرد

                            مشکل برنامه بر میگ رده به تعریف کیپد .
                            یا باید همون طور که نوشتی عمل کنی یا به این صورت:

                            Config KBD=PortB , Delay = 200 , Debounce = 200

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

                            دیدگاه

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