اطلاعیه

Collapse
No announcement yet.

اشکال در برنامه LCD

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

    اشکال در برنامه LCD

    سلام
    c برای فراخوانی LCD من در مورد برنامه نویسی میکرو 8051مشکل دارم . هر چه برنامه را تغییر می دهم و تاخیر برایش قرار می دهم باز هم lcd جواب نمی دهد.
    لطفا برنامه من را خوانده و اشکال آن را رفع کنید.
    با تشکر
    # define LCD_E P2_0
    #define LCD_RW P2_1
    #define LCD_RS P2_2
    #define LCD_DB P0

    void time1ms ()
    {
    int i;
    for (i=0; i < 100; i++);
    }
    void delay1 (int n)
    {
    int i;
    for (i=0; i< n; i++)
    time1ms ();
    }

    void main ()
    {
    LCD_RW =0;
    LCD_RS =0;
    delay1(500);
    LCD_DB = 0x01;
    delay1(500);
    LCD_E =1 ;
    delay1(50);
    LCD_E =0;
    delay1(500);
    LCD_RW =0;
    LCD_RS =0 ;
    delay1 (500);
    LCD_DB = 0x38;
    delay1(500);
    LCD_E =1 ;
    delay1(50);
    LCD_E =0;
    delay1(500);
    LCD_RW =0;
    LCD_RS = 0;
    delay1(500);
    LCD_DB = 0x0E;
    delay1(500);
    LCD_E = 1;
    delay1(50);
    LCD_E =0;
    delay1(500);
    LCD_E = 1;
    delay1(50);
    LCD_E =0;
    delay1(500);
    LCD_RW =0;
    LCD_RS = 0;
    delay1(500);
    LCD_DB = 0x06;
    delay1(500);
    LCD_E =1 ;
    delay1(50);
    LCD_E =0;
    delay1(500);
    LCD_RW =0;
    LCD_RS = 0;
    delay1 (500);
    LCD_DB = 0x80;
    delay1(500);
    LCD_E =1 ;
    delay1(50);
    LCD_E =0;
    delay1(500);
    LCD_RW =0 ;
    LCD_RS = 1;
    delay1(500);
    LCD_DB ='N';
    while (1) ;

    }







    [/code]

    #2
    اشکال در برنامه LCD

    سلام . خوبی دوست عزیز؟
    ببینید زمانی که به زبان C برنامه مینویسید مشخص نیست که از چه دستوری برای تبدیل حلقه شما به زبان اسمبلی استفاده میکنه بنابراین نمیتونید تاخیر دقیق رو بدست بیارید مگه اینکه تاخیر رو با تایمر درست کنید .
    ولی برای LCD من زمانی که به زبان C مینویسیم 2 تا حلقه تو در تو 50 تکرار میذارم میشه 2500 تا توی عمل هم ازش جواب گرفتم . فقط این کامپایلر ها یه مقدار مشکل دارن حواستون باشه آخر پرانتز FOR سیمیکالتون نذارید بلکه توی خط پایینش بنویسید {} .
    موفق باشید .
    شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
    هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
    چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

    دیدگاه


      #3
      اشکال در برنامه LCD

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

      دیدگاه


        #4
        اشکال در برنامه LCD

        سلام
        برنامه را آنطوری که شما گفتید ، انجام دادیم ولی LCD کار نکرد.
        البته باید بگم که پروژه ام با FPGA کار می کند و در طراحی داخلی از هسته FPGA
        TSK51A_ D که عملکردش همانند 8051 است با نرم افزار پروتل dxp طراحی شده است
        حال با راه اندازی lcd, keypad مشکل دارم .
        خواهش می کنم مرا راهنمایی کنید. اگر کسی را که با این نرم افزار کار کرده است معرفی کنید. خیلی ممنون

        دیدگاه


          #5
          سلام

          سلام

          یک سوال داشتم اینکه فرض کنید از طرق صفحه کلید یک سری عدد روی lcd نمایش دادیم56546989 و مکان نما هم روشن باشه.
          حالا باید lcd دستوری داشته باشه که با زدن یک کلید محل مکان نما علاوه بر حرکت به سمت چپ عدد هم پاک بشه!
          که فکر میکنم این کد همون عدد 4 باشه که در جدول صفحه 205 کتاب 8051 مزیدی هست.
          ولی وقتی من این فرمان و به lcd میدم اجرا نمیشه؟؟؟؟
          در صورتی که بقیه فرمانها اجرا میشه!!!
          لطفا راهنمایی کنید.
          متشکرم.
          ww.microworld.blogfa.com

          دیدگاه


            #6
            اشکال در برنامه LCD

            سلام .خوبی دوست عزیز؟
            حقیقتش من دقیق نمیدونم که عدد 4 که گفتید کد اسکیه که فرمان LCD هست .
            ولی چیزی که هست اگه بخواهی همینطوری اینکار رو انجام بدی باید آدرس رو یه خونه بیاری عقب بعد کد اسکی اسپیس رو بفرستی بعد دوباره یه خونه بیایی عقب .
            شاید روش معقول تری هم داشته باشه من بلد نیستم.
            موفق باشید.
            شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
            هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
            چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

            دیدگاه


              #7
              اشکال در برنامه LCD

              درسته، این کار رو باید با میکرو انجام بدید (یعنی خودت برنامه نویسیشو بکنی) من همچین دستوری برای LCD تا حالا ندیدم. اون کد 0x04 هم اصلا برای این کار نیست بلکه کارش اینه که اگه شما این کد رو بهش بدید هر وقت یک کاراکتر توش بنویسید (data) مکان نما یکی کم میشه یعنی مثل word pad که وقتی میزنید "right to left" از راست به چپ مینویسه (معادل 0x04 برای lcd) و وقتی میزنید "left to right" از چپ به راست مینویسه (معادل 0x06 برای lcd) امیدوارم که تونسته باشم منظورمو برسونم
              حالا من یه سوال دارم
              من یه ال سی دی 4x20 خریدم، یه کد هست 0x38 که به به معنای سازماندهی 2خط و ماتریس5x7 هست حالا کد سازماندهی 4خط کدومه؟ (تو مزیدی ننوشته) بعد اینکه بقیه دستوراتش مثل همون ال سی دی 2x16 هست یا دستورات بیشتری داره؟ کسی یه ebook یا چیزی در اینمورد داره؟
              قربان همتون...شهاب
              سایت صغیر این بنده حقیر منتظر بازدید و نظرات شما دوستان کبیر میباشد
              www.best-circuits.com
              (زبان فارسی به سایت اضافه شد)

              دیدگاه


                #8
                اشکال در برنامه LCD

                سلام . خوبی دوست عزیز؟
                من تا الان با LCD هایی که بیشتر از 2 سطر دارم کار نکردم ولی فکر میکنم اگه همون کد رو بفرستید و بعد سطر ها رو تک تک آدرس بدید مشکلی پیش نمیاد .
                مثلا برای بار اول یه برنامه بنویسید که با همین کد 0x38 کار قالب بندی رو انجام بده بعد مدام یه حرف رو برای LCD بفرستید تا جایی که جا داشته باشه این حرف روی سطر های مختلف به نمایش در میاد اگه در 2 سطر آخر به نمایش در نیومد دیگه فکر کنم حتما باید دیتاشیتش رو پیدا کنید .
                موفق باشید.
                شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
                هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
                چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

                دیدگاه


                  #9
                  اشکال در برنامه LCD

                  #include <reg52.h>
                  //*********************************
                  sbit RS = P3^0;
                  sbit RW = P3^1;
                  sbit EN = P3^2;
                  //*********************************
                  char read(char ch[]) ;
                  int bin(int ci);
                  char read1(char c) ;
                  int com(int a);
                  int ascii(int as) ;
                  void cls();
                  int delay();
                  int delay1();
                  //*********************************
                  void main(void)
                  {
                  int i;
                  cls();
                  for(i=0;i<256;i++){
                  com(0x80);
                  ascii(i);
                  com(0xC0);
                  bin(i);
                  delay1();

                  }
                  while(1){

                  }
                  }
                  //*******************COMMAND********************
                  int com(int a)
                  {
                  delay();
                  P2= a;
                  RS=0;
                  RW=0;
                  EN=1;
                  delay();
                  EN=0;
                  }
                  //******************READ********************

                  char read(char ch[])
                  {
                  int i ;
                  for(i=0;ch[i] !='\0';i++){
                  delay();
                  P2=ch[i];
                  RS=1;
                  RW=0;
                  EN=1;
                  delay();
                  EN=0;
                  }
                  }

                  //********************read1*****************

                  char read1(char c) {
                  delay();
                  P2=c;
                  RS=1;
                  RW=0;
                  EN=1;
                  delay();
                  EN=0;
                  }
                  //**************CLEAN SCREEN****************
                  void cls()
                  {
                  int g[7] = {0x38, 0x0F, 0x0, 0x02, 0x80, 0x0C},i;
                  for(i=0;i<6;i++)
                  {
                  delay();
                  com (g[i]);
                  }
                  }

                  //******************ASCII*******************

                  int ascii(int as)
                  {
                  char ba1[5],i,f=0;
                  for (i = 1; i <= 4; i++){
                  ba1[i] = as % 10;
                  as /= 10;
                  }
                  i=4;
                  while(ba1[i]==0) {
                  i--;
                  }

                  for (i = i; i > 0; i--){
                  ba1[i] += 48;
                  f=ba1[i] ;
                  read1(f);
                  }
                  }
                  //*****************binary ascii**************
                  int bin(int ci)
                  {
                  char ba2[9], i,f=0;
                  for (i = 1; i <= 8; i++){
                  ba2[i] = ci % 2;
                  ci /= 2;
                  }
                  for (i = 8; i > 0; i--)
                  {
                  ba2[i] += 48;
                  f = ba2[i] ;
                  read1(f);
                  }
                  }
                  //************************ delay*************************

                  int delay(){
                  int i=0;

                  TMOD=1;
                  TH0=254;
                  TL0=12;
                  TR0=1;
                  while( TF0!=1);
                  TF0=0;
                  TR0 =0;

                  }
                  //************************ delay1**************************
                  int delay1(){
                  int i;
                  for(i=0;i<3000;i++){
                  delay();
                  }

                  }
                  فهبنی صبرت علی عذابک فکیف اصبرعلی فراقک
                  گیرم که برعذاب توصبر کنم ،چگونه بر جدایی ات شکیبایی ورزم

                  دیدگاه


                    #10
                    اشکال در برنامه LCD

                    من دقیقا بعد از اینکه این سوال رو پرسیدم رفتم و امتحان کردم (یکی نیست بگه آخه ابله :cry: خوب اول برو امتحان کن بعد بیا بپرس ) از همون 0x80 شروع میشه بعد میاد خط سوم بعد دوم و بعد چهارم
                    سایت صغیر این بنده حقیر منتظر بازدید و نظرات شما دوستان کبیر میباشد
                    www.best-circuits.com
                    (زبان فارسی به سایت اضافه شد)

                    دیدگاه


                      #11
                      اشکال در برنامه LCD

                      دوباره سلام و دوباره یه سوال دیگه
                      چجوری باید اطلاعات روی LCD (کاراکتری 16x2 یا 20x4 ) رو بخونیم. مثلا میخوام بدونم که توی ادرس 0x80 (خط اول،کاراکتر اول) چه کاراکتری نوشته شده. 'a' یا 'b' یا ...
                      بعد اینکه خوندن اطلاعات از روی lcd بطور معمول چقدر طول میکشه؟
                      با تشکر از همگی.
                      سایت صغیر این بنده حقیر منتظر بازدید و نظرات شما دوستان کبیر میباشد
                      www.best-circuits.com
                      (زبان فارسی به سایت اضافه شد)

                      دیدگاه


                        #12
                        اشکال در برنامه LCD

                        سلام . خوبی دوست عزیز؟
                        من خودم تا الان این کار رو نکردم. متونم علت این کار رو بندونم چرا می خواهید از روی LCD بخونید؟ شاید از طریق دیگه هم بشه کاری که در ذهن دارید رو انجام داد.
                        موفق باشید.
                        شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
                        هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
                        چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

                        دیدگاه


                          #13
                          اشکال در برنامه LCD

                          ببینید فرض کنید یه lcd 20x4 هست که مثلا باید ثانیه ای 1 بار refresh بشه خوب بعد از نوشتن هر data یا command باید حداقل 2ms صبر کنیم که در نتیجه: 20x4x2=160ms یعنی هر دفعه 160ms طول میکشه تا refresh بشه که این زمان باعث میشه که به قول معروف صفحه بپره!
                          حالا من فکر میکنم که سرعت خوندن خیلی بالا تر از سرعت نوشتن باشه پس بهتره اول کاراکتر مورد نظر رو بخونیم بعد اگه با اون چیزی که باید باشه متفاوت بود اون وقت بنویسیم.
                          برای مثال من توی serial EEPROM هم از همین روش استفاده میکنم فرض کنید میخواید یه serial EEPROM که حجمش 64KB هست رو به طور کامل پاک کنید (تمام بایتها رو صفر کنید) خوب عمل نوشتن 10ms و عمل خوندن فوق فوقش 100us طول میکشه پس بهتره اول یک بایت رو بخونید بعد اگه 0 نبود صفرش کنید. اینجوری خیلی سریعتر هست درسته؟
                          سایت صغیر این بنده حقیر منتظر بازدید و نظرات شما دوستان کبیر میباشد
                          www.best-circuits.com
                          (زبان فارسی به سایت اضافه شد)

                          دیدگاه


                            #14
                            اشکال در برنامه LCD

                            سلام.
                            اول یک سوال.
                            شما چی میخواید توی ال سی دی بنویسید که فکر میکنید چشمک میزنه؟
                            بعدش هم اینکه توی ال سی دی عملیات خوندن و نوشتنش یه میزان زمان لازم داره (توی کتاب که اینجوری نوشته بود).
                            برای خوندن از ال سی دی هم همه عملیات تا اونجایی که آدرس کاراکتر رو مینویسید مثل نوشتن در ال سی دیه بعد از اون مرحله که آدرس کاراکتر رو نوشتید بجای اینکه دیتا رو بنویسید RW رو یک میکنید ؛ پایه دیتا میکرو رو یک میکنید (برای اینکه بصورت ورودی کار کنه) بعد RS رو 1 میکنید و بعد E رو یک میکنید و بعد صفرش میکنید و بعد یه وقفه کوتاه و بعد پورت میکرو رو میخونید (همون که به خط دیتا ال سی دی وصله).
                            محتویاتش همون کد اسکیه کاراکتریه که آدرسش رو نوشته بودی.
                            اگر بد گفتم ببخش.
                            یه مثالشو مینویسم میذارم که بهتر بشه متوجه شد.
                            الهم عجل لولیک الفرج

                            دیدگاه

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