1. Các vùng nhớ của màn hình LCD
Vùng nhớ RAM hiển thị dữ liệu DDRAM (Display Data RAM)
DDRAM là bộ nhớ tạm chứa các ký tự cần hiển thị lên LCD. Bộ nhớ này gồm có 80 ô được chia thành 2 hàng, mỗi ô có độ rộng 8 bit. Các ô được đánh địa chỉ từ 0 đến 39 (00 đến 27 ở hệ cơ số 16) cho dòng 1, từ 64 đến 103 (40 đến 67 ở hệ cơ số 16) cho dòng 2.
Mỗi ô nhớ tương ứng với 1 ô trên màn hình LCD. Đối với màn hình LCD 16×2 hiển thị tối đa 32 ký tự, lưu ở 16 ô nhớ có địa chỉ từ 0 đến 15 ở dòng 1 và 16 ô nhớ có địa chỉ từ 64 đến 79 ở dòng 2. Khi muốn hiển thị một ký tự trên LCD, chúng ta cần lưu ký tự đó vào DDRAM ở 1 trong 32 ô nhớ trên.
Vùng nhớ ROM tạo ra các ký tự CGROM (Character Generator ROM)
Vùng ROM này dùng để chứa các mẫu kí tự loại 5×8 hoặc 5×10 điểm ảnh cho 1 kí tự trong 1 ô nhớ. Chúng tương ứng với các ký tự trong mã ASCII. Ví dụ, ký tự ‘a’ có mã ASCII là 97, đổi ra nhị phân là 01100001. CGROM sẽ lưu trữ giá trị nhị phân này.
CGROM lưu trữ 208 mẫu kí tự 5×8 và 32 mẫu kí tự kiểu 5×10, tổng cộng là 240 kí tự. Chúng ta không thể thay đổi vùng ROM này.
Vùng nhớ RAM tạo ra các ký tự CGRAM (Character Generator RAM)
CGRAM là vùng nhớ chứa các ký tự riêng do người dùng tự định nghĩa. Các ký tự phải được định nghĩa trước và được gọi hiển thị khi cần thiết. Vùng nhớ CGRAM có dung lượng rất hạn chế. Chúng ta chỉ có thể tạo 8 kí tự loại 5×8 hoặc 4 kí tự loại 5×10.
2. Cách tạo thêm các ký tự mới trên LCD
Chúng ta xem ví dụ tạo chữ ‘Ô’ trên LCD bên dưới.
Sử dụng mảng byte lưu trữ 8 dãy bit, mỗi dãy bit gồm 5 bit để biểu diễn một ký tự loại 5×8.
byte chuO[8] = {
B01110,
B10001,
B00000,
B01110,
B10001,
B10001,
B01110,
B00000
};
3. Chương trình hiển thị ký tự mới trên LCD
Định nghĩa các ký tự mới bằng các byte rồi sử dụng hàm createChar()
để tạo các ký tự theo thứ tự ký tự 0 đến 7, tức là tối đa 8 ký tự đối với loại ký tự 5×8. Sử dụng hàm print(char(0))
để in ký tự thứ 0 lên màn hình LCD. Tương tự cho ký tự 1 đến 7: print(char(1)), print(char(2)),…, print(char(7)).
Lưu ý: Đối với loại ký tự 5×10 thì tạo được tối đa 4 ký tự.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Khai báo các byte định nghĩa các ký tự mới
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
byte heart_h[8] = {
B00000,
B00000,
B01010,
B10101,
B10001,
B01010,
B00100,
B00000
};
byte heart_f[8] = {
B00000,
B00000,
B01010,
B11111,
B11111,
B01110,
B00100,
B00000
};
byte ohm[8] = {
B00000,
B01110,
B10001,
B10001,
B10001,
B01010,
B01010,
B11011
};
byte rect[8] = {
B11111,
B10001,
B10001,
B10001,
B10001,
B10001,
B10001,
B11111
};
byte arrow_u[8] = {
B00100,
B01110,
B11111,
B00100,
B00100,
B00100,
B00100,
B00100
};
byte arrow_d[8] = {
B00100,
B00100,
B00100,
B00100,
B00100,
B11111,
B01110,
B00100
};
byte diamond[8] = {
B00000,
B00100,
B01010,
B10001,
B01010,
B00100,
B00000,
B00000
};
void setup() {
lcd.begin(16, 2);
lcd.createChar(0, smiley);
lcd.createChar(1, heart_h);
lcd.createChar(2, heart_f);
lcd.createChar(3, ohm);
lcd.createChar(4, rect);
lcd.createChar(5, arrow_u);
lcd.createChar(6, arrow_d);
lcd.createChar(7, diamond);
}
void loop() {
for(int i=0;i<8;i++){
lcd.setCursor(i*2,0);
lcd.print(char(i));
delay(200);
}
lcd.setCursor(0, 1);
lcd.print("I love you");
for(int i=10;i<16;i++){
lcd.setCursor(i, 1);
lcd.print(char(2));
delay(200);
}
delay(2000);
lcd.clear();
delay(300);
}
Kết quả
4. Bài tập
Bài tập 1: Định nghĩa chữ Ê và Ô cho LCD rồi hiển thị lên màn hình LCD.
Bài tập 2: Thiết kế bàn phím nhập ký tự UNICODE gồm các chữ cái ABCS (AA → Â, AS→Á).