Đây là hướng dẫn thứ sáu của chúng tôi trong Loạt bài Hướng dẫn PIC, trong hướng dẫn này, chúng tôi tìm hiểu Giao diện của LCD 16x2 với Vi điều khiển PIC. Trong các hướng dẫn trước của chúng tôi, chúng tôi đã tìm hiểu cơ bản về PIC bằng cách sử dụng một số Chương trình nhấp nháy đèn LED và cũng đã học Cách sử dụng Bộ định thời trong Vi điều khiển PIC. Bạn có thể xem ở đây tất cả các hướng dẫn về Học vi điều khiển PIC bằng trình biên dịch MPLABX và XC8.
Hướng dẫn này sẽ là một hướng dẫn thú vị vì chúng ta sẽ học Cách giao diện LCD 16 × 2 với PIC16F877A, hãy xem Video chi tiết ở cuối hướng dẫn này. Đã qua rồi cái thời mà chúng ta sử dụng đèn LED cho các chỉ dẫn của người dùng. Hãy để chúng tôi xem cách chúng tôi có thể làm cho các dự án của mình trông thú vị và hữu ích hơn bằng cách sử dụng màn hình LCD. Ngoài ra, hãy xem các bài viết trước của chúng tôi về Giao diện LCD với 8051, với Arduino, với Raspberry Pi, với AVR.
Các chức năng cho Giao diện LCD với Vi điều khiển PIC:
Để làm cho mọi thứ dễ dàng hơn, chúng tôi đã tạo một thư viện nhỏ có thể giúp mọi thứ trở nên dễ dàng khi sử dụng màn hình LCD này với PIC16F877A của chúng tôi. Tệp tiêu đề "MyLCD.h" được cung cấp tại đây để tải xuống, tệp này chứa tất cả các chức năng cần thiết để điều khiển màn hình LCD sử dụng PIC MCU. Mã thư viện được giải thích rõ ràng bằng các dòng bình luận nhưng nếu bạn vẫn còn nghi ngờ, hãy liên hệ với chúng tôi qua phần bình luận. Ngoài ra, hãy xem bài viết này để biết LCD cơ bản hoạt động và các sơ đồ chân của nó.
Lưu ý: Bạn nên biết điều gì đang thực sự xảy ra bên trong tệp tiêu đề của mình vì nó sẽ giúp bạn gỡ lỗi hoặc trong khi thay đổi MCU.
Bây giờ, có hai cách để thêm mã này vào chương trình của bạn. Bạn có thể sao chép tất cả các dòng mã trên trong MyLCD.h và dán chúng trước void main (). Hoặc bạn có thể tải xuống tệp tiêu đề bằng liên kết và thêm chúng vào tệp tiêu đề của dự án của bạn ( #include "MyLCD.h "; ). Điều này có thể được thực hiện bằng cách nhấp chuột phải vào tệp tiêu đề và chọn Thêm mục hiện có và duyệt đến tệp tiêu đề này.
Ở đây tôi đã sao chép và dán mã tệp tiêu đề vào tệp C chính của mình. Vì vậy, nếu bạn đang sử dụng mã của chúng tôi, thì bạn không cần tải xuống và thêm tệp tiêu đề vào chương trình của mình, chỉ cần sử dụng Mã hoàn chỉnh được cung cấp ở cuối Hướng dẫn này. Cũng lưu ý rằng thư viện này sẽ chỉ hỗ trợ Vi điều khiển PIC dòng PIC16F.
Ở đây tôi giải thích từng chức năng bên trong tệp tiêu đề của chúng tôi bên dưới:
void Lcd_Start (): Hàm này phải là hàm đầu tiên phải được gọi để bắt đầu hoạt động với màn hình LCD của chúng ta. Chúng ta chỉ nên gọi hàm này một lần duy nhất để tránh bị lag chương trình.
void Lcd_Start () {Lcd_SetBit (0x00); for (int i = 1065244; i <= 0; i--) NOP (); Lcd_Cmd (0x03); __delay_ms (5); Lcd_Cmd (0x03); __delay_ms (11); Lcd_Cmd (0x03); Lcd_Cmd (0x02); // 02H được sử dụng cho Return home -> Xóa RAM và khởi tạo LCD Lcd_Cmd (0x02); // 02H được sử dụng cho Return home -> Xóa RAM và khởi tạo LCD Lcd_Cmd (0x08); // Chọn Hàng 1 Lcd_Cmd (0x00); // Xóa Hàng 1 Hiển thị Lcd_Cmd (0x0C); // Chọn Hàng 2 Lcd_Cmd (0x00); // Xóa Hàng 2 Hiển thị Lcd_Cmd (0x06); }
Lcd_Clear (): Hàm này xóa màn hình LCD và có thể được sử dụng bên trong các vòng lặp để xóa sự xuất hiện của dữ liệu trước đó.
Lcd_Clear () {Lcd_Cmd (0); // Xóa màn hình LCD Lcd_Cmd (1); // Di chuyển con trỏ đến vị trí đầu tiên}
void Lcd_Set_Cursor (x pos, y pos): Sau khi khởi động, màn hình LCD của chúng ta đã sẵn sàng thực hiện các lệnh, chúng ta có thể hướng dẫn màn hình LCD đặt con trỏ ở vị trí ưa thích của bạn bằng cách sử dụng chức năng này. Giả sử nếu, chúng ta cần con trỏ ở ký tự thứ 5 của hàng thứ nhất. Khi đó, hàm sẽ là void Lcd_Set_Cursor (1, 5)
void Lcd_Set_Cursor (char a, char b) {char temp, z, y; if (a == 1) {temp = 0x80 + b - 1; // 80H dùng để di chuyển con trỏ z = temp >> 4; // Giảm 8 bit y = temp & 0x0F; // 8-bit trên Lcd_Cmd (z); // Đặt Hàng Lcd_Cmd (y); // Đặt Cột} else if (a == 2) {temp = 0xC0 + b - 1; z = temp >> 4; // Giảm 8-bit y = temp & 0x0F; // 8-bit trên Lcd_Cmd (z); // Đặt Hàng Lcd_Cmd (y); // Đặt cột}}
void Lcd_Print_Char (char data): Khi con trỏ được đặt, chúng ta có thể viết một ký tự vào vị trí của nó bằng cách gọi hàm này đơn giản.
void Lcd_Print_Char (char data) // Gửi 8 bit qua chế độ 4 bit {char Lower_Nibble, Upper_Nibble; Lower_Nibble = dữ liệu & 0x0F; Upper_Nibble = dữ liệu & 0xF0; RS = 1; // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4); // Gửi nửa trên bằng cách dịch chuyển 4 EN = 1; for (int i = 2130483; i <= 0; i--) NOP (); EN = 0; Lcd_SetBit (Lower_Nibble); // Gửi nửa dưới EN = 1; for (int i = 2130483; i <= 0; i--) NOP (); EN = 0; }
void Lcd_Print_String (char * a): Nếu một nhóm ký tự được hiển thị, thì hàm chuỗi có thể được sử dụng.
void Lcd_Print_String (char * a) {int i; for (i = 0; a! = '\ 0'; i ++) Lcd_Print_Char (a); // Tách chuỗi bằng con trỏ và gọi hàm Char}
Mỗi lần Lcd_Print_Char (dữ liệu char) được gọi, các giá trị ký tự tương ứng của nó được gửi đến các dòng dữ liệu của màn hình LCD. Các ký tự này đạt đến HD44780U ở dạng bit. Bây giờ vi mạch này liên hệ các bit với ký tự sẽ được hiển thị bằng cách sử dụng bộ nhớ ROM của nó như bảng dưới đây. Bạn có thể tìm thấy các bit cho tất cả các ký tự trong biểu dữ liệu của Bộ điều khiển LCD HD44780U.
Bây giờ, vì chúng ta hài lòng với tệp tiêu đề của mình, hãy xây dựng mạch và kiểm tra chương trình. Cũng kiểm tra tệp tiêu đề hoàn chỉnh được cung cấp trong liên kết được cung cấp ở trên.
Sơ đồ mạch và thử nghiệm:
Dưới đây là sơ đồ mạch cho Giao diện LCD 16x2 với Vi điều khiển PIC.
Tôi chưa hiển thị nguồn điện hoặc kết nối ICSP trong mạch trên, vì chúng tôi đang sử dụng cùng một bảng mà chúng tôi đã sử dụng trong hướng dẫn trước, hãy kiểm tra tại đây.
Một điều quan trọng cần lưu ý trong chương trình là định nghĩa chân của LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Các định nghĩa chân này có thể được thay đổi tùy theo thiết lập phần cứng của người lập trình. Hãy nhớ thay đổi cấu hình cổng được tôn trọng trong chức năng chính nếu bạn thay đổi ở đây.
Phần cứng cho dự án này rất đơn giản. Chúng tôi sẽ sử dụng lại cùng một mô-đun PIC mà chúng tôi đã sử dụng lần trước và kết nối mô-đun LCD với PIC của chúng tôi bằng dây nhảy.
Kết nối có thể được hiểu theo bảng sau:
Số chân LCD |
Tên pin LCD |
Tên pin MCU |
Số pin MCU |
1 |
Đất |
Đất |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
Đất |
12 |
4 |
Đăng ký Lựa chọn |
RD2 |
21 |
5 |
Đọc viết |
Đất |
12 |
6 |
Kích hoạt |
RD3 |
22 |
7 |
Bit dữ liệu 0 |
NC |
- |
số 8 |
Bit dữ liệu 1 |
NC |
- |
9 |
Bit dữ liệu 2 |
NC |
- |
10 |
Bit dữ liệu 3 |
NC |
- |
11 |
Bit dữ liệu 4 |
RD4 |
27 |
12 |
Bit dữ liệu 5 |
RD5 |
28 |
13 |
Bit dữ liệu 6 |
RD6 |
29 |
14 |
Bit dữ liệu 7 |
RD7 |
30 |
15 |
LED tích cực |
+ 5V |
11 |
16 |
LED âm bản |
Đất |
12 |
Bây giờ chúng ta chỉ cần tạo kết nối, kết xuất mã vào MCU của chúng ta và xác minh kết quả đầu ra.
Nếu bạn có bất kỳ khó khăn hoặc nghi ngờ, xin vui lòng sử dụng phần bình luận. Cũng kiểm tra Video Demo được cung cấp bên dưới.