Thông báo

Collapse
No announcement yet.

Giao tiếp với LCD

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Nguyên văn bởi heliman
    #separate void LCD_SetData ( unsigned int cX )
    {
    output_bit ( LCD_D4, cX & 0x01 );
    output_bit ( LCD_D5, cX & 0x02 );
    output_bit ( LCD_D6, cX & 0x04 );
    output_bit ( LCD_D7, cX & 0x08 );
    }

    //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx


    Tôi dùng CCS 3.249 , máy báo lỗi "Undefine Indentifier amp " ở ngay dòng gần cuối cùng : "output_bit ( LCD_D4, cX & 0x01 ); ",
    các bác có giải thích được "amp" là cái gì và nên khai báo nó là gì không vậy ?
    Hẳn là code này nằm trên một trang web nào rồi.

    & là mã dùng để hiển thị dấu '&' trong một trang web. Bạn cứ thay hết các & bằng ký tự '&' là xong. Ví dụ
    Code:
    output_bit ( LCD_D4, cX & 0x01 );
    Thân,
    Biển học mênh mông, sức người có hạn

    Comment


    • #17
      LCD không hiển thị

      Tôi cũng chưa biết tác giả dùng LCD gì, nhưng tôi dùng LCD : LM016L (trong thư viện Proteus) không biết có được không.
      Cảm ơn bác namqn ,dó là do lỗi Font , ngay đoạn khai báo
      include &lt ; 16f84a.h> //thực tế là dấu <
      Nhưng còn đoạn mã :
      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxx
      main()
      {
      lcd_init();
      while(1)
      {
      lcd_PutCmd(Clear_Scr);

      lcd_setposition(LINE_1+3);
      printf(lcd_putchar,&quot;noisepic&quot ; ); //???

      lcd_SetPosition(LINE_2+1);
      printf(lcd_PutChar,&quot;PICVIETNAM&quot ; ); //???

      }
      }
      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxx
      Tôi đã thay dòng ??? bằng một số dòng lệnh như:
      - lcd_PutChar("ABC");
      - printf(lcd_PutChar ("ABC") );

      Nhưng LCD vẫn không hiện ??

      Comment


      • #18
        Sơ đồ Proteus

        [IMG]D:\1.JPEG[/IMG] Sơ đồ Proteus

        Comment


        • #19
          To Heliman
          Trong main()
          while(1)
          {
          bạn dùng lcd_PutCmd(Clear_Scr);
          do vậy Sau khi ghi ra LCD nó lại bị xóa và ghi lại. Có thể như vậy bạn sẽ không nhìn thấy.
          Hoặc có thể bạn chỉnh contrast chưa đúng nên không thấy. Chỉnh lại điện áp chân VEE.
          Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

          Biến tần
          Máy giặt
          Lò vi sóng
          Bếp từ.
          Tủ lạnh.
          Điều hòa

          Comment


          • #20
            Nguyên văn bởi heliman
            Tôi cũng chưa biết tác giả dùng LCD gì, nhưng tôi dùng LCD : LM016L (trong thư viện Proteus) không biết có được không.
            Cảm ơn bác namqn ,dó là do lỗi Font , ngay đoạn khai báo
            include &lt ; 16f84a.h> //thực tế là dấu <
            Nhưng còn đoạn mã :
            xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxx
            main()
            {
            lcd_init();
            while(1)
            {
            lcd_PutCmd(Clear_Scr);

            lcd_setposition(LINE_1+3);
            printf(lcd_putchar,&quot;noisepic&quot ; ); //???

            lcd_SetPosition(LINE_2+1);
            printf(lcd_PutChar,&quot;PICVIETNAM&quot ; ); //???

            }
            }
            xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxx
            Tôi đã thay dòng ??? bằng một số dòng lệnh như:
            - lcd_PutChar("ABC");
            - printf(lcd_PutChar ("ABC") );

            Nhưng LCD vẫn không hiện ??
            Nhìn vào các dòng ??? thì có thể thấy cú pháp như sau (sau khi đã bỏ code hiển thị ký tự của HTML)
            Code:
            printf(lcd_PutChar,"PICVIETNAM");   //???
            Bạn chú ý dấu phẩy giữa lcd_PutChar và chuỗi ký tự "PICVIETNAM".

            Ngoài ra, nguyên nhân đúng như bác MinhHa đã nói, bạn ghi xong rồi lại xóa ngay thì làm sao thấy được gì, nên có thêm phần delay. Một cách khác là bạn chuyển lệnh xóa màn hình ra khỏi vòng while, vì đã có các lệnh xác định tọa độ khi xuất các chuỗi ký tự.

            Thân,
            Biển học mênh mông, sức người có hạn

            Comment


            • #21
              Các lỗi trên đúng như anh Nam đã phân tích, e kô ý kiến gì thêm.

              Chú ý là cái đoạn : printf(lcd_putchar,"PICVIETNAM") ==>> OK
              printf(lcd_putchar,biên1, biền...) ==>> Không đc
              hàm thư viện LCD 4bit trên là khá chuẩn và tôi vẫn dùng nó tốt cho tất cả các dòng PIC và cả trong HTPIC16 và 18 tuy có chỉnh sửa đôi chút, tuy nhiện các bạn nên vào forum về HTPIC để down thử viện của họ.
              Ethernet-RS232, PIC Webserver, RFID Reader
              CallerID, Cảnh báo BTS, ...
              0988006696
              linhnc308@gmail.com
              http://linhnc308.blogspot.com

              Comment


              • #22
                Khả quan hơn một chút

                Cảm ơn 2 bác MinhHa và bác Namqn.
                Sau một hồi tìm trên mạng , tôi đoán bác noisepic đã láy
                bài viết ở dây : http://www.vermontficks.org/lcdd.htm
                code ở đây : http://www.vermontficks.org/lcdc2.htm

                bác Noise đã chỉnh sửa một số so với bản gốc:

                Tôi đã copy thành 2 file sau

                Code:
                xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                //lcd_lib.c
                // The six bus pins are defined here.
                // this example happens to use PIC port B3, B4, B5, B6 for LCD data
                // and port B5 for LCD ENABLE and port B6 for LCD RS.  //2 dong nay chac ho viet nham so voi define o duoi
                
                #define LCD_D4          PIN_B1
                #define LCD_D5          PIN_B2
                #define LCD_D6          PIN_B3
                #define LCD_D7          PIN_B4
                #define LCD_EN          PIN_B5
                #define LCD_RS          PIN_B6
                #define LINE_1          0x00
                #define LINE_2          0x40
                #define CLEAR_DISP      0x01
                
                // prototype statements
                #separate void LCD_Init ( void );
                #separate void LCD_SetPosition ( unsigned int cX );
                #separate void LCD_PutChar ( unsigned int cX );
                #separate void LCD_PutCmd ( unsigned int cX );
                #separate void LCD_PulseEnable ( void );
                #separate void LCD_SetData ( unsigned int cX );
                
                // whatever pins you assign to the display 
                // MUST be in a bus that is a CCS type "standard_io".
                //#use standard_io ( A )
                #use standard_io ( B )
                //#use standard_io ( C ) toi bo 2 dong nay vi bao loi va ko can thiet
                #separate void LCD_Init ( void )
                    {
                    LCD_SetData ( 0x00 );
                    delay_ms ( 200 );       /* wait enough time after Vdd rise */
                    output_low ( LCD_RS );
                    LCD_SetData ( 0x03 );   /* init with specific nibbles to start 4-bit mode */
                    LCD_PulseEnable();
                    LCD_PulseEnable();
                    LCD_PulseEnable();
                    LCD_SetData ( 0x02 );   /* set 4-bit interface */
                    LCD_PulseEnable();      /* send dual nibbles hereafter, MSN first */
                    LCD_PutCmd ( 0x2C );    /* function set (all lines, 5x7 characters) */
                    LCD_PutCmd ( 0x0C );    /* display ON, cursor off, no blink */
                    LCD_PutCmd ( 0x01 );    /* clear display */
                    LCD_PutCmd ( 0x06 );    /* entry mode set, increment & scroll left */
                    }
                
                #separate void LCD_SetPosition ( unsigned int cX )
                    {
                    /* this subroutine works specifically for 4-bit Port A */
                    LCD_SetData ( swap ( cX ) | 0x08 );
                    LCD_PulseEnable();
                    LCD_SetData ( swap ( cX ) );
                    LCD_PulseEnable();
                    }
                
                #separate void LCD_PutChar ( unsigned int cX )
                    {
                    /* this subroutine works specifically for 4-bit Port A */
                //    if ( !cSkip )                            //dong nay chac can khi co phan cung
                        {
                        output_high ( LCD_RS );
                        LCD_SetData ( swap ( cX ) );     /* send high nibble */
                        LCD_PulseEnable();
                        LCD_SetData ( swap ( cX ) );     /* send low nibble */
                        LCD_PulseEnable();
                        output_low ( LCD_RS );
                        }
                    }
                
                #separate void LCD_PutCmd ( unsigned int cX )
                    {
                    /* this subroutine works specifically for 4-bit Port A */
                    LCD_SetData ( swap ( cX ) );     /* send high nibble */
                    LCD_PulseEnable();
                    LCD_SetData ( swap ( cX ) );     /* send low nibble */
                    LCD_PulseEnable();
                    }
                
                #separate void LCD_PulseEnable ( void )
                    {
                    output_high ( LCD_EN );
                    delay_us ( 3 );         // was 10
                    output_low ( LCD_EN );
                    delay_ms ( 3 );         // was 5
                    }
                
                #separate void LCD_SetData ( unsigned int cX )
                    {
                    output_bit ( LCD_D4, cX & 0x01 );
                    output_bit ( LCD_D5, cX & 0x02 );
                    output_bit ( LCD_D6, cX & 0x04 );
                    output_bit ( LCD_D7, cX & 0x08 );
                    }
                Code:
                xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                //TestLCD.c
                #include <16f628a.h>
                #use delay(clock=4000000)
                #fuses NOWDT,PUT,HS,NOPROTECT
                #include <lcd_lib.c>
                
                void main ( void )
                    {
                    char cX;
                
                    cX = 1;                                           // set number
                    LCD_Init();                                       // set up LCD for 4-wire bus, etc.
                    LCD_PutCmd ( CLEAR_DISP );                        // clear screen
                
                    LCD_SetPosition ( LINE_1 + 0 );                   // set line and offset on line
                    printf ( LCD_PutChar, "Test #1", cX );           // display message
                    LCD_SetPosition ( LINE_2 + 5 );                   // set line and offset on line
                    printf ( LCD_PutChar, "2nd test" );               // display message
                
                    while ( 1 );                                      // stop
                    }
                xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                Đúng như bác Nam nói , ở đây họ để LCD_PutCmd ( CLEAR_DISP ) ở ngoài, tất cả không dính dáng tới while(1) , tất nhiên ở đây cần dùng delay.


                Build thì đúng rồi, nhưng copy file hex vào Proteus thì không hiển thị :

                kết quả hiện trên LCD (ở dây http://www.vermontficks.org/lcdd.htm
                ) là :
                Test #1
                2nd test


                Trông mà thèm

                Tôi đã cắt sơ đồ Proteus thành file .JPG nhưng không gửi lên đây được.
                Last edited by heliman; 01-08-2006, 01:15.

                Comment


                • #23
                  Sorry khi chen ngang vào đây :
                  _3 lần gởi 0x03 ( =0011 vào 4 chân data) là reset . Bất cứ khi nào RS=0 và gởi 3 lần như vậy thì sẽ reset LCD , chú ý thời gian giữa các lần gởi. Điều này thường làm khi khởi động cấp nguồn cho LCD , bởi vì lúc này LCD ở trạng thái không ổn định .
                  _LCD hiện có 2 loại bộ điều khiển :Hitachi 4470 , và NT3881 , theo đó việc định địa chỉ vị trí trên LCD là khác . Vd ký tự đầu tiên =0x00 với Hitachi nhưng sẽ là 0x80 trên LCD có bộ điều khiển NT3881,VD như loại TR1602C.
                  _Sau đó gởi 0x02 ( chỉ 4 bit thôi ) để kích hoạt mode 4 bit .
                  _Bắt đầu từ đây mọi byte lệnh hay data gởi ra đều phải gởi theo 2 nibble.

                  Comment


                  • #24
                    em copy chương trình cuối cùng do bác Heliman gửi rồi nạp vào PIC, mạch thật hẳn hoi, cũng không chạy (buid thì OK). Mặc dù mạch này em nạp chương trình viết bằng ASM thì đã chạy tốt. Trước đây em toàn viết bằng asm thôi, bây giờ mới tập viết bằng C. Rất mong các đại sư huynh ra tay giúp để cho chương trình có thể chạy được và hiển thị được.

                    Comment


                    • #25
                      code cho lcd

                      các tiền bối có thể upload một code chuẩn nhất về lập trình điều khiễn lcd cho pic dùng ngôn ngữ c (vd 16f877...) cho mọi người mới học pic có thể thống nhất cùng học,chứ nhiều người viết khai báo nhiều kiểu làm cho người mới học không biết chọn cái nào để nghiên cứu.

                      Comment


                      • #26
                        hien thi LCD

                        Cac huynh de cho minh hoi chut xiu :
                        Chuong trinh ben duoi minh viet de hien thi ki tu A len LCD ,nhung khi mo phong no thi khong chay ,minh khong biet sai o cho nao ,cac huynh de kiem tra dum va sua dum cho minh nha ,minh dang lam de tai nen dang can gap .Cam on nhieu!



                        TITLE "HIEN THI LEN LCD"
                        PROCESSOR P16F876A
                        #INCLUDE <P16F876A.INC> ;CHEN THU VIEN LIEN KET CHO CHUONG TRINH
                        __CONFIG 3F71H ;CAU HINH CAC BIT HE THONG
                        ERRORLEVEL -302 ;BO DI CAC LOI CHON BANK

                        cblock 0X020

                        LCD_TEMP
                        LCD_TEMP1
                        DELAY
                        X_DELAY
                        endc
                        LCD_DATA EQU PORTB
                        LCD_DATA_TRIS EQU TRISB
                        LCD_CTRL EQU PORTA

                        ; PORTA control bits
                        LCD_E EQU 2
                        LCD_RW EQU 1
                        LCD_RS EQU 0


                        org 0x000
                        GOTO START
                        START

                        ;HIEN THI NHIET DO LEN LCD

                        LCDINIT

                        CLRF LCD_CTRL

                        MOVLW 0x01E
                        CALL X_DELAY500 ; 30 * 0.5mS = 15mS

                        MOVLW 0x038 ; 8-bit-interface, 2-lines
                        CALL LCDPUTCMD
                        MOVLW 0x000 ; disp.off, curs.off, no-blink
                        CALL LCDDMODE
                        CALL LCDCLEAR
                        MOVLW 0x004 ; disp.on, curs.off
                        CALL LCDDMODE
                        MOVLW 0x002 ; auto-inc (shift-cursor)
                        CALL LCDEMODE
                        ;MOVLW 0x01E
                        ;CALL X_DELAY500
                        CALL LCDPUTCHAR
                        RETURN
                        ;************************************************* *********************

                        LCDBUSY
                        BSF STATUS,RP0 ; bank 1
                        MOVLW 0x0FF ; Set PORTB for input
                        MOVWF LCD_DATA_TRIS
                        BCF STATUS, RP0 ; bank 0
                        BCF LCD_CTRL, LCD_RS ; lenh dang duoc viet len LCD
                        BSF LCD_CTRL, LCD_RW ; vdk doc du lieu tu LCD
                        BSF LCD_CTRL, LCD_E ; cho phep giao tiep LCD
                        MOVF LCD_DATA, W ; Read busy flag + DDram address
                        BCF LCD_CTRL, LCD_E ; cam
                        ANDLW 0x80 ; Check Busy flag, High = Busy
                        BTFSS STATUS, Z
                        GOTO LCDBUSY
                        LCDNOTBUSY
                        BCF LCD_CTRL, LCD_RW
                        BSF STATUS, RP0 ; bank 1
                        MOVLW 0x000
                        MOVWF LCD_DATA_TRIS ; Set PORTB for output
                        BCF STATUS, RP0 ; bank 0
                        RETURN
                        ;************************************************* ********************

                        LCDDMODE
                        ANDLW 0x007 ; Strip upper bits
                        IORLW 0x008 ; Function set
                        CALL LCDPUTCMD
                        RETURN
                        ;************************************************* *********************

                        LCDCLEAR
                        MOVLW 0x001
                        CALL LCDPUTCMD
                        RETURN
                        ;************************************************* ********************

                        LCDEMODE
                        ANDLW 0x003 ; Strip upper bits
                        IORLW 0x004 ; Function set
                        CALL LCDPUTCMD
                        RETURN

                        ;************************************************* *********************

                        LCDPUTCHAR
                        Movlw 0x080 ;dinh dia chi de xuat A
                        CALL LCDPUTCMD
                        Movlw 'A'
                        movwf LCD_TEMP
                        CALL LCDBUSY ; Wait for LCD to be ready
                        BCF LCD_CTRL, LCD_RW ; vdk viet du lieu len LCD
                        BSF LCD_CTRL, LCD_RS ; du lieu dang duoc viet len LCD
                        BSF LCD_CTRL, LCD_E ; cho phep giao tiep LCD
                        MOVF LCD_TEMP, W
                        MOVWF LCD_DATA ; Send data to LCD
                        BCF LCD_CTRL, LCD_E ; cam giao tiep LCD
                        RETURN



                        ;************************************************* *********************

                        LCDPUTCMD
                        MOVWF LCD_TEMP ; Command to send is in W
                        CALL LCDBUSY ; Wait for LCD to be ready
                        BCF LCD_CTRL, LCD_RW ; vdk viet du lieu len LCD
                        BCF LCD_CTRL, LCD_RS ; lenh dang duoc viet len LCD
                        BSF LCD_CTRL, LCD_E ; cho phep giao tiep LCD
                        MOVF LCD_TEMP, W
                        MOVWF LCD_DATA ; Send data to LCD
                        BCF LCD_CTRL, LCD_E ; cam giao tiep LCD
                        RETURN

                        ;************************************************* ******************
                        DELAY500
                        MOVLW D'165' ; +1 1 cycle
                        MOVWF DELAY ; +2 1 cycle
                        DELAY500_LOOP
                        DECFSZ DELAY, F ; step1 1 cycle
                        GOTO DELAY500_LOOP ; step2 2 cycles
                        DELAY500_END
                        RETURN ; +3 2 cycles

                        ;*********************************** a delay of 'W' * 500mS
                        X_DELAY500
                        MOVWF X_DELAY ; +1 1 cycle
                        X_DELAY500_LOOP
                        CALL DELAY500 ; step1 wait 500uSec
                        DECFSZ X_DELAY, F ; step2 1 cycle
                        GOTO X_DELAY500_LOOP ; step3 2 cycles
                        X_DELAY500_END
                        RETURN ; +2 2 cycles
                        end




                        hinh mo_phong_LCD duoi day:
                        Attached Files

                        Comment


                        • #27
                          Chào cả nhà, cho mình hỏi vài vấn đề, mình muốn giao tiếp giữa PIC và GLCD (128x64)dùng chuẩn I2C thì thì kết nối như thế nào, mình thấy là PIC có chuẩn này, nhưng màn hình GLCD thì chưa có hỗ trợ, mình định làm 1 cái mạch tích hợp GLCD để hỗ trợ I2C. vậy thì làm như thế nào? Bác nào biết chỉ với!!!!!!!!

                          Comment


                          • #28
                            bạn noisepic có thể chỉ dùm mình cách lập trình đọc dữ liệu từ lcd đc ko, mình đag làm đồ án và đag gặp rắc rối ở đó

                            Comment


                            • #29
                              Code:
                              //khoi tao LCD**********************************************
                              #separate void LCD_Init ( void )
                              {
                              LCD_SetData ( 0x00 );
                              delay_ms(200); /* wait enough time after Vdd rise >> 15ms */
                              output_low ( LCD_RS );// che do gui lenh
                              LCD_SetData ( 0x03 ); /* init with specific nibbles to start 4-bit mode */
                              LCD_PulseEnable();
                              LCD_PulseEnable();
                              LCD_PulseEnable();
                              LCD_SetData ( 0x02 ); /* set 4-bit interface */
                              LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */
                              LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */
                              LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */
                              LCD_PutCmd ( 0x01 ); /* clear display */
                              LCD_PutCmd ( 0x06 ); /* entry mode set, increment &amp; scroll left */
                              mấy bạn cho mình hỏi tại sao chỗ phần mình tô màu đỏ LCD_PutCmd có giá trị 0x2c mà lại là (tất cả dòng, 5x7). vì 0x2c = 00101100. theo bảng bên dưới thì với giá trị 0x2c phải là (tất cả dòng, 5x10) mới đúng chứ

                              Click image for larger version

Name:	table1.jpg
Views:	1
Size:	90.5 KB
ID:	1392879
                              F=1 bộ font 5x10 được sử dụng và nếu F=0 thì font 5x8 được hiển thị

                              Comment


                              • #30
                                ac nào xem giúp e lỗi này là lỗi j và cách khắc phục ntn ak. trong thư viện lcd.c có ct gửi một byte r sao mà nó cứ báo lỗi ak.
                                Attached Files
                                Last edited by dtvn1188; 12-05-2014, 00:16.

                                Comment

                                Về tác giả

                                Collapse

                                noisepic Tìm hiểu thêm về noisepic

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X