#define LATCH_pin 9 // Chân LATCH của 74HC595 (STCP)
#define CLOCK_pin 10 // Chân CLOCK của 74HC595 (SHCP)
#define DATA_pin 8 // Chân DATA của 74HC595 (DS)
const int ledPins[] = {1, 2, 3, 4, 5, 6, 7}; // a, b, c, d, e, f, g
const int dk[] = {12, 13}; // Chân điều khiển hàng chục và hàng đơn vị
const byte led7[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // Mã hex mới
byte led_don = 0; // Biến để lưu trạng thái các LED đơn
unsigned int dem = 0; // Biến đếm
void clock_signal(void) {
digitalWrite(CLOCK_pin, HIGH); // Gửi tín hiệu clock (lên)
delayMicroseconds(500); // Chờ một chút
digitalWrite(CLOCK_pin, LOW); // Gửi tín hiệu clock (xuống)
delayMicroseconds(500); // Chờ một chút
}
void latch_enable(void) {
digitalWrite(LATCH_pin, HIGH); // Kích hoạt latch (lên)
delayMicroseconds(500); // Chờ một chút
digitalWrite(LATCH_pin, LOW); // Tắt latch (xuống)
}
void send_data(byte data_out) {
for (int i = 7; i >= 0; i--) { // Duyệt qua từng bit từ 7 đến 0
if ((data_out >> i) & 0x01) // Kiểm tra bit hiện tại
digitalWrite(DATA_pin, HIGH); // Nếu bit là 1, bật DATA
else
digitalWrite(DATA_pin, LOW); // Nếu bit là 0, tắt DATA
clock_signal(); // Gửi tín hiệu clock để chuyển bit
}
latch_enable(); // Kích hoạt latch sau khi gửi hết dữ liệu
}
void capNhatLED() {
digitalWrite(LATCH_pin, LOW);
shiftOut(DATA_pin, CLOCK_pin, LSBFIRST, led_don); // Cập nhật LED đơn
digitalWrite(LATCH_pin, HIGH);
}
void displayDigit(int num, int pin) {
// Tắt tất cả các LED trước khi hiển thị
for (int i = 0; i < 2; i++) {
digitalWrite(dk[i], LOW);
}
// Gửi dữ liệu đến LED 7 thanh
for (int i = 0; i < 7; i++) {
digitalWrite(ledPins[i], ~led7[num] & (1 << i)); // Lấy trạng thái từng chân LED từ mã hex (đảo bit do mã ngược)
}
// Bật LED đang được quét
digitalWrite(pin, HIGH);
}
void setup() {
// Thiết lập các chân LED 7 thanh là OUTPUT
for (int i = 0; i < 7; i++) {
pinMode(ledPins[i], OUTPUT);
}
// Thiết lập các chân điều khiển LED 7 thanh là OUTPUT
for (int i = 0; i < 2; i++) {
pinMode(dk[i], OUTPUT);
digitalWrite(dk[i], LOW); // Mặc định tắt các LED
}
// Thiết lập các chân 74HC595 là OUTPUT
pinMode(LATCH_pin, OUTPUT);
pinMode(CLOCK_pin, OUTPUT);
pinMode(DATA_pin, OUTPUT);
// Đặt tất cả các chân 74HC595 về mức LOW
digitalWrite(LATCH_pin, LOW);
digitalWrite(CLOCK_pin, LOW);
digitalWrite(DATA_pin, LOW);
}
void loop() {
for (dem = 0; dem < 30; dem++) { // Đếm từ 00 đến 29
int tens = dem / 10; // Hàng chục
int units = dem % 10; // Hàng đơn vị
unsigned long startTime = millis(); // Ghi nhận thời gian bắt đầu
while (millis() - startTime < 500) { // Lặp trong 500ms
// Sáng dần các LED đơn từ 1 đến 8
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 30; j++) {
led_don = 0;
bitSet(led_don, i); // Bật LED i
send_data(led_don); // Gửi dữ liệu tới 74HC595
capNhatLED(); // Cập nhật LED
//delay(300); // Đợi 300ms giữa các lần sáng
// Hiển thị số lên LED 7 thanh
displayDigit(tens, dk[0]); // Hiển thị hàng chục
delay(5); // Thời gian quét
displayDigit(units, dk[1]); // Hiển thị hàng đơn vị
delay(5); // Thời gian quét
}
}
}
}
// Sau khi đếm đến 30, hiển thị số 30 và dừng
while (true) {
displayDigit(3, dk[0]); // Hiển thị số 3 ở hàng chục
displayDigit(0, dk[1]); // Hiển thị số 0 ở hàng đơn vị
// Hiển thị số 30 liên tục
}
}