BÀI 07: GIAO TIẾP VỚI LCD

tháng 4 22, 2018
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);
}

Tiếp theo là gửi dữ liệu, đầu tiên gửi một kí tự ra LCD
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:))
Latest
Previous Article
Next Post »

Disqus
Tambahkan komentar Anda

Không có nhận xét nào