QC

LCD 4 Bit 8051

 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 NumberSymbolPin Function
1VSSGround
2VCC+5v
3VEEContrast adjustment (VO)
4RSRegister Select. 0:Command, 1: Data
5R/WRead/Write, R/W=0: Write & R/W=1: Read
6ENEnable. Falling edge triggered
7D0Data Bit 0 (Not used in 4-bit operation)
8D1Data Bit 1 (Not used in 4-bit operation)
9D2Data Bit 2 (Not used in 4-bit operation)
10D3Data Bit 3 (Not used in 4-bit operation)
11D4Data Bit 4
12D5Data Bit 5
13D6Data Bit 6
14D7Data Bit 7/Busy Flag
15A/LED+Back-light Anode(+)
16K/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

Sơ đồ dưới đây cho thấy kết nối tối thiểu cần thiết để giao tiếp màn hình LCD với bộ vi điều khiển.
Khi chúng ta đang giao tiếp màn hình LCD ở chế độ 4 bit, chỉ 4 đường dữ liệu cao hơn được sử dụng làm bus dữ liệu.

Port Connection

Phần này trình bày cách cấu hình GPIO để giao tiếp với màn hình LCD.
Cấu hình dưới đây là theo sơ đồ trên. Bạn có thể kết nối màn hình LCD với bất kỳ chân PORT nào có sẵn trên bo mạch của bạn và cập nhật phần này cho phù hợp


#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);
}


Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...