LCD 4 BIT 8051
Như tên gọi, 2x16 có 2 dòng với 16 ký tự trên mỗi dòng. Nó hỗ trợ tất cả các ký tự ASCII và về cơ bản được sử dụng để hiển thị các ký tự chữ và số. Ở đây mỗi ký tự được hiển thị trong một ma trận 5x7 pixel. Ngoài các ký tự chữ và số, nó còn cung cấp khả năng hiển thị các ký tự tùy chỉnh bằng cách tạo mẫu.
HÌNH ẢNH LCD 16 X 2.
GIẢI THÍCH CÁC PIN:
Pin Number | Symbol | Pin Function |
1 | VSS | Ground |
2 | VCC | +5v |
3 | VEE | Contrast adjustment (VO) |
4 | RS | Register Select. 0:Command, 1: Data |
5 | R/W | Read/Write, R/W=0: Write & R/W=1: Read |
6 | EN | Enable. Falling edge triggered |
7 | D0 | Data Bit 0 (Not used in 4-bit operation) |
8 | D1 | Data Bit 1 (Not used in 4-bit operation) |
9 | D2 | Data Bit 2 (Not used in 4-bit operation) |
10 | D3 | Data Bit 3 (Not used in 4-bit operation) |
11 | D4 | Data Bit 4 |
12 | D5 | Data Bit 5 |
13 | D6 | Data Bit 6 |
14 | D7 | Data Bit 7/Busy Flag |
15 | A/LED+ | Back-light Anode(+) |
16 | K/LED- | Back-Light Cathode(-) |
Ngoài các kết nối cung cấp điện áp, các chân quan trọng theo quan điểm lập trình là các đường dữ liệu (Bus dữ liệu 8-bit), Chọn thanh ghi, Đọc / Ghi và Chân kích hoạt.
Bus dữ liệu: Như thể hiện trong hình và bảng trên, một LCD chữ và số có bus dữ liệu 8 bit được tham chiếu là D0-D7. Vì nó là một bus dữ liệu 8-bit, chúng tôi có thể gửi dữ liệu / cmd tới LCD theo byte. Nó cũng cung cấp điều khoản để gửi dữ liệu / cmd theo khối 4 bit, được sử dụng khi có số lượng giới hạn các dòng GPIO trên vi điều khiển.
Chọn thanh ghi (RS): Màn hình LCD có hai thanh ghi là thanh ghi Dữ liệu và thanh ghi Lệnh. Bất kỳ dữ liệu nào cần được hiển thị trên LCD phải được ghi vào thanh ghi dữ liệu của LCD. Lệnh có thể được cấp cho màn hình LCD bằng cách ghi nó vào thanh ghi lệnh của màn hình LCD. Tín hiệu này được sử dụng để phân biệt dữ liệu / cmd mà màn hình LCD nhận được.
Nếu tín hiệu RS là THẤP thì màn hình LCD sẽ diễn giải thông tin 8-bit dưới dạng Lệnh và ghi vào đó Thanh ghi lệnh và thực hiện hành động theo lệnh.
Nếu tín hiệu RS ở mức CAO thì màn hình LCD sẽ diễn giải thông tin 8-bit dưới dạng dữ liệu và sao chép nó vào thanh ghi dữ liệu. Sau đó, màn hình LCD giải mã dữ liệu để tạo ra mẫu 5x7 và cuối cùng hiển thị trên màn hình LCD.
Đọc / Ghi (RW): Tín hiệu này được sử dụng để ghi dữ liệu / cmd vào LCD và đọc cờ bận của LCD. Đối với hoạt động ghi, RW phải ở mức THẤP và đối với hoạt động đọc, R / W phải ở mức CAO.
Kích hoạt (EN): Chân này được sử dụng để gửi kích hoạt kích hoạt đến màn hình LCD. Sau khi gửi dữ liệu / cmd, Chọn thanh ghi dữ liệu / cmd, Chọn thao tác Ghi. Một xung CAO đến THẤP phải được gửi trên chân kích hoạt này sẽ chốt thông tin vào thanh ghi LCD và kích hoạt màn hình LCD hoạt động tương ứng.
Schematic
Port Connection
#define LcdDataBus P2 | |
sbit LCD_RS = P2^0; | |
sbit LCD_RW = P2^1; | |
sbit LCD_EN = P2^2; |
Các bước để gửi lệnh:
Bước 1: Gửi lệnh I / P tới LCD.
Bước 2: Chọn Đăng ký Điều khiển bằng cách đặt RS ở mức thấp.
Bước 3: Chọn Thao tác ghi làm cho RW thấp.
step4: Gửi xung từ Cao đến Thấp trên Bật mã PIN với một số độ trễ.
/* Function to send the command to LCD. As it is 4bit mode, a byte of data is sent in two 4-bit nibbles */ void Lcd_CmdWrite(char cmd) { LcdDataBus = (cmd & 0xF0); //Send higher nibble LCD_RS = 0; // Send LOW pulse on RS pin for selecting Command register LCD_RW = 0; // Send LOW pulse on RW pin for Write operation LCD_EN = 1; // Generate a High-to-low pulse on EN pin delay(1000); LCD_EN = 0; delay(10000); LcdDataBus = ((cmd<<4) & 0xF0); //Send Lower nibble LCD_RS = 0; // Send LOW pulse on RS pin for selecting Command register LCD_RW = 0; // Send LOW pulse on RW pin for Write operation LCD_EN = 1; // Generate a High-to-low pulse on EN pin delay(1000); LCD_EN = 0; delay(10000); }
Các bước gửi dữ liệu:
step1: Gửi ký tự đến màn hình LCD.
Bước 2: Chọn thanh ghi dữ liệu bằng cách đặt RS cao.
Bước 3: Chọn Thao tác ghi làm cho RW thấp.
step4: Gửi xung từ Cao đến Thấp trên Bật mã PIN với một số độ trễ.
Các thời gian tương tự như trên chỉ có thay đổi là RS được tạo cao để chọn thanh ghi dữ liệu.
/* Function to send the Data to LCD. As it is 4bit mode, a byte of data is sent in two 4-bit nibbles */ void Lcd_DataWrite(char dat) { LcdDataBus = (dat & 0xF0); //Send higher nibble LCD_RS = 1; // Send HIGH pulse on RS pin for selecting data register LCD_RW = 0; // Send LOW pulse on RW pin for Write operation LCD_EN = 1; // Generate a High-to-low pulse on EN pin delay(1000); LCD_EN = 0; delay(10000); LcdDataBus = ((dat<<4) & 0xF0); //Send Lower nibble LCD_RS = 1; // Send HIGH pulse on RS pin for selecting data register LCD_RW = 0; // Send LOW pulse on RW pin for Write operation LCD_EN = 1; // Generate a High-to-low pulse on EN pin delay(1000); LCD_EN = 0; delay(10000); }
Hardware Connections
Code Examples
#include<reg51.h> /* Configure the data bus and Control bus as per the hardware connection Databus is connected to P2.4:P2.7 and control bus P2.0:P2.2*/ #define LcdDataBus P2 sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2; /* local function to generate delay */ void delay(int cnt) { int i; for(i=0;i<cnt;i++); } /* Function to send the command to LCD. As it is 4bit mode, a byte of data is sent in two 4-bit nibbles */ void Lcd_CmdWrite(char cmd) { LcdDataBus = (cmd & 0xF0); //Send higher nibble LCD_RS = 0; // Send LOW pulse on RS pin for selecting Command register LCD_RW = 0; // Send LOW pulse on RW pin for Write operation LCD_EN = 1; // Generate a High-to-low pulse on EN pin delay(1000); LCD_EN = 0; delay(10000); LcdDataBus = ((cmd<<4) & 0xF0); //Send Lower nibble LCD_RS = 0; // Send LOW pulse on RS pin for selecting Command register LCD_RW = 0; // Send LOW pulse on RW pin for Write operation LCD_EN = 1; // Generate a High-to-low pulse on EN pin delay(1000); LCD_EN = 0; delay(10000); } /* Function to send the Data to LCD. As it is 4bit mode, a byte of data is sent in two 4-bit nibbles */ void Lcd_DataWrite(char dat) { LcdDataBus = (dat & 0xF0); //Send higher nibble LCD_RS = 1; // Send HIGH pulse on RS pin for selecting data register LCD_RW = 0; // Send LOW pulse on RW pin for Write operation LCD_EN = 1; // Generate a High-to-low pulse on EN pin delay(1000); LCD_EN = 0; delay(10000); LcdDataBus = ((dat<<4) & 0xF0); //Send Lower nibble LCD_RS = 1; // Send HIGH pulse on RS pin for selecting data register LCD_RW = 0; // Send LOW pulse on RW pin for Write operation LCD_EN = 1; // Generate a High-to-low pulse on EN pin delay(1000); LCD_EN = 0; delay(10000); } int main() { char i,a[]={"Good morning!"}; LcdDataBusDirnReg = 0x00; // Configure all the LCD pins as output Lcd_CmdWrite(0x02); // Initialize Lcd in 4-bit mode Lcd_CmdWrite(0x28); // enable 5x7 mode for chars Lcd_CmdWrite(0x0E); // Display OFF, Cursor ON Lcd_CmdWrite(0x01); // Clear Display Lcd_CmdWrite(0x80); // Move the cursor to beginning of first line Lcd_DataWrite('H'); Lcd_DataWrite('e'); Lcd_DataWrite('l'); Lcd_DataWrite('l'); Lcd_DataWrite('o'); Lcd_DataWrite(' '); Lcd_DataWrite('w'); Lcd_DataWrite('o'); Lcd_DataWrite('r'); Lcd_DataWrite('l'); Lcd_DataWrite('d'); Lcd_CmdWrite(0xc0); //Go to Next line and display Good Morning for(i=0;a[i]!=0;i++) { Lcd_DataWrite(a[i]); } while(1); }
NIẾU BẠN DÙNG THƯ VIỆN.
LCD 1x16
#include "lcd.h" int main() { /*Connect RS->P2.0, RW->P2.1, EN->P2.2 and data bus to P2.4 to P2.7*/ LCD_SetUp(P2_0,P2_1,P2_2,P_NC,P_NC,P_NC,P_NC,P2_4,P2_5,P2_6,P2_7); LCD_Init(1,16); LCD_DisplayString("HELLO\n");
while(1); return (0); }
LCD 2x16
#include "lcd.h" int main() { /*Connect RS->P2.0, RW->P2.1, EN->P2.2 and data bus to P2.4 to P2.7*/ LCD_SetUp(P2_0,P2_1,P2_2,P_NC,P_NC,P_NC,P_NC,P2_4,P2_5,P2_6,P2_7); LCD_Init(1,16); LCD_DisplayString("HELLO");
LCD_GoToLine(1); LCD_DisplayString("Lcd 4-Bit mode"); while(1); return (0); }
LCD 4x20
#include "lcd.h" int main() { /*Connect RS->P2.0, RW->P2.1, EN->P2.2 and data bus to P2.4 to P2.7*/ LCD_SetUp(P2_0,P2_1,P2_2,P_NC,P_NC,P_NC,P_NC,P2_4,P2_5,P2_6,P2_7); LCD_Init(4,20); LCD_DisplayString("HELLO\n"); LCD_DisplayString("LCD 4-bit Mode\n"); LCD_DisplayString("20 x 4 \n"); LCD_DisplayString(":) :O"); while(1); return (0); }