Mã:
const int shcpPin = 12; // Chân Arduino nối với SHCP HC595
const int stcpPin = 10; // Chân Arduino nối với STCP HC595
const int dataPin = 11; // Chân Arduino nối với DS HC595
const int col1Pin = 2; // Chân Arduino nối với cột 1 LED Ma trận
const int col2Pin = 3; // Chân Arduino nối với cột 2 LED Ma trận
const int col3Pin = 4; // Chân Arduino nối với cột 3 LED Ma trận
const int col4Pin = 5; // Chân Arduino nối với cột 4 LED Ma trận
const int col5Pin = 6; // Chân Arduino nối với cột 5 LED Ma trận
const int col6Pin = 7; // Chân Arduino nối với cột 6 LED Ma trận
const int col7Pin = 8; // Chân Arduino nối với cột 7 LED Ma trận
const int col8Pin = 9; // Chân Arduino nối với cột 8 LED Ma trận
// Mã LED Ma trận
unsigned char matrixHex[10][8] = {
{0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c},
{0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x3e},
{0x3c, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x7e},
{0x3c, 0x42, 0x02, 0x1c, 0x02, 0x02, 0x42, 0x3c},
{0x04, 0x08, 0x10, 0x20, 0x44, 0x7e, 0x04, 0x04},
{0x7e, 0x40, 0x40, 0x3c, 0x02, 0x02, 0x42, 0x3c},
{0x3c, 0x42, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x3c},
{0x7e, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x10},
{0x3c, 0x42, 0x42, 0x3c, 0x42, 0x42, 0x42, 0x3c},
{0x3c, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x42, 0x3c}
};
void setup() {
// Cấu hình các chân nối với Arduino là đầu ra
pinMode(shcpPin, OUTPUT);
pinMode(stcpPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(col1Pin, OUTPUT);
pinMode(col2Pin, OUTPUT);
pinMode(col3Pin, OUTPUT);
pinMode(col4Pin, OUTPUT);
pinMode(col5Pin, OUTPUT);
pinMode(col6Pin, OUTPUT);
pinMode(col7Pin, OUTPUT);
pinMode(col8Pin, OUTPUT);
}
void loop() {
// Đếm từ 0 đến 9
for (int num = 0; num < 10; num++) {
// Lặp 25 lần tạo trễ khoảng 8 * 5 * 25 = 1000ms
for (int i = 0; i < 25; i++) {
// Bật hiển thị cột 1
MATRIX_setCol(0, 1, 1, 1, 1, 1, 1, 1);
// Xuất mã của cột 1
HC595_shiftOut(matrixHex[num][0]);
// Trễ 5mss
delay(5);
// Tắt hiển thị cột 1
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 1);
// Bật hiển thị cột 2
MATRIX_setCol(1, 0, 1, 1, 1, 1, 1, 1);
// Xuất mã của cột 2
HC595_shiftOut(matrixHex[num][1]);
// Trễ 5ms
delay(5);
// Tắt hiển thị cột 2
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 1);
// Tương tự với các cột khác
MATRIX_setCol(1, 1, 0, 1, 1, 1, 1, 1);
HC595_shiftOut(matrixHex[num][2]);
delay(5);
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 1);
MATRIX_setCol(1, 1, 1, 0, 1, 1, 1, 1);
HC595_shiftOut(matrixHex[num][3]);
delay(5);
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 1);
MATRIX_setCol(1, 1, 1, 1, 0, 1, 1, 1);
HC595_shiftOut(matrixHex[num][4]);
delay(5);
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 1);
MATRIX_setCol(1, 1, 1, 1, 1, 0, 1, 1);
HC595_shiftOut(matrixHex[num][5]);
delay(5);
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 1);
MATRIX_setCol(1, 1, 1, 1, 1, 1, 0, 1);
HC595_shiftOut(matrixHex[num][6]);
delay(5);
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 1);
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 0);
HC595_shiftOut(matrixHex[num][7]);
delay(5);
MATRIX_setCol(1, 1, 1, 1, 1, 1, 1, 1);
}
}
}
// Hàm gửi dữ liệu ra HC595
void HC595_shiftOut(unsigned char b) {
// Đặt lại chân SHCP và STCP
digitalWrite(shcpPin, LOW);
digitalWrite(stcpPin, LOW);
for (int i = 0; i < 8; i++) {
// Lấy từng bit (MSB trước) của byte cần xuất để kiểm tra
// Nếu bit đó khác 0
if (b & (0x80 >> i)) {
// Kéo chân DS lên mức cao
digitalWrite(dataPin, HIGH);
// Ngược lại
} else {
// Kéo chân DS xuống mức thấp
digitalWrite(dataPin, LOW);
}
// Tạo xung L-to-H dịch dữ liệu
digitalWrite(shcpPin, LOW);
delayMicroseconds(1);
digitalWrite(shcpPin, HIGH);
}
// Tạo xung L-to-H chốt dữ liệu
digitalWrite(stcpPin, LOW);
delayMicroseconds(1);
digitalWrite(stcpPin, HIGH);
}
// Hàm đặt mức logic cho các cột
void MATRIX_setCol(int c1, int c2, int c3, int c4, int c5, int c6, int c7, int c8) {
// Xuất giá trị ra chân nối với cột 1
digitalWrite(col1Pin, c1);
// Tương tự cho các cột khác
digitalWrite(col2Pin, c2);
digitalWrite(col3Pin, c3);
digitalWrite(col4Pin, c4);
digitalWrite(col5Pin, c5);
digitalWrite(col6Pin, c6);
digitalWrite(col7Pin, c7);
digitalWrite(col8Pin, c8);
}