Tạo thêm các ký tự mới trên LCD với board mạch Arduino

Đây là bài 12/17 bài của series môn học Lập trình Arduino cơ bản

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)

Vùng nhớ DDRAM của LCD

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.

Ký tự 5x8 và 5x10 của LCD
Ký tự 5×8 và 5×10 trên LCD

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.

Tạo một ký tự 5x8 của LCD
Tạo ký tự ‘Ô’ loại 5×8 trên LCD

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→Á).

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Các hiệu ứng hiển thị trên LCD với board mạch ArduinoLập trình giao tiếp cảm biến LM35 với board mạch Arduino >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.