Thông báo

Collapse
No announcement yet.

16F877 và LCD 16x2 _ Cần giải thích mấy dòng lệnh.

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

  • 16F877 và LCD 16x2 _ Cần giải thích mấy dòng lệnh.

    Chào các bác!
    Học tới bài PIC và LCD thì có mấy chỗ chưa hiểu rõ, mong các bác chỉ giúp.

    Tham khảo code trên diễn đàn bài hiện thị ký tự lên LCD như sau:
    #include "16F877A.h" // PIC16F877A header file
    #use delay(clock=4000000) // for 4Mhz crystal
    #fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode

    #define WRITE_DATA 0
    #define WRITE_COMMAND 1

    #define NCHAR_PER_LINE 16 // max char numbers per line
    #define MS10 10 // 10 milliseconds
    #define US400 400 // 400 microseconds

    #define LCD_RS PIN_A1
    #define LCD_RW PIN_A2
    #define LCD_E PIN_A3

    ///////////////////////////////////////////////////////////
    //
    /* private */ void lcd_write(byte dat, int1 option) {
    delay_us(US400);
    if (option == WRITE_DATA)
    output_high(LCD_RS);
    else // option == WRITE_COMMAND
    output_low(LCD_RS);
    output_low(LCD_RW);
    output_b(dat);

    output_high(LCD_E);
    delay_us(US400);
    output_low(LCD_E);
    }

    ///////////////////////////////////////////////////////////
    //
    void lcd_init(void) {
    output_low(LCD_E); // Let LCD E line low

    lcd_write(0x38, WRITE_COMMAND); // Set LCD 16x2, 5x7, 8bits data
    delay_ms(15);
    lcd_write(0x01, WRITE_COMMAND); // Clear LCD display
    delay_ms(MS10);
    lcd_write(0x0f, WRITE_COMMAND); // Open display & current
    delay_ms(MS10);
    lcd_write(0x06, WRITE_COMMAND); // Window fixed (Character Entry Mode?)
    delay_ms(MS10);
    }

    ///////////////////////////////////////////////////////////
    //
    void lcd_display_char(int8 line, int8 pos, char ch) // Ko hiểu mấy dòng lệnh trong hàm này ah.
    {
    line = (line == 0) ? 0 : 1;
    pos = (pos > NCHAR_PER_LINE) ? NCHAR_PER_LINE : pos;

    lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND);
    lcd_write(ch, WRITE_DATA);

    }

    ///////////////////////////////////////////////////////////
    void lcd_display_str(int8 line, char str[], int8 nchars) {
    int8 i;
    for (i = 0; i < nchars; i++)
    lcd_display_char(line, i, str[i]);
    }

    ///////////////////////////////////////////////////////////
    /**
    * Display characters to a 2x16 LCD
    *
    * (1) LCD1 to GND
    * (2) LCD2 to VDD 5 volts
    * (3) LCD4 (RS) - LCD5 (RW) - LCD6 (E) to A1, A2, A3
    * (4) LCD7-LCD14 to B0-B7 (bus data)
    *
    * Ref: http://pic16.com/bbs/dispbbs.asp?boa...ID=5879&page=1
    */
    void main(void) {
    int8 i;
    char LINE1[] = { "SGN Tech" };
    char LINE2[] = { "Xin chao" };

    lcd_init();

    // use of lcd_display_char()
    for (i = 0; i < 8; i++)
    lcd_display_char(0, i, LINE1[i]);

    // use of lcd_display_str
    lcd_display_str(1, LINE2, 8);
    }

    Điều muốn các bác giúp đỡ ở đây là thể giải thích cái hàm void lcd_display_char(), e ko hiểu nó lắm bởi e đang muốn LCD hiện thị giá trị Analog( đã được tách ra làm 3 sô:A_B_C )rồi mà vẫn chưa đưa lên LCD được, mong các bác chỉ giúp.
    Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
    http://diencongnghiep360.com/
    http://tudienhathe.vn/


  • #2
    viết lại thế này nhé :

    [CODE]

    void lcd_display_char(int8 line, int8 pos, char ch) // Ko hiểu mấy dòng lệnh trong hàm này ah.
    {
    if(line != 0)line= 1; // hiển thị ở hàng nào 1 hoặc 2
    if(pos =< NCHAR_PER_LINE) NCHAR_PER_LINE = pos; // hiển thị ở cột nào

    lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND);
    lcd_write(ch, WRITE_DATA);
    }

    [CODE]

    chắc hiểu rồi hen.

    Comment


    • #3
      Nguyên văn bởi thientanvt Xem bài viết
      viết lại thế này nhé :

      [CODE]

      void lcd_display_char(int8 line, int8 pos, char ch) // Ko hiểu mấy dòng lệnh trong hàm này ah.
      {
      if(line != 0)line= 1; // hiển thị ở hàng nào 1 hoặc 2
      if(pos =< NCHAR_PER_LINE) NCHAR_PER_LINE = pos; // hiển thị ở cột nào

      lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND);
      lcd_write(ch, WRITE_DATA);
      }
      chắc hiểu rồi hen.
      Hi, Kiểu viết trên lạ thật đấy, mình chưa gặp bao giờ, giờ đã hiểu nó.
      Cảm ơn bạn nhiều nhé.
      // Hàng thứ 2 bạn viết sai,phải là: if(pos >=NCHAR_PER_LINE)pos=NCHAR_PER_LINE; //hihi.

      [CODE]
      Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
      http://diencongnghiep360.com/
      http://tudienhathe.vn/

      Comment


      • #4
        ừ há mình nhầm.

        Comment


        • #5
          Các bạn tham khảo thêm ví dụ PIC16F877A giao tiếp với LCD16x2 ở Phan Information Technology trong mục Học tập/project PIC
          0912666017

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          • nguyendinhvan
            Trả lời cho Vấn đề về tốc độ quay
            bởi nguyendinhvan
            Sử dụng động cơ servor, hoặc lắp thêm một cái encoder vào động cơ bước. Encoder sẽ kiểm soát động cơ có quay hoặc đứng im.
            Hôm qua, 19:50
          • Andrea14
            Vấn đề về tốc độ quay
            bởi Andrea14
            Chào mọi người,

            Tôi muốn mô phỏng sự thay đổi các mùa bằng cách từ từ nghiêng một quả địa cầu 16 inch bằng một động cơ bước nhỏ. Một động cơ bước khác sẽ quay quả địa cầu theo thời gian thực. Hệ thống truyền động...
            12-12-2025, 12:42
          • bqviet
            Trả lời cho Đấu tắt điện cho máy tính bảng
            bởi bqviet
            Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
            06-12-2025, 17:17
          • nguyendinhvan
            Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
            bởi nguyendinhvan
            Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
            05-12-2025, 19:59
          Đang tải...
          X