Sử dụng IC MAX7219 để điều khiển LED Ma trận 8x8 - Shiftout 16 bit

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

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 !

lên
17 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Sử dụng IC MAX7219 để điều khiển LED 7 thanh

Tiếp tục tìm hiểu về IC MAX7219, hôm nay mình sẽ đề cập đến việc hiển thị LED 7 thanh. Chỉ với một con chip MAX7219, chúng ta có thể hiển thi một lúc tới 8 chữ số và chỉ cần 3 chân Digital từ Arduino. Việc điều khiển LED 7 thanh trở nên thực sự hiệu quả và đơn giản. 

Nếu các bạn chưa biết về MAX7219, có thể tìm hiểu lại tại đây

lên
19 thành viên đã đánh giá bài viết này hữu ích.