fbpx

Hướng dẫn viết thư viện LCD16x2 cho PIC Bình luận

Giới thiệu

Thiết bị hiển thị LCD (Liquid Crystal Display) được sử dụng trong rất nhiều các ứng dụng của Vi điều khiển. LCD có rất nhiều ưu điểm so với các dạng hiển thị khác: Nó có khả năng hiển thị kí tự đa dạng, trực quan (chữ, số và kí tự đồ họa), dễ dàng đưa vào mạch ứng dụng theo nhiều giao thức giao tiếp khác nhau, tốn rất ít tài nguyên hệ thống và giá thành rẻ.

Để hiển thị được LCD thì vi điều khiển phải thông qua con chip chuyên dùng thống thường đó là chip HD44780 của Hitachi. Khi sản xuất LCD, nhà sản xuất đã tích hợp chíp điều khiển (HD44780) bên trong lớp vỏ và chỉ đưa các chân giao tiếp cần thiết.

Hình 1. Sơ đồ chân của LCD

Bảng 1. Các chân trên module LCD và chức năng của chúng

Vss Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với GND của mạch điều khiển.
Vdd Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với Vcc = 5V của mạch điều khiển.
Vee Chân này dùng để điều chỉnh độ tương phản của LCD. Thông thường điện áp Vee được thay đổi bằng biến trở.
RS Chân chọn thanh ghi (Register Select). Nối chân RS với logic “0” (GND) hoặc logic “1” (VCC) để chọn thanh ghi.

+ Logic “0”: Bus DB0-DB7 sẽnối với thanh ghi lệnh IR của LCD (ở chế độ”ghi” – write) hoặc nối với bộ đếm địa chỉ của LCD (ởchế độ”đọc” – read)

+ Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD.

R/W Chân chọn chế độ đọc/ghi (Read/Write).

+ Logic “0”: LCD hoạt động ởchế độ ghi.

+ Logic “1”: LCD ở chế độ đọc.

E Chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E.

+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào(chấp nhận) thanh ghi bên trong nó khi phát hiện một xung (high-to-low transition) của tín hiệu chân E.

+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên (low to-high transition) ởchân E và được LCD giữ ở bus đến khi nào chân E xuống mức thấp

DB0 -DB7 Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU. Có 2 chế độ sử dụng 8 đường bus này :

+ Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7.

+ Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7

Thông thường sẽ dùng chế độ giao tiếp 4bit để tiết kiệm số lượng chân.

 

Hình 2. Sơ đồ kết nối LCD và Vi điều khiển PIC16F877A kiểu 4bit

 

Giao tiếp với HD44780.

Tiếp theo mình xin hướng dẫn chế độ giao tiếp 4 bit để hiển thị LCD dùng chip HD44780. Theo datasheet HD44780 thì đầu tiên phải cài đặt thông số ban đầu cho LCD trước khi cho nó làm việc, trình tự các bước như sau:

Bảng 2. Khởi tạo thông số ban đầu cho LCD

Bước

Công việc

0 Cấp điện cho LCD
1 Delay tối thiểu 15ms để điện áp cấp cho LCD lên 4.5V
2 Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 1 1

3 Delay tối thiêu 5ms
4 Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 1 1

5 Delay tối thiểu 100us
7 Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 1 1

8 Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 1 0

9 1 – Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 1 1

2 – Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 N F * *

10 1 – Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 0 0

2 – Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 1 0 0 0

11 1 – Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 0 0

2 – Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 0 1

12 1 – Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 0 0 0

2 – Set các bit tương ứng với mức logic:

RS R/W DB7 DB6 DB5 DB4

0 0 0 1 I/D S

Kết thúc khởi tạo LCD

Lưu ý:

  • N = 0; 1 hàng
  • F = 0; 5 × 8 dot font.
  • I/D =1 : Tăng
  • S=0 : Không dịch.

Thư viện LCD16x2 cho PIC

Thư viện LCD 16×2 đươc viết gồm 2 phần:

  • File LCD.h: là file header dùng để khai báo chân LCD sử dụng.
  • File LCD_Functions.c: là file chưa các hàm LCD.

LCD.h

Các chân của LCD được kết nối với chân nào của vi điều khiển thì khai báo trong file header này. Ví dụ: Chân E được kết nói với PIN_B5 của PIC…

#ifndef _LCD_
#define _LCD_
#define LCD_RS PIN_B3                        
#define LCD_RW PIN_B4
#define LCD_EN PIN_B5
#define LCD_D4 PIN_D4                 
#define LCD_D5 PIN_D5
#define LCD_D6 PIN_D6
#define LCD_D7 PIN_D7 
#endif

LCD_Fucntions.c

Trong file này chứa các hàm:

  • void LCD_Enable(void): Tạo xung Enable để giao tiếp với LCD.
  • void LCD_Send4Bit( unsigned char Data ): Truyền 4bit dữ liệu xuống LCD.
  • void LCD_SendCommand (unsigned char command ): Gửi 1 lệnh xuống LCD (Một lệnh thì có 8 bit dữ liệu)
  • void LCD_Init (void): Khởi tạo ban đầu cho LCD.
  • void LCD_PutChar ( unsigned char Data ): Hiển thị 1 ký tự lên LCD.
  • void LCD_Puts (char *s): Hiển thị một chuỗi lên LCD.
  • void LCD_Clear(): Xóa màn hình LCD
  • void LCD_Gotoxy(unsigned char row, unsigned char col): hiển thị bắt đầu tại vị trí hàng row, cột col

void LCD_Enable(void)

 void LCD_Enable(void)
{
 output_high(LCD_EN);
 delay_us(3);
 output_low(LCD_EN);
 delay_us(50); 
}

void LCD_Send4Bit( unsigned char Data )

 void LCD_Send4Bit( unsigned char Data )
{
 output_bit(LCD_D4,Data&0x01);
 output_bit(LCD_D5,(Data>>1)&1);
 output_bit(LCD_D6,(Data>>2)&1);
 output_bit(LCD_D7,(Data>>3)&1);
}

void LCD_SendCommand (unsigned char command )

 void LCD_SendCommand (unsigned char command )
{
LCD_Send4Bit  ( command >>4 );/* Gui 4 bit cao */
LCD_Enable () ;
LCD_Send4Bit  ( command  );   /* Gui 4 bit thap*/
LCD_Enable () ;
}

void LCD_Init (void)

void LCD_Init (void)
{
output_low(LCD_RS);
output_low(LCD_RW);
delay_ms(20);
LCD_Send4Bit(0x03);
LCD_Enable();
delay_ms(10);
LCD_Send4Bit(0x03);
LCD_Enable();
delay_ms(10);
LCD_Send4Bit(0x03);
LCD_Enable();
delay_ms(10);
LCD_Send4Bit(0x02);
LCD_Enable();
delay_ms(10);
LCD_SendCommand( 0x28 );      // giao thuc 4 bit, hien thi 2 hang, ki tu 5x8   
                                 //Function Set: 8-bit, 1 Line, 5x7 Dots   0x30
                                 //Function Set: 8-bit, 2 Line, 5x7 Dots   0x38
                                 //Function Set: 4-bit, 1 Line, 5x7 Dots   0x20
                                 //Function Set: 4-bit, 2 Line, 5x7 Dots   0x28
LCD_SendCommand( 0x0C);    //Display on Cursor on: 0x0E   0x0F 
                               //Display on Cursor off: 0x0C
                               //Display on Cursor blinking: 0x0F
LCD_SendCommand( 0x06 );   // tang ID, khong dich khung hinh  Entry Mode
LCD_SendCommand( 0x01 );   //  Clear Display  (also clear DDRAM content)
}

void LCD_PutChar ( unsigned char Data )

void LCD_PutChar ( unsigned char Data )
{
 output_high(LCD_RS);
 LCD_SendCommand( Data );
 output_low(LCD_RS);
}

void LCD_Puts (char *s)

void LCD_Puts (char *s)
{
   while (*s)
   {
      LCD_PutChar(*s);
      s++;
   }
}

void LCD_Clear():

void LCD_Clear()
{
  LCD_SendCommand(0x01);  
  delay_ms(10);
}

void LCD_Gotoxy(unsigned char row, unsigned char col)

void LCD_Gotoxy(unsigned char row, unsigned char col)
{
  unsigned char address;
  if(!row)
  address = (0x80 + col);
  else
  address = (0xC0 + col);
  delay_us(500);
  LCD_SendCommand(address);
  delay_us(50);
}

Mô phỏng Proteus

Hình 3. Sơ đồ mô phỏng trong Proteus

Đoạn code demo

/*
   
Trang chủ
Demo LCD for PIC16F877A */ #include <16f877A.h> #device *=16 adc=10 #fuses hs, nowdt, noprotect, nolvp, put, brownout #use delay(clock=20000000) #include #include // 4-Bits Interface void main() { unsigned char line1[16], line2[16]; LCD_Init(); delay_ms(10); sprintf(line1," DEMO LCD 16x2 "); sprintf(line2," nvtienanh.com "); while(TRUE) { LCD_Gotoxy(0,0); LCD_Puts(line1); LCD_Gotoxy(1,0); LCD_Puts(line2); delay_ms(500); } }

Bình luận

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.