giao tiếp lcd16x2 bằng 3 dây

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • lionking
    Đệ tử 3 túi
    • May 2011
    • 47

    #1

    giao tiếp lcd16x2 bằng 3 dây

    mình vừa làm giao tiếp với lcd16x2 chỉ điều khiển bằng 3 dây, chia cho mọi người cùng sài

    code:

    #include <16F877A.h>
    #fuses HS, NOWDT ,PROTECT ,NOBROWNOUT ,NOPUT
    #use delay(clock=20000000)
    #include <define_pic16f877a.h>

    #define data74595 RD1
    #define clock74595 RD0
    #define latch74595 RD2


    int8 buffer_data_lcd = 0;
    void OutPut74595(int8 data);


    void LCD_STROBE()
    {
    bit_set(buffer_data_lcd,2);
    OutPut74595(buffer_data_lcd);

    bit_clear(buffer_data_lcd,2);
    OutPut74595(buffer_data_lcd);
    }

    /* write a byte to the LCD in 4 bit mode */
    void LCD_DATA(unsigned char c)
    {
    buffer_data_lcd = buffer_data_lcd & 0x0F;
    buffer_data_lcd = buffer_data_lcd | (c << 4);
    OutPut74595(buffer_data_lcd);
    }

    void lcd_write(unsigned char c)
    {
    delay_us(40);
    LCD_DATA(c>>4);
    LCD_STROBE();
    LCD_DATA( c );
    LCD_STROBE();
    }

    void lcd_clear(void)
    {
    bit_clear(buffer_data_lcd,0);
    OutPut74595(buffer_data_lcd);
    lcd_write(0x1);
    delay_ms(2);
    }


    /* write one character to the LCD */

    void lcd_putchar(char c)
    {
    bit_set(buffer_data_lcd,0);
    OutPut74595(buffer_data_lcd);
    lcd_write( c );
    }

    void lcd_gotoxy(unsigned char row,unsigned char col)
    {
    bit_clear(buffer_data_lcd,0);
    OutPut74595(buffer_data_lcd);
    switch(row)
    {
    case 0 : lcd_write( 0x80 + col ) ;
    break ;
    case 1 : lcd_write( 0xC0 + col ) ;
    break ;
    case 2 : lcd_write( 0x94 + col ) ;
    break ;
    case 3 : lcd_write( 0xD4 + col ) ;
    break ;
    };

    }

    /* initialise the LCD - put into 4 bit mode */
    void lcd_init()
    {

    buffer_data_lcd = 0;
    OutPut74595(buffer_data_lcd);

    delay_ms(15); // wait 15mSec after power applied,
    LCD_DATA(0x03);
    LCD_STROBE();
    delay_ms(5);
    LCD_STROBE();
    delay_us(200);
    LCD_STROBE();
    delay_us(200);
    LCD_DATA(2); // Four bit mode
    LCD_STROBE();

    lcd_write(0x28); // Set interface length
    lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
    lcd_clear(); // Clear screen
    lcd_write(0x6); // Set entry Mode
    }

    //------------------------------------------------
    void OutPut74595(int8 data)
    {
    int8 i ;

    for(i=0;i<8;i++)
    {
    if( bit_test(data,7) )
    {
    data74595=1 ;
    }
    else
    {
    data74595=0 ;
    };
    clock74595=0;
    clock74595=1;

    data = data<<1 ;
    };
    //-----------------------------
    latch74595 = 1;
    latch74595 = 0;
    }
    //-------------------------------------------------------------
    void main(void)
    {
    TRISA=0xFF;
    TRISB=0x00;
    TRISC=0xFF;
    TRISD=0xF0 ;

    PORTB = 0x00;

    lcd_init();


    while( true )
    {
    lcd_gotoxy(0,0);
    printf(lcd_putchar," Hello");
    lcd_gotoxy(1,0);
    printf(lcd_putchar," Hoang Cute");

    };
    }
    Attached Files
  • lionking
    Đệ tử 3 túi
    • May 2011
    • 47

    #2
    mình định thêm 1 con IC số nữa để bỏ bớt đi 1 dây giao tiếp nữa, khi nào thành công up tiếp

    Comment

    • tdm
      Đệ tử 7 túi
      • May 2005
      • 258

      #3
      Nguyên văn bởi lionking View Post
      mình vừa làm giao tiếp với lcd16x2 chỉ điều khiển bằng 3 dây, chia cho mọi người cùng sài

      code:

      #include <16F877A.h>
      #fuses HS, NOWDT ,PROTECT ,NOBROWNOUT ,NOPUT
      #use delay(clock=20000000)
      #include <define_pic16f877a.h>

      #define data74595 RD1
      #define clock74595 RD0
      #define latch74595 RD2


      int8 buffer_data_lcd = 0;
      void OutPut74595(int8 data);


      void LCD_STROBE()
      {
      bit_set(buffer_data_lcd,2);
      OutPut74595(buffer_data_lcd);

      bit_clear(buffer_data_lcd,2);
      OutPut74595(buffer_data_lcd);
      }

      /* write a byte to the LCD in 4 bit mode */
      void LCD_DATA(unsigned char c)
      {
      buffer_data_lcd = buffer_data_lcd & 0x0F;
      buffer_data_lcd = buffer_data_lcd | (c << 4);
      OutPut74595(buffer_data_lcd);
      }

      void lcd_write(unsigned char c)
      {
      delay_us(40);
      LCD_DATA(c>>4);
      LCD_STROBE();
      LCD_DATA( c );
      LCD_STROBE();
      }

      void lcd_clear(void)
      {
      bit_clear(buffer_data_lcd,0);
      OutPut74595(buffer_data_lcd);
      lcd_write(0x1);
      delay_ms(2);
      }


      /* write one character to the LCD */

      void lcd_putchar(char c)
      {
      bit_set(buffer_data_lcd,0);
      OutPut74595(buffer_data_lcd);
      lcd_write( c );
      }

      void lcd_gotoxy(unsigned char row,unsigned char col)
      {
      bit_clear(buffer_data_lcd,0);
      OutPut74595(buffer_data_lcd);
      switch(row)
      {
      case 0 : lcd_write( 0x80 + col ) ;
      break ;
      case 1 : lcd_write( 0xC0 + col ) ;
      break ;
      case 2 : lcd_write( 0x94 + col ) ;
      break ;
      case 3 : lcd_write( 0xD4 + col ) ;
      break ;
      };

      }

      /* initialise the LCD - put into 4 bit mode */
      void lcd_init()
      {

      buffer_data_lcd = 0;
      OutPut74595(buffer_data_lcd);

      delay_ms(15); // wait 15mSec after power applied,
      LCD_DATA(0x03);
      LCD_STROBE();
      delay_ms(5);
      LCD_STROBE();
      delay_us(200);
      LCD_STROBE();
      delay_us(200);
      LCD_DATA(2); // Four bit mode
      LCD_STROBE();

      lcd_write(0x28); // Set interface length
      lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
      lcd_clear(); // Clear screen
      lcd_write(0x6); // Set entry Mode
      }

      //------------------------------------------------
      void OutPut74595(int8 data)
      {
      int8 i ;

      for(i=0;i<8;i++)
      {
      if( bit_test(data,7) )
      {
      data74595=1 ;
      }
      else
      {
      data74595=0 ;
      };
      clock74595=0;
      clock74595=1;

      data = data<<1 ;
      };
      //-----------------------------
      latch74595 = 1;
      latch74595 = 0;
      }
      //-------------------------------------------------------------
      void main(void)
      {
      TRISA=0xFF;
      TRISB=0x00;
      TRISC=0xFF;
      TRISD=0xF0 ;

      PORTB = 0x00;

      lcd_init();


      while( true )
      {
      lcd_gotoxy(0,0);
      printf(lcd_putchar," Hello");
      lcd_gotoxy(1,0);
      printf(lcd_putchar," Hoang Cute");

      };
      }
      cái này hay ở chỗ tiết kiệm được chân VDK,nhưng có nhược điểm chỉ được một chiều từ VDK tới LCD.
      còn đọc dữ liệu từ LCD về VDK thì không được.
      viết chương trình cho vdk chạy ổn định là cả một vấn đề.

      Comment

      • lionking
        Đệ tử 3 túi
        • May 2011
        • 47

        #4
        sơ đồ giao tiếp lcd chỉ có 2 dây đây . Con IC thêm vào là 74HC164
        Attached Files

        Comment

        • ronnynguyen
          Nhập môn đệ tử
          • Sep 2011
          • 1

          #5
          Mình cần LCD hiển thị chữ quang báo nhưng viết mãi không được. Có ai giúp mình với !!!

          Comment

          • DINH THANH SANG
            Đệ tử 3 túi
            • Jul 2011
            • 55

            #6
            Nguyên văn bởi lionking View Post
            sơ đồ giao tiếp lcd chỉ có 2 dây đây . Con IC thêm vào là 74HC164
            bạn có thể viết thêm ngôn ngữ HTPIC c nữa được không bạn
            ĐINH THANH SANG 1990
            AN MỸ - CẨM CHÂU - HỘI AN - QUẢNG NAM
            DĐ: 01684222047
            Yahoo ID: thanh_sang_mua_he_mai_xanh@yahoo.com.vn

            Comment

            • lionking
              Đệ tử 3 túi
              • May 2011
              • 47

              #7
              Nguyên văn bởi DINH THANH SANG View Post
              bạn có thể viết thêm ngôn ngữ HTPIC c nữa được không bạn
              Ngày xưa mình cũng dùng HTPIC nhưng thấy hỗ trợ ít hơn CSS nên mình không dùng HTPIC nữa. để viết chương trình trên cho HTPIC bạn viết thêm hàm bit_set,bit_clear rồi ghép vào chương trình của mình là được

              Comment

              • binhngo
                Nhập môn đệ tử
                • Feb 2009
                • 8

                #8
                Ai kiểm tra giùm hộ tôi với....

                Nguyên văn bởi lionking View Post
                mình vừa làm giao tiếp với lcd16x2 chỉ điều khiển bằng 3 dây, chia cho mọi người cùng sài

                code:

                #include <16F877A.h>
                #fuses HS, NOWDT ,PROTECT ,NOBROWNOUT ,NOPUT
                #use delay(clock=20000000)
                #include <define_pic16f877a.h>

                #define data74595 RD1
                #define clock74595 RD0
                #define latch74595 RD2


                int8 buffer_data_lcd = 0;
                void OutPut74595(int8 data);


                void LCD_STROBE()
                {
                bit_set(buffer_data_lcd,2);
                OutPut74595(buffer_data_lcd);

                bit_clear(buffer_data_lcd,2);
                OutPut74595(buffer_data_lcd);
                }

                /* write a byte to the LCD in 4 bit mode */
                void LCD_DATA(unsigned char c)
                {
                buffer_data_lcd = buffer_data_lcd & 0x0F;
                buffer_data_lcd = buffer_data_lcd | (c << 4);
                OutPut74595(buffer_data_lcd);
                }

                void lcd_write(unsigned char c)
                {
                delay_us(40);
                LCD_DATA(c>>4);
                LCD_STROBE();
                LCD_DATA( c );
                LCD_STROBE();
                }

                void lcd_clear(void)
                {
                bit_clear(buffer_data_lcd,0);
                OutPut74595(buffer_data_lcd);
                lcd_write(0x1);
                delay_ms(2);
                }


                /* write one character to the LCD */

                void lcd_putchar(char c)
                {
                bit_set(buffer_data_lcd,0);
                OutPut74595(buffer_data_lcd);
                lcd_write( c );
                }

                void lcd_gotoxy(unsigned char row,unsigned char col)
                {
                bit_clear(buffer_data_lcd,0);
                OutPut74595(buffer_data_lcd);
                switch(row)
                {
                case 0 : lcd_write( 0x80 + col ) ;
                break ;
                case 1 : lcd_write( 0xC0 + col ) ;
                break ;
                case 2 : lcd_write( 0x94 + col ) ;
                break ;
                case 3 : lcd_write( 0xD4 + col ) ;
                break ;
                };

                }

                /* initialise the LCD - put into 4 bit mode */
                void lcd_init()
                {

                buffer_data_lcd = 0;
                OutPut74595(buffer_data_lcd);

                delay_ms(15); // wait 15mSec after power applied,
                LCD_DATA(0x03);
                LCD_STROBE();
                delay_ms(5);
                LCD_STROBE();
                delay_us(200);
                LCD_STROBE();
                delay_us(200);
                LCD_DATA(2); // Four bit mode
                LCD_STROBE();

                lcd_write(0x28); // Set interface length
                lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
                lcd_clear(); // Clear screen
                lcd_write(0x6); // Set entry Mode
                }

                //------------------------------------------------
                void OutPut74595(int8 data)
                {
                int8 i ;

                for(i=0;i<8;i++)
                {
                if( bit_test(data,7) )
                {
                data74595=1 ;
                }
                else
                {
                data74595=0 ;
                };
                clock74595=0;
                clock74595=1;

                data = data<<1 ;
                };
                //-----------------------------
                latch74595 = 1;
                latch74595 = 0;
                }
                //-------------------------------------------------------------
                void main(void)
                {
                TRISA=0xFF;
                TRISB=0x00;
                TRISC=0xFF;
                TRISD=0xF0 ;

                PORTB = 0x00;

                lcd_init();


                while( true )
                {
                lcd_gotoxy(0,0);
                printf(lcd_putchar," Hello");
                lcd_gotoxy(1,0);
                printf(lcd_putchar," Hoang Cute");

                };
                }
                Tôi đã chuyển mã nguồn này sang htpic, tuy nhiên báo lỗi không chạy, bac nào tìm hộ tôi xem lỗi ở đâu với


                #include <htc.h>
                #include "stdio.h"
                __CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );
                #define _XTAL_FREQ 20000000

                #define data74595 RD1
                #define clock74595 RD0
                #define latch74595 RD2
                #define uchar unsigned char
                #define bit_set(var,bitno) ((var) |= 1 << (bitno))
                #define bit_clear(var,bitno) ((var) &= ~(1 << (bitno)))
                #define bit_test(data,bitno) ((data>>bitno)&0x01)

                uchar buffer_data_lcd = 0;
                void OutPut74595(unsigned char data);


                void LCD_STROBE()
                {
                bit_set(buffer_data_lcd,2);
                OutPut74595(buffer_data_lcd);

                bit_clear(buffer_data_lcd,2);
                OutPut74595(buffer_data_lcd);
                }

                /* write a byte to the LCD in 4 bit mode */
                void LCD_DATA(unsigned char c)
                {
                buffer_data_lcd = buffer_data_lcd & 0x0F;
                buffer_data_lcd = buffer_data_lcd | (c << 4);
                OutPut74595(buffer_data_lcd);
                }

                void lcd_write(unsigned char c)
                {
                __delay_us(40);
                LCD_DATA(c>>4);
                LCD_STROBE();
                LCD_DATA( c );
                LCD_STROBE();
                }

                void lcd_clear(void)
                {
                bit_clear(buffer_data_lcd,0);
                OutPut74595(buffer_data_lcd);
                lcd_write(0x1);
                __delay_ms(2);
                }


                /* write one character to the LCD */

                void lcd_putchar(char c)
                {
                bit_set(buffer_data_lcd,0);
                OutPut74595(buffer_data_lcd);
                lcd_write( c );
                }

                void lcd_gotoxy(unsigned char row,unsigned char col)
                {
                bit_clear(buffer_data_lcd,0);
                OutPut74595(buffer_data_lcd);
                switch(row)
                {
                case 0 : lcd_write( 0x80 + col ) ;
                break ;
                case 1 : lcd_write( 0xC0 + col ) ;
                break ;
                case 2 : lcd_write( 0x94 + col ) ;
                break ;
                case 3 : lcd_write( 0xD4 + col ) ;
                break ;
                };

                }

                /* initialise the LCD - put into 4 bit mode */
                void lcd_init()
                {

                buffer_data_lcd = 0;
                OutPut74595(buffer_data_lcd);

                __delay_ms(15); // wait 15mSec after power applied,
                LCD_DATA(0x03);
                LCD_STROBE();
                __delay_ms(5);
                LCD_STROBE();
                __delay_us(200);
                LCD_STROBE();
                __delay_us(200);
                LCD_DATA(2); // Four bit mode
                LCD_STROBE();

                lcd_write(0x28); // Set interface length
                lcd_write(0x0C); // Display On, Cursor On, Cursor Blink
                lcd_clear(); // Clear screen
                lcd_write(0x6); // Set entry Mode
                }

                //------------------------------------------------
                void OutPut74595(uchar data)
                {
                uchar i ;

                for(i=0;i<8;i++)
                {
                if( bit_test(data,7) )
                {
                data74595=1 ;

                }
                else
                {
                data74595=0 ;
                };
                clock74595=0;
                clock74595=1;

                data = data<<1 ;
                };
                //-----------------------------
                latch74595=1 ;
                latch74595=0 ;
                }
                //-------------------------------------------------------------
                void main(void)
                {
                TRISA=0xFF;
                TRISB=0x00;
                TRISC=0xFF;
                TRISD=0xF0 ;
                PORTB=0x00;

                lcd_init();

                lcd_gotoxy(1,0);
                printf(" Hoang Cute");

                while( 1 )
                {

                };
                }

                Comment

                Working...