Chào các bạn hôm nay mình chuyển sang bài điều khiển LCD 16X 2 nha ! Trông có vẻ phức tạp nhưng quét LCD có khi dễn hơn matrix rất nhiều . Chúng ta mới tìm hiểu LCD 8 bit đã , xuất 4 bit để sau.
Chúng ta đi tìm hiểu một chút về LCD 16x2 :
Đây là loại gồm 16 ký tự x2 dòng ,mỗi ký tự được tạo ra từ một ma trận điểm sáng kích cỡ 5x7 hoặc 5x10
Sơ đồ chân:
Chân 15 và chân 16: ghi là A và K. Nó là anot và katot của một con led dùng để sáng LCD trong bóng tối, chúng ta có thể k nối , nếu sử dụng nối chân 15 với trở 220 or 330 ôm lên VCC , chân 16 nối đất.
Để mạch hoạt động chúng ta mắc theo sơ đồ sau đây:
Trên là sơ đồ theo ví dụ của mình , các bạn có thể mắc bất kỳ đâu tùy ứng dụng của bạn..Thường chân dữ liệu dùng Port 0 hoặc Port 2 VĐK , thiết kế mạch in nên để IC dưới gầm LCD cho nhỏ gọn .
* Nguyên lý hoạt động
-Các chân 1,2,3 là các chân VSS , VDD, VEE trong đó VSS chân nối đất , VEE chân chọn độ tương phản chân này dc chọn qua 1 biến trở 5K một đầu nối VCC , một đầu nối mát . Chân VDD nối dương nguồn .
- Chân chọn thanh ghi RS (Register Select): Có hai thanh ghi trong LCD, chân RS(Register Select) được dùng để chọn thanh ghi, như sau:
Nếu RS = 0 ở chế độ ghi lệnh như xóa màn hình , bật tắt con trỏ...
Nếu RS =1 ở chế độ ghi dữ liệu như hiển thị ký tự , chữ số lên màn hình .
-Chân đọc/ ghi (R/W): Đầu vào đọc/ ghi cho phép người dùng ghi thông tin lên LCD khi R/W = 0 hoặc đọc thông tin LCD khi
R/W = 1.
-Chân cho phép E (Enable): Chân cho phép E được sử dụng bởi LCD để chốt dữ liệu của nó. Khi dữ liệu được đến chân dữ liệu thì cần có 1 xung từ mức cao xuống mức thấp ở chân này để LCD chốt dữ liệu , xung này phải có độ rộng tối thiểu 450ns.
Chân D0 - D7: Đây là 8 chân dữ liệu 8 bít, được dùng để gửi thông tin lên LCD hoặc đọc nội dung của các thanh ghi trong
LCD. Để hiển thị các chữ cái và các con số chúng ta gửi các mã ASCII của các chữ cái và các con số tương ứng đến các chân này khi bật RS =1;
* Bảng mã lệnh trong LCD 16x2 :
Điều khiển LCD qua các bước sau :
-Chỉnh độ tương phản LCD cho thích hợp , nhiều trường hợp k chú ý LCD để tương phản quá thấp k nhìn thấy gì => đổi lỗi cho mạch hỏng.
-Khởi tạo LCD set số dòng , bật tắt con trỏ...
- Gán giá trị thích hợp cho các chân điều khiển RS, RW ,E với các chế độ
- Xuất dữ liệu vào POrt data-
- Kiểm tra LCD có bận k để tiến hành xuất tiếp.
-Quay lại bước 1.
Chúng ta đi vào ví dụ cụ thể . Ở đây mình sẽ xuất chữ
[You must be registered and logged in to see this link.] lên 2 dòng của LCD
Code :
Trích dẫn
#include "REGX52.H"
#include "stdio.H"
//------------Khoi tao bien va cac gia tri gan-------------//
sbit RS_LCD = P2^5;
sbit RW_LCD = P2^6;
sbit E_LCD = P2^7;
//---------------Sau day la cac chuong trinh con------------//
//--------------Ham tre khoang thoi gian rat ngan phuc vu viec kiem tr co ban---------------//
void delay_short()
{
unsigned int i;
for(i=0;i<3;i++);
}//--------------****------------------//
//------------Ham tre 2---------------//
void delay(unsigned int time) // Thoi gian time ms
{
TMOD = 0x01; // Timer 0 che do 1
while (time--)
{
TH0 = -1000/256;
TL0 = -1000%256;
TR0 = 1;
while (!TF0);
TR0 = 0;
TF0 = 0;
}
}
//-----------------******----------------//
//--------------Ham kiem tra co ban (busy_flag)--------------??
void kt_ban()
{
unsigned char x;
P0 = 0xff;
RS_LCD = 0;
RW_LCD = 1;
do
{
E_LCD = 1;
delay(50);
E_LCD = 0;
x=P0;
x=x&0x80;
}
while(x!=0x80);
}//-----------*******--------------------//
//---------------Ham ghi lenh giao tiep voi LCD---------------//
void ghi_lenh(unsigned char lenh)
{
kt_ban();
delay(50);
P0 = lenh;
RS_LCD = 0; // Chon thanh ghi lenh
RW_LCD = 0; // Chon che do ghi du lieu tu 8051 vao LCD
E_LCD = 1;
delay_short();
E_LCD = 0;
}//------------*******-----------------//
//-----------Ham ghi ky tu ra LCD------------//
void ghi_kytu(unsigned char kytu)
{
kt_ban();
delay(50);
P0 = kytu;
RS_LCD = 1; // Chon che do doc du lieu tu 8051
RW_LCD = 0;
E_LCD =1;
delay_short();
E_LCD = 0;
}//------------*******-----------------//
//-----------Ham ghi nhanh ky tu ra LCD------------//
void ghi_nhanh ( unsigned char kytu)
{
delay_short();
P0 = kytu;
RS_LCD = 1;
RW_LCD = 0;
E_LCD = 1;
delay_short();
E_LCD = 0;
}//--------------***********-------------//
//-----------Ham ghi chuoi ky tu ra LCD------------//
void ghi_chuoi(char *str)
{
while(*str)
{
delay(50);
ghi_kytu(*str);
str++;
}
}//-----------********------------//
//-----------Ham ghi nhanh chuoi ky tu ra LCD------------//
void ghi_nhanh_chuoi(char *str)
{
while(*str){
ghi_nhanh(*str);
str++;
}
}
//-----------************------------//
//-----------Ham ghi so nguyen ra LCD------------//
void ghi_so_nguyen(unsigned char so)
{
unsigned char a,b,c;
a=so/100; // Lay phan tram
b=(so-100*a)/10; // Lay phan chuc
c=(so-100*a-10*b); // Lay phan don vi
ghi_nhanh(a+48); // Doi ra hang tram, ma ascii
ghi_nhanh(b+48); // Doi ra hang chuc, ma ascii
ghi_nhanh(c+48); // Doi ra hang don vi, ma ascii
}
//-----------***********------------//
//-----------Ham khoi tao LCD------------//
void setting_LCD()
{
ghi_lenh(0x38);
ghi_lenh(0x01); // Xoa man hinh
ghi_lenh(0x0f); // Co dich hien thi
}
//-----------**********------------//
/*********************************/
/* CON DAY LA CHUONG TRINH CHINH */
/* ----------??????--------------*/
/*********************************/
void main()
{
setting_LCD();
ghi_lenh(0x01);
ghi_lenh(0x0c);
ghi_chuoi("http://");
ghi_lenh(0xc0);
ghi_lenh(0x0c);
ghi_chuoi("machdientu.net");
delay(300);
while(1);
}
Bạn có thể down ví dụ tại link sau:
[You must be registered and logged in to see this link.]Các ứng dụng mình sử dụng LCD :