اطلاعیه

Collapse
No announcement yet.

نمایش عدد بزرگ وارد شده از کیپد روی LCD

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

    نمایش عدد بزرگ وارد شده از کیپد روی LCD

    سلام ، میخوام یه عدد بزرگ رو ، مثلا 10 رقم رو با کیپد بخونم و رو lcd نمایش بدم، مشکلم اینجاست که عدد وقتی از 4 رقم بزرگ میشه ، اعداد قاطی میکنند

    چه نوع متغیری انتخاب کنم ؟ آیا تاکتیک خاصی داره ؟؟

    حتی نوع متغیر عددی که باید روی lcd نمایش داده بشه رو unsigned long گذاشتم ، ولی تاثیری نداشت. ( در محیط پروتئوس)
    به رویاهات فکر کن!!

    #2
    پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

    سلام :nerd:
    سعی کنید همیشه وقتی سوال میکنید همه چیز رو خوب شرح بدید تا سریع به جواب برسید. :smile:
    مثلا شما از کدوم زبان استفاده میکنید؟(البته احتمالا سی)
    از کدوم برنامه یا کامپایلر؟
    واقعا 10 رقم هستش یا ممکنه بیشتر-کمتر بشه؟
    متغییر فعلی شما چیه؟
    عدد صحیحه یا اعشار؟
    و...
    اگه شماتیک و برنامه رو هم قرار بدید و و یه توضیح کوچیک بدید که دیگه فکر نکنم لازم باشه سوالا رو جواب بدید.

    دیدگاه


      #3
      پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

      تو قسمت Fundamental data types یه جدول هست که بازه متغییر ها رو نوشته:

      http://www.cplusplus.com/doc/tutorial/variables/

      فکر کنم شما با float یا double یا long double کارتون راه بیفته!

      دیدگاه


        #4
        پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

        شما کیپد رو با چه تابعی میخونید؟
        اعداد قاطی میکنن دقیقا یعنی چی؟

        اعداد رو به صورت ارایه ای ذخیره میکنید یا به صورت یک عدد در متغیر؟

        توضیح بدید لطفا!

        متغیر نوع long فقط تا 10 رقم ظرفیت داره
        ینی Unsigned Long تا 4294967295 جاداره!

        اما متغیر double تا 15 رقم جا میگیره
        بهتره از اون استفاده کنید
        و اگه قرار نیست روی اعداد محاسبات انجام بدید بهتره به صورت ارایه ای ذخیره اش کنید

        دیدگاه


          #5
          پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

          نوشته اصلی توسط rozeh
          سلام :nerd:
          سعی کنید همیشه وقتی سوال میکنید همه چیز رو خوب شرح بدید تا سریع به جواب برسید. :smile:
          مثلا شما از کدوم زبان استفاده میکنید؟(البته احتمالا سی)
          از کدوم برنامه یا کامپایلر؟
          واقعا 10 رقم هستش یا ممکنه بیشتر-کمتر بشه؟
          متغییر فعلی شما چیه؟
          عدد صحیحه یا اعشار؟
          و...
          اگه شماتیک و برنامه رو هم قرار بدید و و یه توضیح کوچیک بدید که دیگه فکر نکنم لازم باشه سوالا رو جواب بدید.
          سلام :smile:

          از زبان c استفاده میکنم کامپایلر کدویژن.. یه شماره تلفن میخوام وارد کنم.. 8رقم یا 11 رقم

          من انواع متغیر رو انتخاب کردم long int , Double و .. ولی در نمایش رو LCD فقط تا حد بالای متغیر int میره.. یعنی : 32768.. بیشتر از این عدد رو وارد کنم اعداد قاطی میشه مثلا یهو میره منفی 7506 !

          شماتیک :


          برنامه :
          کد:
          /*****************************************************
          This program was produced by the
          CodeWizardAVR V2.05.3 Standard
          Automatic Program Generator
          © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
          http://www.hpinfotech.com
          
          Project : 
          Version : 
          Date  : 2013-03-26
          Author : Negaran
          Company : 
          Comments: 
          
          
          Chip type        : ATmega16
          Program type      : Application
          AVR Core Clock frequency: 1.000000 MHz
          Memory model      : Small
          External RAM size    : 0
          Data Stack size     : 256
          *****************************************************/
          
          #include <mega16.h>
          #include <delay.h>
          #include <stdlib.h>
          // Alphanumeric LCD functions
          #include <alcd.h>
          unsigned long int number1,number2;
          unsigned char key=0;
          char s[10];
          bit mode1=1,mode2,n1=1,n2;
          // Declare your global variables here
          unsigned char scan_keypad()
            { 
            char kb; 
            delay_ms(20);
            //--row1--
            PORTD.0=0;
                delay_ms(20);
                if(PIND.4==0)
                {
                delay_ms(20);
                kb=1;
                while(PIND.4==0);
                }
                
                if(PIND.5==0)
                {
                delay_ms(20);
                kb=2;
            
                while(PIND.5==0);
                }
                
                if(PIND.6==0)
                {
                delay_ms(20);
                kb=3;
            
                while(PIND.6==0);
                }
                
          
             PORTD.0=1;    
            //--row2-- 
            
            PORTD.1=0;
                delay_ms(20);
                if(PIND.4==0)
                {
                delay_ms(20);
                kb=4;
                while(PIND.4==0);
                }
                
                if(PIND.5==0)
                {
                delay_ms(20);
                kb=5;          
               
                while(PIND.5==0);
                }
                
                if(PIND.6==0)
                {
                delay_ms(20);
                kb=6;
                while(PIND.6==0);
                }
                
                PORTD.1=1; 
             //--row3--
                PORTD.2=0;
                delay_ms(20);
                if(PIND.4==0)
                {
                delay_ms(20);
                kb=7;
                while(PIND.4==0);
                }
                
                if(PIND.5==0)
                {
                delay_ms(20);
                kb=8;
                while(PIND.5==0);
                }
                
                if(PIND.6==0)
                {
                delay_ms(20);
                kb=9;
                while(PIND.6==0);
                }
                
          
                PORTD.2=1; 
             //--row4--
                PORTD.3=0;
                delay_ms(20);
                if(PIND.4==0)
                {
                delay_ms(20);
                kb='*';
                while(PIND.4==0);
                }
                
                if(PIND.5==0)
                {
                delay_ms(20);
                kb=0;
                while(PIND.5==0);
                }
                
                if(PIND.6==0)
                {
                delay_ms(20);
                kb='#';
                while(PIND.6==0);
                }
                
          
              PORTD.3=1;
                    
              return kb; 
              }
          void main(void)
          {
          // Declare your local variables here
          
          // Input/Output Ports initialization
          // Port A 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 
          PORTA=0x00;
          DDRA=0x00;
          
          // Port B 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 
          PORTB=0x00;
          DDRB=0x00;
          
          // 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=Out Func1=Out Func0=Out 
          // State7=T State6=T State5=T State4=T State3=T State2=1 State1=1 State0=1 
          PORTD=0x07;
          DDRD=0x07;
          
          // Alphanumeric LCD initialization
          // Connections are specified in the
          // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
          // RS - PORTA Bit 0
          // RD - PORTA Bit 1
          // EN - PORTA Bit 2
          // D4 - PORTA Bit 4
          // D5 - PORTA Bit 5
          // D6 - PORTA Bit 6
          // D7 - PORTA Bit 7
          // Characters/line: 16
          lcd_init(16);
          lcd_clear();
          lcd_gotoxy(0,0);
          while (1)
             {    delay_ms(5);
          
             while(mode1)
             { 
               lcd_clear();
               lcd_gotoxy(0,0);
               lcd_putsf("Enter Number1:");
               delay_ms(1000);
             while(n1)
              {
              lcd_clear();
              lcd_gotoxy(0,0);
              key=scan_keypad();
              if(key==1) number1=number1*10+1;     
              if(key==2) number1=number1*10+2;
              if(key==3) number1=number1*10+3;
              if(key==4) number1=number1*10+4;
              if(key==5) number1=number1*10+5;
              if(key==6) number1=number1*10+6;
              if(key==7) number1=number1*10+7;
              if(key==8) number1=number1*10+8;
              if(key==9) number1=number1*10+9;
              if(key==10)number1=number1*10; 
              if(key=='*') n1=0;
              itoa(number1,s);
              lcd_puts(s);
              delay_ms(50); 
              
              
              }    
              
          
             }
          }
          }
          به رویاهات فکر کن!!

          دیدگاه


            #6
            پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

            نوشته اصلی توسط atige
            شما کیپد رو با چه تابعی میخونید؟
            اعداد قاطی میکنن دقیقا یعنی چی؟

            اعداد رو به صورت ارایه ای ذخیره میکنید یا به صورت یک عدد در متغیر؟

            توضیح بدید لطفا!

            متغیر نوع long فقط تا 10 رقم ظرفیت داره
            ینی Unsigned Long تا 4294967295 جاداره!

            اما متغیر double تا 15 رقم جا میگیره
            بهتره از اون استفاده کنید
            و اگه قرار نیست روی اعداد محاسبات انجام بدید بهتره به صورت ارایه ای ذخیره اش کنید
            برنامه رو تو پست بالا گذاشتم ، یه تابع اولش گذاستم به اسم scan_keypad ، با اون اسکن میکنم :smile:
            به صورت یه عدد تو متغیر ذخیره میکنم.. چطور میتونم تو آرایه بریزم.. یکم توضیح میدی ؟
            به رویاهات فکر کن!!

            دیدگاه


              #7
              پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

              سلام :nerd:
              شما خیلی جاها از دستور شرطی If استفاده کردین. وقتی که دستورهای شرطی زیادی دارین که واسه برابر بودن یا مساوی بودن هستش از Switch cas استفاده کنید. الان تو حلقه همچین چیزی می بینم. قبل از تابع اصلی هم همچین چیزی میبینم. این نشون میده شما یا برنامه نویسی کامل بلد نیستید یا هنوز حرفه ای نشدید :sad:. سعی کنید اول همه دستورات توی برنامه نویسی C رو یه بار نگاه کنید.
              واسه چک کردن پورت ها شما نمی خواین دستور شرطی براش بذارین؟
              پورت pd3 رو هم که 1 نکردین؟ فکر کنم یادت رفته!

              دیدگاه


                #8
                پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

                با سلام،

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

                با توجه به اینکه قرار نیست روی عدد نهایی کار محاسباتی انجام بشه، بهترین اقدام اینه که شما ورودی رو در یک متغیر رشته ای ذخیره کنید تا بتونید به راحتی اون رو ذخیره کرده و نمایش بدید.

                ولی اگر بر همین وضعیت فعلی اصرار دارید، یک متغیر Long کار شما رو راه میندازه ( تا 10 رقم ) ولی به جای itoa باید از ltoa استفاده کنید :

                کد:
                ltoa(number1, s);
                راه حل بهتر استفاده از sprintf هستش! در اینصورت باید در تنظیمات پروژه، sprintf رو روی long, width قرار بدید و از اون به این شکل استفاده کنید :
                کد:
                sprintf(s, "%lu", number1);
                و اگر عدد بزرگتر از 10 رقم باشه، اونوقت باید از راه حل های ابتکاری استفاده بشه ..... :mrgreen:
                مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                Sh_Nourbakhsh@Yahoo.com

                http://s2.picofile.com/file/7170362468/_Wall_e_.jp

                دیدگاه


                  #9
                  پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

                  نوشته اصلی توسط rozeh
                  سلام :nerd:
                  شما خیلی جاها از دستور شرطی If استفاده کردین. وقتی که دستورهای شرطی زیادی دارین که واسه برابر بودن یا مساوی بودن هستش از Switch cas استفاده کنید. الان تو حلقه همچین چیزی می بینم. قبل از تابع اصلی هم همچین چیزی میبینم. این نشون میده شما یا برنامه نویسی کامل بلد نیستید یا هنوز حرفه ای نشدید :sad:. سعی کنید اول همه دستورات توی برنامه نویسی C رو یه بار نگاه کنید.
                  واسه چک کردن پورت ها شما نمی خواین دستور شرطی براش بذارین؟
                  پورت pd3 رو هم که 1 نکردین؟ فکر کنم یادت رفته!
                  ممنوناز توضیحاتت .. آره درسته برنامه اصلا حرفه ای نیستش ولی اسکن کیپد داره انجام میشه.. پورت pd3 رو هم یک کردم که... :biggrin:
                  به رویاهات فکر کن!!

                  دیدگاه


                    #10
                    پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

                    نوشته اصلی توسط aivhl
                    با سلام،

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

                    با توجه به اینکه قرار نیست روی عدد نهایی کار محاسباتی انجام بشه، بهترین اقدام اینه که شما ورودی رو در یک متغیر رشته ای ذخیره کنید تا بتونید به راحتی اون رو ذخیره کرده و نمایش بدید.

                    ولی اگر بر همین وضعیت فعلی اصرار دارید، یک متغیر Long کار شما رو راه میندازه ( تا 10 رقم ) ولی به جای itoa باید از ltoa استفاده کنید :

                    کد:
                    ltoa(number1, s);
                    راه حل بهتر استفاده از sprintf هستش! در اینصورت باید در تنظیمات پروژه، sprintf رو روی long, width قرار بدید و از اون به این شکل استفاده کنید :
                    کد:
                    sprintf(s, "%lu", number1);
                    و اگر عدد بزرگتر از 10 رقم باشه، اونوقت باید از راه حل های ابتکاری استفاده بشه ..... :mrgreen:
                    ممون! مشکلم با اون ltoa حل شد تقریبا.. ولی به نظرم همون آرایه ای استفاده بشه خیلی راحت تر میشه...
                    unsigned char number[8]
                    بعد موقع خوندن هم که یه حلقه for میذاریم.. درست؟؟

                    به رویاهات فکر کن!!

                    دیدگاه


                      #11
                      پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

                      نوشته اصلی توسط اریک ماطوسیان
                      ممنوناز توضیحاتت .. آره درسته برنامه اصلا حرفه ای نیستش ولی اسکن کیپد داره انجام میشه.. پورت pd3 رو هم یک کردم که... :biggrin:
                      :nerd:
                      در اصل پورت D شما باید اینجوری 0x0F مقدار دهی بشه!

                      دیدگاه


                        #12
                        پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

                        دوست عزیز ، اول توی تنظیمات پروژه برید و تنظیمات مربوط به printf , sprintf رو روی long بزارید.
                        دوم ، شما موقعی که مینویسی number1*10 چون number1 از نوع long هست باید اینطوری بنویسی number1*10L
                        یا بنویسی10 number1*(long) ، یعنی یا با گذاشتن long قبل از 10 یا با گذاشتن حرف L پسبیده به 10 اون رو long کنی.

                        سوم اینکه بهتره این مورد (شماره تلفن وارد شده) رو توی یک رشته ذخیره کنی و تمام کارهات رو با رشته انجام بدی ، از قبیل مقایسه با یک شماره دیگه و ... اینجوری هم دستت باز تره هم خطات کمتره.

                        دیدگاه


                          #13
                          پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

                          نوشته اصلی توسط Nourbakhsh Rad


                          راه حل بهتر استفاده از sprintf هستش! در اینصورت باید در تنظیمات پروژه، sprintf رو روی long, width قرار بدید و از اون به این شکل استفاده کنید :
                          کد:
                          sprintf(s, "%lu", number1);

                          سلام
                          منظور از تنظیمات پروژه کجاست ،چون منم دقیقا این مشکل رو دارم.

                          دیدگاه


                            #14
                            پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

                            تو منو Project آخرین بخش یعنی Configure.

                            دیدگاه


                              #15
                              پاسخ : نمایش عدد بزرگ وارد شده از کیپد روی LCD

                              نوشته اصلی توسط امیر . م
                              تو منو Project آخرین بخش یعنی Configure.
                              آقا دست درد نکنه.
                              مشکلم حل شد.
                              جریان این چی بود که باید تغییر می کرد؟

                              دیدگاه

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