Wednesday, 28 November 2018

Giao Tiếp LCD 16x02 Chế Độ 4 Bit

Giới thiệu 


Màn hình LCD (Màn hình tinh thể lỏng) được sử dụng để hiển thị trạng thái hoặc thông số trong các hệ thống nhúng.

LCD 16x2 là thiết bị 16 pin có 8 chân dữ liệu (D0-D7) và 3 chốt điều khiển (RS, RW, EN). 5 chân còn lại là để cung cấp và đèn nền cho màn hình LCD.

Các chốt điều khiển giúp chúng ta cấu hình màn hình LCD ở chế độ lệnh hoặc chế độ dữ liệu. Họ cũng giúp cấu hình chế độ đọc hoặc chế độ ghi và cũng có khi đọc hoặc viết.
LCD 16x2 có thể được sử dụng ở chế độ 4 bit hoặc chế độ 8 bit tùy thuộc vào yêu cầu của ứng dụng. Để sử dụng nó, chúng ta cần gửi các lệnh nhất định tới màn hình LCD ở chế độ lệnh và khi màn hình LCD được cấu hình theo nhu cầu của chúng ta, chúng ta có thể gửi dữ liệu cần thiết trong chế độ dữ liệu.
Để biết thêm thông tin về LCD 16x2 và cách sử dụng nó, hãy tham khảo chủ đề LCD hiển thị 16x2 trong phần cảm biến và mô-đun.

LCD 16x2
Màn hình LCD 16x2

Chế độ 4 bit 

  • Trong chế độ 4 bit, dữ liệu / lệnh được gửi ở định dạng 4 bit (nibble).
  • Để làm điều này 1 gửi cao hơn 4-bit và sau đó gửi thấp hơn 4-bit của dữ liệu / lệnh.
  • Chỉ có 4 chân dữ liệu (D4 - D7) của 16x2 LCD được kết nối với vi điều khiển và các chốt điều khiển khác RS (Đăng ký chọn), RW (Đọc / ghi), E (Bật) được kết nối với các Chân GPIO khác của bộ điều khiển.
  • Vì vậy, do các kết nối như vậy, chúng tôi có thể tiết kiệm bốn chân GPIO có thể được sử dụng cho một ứng dụng khác.

Sơ đồ giao thoa


Giao diện LCD 16x2 với 8051

Lập trình chế độ LCD 4x2 4 bit 

Khởi tạo
  1. Đợi 15ms, Bật thời gian khởi động cho LCD16x2.
  2. Gửi lệnh 0x02 khởi tạo LCD 16x2 ở chế độ 4 bit.
  3. Gửi lệnh 0x28 cấu hình LCD ở chế độ 2 dòng, 4 bit và 5x8.
  4. Gửi bất kỳ lệnh ON hiển thị nào (0x0E, 0x0C)
  5. Gửi lệnh 0x06 (con trỏ tăng)
void LCD_Init (void)  /* LCD Initialize function */
{
 delay(20);  /* LCD Power ON Initialization time >15ms */
 LCD_Command (0x02); /* 4bit mode */
 LCD_Command (0x28); /* Initialization of 16X2 LCD in 4bit mode */
 LCD_Command (0x0C); /* Display ON Cursor OFF */
 LCD_Command (0x06); /* Auto Increment cursor */
 LCD_Command (0x01); /* Clear display */
 LCD_Command (0x80); /* Cursor at home position */
}

Bây giờ chúng ta đã khởi tạo thành công màn hình LCD và sẵn sàng chấp nhận dữ liệu ở chế độ 4 bit để hiển thị.
Để gửi lệnh / dữ liệu đến màn hình LCD 16x2, chúng ta phải gửi nibble cao hơn theo sau bởi nibble thấp hơn. Khi các chân D4 - D7 của màn hình LCD 16x2 được kết nối dưới dạng các chân dữ liệu, chúng tôi phải dịch chuyển nibble xuống bên phải 4 trước khi truyền.
Chức năng ghi lệnh
  1. Đầu tiên, gửi lệnh nibble cao hơn.
  2. Làm cho pin RS thấp, RS = 0 (lệnh reg.)
  3. Làm cho RW pin thấp, RW = 0 (viết hoạt động) hoặc kết nối nó với mặt đất.
  4. Cung cấp xung Cao đến Thấp khi Bật (E).
  5. Gửi lệnh nibble thấp hơn.
  6. Cung cấp xung Cao đến Thấp khi Bật (E).
void LCD_Command (char cmnd) /* LCD16x2 command funtion */
{
 LCD_Port =(LCD_Port & 0x0F) | (cmnd & 0xF0);/* Send upper nibble */
 rs=0;   /* Command reg. */
 rw=0;   /* Write operation */
 en=1; 
 delay(1);
 en=0;
 delay(2);
 
 LCD_Port = (LCD_Port & 0x0F) | (cmnd << 4);/* Send lower nibble */
 en=1;   /* Enable pulse */
 delay(1);
 en=0;
 delay(5);
}

Chức năng ghi dữ liệu
  1. Đầu tiên, gửi dữ liệu nhanh hơn.
  2. Tạo RS pin cao, RS = 1 (dữ liệu reg.)
  3. Làm cho RW pin thấp, RW = 0 (viết hoạt động) hoặc kết nối nó với mặt đất.
  4. Cung cấp xung Cao đến Thấp khi Bật (E).
  5. Gửi dữ liệu nibble thấp hơn.
  6. Cung cấp xung Cao đến Thấp khi Bật (E).
void LCD_Char (char char_data) /* LCD data write function */
{
 LCD_Port =(LCD_Port & 0x0F) | (char_data & 0xF0);/* Send upper nibble */
 rs=1;   /* Data reg.*/
 rw=0;   /* Write operation*/
 en=1;
 delay(1);
 en=0;
 delay(2);

 LCD_Port = (LCD_Port & 0x0F) | (char_data << 4);/* Send lower nibble */
 en=1;   /* Enable pulse */
 delay(1);
 en=0;
 delay(5);

}

Chương trình


#include<reg51.h>

sfr LCD_Port=0x90;  /* P1 port as data port */
sbit rs=P1^0;   /* Register select pin */
sbit rw=P1^1;   /* Read/Write pin */
sbit en=P1^2;   /* Enable pin */


/* Function to provide delay Approx 1ms with 11.0592 Mhz crystal*/
void delay(unsigned int count)      
{
     int i,j;
     for(i=0;i<count;i++)
     for(j=0;j<112;j++);
}

void LCD_Command (char cmnd) /* LCD16x2 command funtion */
{
 LCD_Port =(LCD_Port & 0x0F) | (cmnd & 0xF0);/* Send upper nibble */
 rs=0;   /* Command reg. */
 rw=0;   /* Write operation */
 en=1; 
 delay(1);
 en=0;
 delay(2);
 
 LCD_Port = (LCD_Port & 0x0F) | (cmnd << 4);/* Send lower nibble */
 en=1;   /* Enable pulse */
 delay(1);
 en=0;
 delay(5);
}

void LCD_Char (char char_data)  /* LCD data write function */
{
 LCD_Port =(LCD_Port & 0x0F) | (char_data & 0xF0);/* Send upper nibble */
 rs=1;     /*Data reg.*/
 rw=0;     /*Write operation*/
 en=1;  
 delay(1);
 en=0;
 delay(2);

 LCD_Port = (LCD_Port & 0x0F) | (char_data << 4);/* Send lower nibble */
 en=1;     /* Enable pulse */
 delay(1);
 en=0;
 delay(5);

}

void LCD_String (char *str) /* Send string to LCD function */
{
 int i;
 for(i=0;str[i]!=0;i++)  /* Send each char of string till the NULL */
 {
  LCD_Char (str[i]);  /* Call LCD data write */
 }
}

void LCD_String_xy (char row, char pos, char *str)  /* Send string to LCD function */
{
 if (row == 0)
 LCD_Command((pos & 0x0F)|0x80);
 else if (row == 1)
 LCD_Command((pos & 0x0F)|0xC0);
 LCD_String(str);   /* Call LCD string function */
}

void LCD_Init (void)  /* LCD Initialize function */
{
 delay(20);  /* LCD Power ON Initialization time >15ms */
 LCD_Command (0x02); /* 4bit mode */
 LCD_Command (0x28); /* Initialization of 16X2 LCD in 4bit mode */
 LCD_Command (0x0C); /* Display ON Cursor OFF */
 LCD_Command (0x06); /* Auto Increment cursor */
 LCD_Command (0x01); /* clear display */
 LCD_Command (0x80); /* cursor at home position */
}

void main()
{
 LCD_Init();  /* Initialization of LCD*/
 LCD_String("Do Tri Manh");  /* write string on 1st line of LCD*/
 LCD_Command(0xC0); /* Go to 2nd line*/
 LCD_String_xy(1,0,"Hello World");  /*write string on 2nd line*/
 while(1);  /* Infinite loop. */
}

Code mô phỏng

1 comment: