BÀI 07: GIAO TIẾP VỚI LCD
1.Giới thiệu về LCD
LCD là một màn hình nhiều điểm ảnh, có thể coi là một led ma trận lớn, tuy nhiên chúng ta sẽ không cần đi vào điều khiển từng điểm ảnh mà chúng ta sẽ điều khiển qua lệnh. Có nhiều loại LCD, trong hướng dẫn này mình sẽ dùng loại 16x2. Trước tiên, hãy xem cấu tạo của nó.
Có hai cách để làm việc với LCD là gửi lệnh và gửi dữ liệu. Chúng ta sẽ lần lượt tìm hiểu hai cách này.
2. Gửi lệnh ra LCD
Một số lệnh khởi tạo LCD thường dùng.
3. Gửi dữ liệu ra LCD
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.
Tiếp theo, chúng ta sẽ thực hành 1 số thao tác với LCD. Vẽ mạch mô phỏng như sau:
Đầu tiên chúng ta sẽ thực hiện gửi 1 lệnh ra LCD, hàm như sau:
void LCD_Cmd(unsigned char cmd)
{
RS = 0;
LCD_DATA = cmd;
EN = 0;
EN = 1;
Delay_ms(2);
}
void LCD_Chr_Cp(char c)
{
RS = 1;
LCD_DATA = c;
EN = 0;
EN = 1;
Delay_ms(1);
}
Chúng ta cũng có thể gửi một chuối ra LCD void LCD_Out_String(char *str)
{
unsigned char i=0;
while(str[i]!=0)
{
LCD_Chr_Cp(str[i]);
i++;
}
}
Mặc định khi gửi lệnh hay dữ liệu, LCD sẽ hiển thị nó ở vị trí dòng 0 cột 0, chúng ta có thể xuất lệnh hay dữ liệu đến vị trí tùy ý bằng hàm LCD_Goto_xy() như sau: LCD_Goto_xy(unsigned char x, unsigned char y, char c)
{
unsigned char cmd;
// [1;0] [1;1]
cmd = (x == 1 ? 0x80 : 0xc0) + y - 1;
LCD_Cmd(cmd);
//Out character
LCD_Chr_Cp(c);
}
Cuối cùng, khi chuỗi đang được hiển thị, chúng ta có thể dịch trái hoặc dịch phải với câu lệnh như hình dưới:
Để trở về trạng thái ban đầu, làm như sau:
Các bạn có thể tham khảo chương trình dưới đây:
/**
***********************************************************************
// File Name: LCD 16x2
// Author: luonngduyhuynh2801@gmail.com
// Date:
//Tap Lenh
0x01 clear
0x02 Di chuyen con tro ve dau man hinh
0x06 Di chuyen con sau ki tu
0x0C Bat hien thi va tat con tro
0x0E Bat hien thi va bat con tro
0x80 move poiter ve dau dong 1
0xC0 move poiter ve dau dong 2
0x38 giao tiep 8 bit, 2 line, font 5x7
0x28 giao tiep 4 bit, 2 line, font 5x7
0x18 dich trai
0x1c dich phai
//SET DDRAM address
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 [AD] [AD] [AD] [AD] [AD] [AD] [AD]
***********************************************************************/
#include "main.h"
#include "..\Lib\Delay.h"
sbit RS = P2^0;
sbit EN = P2^1;
#define LCD_DATA P3
void LCD_Cmd(unsigned char cmd)
{
RS = 0;
LCD_DATA = cmd;
EN = 0;
EN = 1;
Delay_ms(2);
}
void LCD_Chr_Cp(char c)
{
RS = 1;
LCD_DATA = c;
EN = 0;
EN = 1;
Delay_ms(1);
}
void LCD_Out_String(char *str)
{
unsigned char i=0;
while(str[i]!=0)
{
LCD_Chr_Cp(str[i]);
i++;
}
}
//function set
void LCD_Init()
{
LCD_Cmd(0x30);
Delay_ms(3);
LCD_Cmd(0x30);
Delay_ms(1);
LCD_Cmd(0x30);
LCD_Cmd(0x38); //8bit 2line font 5x7
LCD_Cmd(0x01);
}
LCD_Goto_xy(unsigned char x, unsigned char y, char c)
{
unsigned char cmd;
// [1;0] [1;1]
cmd = (x == 1 ? 0x80 : 0xc0) + y - 1;
LCD_Cmd(cmd);
//Out character
LCD_Chr_Cp(c);
}
//
void main()
{
Delay_ms(100);
LCD_Init();
//bat hien thi va con tro
LCD_Cmd(0x0E);
LCD_Chr_Cp('A');
LCD_Out_String("Hello");
while(1)
{
}
}
Hàm Delay() các bạn tự viết nhé, mình xóa mất rồi:))