1. Giới Thiệu về màn hình LCD16X2
LCD là một màn hình nhiều điểm ảnh, có thể coi là một Led ma trận dạng lớn, tuy nhiên chúng ta không cần đi vào điều khiển từng Pixel hay là từng chấm nhỏ như trong Phần 1 mà chúng ta sẽ điều khiển qua lệnh, con trỏ… để hiển thị thông tin một cách dễ dàng hơn. Có nhiều loại LCD, trong bài này chúng ta dùng loại đơn giản 16×2. Trước tiên chúng ta tìm hiểu về cầu tạo của nó.
Dưới đây là hình mô phỏng, các em tìm nó với từ khóa “lcd 16×2”.
Tiếp theo chúng ta học về cách kết nối, lập trình để sử dụng LCD. Trước tiên chúng ta phải gửi lệnh vào cho LCD biết nó phải làm gì. Cách gửi lệnh như sau:
Các em có thể xem một số lệnh sau đây. Những lệnh này gọi là lệnh khởi tạo LCD.
Sau khi gửi các lệnh vào LCD (qua các chân D0 – D7) để nó biết sẽ phải làm gì (bật màn hình, hiển thị hay tắt con trỏ, di chuyển con trỏ …), chúng ta sẽ phải gửi lệnh chứa các kí tự mà chúng ta muốn hiển thị. Cách gửi dữ liệu ra cũng tương tự như cách gửi lệnh, các em có thể xem trong hình sau:
Bước 1 thường là mặc định. Các bước sau tương tự như việc gửi lệnh vào LCD. Tại sao B1 lại là mặc định, vì chúng ta thường dùng LCD để hiển thị chứ không để nhận dữ liệu vào. Hình sau nối chân RW với Ground:
Các em tạo Project mô phỏng như hình vẽ dưới và sử dụng đoạn code sau để hiển thị kí tự ra màn hình.
2. Code mẫu
#include<regx52.h>
// Khai bao ket noi voi LCD. 2 chân này sẽ thông báo cho LCD, lúc nào là truyền
//câu lệnh, lúc nào truyền dữ liệu hiển thị và khi nào được truyền, khi nào không
sbit LCD_RS = P2^0;
sbit LCD_EN = P2^1;
#define LCD_DATA P3;
// Đặt hằng số thay thế Port3- xuất dữ liệu từ VĐK
//Hàm Delay_ms được tính toán với tần số thạch anh 12Mhz.
void Delay_ms(unsigned int t)
{
unsigned int x,y;
for(x=0;x<t;x++) {
for(y=0;y<123;y++);
}
}
//Hàm Lcd_cmd sẽ gửi lệnh vào trong LCD. Chú ý các bước trong phần gửi lệnh
void Lcd_Cmd(unsigned char cmd) {
LCD_RS = 0; //Ghi command chu khong phai Data
LCD_DATA = cmd; //Dua command vao Port P3
LCD_EN = 0; //Cho phep truyen command vao LCD
LCD_EN = 1; //Khong cho phep truyen tiep
if(cmd<=0x02) {
Delay_ms(2);
}
else {
Delay_ms(1);
}
}
void Lcd_Chr_Cp(char c); // Hiển thị một kí tự ở vị trí hiện tại của con trỏ
{ LCD_RS = 1;//Ghi dữ liệu hiển thị chu khong phai lệnh
LCD_DATA = c;
LCD_EN = 0;
LCD_EN = 1;
Delay_ms(1); }
void Lcd_Str_Cp(char *str); //Ghi một String thay vì chỉ ghi từng kí tự
{
unsigned char i = 0;
while(str[i]!=0); //Ghi lần lượt từng kí tự của String ra màn hình đến khi gặp //kí tự trắng
{
Lcd_Chr_Cp(str[i]); i++; }
}
// Khai báo chương trình chính
void main()
{
// Xoa toan bo noi dung tren
LCD Lcd_Cmd(0x01);
// Bat hien thi va tat con tro. Dòng lệnh bên dưới sẽ bật con trỏ với mã 0x0E
Lcd_Cmd(0x0C); //Lcd_Cmd(0x0E);
// Hien thi chuoi "Hello World"
Lcd_Str_Cp("Hello World");
// Di chuyen con tro ve dau dong thu 2
Lcd_Cmd(0x38);
Lcd_Cmd(0xC0);
Lcd_Str_Cp("I am the best in the world Hê Hê");
Delay_ms(3000);
while(1)
{
Lcd_Cmd(0x18);
Delay_ms(1000);
}
}
Trong việc hiển thị kí tự tại một vị trí có sẵn, chúng ta sử dụng 8 bit để chọn vị trí của kí tự. Bit đầu tiên luôn mặc định là 1. Các bit tiếp theo hiển thị vị trí của kí tự. Có tất cả 128 ô (00-7F).
Với các câu lệnh khác, chúng ta có thể hiển thị kí tự ở một vị trí bất kì trong một dòng, thay vì chỉ đầu dòng. Chúng ta cũng có thể cho cả dòng chữ chạy trái, chạy phải chỉ với một dòng lệnh.
Sau khi hiển thị một kí tự tại một vị trí có sẵn, chúng ta có thể tiến đến bước xa hơn, dịch chuyển kí tự mà chúng ta muốn (dịch trái, dịch phải) với câu lệnh như hình dưới.
Cuối cùng, khi dòng chữ đang chạy, các em muốn dừng không cho chạy nữa, trở lại vị trí như ban đầu, có thể dùng lệnh sau: