اطلاعیه

Collapse
No announcement yet.

مشکل با کاربرد دستور lcd_gotoxy در چرخه بینهایت

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

    مشکل با کاربرد دستور lcd_gotoxy در چرخه بینهایت

    سلام. من طبق چیزهایی که در اینترنت دیدم، یه ولتمتر درست کردم که البته زمان سنج (ثانیه شمار) هم در درونش داره. حالا مشکلم اینجاست که وقتی دستور زیر رو پروگرام میکنم، کاملا درست عمل میکنه، یعنی اول ولتاژ و بعد صفحه پاک میشه و ثانیه رو نشون میده ولی من لازم دارم که هردو رو همزمان در دو خط LCD داشته باشم. از 1602 استفاده میکنم. از دستور lcd_gotoxy در درون while که استفاده میکنم جواب نمیده و کلا برنامه از کار میفته. لطفا راهنماییم کنید. ممنونم. (این توضیح رو هم بدم که کار این قطعه در واقع جمع ولتاژ عبوری در طول زمانه، اگه یه موقع دستورات جمع رو دیدید مشکلی در این بابت نیست

    [code=c]
    #include <mega8.h>
    #include <delay.h>
    #include <stdlib.h>
    #include <alcd.h>
    #include <stdio.h>
    #asm
    .equ __lcd_port=0x18 //portb
    #endasm

    #define ADC_VREF_TYPE 0x00 //Volt.Ref


    float read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    delay_us(10); // Delay needed for the stabilization of the ADC input voltage
    ADCSRA|=0x40; // Start the AD conversion
    while ((ADCSRA & 0x10)==0); // Wait for the AD conversion to complete
    ADCSRA|=0x10;
    return ADCW;
    }

    void main(void)
    {
    char buffer[];
    int t=0;
    char T[];
    float V,g=0,d=0;


    DDRD=0X00;

    lcd_init(16);

    // ADC Clock frequency: 125.000 kHz
    // ADC Voltage Reference: Int., cap. on AREF
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x85;


    while (1)
    {
    if(PIND.0)
    {
    V=read_adc(0);


    V=(V*5)/1023;
    g=V;
    d=g+d;
    t=t+1;

    ftoa(d,6,buffer);
    lcd_putsf("Q="
    lcd_puts(buffer);
    delay_ms(750);
    lcd_clear();

    itoa(t,T);
    lcd_putsf("T="
    lcd_puts(T);
    delay_ms(250);
    lcd_clear();

    }


    };
    }
    [/code]

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


    کد:
    #include <mega8.h>
    #include <delay.h>
    #include <stdlib.h>
    #include <alcd.h>
    #include <stdio.h>
    #asm
      .equ __lcd_port=0x18 //portb
    #endasm
     
    #define ADC_VREF_TYPE 0x00 //Volt.Ref
     
     
    float read_adc(unsigned char adc_input)
    {
      ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
      delay_us(10);  // Delay needed for the stabilization of the ADC input voltage
      ADCSRA|=0x40; // Start the AD conversion
      while ((ADCSRA & 0x10)==0); // Wait for the AD conversion to complete
      ADCSRA|=0x10;
      return ADCW;
    }
     
    void main(void)
    {
      char buffer[17];
      int t=0;
      char T[17];
      float V,g=0,d=0;
      
      
      DDRD=0X00;
      
      lcd_init(16);
     
      // ADC Clock frequency: 125.000 kHz
      // ADC Voltage Reference: Int., cap. on AREF
      ADMUX=ADC_VREF_TYPE & 0xff;
      ADCSRA=0x85;
     
     
      while (1)
      {  
        if(PIND.0)
        {  
          V=read_adc(0);
          
          
            V=(V*5)/1023;
            g=V;
            d=g+d;
            t=t+1;
            
           
     ftoa(d,6,buffer);
            itoa(t,T);
    
      lcd_clear();
            lcd_putsf("Q=");
            lcd_puts(buffer);
           
    
    
     lcd_gotoxy(0,1)
            
    
    
            lcd_putsf("T=");        
            lcd_puts(T);
    
      delay_ms(1000);
          
            
        }
     
        
      };
    }

    دیدگاه


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

      سلام و دردود بزرگوار :biggrin:
      معمولا از تابع lcd gotoxy بعد از lcd int استفاده میکنند و قرار دادنش در while کار درستی نیست و در بعضی مواقع باعث از کار افتادن برنامه میشه
      dont lose hope

      دیدگاه


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

        خب پس باید با این اوصاف از خط دوم lcd بگذریم؟ بعضی دوستان از ولتمتر و امپرمتر در دو خط استفاده میکنند. لطفا راهنمایی بیشتری کنید. ممنون

        دیدگاه


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

          نوشته اصلی توسط pemhpr
          خب پس باید با این اوصاف از خط دوم lcd بگذریم؟ بعضی دوستان از ولتمتر و امپرمتر در دو خط استفاده میکنند. لطفا راهنمایی بیشتری کنید. ممنون
          سلام به همه

          من خودم از دستور lcd_gotoxy قبل از دستور های ( lcd_puts lcd_putsf lcd_putchar ) که استفاده میکنم قاتی میکنه
          هر کاری میکنم این مشکل حل نمیشه !!!

          دیدگاه


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

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

            من خودم از دستور lcd_gotoxy قبل از دستور های ( lcd_puts lcd_putsf lcd_putchar ) که استفاده میکنم قاتی میکنه
            هر کاری میکنم این مشکل حل نمیشه !!!
            این دستور هیچ اشکالی رو ایجاد نمیکنه .. شاید اشکال کار یه جای دیگه از نرم افزارتونه

            دیدگاه


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

              نوشته اصلی توسط دیجت
              این دستور هیچ اشکالی رو ایجاد نمیکنه .. شاید اشکال کار یه جای دیگه از نرم افزارتونه
              سلام
              دوباره امتحان کردم
              برنامه ای که نوشتم برای گرفتن کاراکترها از کیبورد و نمایش اونها در ال سی دی هست
              برای اینکه بتونم با بک اسپیس موجود روی کیبورد کاراکتر قبلی رو پاک کنم نیاز دارم مختصات کاراکتر ها رو روی ال سی دی 16*2 بدونم
              برای اینکه مختصات رو بدونم گفتم بیام خودم به کاراکتر ها مختصات بدم با دستور lcd_gotoxy و بعدش برای چاپ کاراکتر از دستور lcd_putchar استفاده کنم
              دستور lcd_gotoxy رو مینویسم بعدش دستور lcd_putchar رو
              حالا چی میشه یه وقت کاراکتر رو نمایش میده یه وقت نه :eek:
              اصلا معلوم نیست که کارش رو چه حسابیه
              من حتی با دستور های دیگه ای برای چاپ یک کاراکتر یا رشته استفاده کردم ولی نشد که نشد :angry:
              کسی میتونه کمک کنه

              دیدگاه


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

                خب مطمئن باش اشکال از برنامه خودته
                این دستور کار خاصی انجام نمیده که بخواد اختلالی ایجاد کنه

                هر چی هست توی تعیین مختصات خودته

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

                حالا برای پاک کردن اخرین کارکتر ادرس رو داری و اونو حذف میکنی و یک خانه میری عقب برای نوشتن دوباره یا پاک کردن دوباره

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

                دیدگاه

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