LCD giao tiếp với vi điều khiển

Lập trình giao tiếp giữa vi điều khiển Pic và Lcd

Màn hình tinh thể lỏng hay LCD (Liquid crystal display)

Đây là loại thiết bị hiển thị cấu tạo bởi các tế bào (các điểm ảnh) chứa tinh thể lỏng có khả năng thay đổi tính phân cực của ánh sáng và do đó thay đổi cường độ ánh sáng truyền qua khi kết hợp với các kính lọc phân cực. Chúng có ưu điểm là phẳng, cho hình ảnh sáng, chân thật và tiết kiệm năng lượng.

Ở đây chúng ta chỉ đề cập đến module Text LCD trong lập trình vi điều khiển. Các module này có kích thước lớn nhỏ khác nhau và thường có các tên gọi LCD Số ký tự x số dòng. Ví dụ: LCD 16×2 – có nghĩa là màn hình lcd này có 16 ký tự và 2 dòng.

Hình ảnh thực tế của LCD 16×2

Hình ảnh của LCD 16×2, trên phần mềm Proteus

Bạn thấy trên lcd có 8 bit dữ liệu từ D0 đến D7, bạn có hai sự lựa chọn cho việc kết nối LCD với vi điều khiển (config), một là kết nối truyền dữ liệu 4 bit (config 4bit), hai là truyền dữ liệu 8 bit (config 8bit). Trong bài hướng dẫn này mình chia sẻ sơ đồ kết nối truyền dữ liệu 4 bit, bạn xem hình bên dưới sẽ rõ hơn:

Kết nối LCD 16×2 với vi điều khiển pic 16f877A theo kiểu 4bit

Trong sơ đồ trên ta chỉ sử dụng 4 bit từ D4-D7 (data lines) để truyền dữ liệu  từ vi điều khiển pic 16f877A đến LCD 16×2. Hai chân RS, E (control lines) dùng để điều khiển LCD, VEE kết nối với một biến trở để điều chỉnh độ sáng của LCD.

Như vậy, chúng ta đã biết khái niệm về LCD và cách kết nối chúng với vi điều khiển, sau đây chúng ta sẽ học cách lập trình trên vi điều khiển để xuất dữ liệu lên LCD bằng chương trình mikaroC compiler . Trên trình biên dịch mikroC đã hỗ trợ thư viện LCD, bạn chỉ cần định nghĩa port và gọi vài hàm là có thể hoàn thành việc xuất dữ liệu. Sau đây là các hàm trong thư viện LCD trên mikroC compiler:

  • Lcd_Int(): đây là hàm khởi tạo LCD, trước khi ta viết các hàm khác thì ta phải gọi hàm này khác.
  • Lcd_Out(char row, char column, char *text): xuất dữ liệu ra LCD, cách viết hàm như sau: Lcd Library Lcd_Out(char row, char column, char *text);
  • Lcd_cmd(command): trong đó biến command có thể là:
    • _LCD_FIRST_ROW: di chuyển con trỏ nhấp nháy đến vị trí đầu tiên của dòng 1.
    • _LCD_SECOND_ROW: di chuyển con trỏ nhấp nháy đến vị trí đầu tiên của dòng 2.
    • _LCD_THIRD_ROW: di chuyển con trỏ nhấp nháy đến vị trí đầu tiên của dòng 3.
    • _LCD_FOURTH_ROW: di chuyển con trỏ nhấp nháy đến vị trí đầu tiên của dòng 4.
    • _LCD_CLEAR: xóa dữ liệu màn hình .
    • _LCD_CURSOR_OFF: tắt con trỏ nhấp nháy.
    • _LCD_UNDERLINE_ON: con trỏ nhấp nháy kiểu gạch dưới.
    • _LCD_BLINK_CURSOR_ON: con trỏ nhấp nháy.
    • _LCD_MOVE_CURSOR_LEFT: di chuyển con trỏ trái mà không làm thay đổi hiển thị dữ liệu RAM
    • _LCD_MOVE_CURSOR_RIGHT: di chuyển con trỏ phải mà không làm thay đổi hiển thị dữ liệu RAM
    • _LCD_TURN_ON: mở LCD
    • _LCD_TURN_OFF: tắt hiển thị LCD
    • _LCD_SHIFT_LEFT: di chuyển dữ liệu hiển thị sang trái.
    • _LCD_SHIFT_RIGHT: di chuyển dữ liệu hiển thị sang phải
  • Lcd_Out_Cp(*char text): In văn bản trên màn hình LCD tại vị trí con trỏ hiện hành. Cả hai biến chuỗi và chữ có thể được thông qua như là một văn bản.
  • Lcd_Chr(char row, char column, char out_char): In ký tự trên LCD tại vị trí quy định. Cả hai biến số và chữ có thể được thông qua như là một ký tự.

Trước tiên chúng ta cần thiết đặt các data lines và control lines như sau:

// LCD module connections
sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD5_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;
sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// End LCD module connections

Sau đây là một Project hoàn chỉnh về việc xuất dữ liệu ra LCD:

/*Project: Hoc lap trinh giao tiep LCD 4bit, ket noi RD0..RD3 den D4...D7 cua LCD
 RD4 ket noi RS, RD5 ket noi E.
 MCU: pic 16f877A
 Author: Huynh Minh Trung
web: http://giaoan.link
 */
 
// LCD module connections
sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD5_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;
sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// End LCD module connections

unsigned char *text;
void main() {
TRISD = 0x00; //Trisd as output
PORTD = 0x00; //Clear port d
text="CHAO BAN DEN";

Lcd_Init(); //Khoi tao LCD
Lcd_Cmd(_LCD_BLINK_CURSOR_ON); //Con tro nhap nhay
Delay_ms(2000);
Lcd_Out(1,2,text); //Xuat du lieu tu bien text ra vi tri dong 1, cot 1
Lcd_Cmd(_LCD_SECOND_ROW); //Di chuyen con tro den dong 2
Delay_ms(2000);
Lcd_out(2,1,"dientudieukhien"); //Xuat chuoi du lieu ra dong 2, cot 2
}

Video mô phỏng bằng chương trình Proteus về xuất dữ liệu LCD:
Bạn có thể tải project theo link bên dưới về tham khảo, gồm code c, file mô phỏng bằng proteus: