Màn hình là bộ phận cần thiết của máy móc cho dù đó là bất kỳ thiết bị gia dụng hay máy công nghiệp nào. Màn hình không chỉ hiển thị các tùy chọn điều khiển để vận hành máy mà còn hiển thị trạng thái và đầu ra của tác vụ được thực hiện bởi máy đó. Có nhiều loại màn hình được sử dụng trong điện tử như màn hình 7 đoạn, màn hình LCD, màn hình cảm ứng TFT, màn hình LED, màn hình LCD 16x2 là màn hình cơ bản nhất và cũng được sử dụng trong một số thiết bị điện tử nhỏ, chúng tôi đã thực hiện rất nhiều các dự án sử dụng LCD 16x2 bao gồm giao diện cơ bản với các bộ vi điều khiển khác:
- Giao diện LCD với Vi điều khiển 8051
- Giao diện LCD với Vi điều khiển ATmega32
- Giao diện LCD với Vi điều khiển PIC
- Giao diện LCD 16x2 với Arduino
- Giao diện LCD 16x2 với Raspberry Pi bằng Python
Trong hướng dẫn này, chúng ta sẽ thấy cách giao diện màn hình LCD 16x2 với vi điều khiển ARM7-LPC2148 và hiển thị một thông báo chào mừng đơn giản. Nếu bạn chưa quen với ARM7, hãy bắt đầu với những điều cơ bản về ARM7 LPC2148 và tìm hiểu cách nó có thể được lập trình bằng Keil uVision
Vật liệu thiết yếu
Phần cứng
- Bo mạch vi điều khiển ARM7-LPC2148
- LCD (16X2)
- Chiết áp
- IC ổn áp 5V
- Breadboard
- Kết nối dây
- Pin 9V
- Cáp micro USB
Phần mềm
- Keil uVision 5
- Công cụ Magic Flash
Trước khi tham gia vào dự án, chúng ta phải biết một số điều về các chế độ hoạt động của LCD và về các mã Hex của LCD.
Mô-đun hiển thị LCD 16X2
Màn hình LCD 16X2 cho biết nó có 16 Cột và 2 Hàng. LCD này có 16 chân. Hình ảnh và bảng dưới đây hiển thị tên pin của màn hình LCD và chức năng của nó.
TÊN |
CHỨC NĂNG |
VSS |
Ghim nối đất |
VDD |
+ Chân đầu vào 5V |
VEE |
Pin điều chỉnh độ tương phản |
RS |
Đăng ký Lựa chọn |
R / W |
Đọc / Ghi Ghim |
E |
Bật ghim |
D0-D7 |
Ghim dữ liệu (8 ghim) |
LED A |
Chân cực dương (+ 5V) |
LED K |
Pin cathode (GND) |
Màn hình LCD có thể hoạt động ở hai chế độ khác nhau, đó là chế độ 4 bit và chế độ 8 bit. Ở chế độ 4 bit, chúng tôi gửi dữ liệu bằng cách gặm, đầu tiên là trên và sau đó là dưới. Đối với những người bạn không biết nibble là gì: nibble là một nhóm bốn bit, vì vậy bốn bit dưới (D0-D3) của một byte tạo thành nibble dưới trong khi bốn bit trên (D4-D7) của một dạng byte cao hơn nibble. Điều này cho phép chúng tôi gửi dữ liệu 8 bit.
Trong khi ở chế độ 8 bit, chúng ta có thể gửi dữ liệu 8 bit trực tiếp trong một hành trình vì chúng ta sử dụng tất cả 8 dòng dữ liệu.
Ở đây trong dự án này, chúng tôi sẽ sử dụng chế độ thông dụng nhất là chế độ 4-bit. Trong chế độ bốn bit, chúng ta có thể tiết kiệm 4 chân của vi điều khiển và cũng giảm chi phí đi dây.
16x2 cũng sử dụng mã HEX để thực hiện bất kỳ lệnh nào, có nhiều lệnh hex cho LCD như di chuyển con trỏ, chọn chế độ, chuyển điều khiển sang dòng thứ hai, v.v. Để biết thêm về Mô-đun hiển thị LCD 16X2 và các lệnh hex, hãy theo liên kết.
Sơ đồ mạch và kết nối
Bảng dưới đây cho thấy các kết nối mạch giữa LCD và ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Đăng ký Chọn) |
P0.6 |
E (Bật) |
P0.12 |
D4 (Chân dữ liệu 4) |
P0.13 |
D5 (Chân dữ liệu 5) |
P0.14 |
D6 (Chân dữ liệu 6) |
P0.15 |
D7 (Chân dữ liệu 7) |
Kết nối của bộ điều chỉnh điện áp với LCD & ARM7 Stick
Bảng dưới đây cho thấy các kết nối giữa ARM7 & LCD với bộ điều chỉnh điện áp.
IC điều chỉnh điện áp |
Chức năng ghim |
LCD & ARM-7 LPC2148 |
1. pin bên trái |
+ Ve từ Pin đầu vào 9V |
NC |
2.Centre Pin |
- Ve từ pin |
VSS, R / W, K của LCD GND của ARM7 |
3. pin bên phải |
Đầu ra + 5V quy định |
VDD, A của LCD + 5V của ARM7 |
Chiết áp có LCD
Một chiết áp được sử dụng để thay đổi độ tương phản của màn hình LCD. Nồi có ba chân, chân trái (1) được kết nối với + 5V và trung tâm (2) với VEE hoặc V0 của mô-đun LCD và chân phải (3) được kết nối với GND. Chúng ta có thể điều chỉnh độ tương phản bằng cách xoay núm.
Cài đặt Jumper
Chân jumper có trong ARM7-Stick để chúng tôi có thể cấp nguồn và tải mã lên bằng cách sử dụng USB hoặc bằng cách chỉ sử dụng đầu vào 5V DC để cấp nguồn. Bạn có thể xem những hình ảnh dưới đây.
Hình ảnh dưới đây cho thấy rằng jumper đang ở vị trí DC. Điều đó có nghĩa là chúng ta phải cấp nguồn cho bo mạch từ nguồn 5V bên ngoài.
Và hình ảnh này cho thấy jumper được kết nối ở chế độ USB. Tại đây nguồn và mã được cung cấp qua cổng micro usb.
LƯU Ý: Ở đây trong hướng dẫn này, chúng tôi đã tải lên mã bằng cách sử dụng USB bằng cách đặt jumper thành USB và sau đó thay đổi jumper thành chế độ DC để cấp nguồn cho LPC2148 từ đầu vào 5v của bộ điều chỉnh. Bạn có thể kiểm tra điều này trong video được cung cấp ở cuối.
Mạch cuối cùng để giao tiếp LCD 16x2 với Vi điều khiển ARM7 sẽ giống như sau:
Lập trình ARM7-LPC2148
Để lập trình ARM7-LPC2148, chúng ta cần công cụ keil uVision & Flash Magic. Chúng tôi đang sử dụng Cáp USB để lập trình Thanh ARM7 qua cổng micro USB. Chúng tôi viết mã bằng Keil và tạo một tệp hex và sau đó tệp HEX được chuyển sang thanh ARM7 bằng Flash Magic. Để biết thêm về cách cài đặt keil uVision và Flash Magic cũng như cách sử dụng chúng, hãy truy cập liên kết Bắt đầu với Vi điều khiển ARM7 LPC2148 và Lập trình bằng Keil uVision.
Mã hoàn chỉnh cho giao diện LCD với ARM 7 được đưa ra ở cuối hướng dẫn này, ở đây chúng tôi sẽ giải thích một số phần của nó.
Trước hết, chúng ta cần bao gồm các tệp tiêu đề bắt buộc
#include
Khởi tạo mô-đun LCD là một bước rất quan trọng. Ở đây chúng tôi sử dụng một số mã HEX nhất định, thực chất là các lệnh, để cho màn hình LCD biết về chế độ hoạt động (4-bit), loại LCD (16x2), dòng bắt đầu, v.v.
void LCD_INITILIZE (void) // Hàm chuẩn bị sẵn sàng màn hình LCD { IO0DIR = 0x0000FFF0; // Đặt chân P0.4, P0.6, P0.12, P0.13, P0.14, P0.15as OUTPUT delay_ms (20); LCD_SEND (0x02); // Khởi tạo lcd ở chế độ hoạt động 4 bit LCD_SEND (0x28); // 2 dòng (16X2) LCD_SEND (0x0C); // Hiển thị trên con trỏ tắt LCD_SEND (0x06); // Con trỏ tăng tự động LCD_SEND (0x01); // Hiển thị rõ ràng LCD_SEND (0x80); // Dòng đầu tiên vị trí đầu tiên }
Đối với chế độ 4-Bit, chúng tôi có loại chức năng ghi khác nhau cho các chân, đó là bằng cách sử dụng ngòi trên và dưới. Hãy xem, nó được thực hiện như thế nào
void LCD_SEND (char command) // Hàm gửi lệnh hex bằng nibble { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((lệnh & 0xF0) << 8)); // Gửi phần trên của lệnh IO0SET = 0x00000040; // Làm cho Enable HIGH IO0CLR = 0x00000030; // Tạo RS & RW LOW delay_ms (5); IO0CLR = 0x00000040; // Makeing Enable LOW delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((lệnh & 0x0F) << 12)); // Gửi Lower nibble của lệnh IO0SET = 0x00000040; // BẬT CAO IO0CLR = 0x00000030; // RS & RW LOW delay_ms (5); IO0CLR = 0x00000040; // BẬT LOW delay_ms (5); }
Logic gửi Nibble
IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((lệnh & 0x0F) << 12)); // Gửi phần dưới của lệnh IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((lệnh & 0xF0) << 8)); // Gửi phần trên của lệnh
Hai câu lệnh trên đóng một vai trò quan trọng trong chương trình này. Lệnh đầu tiên gửi nibble thấp hơn & thứ hai gửi nibble trên. Đó là mà không ảnh hưởng đến các chân khác mà chúng tôi làm. Hãy xem nó diễn ra như thế nào trước khi tìm hiểu về logic này trước tiên
ORing- (A-0 = A), (A-1 = 1) ANDing- (A & 0 = 0), (A & 1 = A)
Vì vậy, chúng tôi sử dụng một khái niệm che và hoạt động dịch chuyển hợp lý mà không ảnh hưởng đến các chân khác. Có nghĩa là chỉ các chân (P0.12-P0.15) được sử dụng và không có chân nào khác như P0.4, P0.6 bị ảnh hưởng. Nó sẽ được thực hiện bằng cách dịch chuyển dữ liệu theo bốn bit và làm cho ngòi trên thay cho ngòi dưới và che đi phần trên. Và sau đó chúng tôi làm cho các bit thấp hơn bằng 0 (0XF0) và ORed với dữ liệu nibble để có được dữ liệu nibble trên ở đầu ra.
Quy trình tương tự được sử dụng cho dữ liệu nibble thấp hơn nhưng ở đây chúng ta không cần phải thay đổi dữ liệu.
Trong khi ghi dữ liệu vào đầu ra, nghĩa là ở chế độ lệnh, RS phải THẤP và để thực hiện kích hoạt phải ở mức CAO, và trong chế độ dữ liệu, RS phải CAO và để thực hiện kích hoạt phải ở mức CAO.
Bây giờ để gửi dữ liệu chuỗi sẽ được in ở đầu ra, nguyên tắc tương tự được sử dụng bởi nibble. Bước quan trọng ở đây là CHỌN ĐĂNG KÝ (RS) phải ở mức CAO cho chế độ dữ liệu.
void LCD_DISPLAY (char * msg) // Hàm in các ký tự được gửi lần lượt { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Gửi phần trên IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH để in dữ liệu IO0CLR = 0x00000020; // RW LOW Chế độ ghi trễ ms (2); IO0CLR = 0x00000040; // EN = 0, RS và RW không thay đổi (tức là RS = 1, RW = 0) trễ ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Gửi Lower nibble IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; trễ ms (2); IO0CLR = 0x00000040; trễ ms (5); i ++; }
Toàn bộ video Mã hóa & Trình diễn được cung cấp bên dưới