اطلاعیه

Collapse
No announcement yet.

راه اندازی LCD کاراکتری 16*2 در CCS

Collapse
این موضوع بسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    راه اندازی LCD کاراکتری 16*2 در CCS

    بنده برنامه زیر رو در ccs c نوشتم وبدون خطا کامپایل شد ولی در پروتئوس روی lcd هیچی نشون نمیده.پایه های میکرو و lcd رو هم درست وصل کردم.micro=16f877A

    [code=c]
    #include <lcd driving.h>

    #define LCD_ENABLE_PIN PIN_D2
    #define LCD_RS_PIN PIN_D0
    #define LCD_RW_PIN PIN_D1
    #define LCD_DATA4 PIN_D4
    #define LCD_DATA5 PIN_D5
    #define LCD_DATA6 PIN_D6
    #define LCD_DATA7 PIN_D7
    #include <LCD.C>

    void main()
    {
    char n[4]="test";
    lcd_init();

    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_CLOCK_DIV_2);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_ccp1(CCP_OFF);
    setup_comparator(NC_NC_NC_NC);

    //TODO: User Code
    while(true){
    lcd_gotoxy(1,1);
    lcd_putc(n);
    delay_ms(5000);}
    }
    [/code]

    #2
    پاسخ : مشکل راه اندازی lcd کاراکتری 16*2 در ccs c

    شما اول اون دستورات define و خط اول برنامه یعنی دستور #include <lcd driving.h> رو پاک کنید و فقط include <lcd.c> رو بنویسید و ال سی دی رو طبق پیکربندی که در همین فایل lcd.c گفته شده ببندید ببینید جواب میده ؟؟
    درضمن اگر به جای استفاده از دستور lcd_putc خالی ، آن را در دستور printf به کار ببرید بهتره . یعنی به این صورت : printf(lcd_putc,"hello"

    دیدگاه


      #3
      پاسخ : مشکل راه اندازی lcd کاراکتری 16*2 در ccs c

      lcd driving.h نام پروژه هست و شامل درایور و فیوزبیت های میکرو می باشد ونمیشه اونو پاک کرد.
      برای تعریف lcd از دستورات زیر استفاده کردم
      #define use_portb_lcd TRUE
      #include <LCD.C>
      ودر پروتئوس پایه ها رو به شکل زیر وصل کردم
      E------------->portb.0
      rs------------>portb.1
      rw------------>portb.2
      db4----------->portb.4
      db5----------->portb.5
      db6----------->portb.6
      db7----------->portb.7
      از دستور printf هم استفاده کردم جواب نداد.
      متاسفانه هنوز هیچی رو lcd هیچینشون نمیده.

      دیدگاه


        #4
        پاسخ : مشکل راه اندازی lcd کاراکتری 16*2 در ccs c

        پس یه کار دیگه ...:
        اون دستور #define use_portb_lcd TRUE رو از بخش اصلی برنامتون حذف کنید و در عوض خط شماره 39 از فایل lcd.c رو uncomment کنید .
        ببینید جواب میده؟

        دیدگاه


          #5
          پاسخ : مشکل راه اندازی lcd کاراکتری 16*2 در ccs c

          خط 39 lcd.c رو از حالت کامنت در اوردم و lcd رو هم به portd وصل کردم.کار نمی کنه. :question:
          تو پروتئوس این خطا ها رو میده:
          attempted to read after writing a single nibble.
          controller received command whilst busy.
          تمام خطاها مربوط به lcd هست.تو پروتئوس فرکانس lcd رو بردم بالا ولی همون خطاها رو دارم.

          اضافه شده در تاریخ :
          این lcd رو حتما باید با ccs راه بندازم.لطفا اگه کسی این lcd رو با کتابخانه lcd.c راه انداخته پروژشو اینجا قرار بده تا مشکل ما هم حل بشه.

          دیدگاه


            #6
            پاسخ : مشکل راه اندازی lcd کاراکتری 16*2 در ccs c

            این فایل رو مطالعه فرمایید:
            فایل های پیوست شده

            دیدگاه


              #7
              پاسخ : مشکل راه اندازی lcd کاراکتری 16*2 در ccs c

              مثالی که فرستادید کار می کنه اما وقتی خودم دوباره اونو کامپایل کردم کارنمی کنه. :eek: از #define use_portb_lcd TRUE هم استفاده کردم.میشه کتابخانه lcd.c که استفاده کردی رواینجا بزاری.مشکل از کامپایلر یا از lcd.c ؟؟

              اضافه شده در تاریخ :
              من هر کار کردم این lcd.c کار نکرد در نهایت از کتابخانه زیر استفاده کردم که خیلی هم خوب کار می کنه.


              [code=c]
              // flex_lcd.c

              // These pins are for the Microchip PicDem2-Plus board,
              // which is what I used to test the driver. Change these
              // pins to fit your own board.

              #define LCD_DB4 PIN_D0
              #define LCD_DB5 PIN_D1
              #define LCD_DB6 PIN_D2
              #define LCD_DB7 PIN_D3

              #define LCD_E PIN_D4
              #define LCD_RS PIN_D6
              #define LCD_RW PIN_D5

              // If you only want a 6-pin interface to your LCD, then
              // connect the R/W pin on the LCD to ground, and comment
              // out the following line.

              //#define USE_LCD_RW 1

              //========================================

              #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
              #define lcd_line_two 0x40 // LCD RAM address for the 2nd line


              int8 const LCD_INIT_STRING[4] =
              {
              0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
              0xc, // Display on
              1, // Clear display
              6 // Increment cursor
              };


              //-------------------------------------
              void lcd_send_nibble(int8 nibble)
              {
              // Note: !! converts an integer expression
              // to a boolean (1 or 0).
              output_bit(LCD_DB4, !!(nibble & 1));
              output_bit(LCD_DB5, !!(nibble & 2));
              output_bit(LCD_DB6, !!(nibble & 4));
              output_bit(LCD_DB7, !!(nibble & 8));

              delay_cycles(1);
              output_high(LCD_E);
              delay_us(2);
              output_low(LCD_E);
              }

              //-----------------------------------
              // This sub-routine is only called by lcd_read_byte().
              // It's not a stand-alone routine. For example, the
              // R/W signal is set high by lcd_read_byte() before
              // this routine is called.

              #ifdef USE_LCD_RW
              int8 lcd_read_nibble(void)
              {
              int8 retval;
              // Create bit variables so that we can easily set
              // individual bits in the retval variable.
              #bit retval_0 = retval.0
              #bit retval_1 = retval.1
              #bit retval_2 = retval.2
              #bit retval_3 = retval.3

              retval = 0;

              output_high(LCD_E);
              delay_cycles(1);

              retval_0 = input(LCD_DB4);
              retval_1 = input(LCD_DB5);
              retval_2 = input(LCD_DB6);
              retval_3 = input(LCD_DB7);

              output_low(LCD_E);

              return(retval);
              }
              #endif

              //---------------------------------------
              // Read a byte from the LCD and return it.

              #ifdef USE_LCD_RW
              int8 lcd_read_byte(void)
              {
              int8 low;
              int8 high;

              output_high(LCD_RW);
              delay_cycles(1);

              high = lcd_read_nibble();

              low = lcd_read_nibble();

              return( (high<<4) | low);
              }
              #endif

              //----------------------------------------
              // Send a byte to the LCD.
              void lcd_send_byte(int8 address, int8 n)
              {
              output_low(LCD_RS);//ready for command

              #ifdef USE_LCD_RW
              while(bit_test(lcd_read_byte(),7)) ;
              #else
              delay_us(60);
              #endif

              if(address)
              output_high(LCD_RS);
              else
              output_low(LCD_RS);

              delay_cycles(1);

              #ifdef USE_LCD_RW
              output_low(LCD_RW);
              delay_cycles(1);
              #endif

              output_low(LCD_E);

              lcd_send_nibble(n >> 4);
              lcd_send_nibble(n & 0xf);
              }

              //----------------------------
              void lcd_init(void)
              {
              int8 i;

              output_low(LCD_RS);

              #ifdef USE_LCD_RW
              output_low(LCD_RW);
              #endif

              output_low(LCD_E);

              delay_ms(15);

              for(i=0 ;i < 3; i++)
              {
              lcd_send_nibble(0x03);
              delay_ms(5);
              }

              lcd_send_nibble(0x02);

              for(i=0; i < sizeof(LCD_INIT_STRING); i++)
              {
              lcd_send_byte(0, LCD_INIT_STRING[i]);

              // If the R/W signal is not used, then
              // the busy bit can't be polled. One of
              // the init commands takes longer than
              // the hard-coded delay of 60 us, so in
              // that case, lets just do a 5 ms delay
              // after all four of them.
              #ifndef USE_LCD_RW
              delay_ms(5);
              #endif
              }

              }

              //----------------------------

              void lcd_gotoxy(int8 x, int8 y)
              {
              int8 address;

              if(y != 1)
              address = lcd_line_two;
              else
              address=0;

              address += x-1;
              lcd_send_byte(0, 0x80 | address);
              }

              //-----------------------------
              void lcd_putc(char c)
              {
              switch(c)
              {
              case '\f':
              lcd_send_byte(0,1);
              delay_ms(2);
              break;

              case '\n':
              lcd_gotoxy(1,2);
              break;

              case '\b':
              lcd_send_byte(0,0x10);
              break;

              default:
              lcd_send_byte(1,c);
              break;
              }
              }


              void lcd_clear () { //works
              lcd_send_byte(0,0x01);
              lcd_send_byte(0,0x02);
              }





              void lcd_off(){ //works
              lcd_send_byte(0,0x08);}


              void lcd_on(){ //works
              lcd_send_byte(0,0x0c);}


              void lcd_cursor_off(){ //works
              lcd_send_byte(0,0x0c);}


              void lcd_cursor_blink(){ //works
              lcd_send_byte(0,0x0f);}


              void lcd_cursor_underline(){ //works
              lcd_send_byte(0,0x0E);}



              //------------------------------
              #ifdef USE_LCD_RW
              char lcd_getc(int8 x, int8 y)
              {
              char value;

              lcd_gotoxy(x,y);

              // Wait until busy flag is low.
              while(bit_test(lcd_read_byte(),7));

              output_high(LCD_RS);
              value = lcd_read_byte();
              output_low(lcd_RS);

              return(value);
              }
              #endif

              [/code]

              دیدگاه

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