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ị 16x2trong phần cảm biến và mô-đun.
LCD16x2
Kết nối phần cứng
LCD 162 Pins
|
Chân 89c51
|
---|---|
chân dữ liệu D0-D7
|
PORT1
|
RS
|
PORT2.0
|
RW
|
PORT2.1
|
E
|
PORT2.2
|
Lập trình LCD16x2
Khởi tạo LCD16x2
Nó rất dễ dàng để khởi tạo LCD
- BẬT nguồn LCD
- Đợi 15ms, Bật thời gian khởi động cho LCD16x2
- Gửi lệnh 0x38 (khởi tạo. 2 dòng, ma trận 5x8, chế độ 8 bit)
- Gửi bất kỳ lệnh ON hiển thị nào (0x0E, 0x0C)
- 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 (0x38); /* Initialization of 16X2 LCD in 8bit 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à nó đã sẵn sàng chấp nhận dữ liệu để hiển thị.
Chức năng ghi lệnh
- Gửi lệnh đến cổng dữ liệu
- Làm cho pin RS thấp, RS = 0 (lệnh reg.)
- Làm cho RW pin thấp, RW = 0 (viết hoạt động)
- Cung cấp xung Cao đến Thấp khi Bật (E) tối thiểu 450ns.
Khi chúng tôi cung cấp xung Bật, LCD chốt dữ liệu có mặt tại D0 đến D7 và thực hiện lệnh dưới dạng RS là lệnh reg.
void LCD_Command (unsigned char cmd) /* LCD16x2 command funtion */
{
lcd_data_port= cmd;
rs=0; /* command reg. */
rw=0; /* Write operation */
en=1;
delay(1);
en=0;
delay(5);
}
Chức năng ghi dữ liệu
- Gửi lệnh đến cổng dữ liệu
- Làm cho pin RS thấp, RS = 1 (dữ liệu reg.)
- Làm cho RW pin thấp, RW = 0 (viết hoạt động)
- Cung cấp xung Cao đến Thấp khi Bật (E) tối thiểu 450 ns
Khi chúng tôi cung cấp xung Bật, LCD chốt dữ liệu có mặt tại D0 đến D7 và hiển thị nó trên ma trận 5x8 vì RS là dữ liệu reg.
void LCD_Char (unsigned char char_data) /* LCD data write function */
{
lcd_data_port=char_data;
rs=1; /*Data reg.*/
rw=0; /* Write operation*/
en=1;
delay(1);
en=0;
delay(5);
}
chú thích
- LCD Power on delay: sau khi bật nguồn, chúng tôi không thể gửi lệnh ngay lập tức, LCD16x2 cần thời gian tự khởi tạo 15ms. Trong khi lập trình chúng ta cần phải chăm sóc cung cấp đủ năng lượng về độ trễ> 15ms, và sau đó gửi lệnh đến màn hình LCD.
- Sau khi cung cấp các lệnh để thực hiện, LCD16x2 mất thời gian tính bằng micro giây nhưng đối với lệnh 0x01 (Hiển thị rõ ràng), phải mất 1.64ms để thực thi. Vì vậy, sau khi đưa ra lệnh này, chúng ta cần phải cung cấp đủ độ trễ> 1,63milliseconds.
Chương trình
#include<reg51.h>
sfr lcd_data_port=0x90; /* P1 port as data port */
sbit rs=P2^0; /* Register select pin */
sbit rw=P2^1; /* Read/Write pin */
sbit en=P2^2; /* Enable pin */
void delay(unsigned int count) /* Function to provide delay Approx 1ms */
{
int i,j;
for(i=0;i<count;i++)
for(j=0;j<112;j++);
}
void LCD_Command (unsigned char cmd) /* LCD16x2 command funtion */
{
lcd_data_port= cmd;
rs=0; /* command reg. */
rw=0; /* Write operation */
en=1;
delay(1);
en=0;
delay(5);
}
void LCD_Char (unsigned char char_data) /* LCD data write function */
{
lcd_data_port=char_data;
rs=1; /* Data reg.*/
rw=0; /* Write operation*/
en=1;
delay(1);
en=0;
delay(5);
}
void LCD_String (unsigned 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 (0x38); /* Initialization of 16X2 LCD in 8bit 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);
LCD_String("Hello World"); /*write string on 2nd line*/
while(1); /* Infinite loop. */
}
Cán hiển thị
Để cuộn chuỗi hoặc ký tự trên màn hình LCD, chúng tôi cần sử dụng các lệnh sau
Chỉ huy
|
Ý nghĩa
|
---|---|
0x1c
|
Chuyển toàn bộ màn hình sang phải
|
0x18
|
Chuyển toàn bộ màn hình sang trái
|
Để cuộn màn hình, đơn giản là chúng ta phải đặt các lệnh này vào các vòng lặp.
Cán Hiển thị:
- Hiển thị chuỗi trên màn hình LCD
- Cuộn nó sang bên phải bằng lệnh '0x1C'
- Cuộn sang bên trái bằng lệnh '0x18'
Mã hàm chính
void main()
{
unsigned char i,shift;
delay(5);
LCD_Init(); /* initilize LCD */
LCD_String("Do Tri Manh"); /* display string */
delay(1000);
shift=15; /* number of time shifts count=15 */
while(1)
{
for(i=0;i<shift;i++)
{
LCD_Command(0x1c); /* shift display right */
delay(300);
}
shift=30; /* number of time shifts 30 */
for(i=0;i<30;i++)
{
LCD_Command(0x18); /* shift display left */
delay(300);
}
}
}