Viet Anh LE gửi vào
- 45482 lượt xem
Giới thiệu
Hiển thị LED 7 thanh và LED ma trận là những bài học rất cơ bản cho những người tìm hiểu về Arduino. Trên công đồng arduino.vn cũng đã có những bài viết về vấn đề này. Trong quá trình tìm hiểu các tài liệu nước ngoài, mình thấy người ta thường sử dụng IC MAX7219 để điều khiển cho cả LED ma trận và LED 7 thanh. Thấy trên cộng đồng chưa có bài viết nào về MAX7219 nên mình thực hiện bài viết này, với hy vọng có thể đơn giản hơn việc lập trình hiển thị LED ma trận. Việc hiển thị LED 7 thanh sẽ được trình bày trong các bài viết sau.
Các bạn có thể tìm hiểu trước về bài viết cùng chủ đề sau: Hiển thị hình ảnh với LED MATRIX 8x8
Phần cứng
- Arduino UNO R3
- IC MAX7219
- Điện trở 1k Ohm
- LED ma trận 8x8
Nối mạch
- Chân 1 (DIN), chân 12 (LOAD) và 13 (CLK) của MAX7219 lần lượt nối với chân 2,3,4 của Arduino (Các bạn có thể dùng các chân Digital khác).
- Chân 4 và chân 9 nối xuống GND, chân 19 nối nguồn 5V, chân 18 nối nguồn 5V thông qua điện trở 1k.
- Các chân của LED ma trận được nối với các chân của MAX7219 như sau:
LED matrix | MAX7219 |
Cột 1 | 2 |
Cột 2 | 11 |
Cột 3 | 6 |
Cột 4 | 7 |
Cột 5 | 3 |
Cột 6 | 10 |
Cột 7 | 5 |
Cột 8 | 8 |
Hàng 1 | 22 |
Hàng 2 | 14 |
Hàng 3 | 16 |
Hàng 4 | 20 |
Hàng 5 | 23 |
Hàng 6 | 21 |
Hàng 7 | 15 |
Hàng 8 | 17 |
Để đơn giản việc kết nối dây, các bạn có thể sử dụng module MAX7219 + LED matrix 8x8 đã có bán trên thị trường.
IC MAX7219
IC MAX7219 được hãng MAXIM thiết kế và sản xuất, thuận tiện sử dụng để điều khiển LED ma trận và LED 7 thanh (1 chip có thể điều khiển LED ma trận 8x8 hoặc LED 7 thanh 8 chữ số) và chỉ cần 1 điện trở để hạn dòng cho tất cả các led (so với các IC khác hầu như phải có 1 điện trở cho mỗi led). Trên mỗi chip đã được tích hợp bộ giải mã BCD, mạch quét dồn kênh, thanh ghi dịch, ...
Giống như với 74HC595, để điều khiển LED ma trận ta sử dụng MAX7219 hoạt động giống như một thanh ghi dịch khi bạn cần nhập dữ liệu vào nối tiếp theo từng bit. Tổng cộng có 16 bit được nhập vào tại một thời điểm. MAX7219 chỉ cần 3 chân từ Arduino để kết nối với các chân DIN, LOAD và CLK của IC.
Sơ đồ chân của MAX7219 được mô tả như hình dưới.
Chân LOAD được kéo xuống LOW và bit đầu tiên của dữ liệu được đưa vào chân DIN, trên sườn lên của xung CLK, các bit tại chân DIN được đưa vào thanh ghi bên trong chip. Sau đó xung CLK xuống LOW và các bit tiếp theo được thiết lập tại chân DIN trước khi lặp lại quá trình. Sau khi 16 bit được đưa vào thanh ghi, chân LOAD được đưa lên HIGH để chốt dữ liệu vào. Chân DOUT (24) được sử dụng nếu có từ 2 chip MAX7219 trở lên. DOUT của chip thứ nhất kết nối DIN của chip thứ hai và cứ như vậy. Dữ liệu được đưa ra khỏi chân DOUT trên sườn xuống của xung CLK.
Các bạn có thể tham khảo thêm datasheet của MAX7219 để hiểu rõ hơn về nó.
Lập trình
MAX7219 rất thuận tiện cho việc hiển thị LED ma trận nên người ta đã tạo sẵn thư viện. Các bạn có thể download tại đây.
Trong thư viện có một số hàm thông dụng như: setLed (led sáng tại điểm); setRow (led sáng tại hàng), setColumn (led sáng tại cột); clearDisplay (tất cả led đều bật/tắt). Do đó ta có thể điều khiển LED ma trận theo ý muốn một các khá dễ dàng.
Trong bài viết này, mình sẽ lập trình hiển thị ký tự và chạy chuỗi ký tự để các bạn có thể tham khảo.
#include "LedControl.h"// thêm thư viện LedControl matrix = LedControl(2, 4, 3, 1); // Chân 12 nối với chân DataIn // Chân 11 nối với chân CLK // Chân 10 nối với chân LOAD // Sử dụng 1 IC MAX7219 void setup() { matrix.shutdown(0, false); // Bật hiển thị matrix.setIntensity(0, 15); // Đặt độ sáng lớn nhất matrix.clearDisplay(0); // Tắt tất cả led } // Thiết lập mã cho các ký tự byte A[56] = { 0x00,0x3F,0x7F,0xA4,0xA4,0x7F,0x3F,0x00, // A 0x00,0xFF,0xFF,0x98,0x94,0x92,0x61,0x00, // R 0x00,0xFF,0xFF,0x81,0x81,0x7E,0x3C,0x00, // D 0x00,0xFE,0xFF,0x01,0x01,0xFF,0xFE,0x00, // U 0x00,0x81,0x81,0xFF,0xFF,0x81,0x81,0x00, // I 0x00,0xFF,0xC0,0x30,0x0C,0x03,0xFF,0x00, // N 0x00,0x7E,0xFF,0x81,0x81,0xFF,0x7E,0x00 // O }; // Chương trình con chạy chuỗi ký tự void scroll() { matrix.clearDisplay(0); int pos = 8; for (int j = pos; j > -56; j--) { // Vòng lặp thay đổi vị trí for (int i = 0; i < 56; i++) { // Vòng lăp để hiển thị ký tự matrix.setRow(0, i + j, A[i]); } delay(100); } } // Chương trình con hiển thị từng ký tự void show() { matrix.clearDisplay(0); for (int i = 0; i < 8; i++) matrix.setRow(0, i, A[i]); //Hiển thị từng hàng để được ký tự A delay(200); for (int i = 0; i < 8; i++) matrix.setRow(0, i, A[i + 8]); delay(200); for (int i = 0; i < 8; i++) matrix.setRow(0, i, A[i + 16]); delay(200); for (int i = 0; i < 8; i++) matrix.setRow(0, i, A[i + 24]); delay(200); for (int i = 0; i < 8; i++) matrix.setRow(0, i, A[i + 32]); delay(200); for (int i = 0; i < 8; i++) matrix.setRow(0, i, A[i + 40]); delay(200); for (int i = 0; i < 8; i++) matrix.setRow(0, i, A[i + 48]); delay(200); } void loop() { scroll(); show(); }
Lời kết
Hy vọng bài viết này đã cung cấp một phương án hữu ích cho các bạn trong việc hiển thị LED ma trận. Công dụng lớn nhất mà MAX7219 đem lại là để điều khiển LED 7 thanh và mình sẽ đề cập đến trong một bài viết khác.
Chúc các bạn thành công !