-
-
-
Tổng tiền thanh toán:
-
Cách lập trình nhiều con LED 7 đoạn (loại đơn)
06/07/2022
Phần cứng
Arduino Uno
2 điện trở 560 Ohm (hoặc 220 Ohm hoặc 1kOhm)
2 LED 7 đoạn đơn (loại chung cực dương)
2 IC HC595 (dành cho việc ShiftOut)
1 tụ điện 1uF (từ 6v3 trở lên)
Breadboard
Dây cắm breadboard
Giới thiệu led 7 đoạn
Bạn có thể hiểu một cách vô cùng đơn giản về LED 7 đoạn như sau:
LED 7 đoạn có 2 loại:
Chung cực dương: Mỗi đèn LED có 2 chân (1 dương 1 âm). Ở loại LED 7 đoạn này tất cả cực dương sẽ được nối chung cực dương. Để làm các đèn LED trong LED 7 đoạn sáng thì bạn chỉ cần cấp cực âm vào các chân của đèn. Với loại LED 7 đoạn này bạn chỉ cần 1 điện trở là đủ.
Chung cực âm: Tương tự nhưng ngược lại và bạn cần đến 8 điện trở cho các chân dương của LED.
Nguyên lý căn bản của LED 7 đoạn đó là cấp nguồn là nó sáng. Để nó sáng theo ý mình thì bạn cần phải nói ngôn ngữ Arduino cho mạch Arduino Uno hiểu, từ đó Arduino Uno sẽ điều khiển IC HC 595 (chỉ tốn 3 chân điều khiển), từ đó IC HC595 sẽ cấp nguồn cho các chân LED 7 đoạn theo yêu cầu của mình!
Lắp mạch
Đầu tiên, bạn cần lắp mạch như thế này để bật IC HC595 lên.
Sau đó lắp thêm như thế này để ta có thể shiftOut từ Arduino vào IC HC595
Sau đó bạn lắp tiếp như thế này hoặc tham khảo bảng chỉ dẫn lắp mạch ở dưới
Bạn có thể tham khảo file ảnh từ Proteus sau.
Lập trình
/*
shiftOut ra 1 Module LED 7 đoạn đơn
*/
//chân ST_CP của 74HC595
int latchPin = 8;
//chân SH_CP của 74HC595
int clockPin = 12;
//Chân DS của 74HC595
int dataPin = 11;
// Ta sẽ xây dựng mảng hằng số với các giá trị cho trước
// Các bit được đánh số thứ tự (0-7) từ phải qua trái (tương ứng với A-F,DP)
// Vì ta dùng LED 7 đoạn chung cực dương nên với các bit 0
// thì các đoạn của LED 7 đoạn sẽ sáng
// với các bit 1 thì đoạn ấy sẽ tắt
//mảng có 10 số (từ 0-9) và
const int Seg[10] = {
0b11000000,//0 - các thanh từ a-f sáng
0b11111001,//1 - chỉ có 2 thanh b,c sáng
0b10100100,//2
0b10110000,//3
0b10011001,//4
0b10010010,//5
0b10000011,//6
0b11111000,//7
0b10000000,//8
0b10010000,//9
};
void setup() {
//Bạn BUỘC PHẢI pinMode các chân này là OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
static int point = 0;
//shiftout - start
digitalWrite(latchPin, LOW);
//Xuất bảng ký tự ra cho Module LED
shiftOut(dataPin, clockPin, MSBFIRST, Seg[point]);
digitalWrite(latchPin, HIGH);
//shiftout - end
point = (point + 1) % 10; // Vòng tuần hoàn từ 0--9
delay(500);//Đợi 0.5 s cho mỗi lần tăng số
}
Tiếp theo sẽ là 2 Module LED 7 đoạn đơn và hơn thế nữa trong tương lai
Kể từ con IC HC595 thứ 2 trở đi, bạn sẽ lắp như thế này. Con thứ 2 thì mắc vào con thứ 1, con thứ 3 thì mắc vào con thứ 2,... Sau đó xem phần lập trình của tớ để xây dựng bảng số. Tớ có viết một hàm đơn giản để sau này bạn lắp bao nhiêu thì tùy ý hehe. Con sau sẽ lắp trước con liền kề nó nhé!
Bạn có thể tham khảo cách lắp từ proteus
/*
shiftOut ra 1 Module LED 7 đoạn đơn
*/
//chân ST_CP của 74HC595
int latchPin = 8;
//chân SH_CP của 74HC595
int clockPin = 12;
//Chân DS của 74HC595
int dataPin = 11;
// Ta sẽ xây dựng mảng hằng số với các giá trị cho trước
// Các bit được đánh số thứ tự (0-7) từ phải qua trái (tương ứng với A-F,DP)
// Vì ta dùng LED 7 đoạn chung cực dương nên với các bit 0
// thì các đoạn của LED 7 đoạn sẽ sáng
// với các bit 1 thì đoạn ấy sẽ tắt
//mảng có 10 số (từ 0-9) và
const byte Seg[10] = {
0b11000000,//0 - các thanh từ a-f sáng
0b11111001,//1 - chỉ có 2 thanh b,c sáng
0b10100100,//2
0b10110000,//3
0b10011001,//4
0b10010010,//5
0b10000010,//6
0b11111000,//7
0b10000000,//8
0b10010000,//9
};
void setup() {
//Bạn BUỘC PHẢI pinMode các chân này là OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void HienThiLED7doan(unsigned long Giatri, byte SoLed = 2) {
byte *array= new byte[SoLed];
for (byte i = 0; i < SoLed; i++) {
//Lấy các chữ số từ phải quá trái
array[i] = (byte)(Giatri % 10UL);
Giatri = (unsigned long)(Giatri /10UL);
}
digitalWrite(latchPin, LOW);
for (int i = SoLed - 1; i >= 0; i--)
shiftOut(dataPin, clockPin, MSBFIRST, Seg[array[i]]);
digitalWrite(latchPin, HIGH);
free(array);
}
void loop() {
static unsigned long point = 0;
HienThiLED7doan(point, 2);
point = (point + 1) % 100UL; // Vòng tuần hoàn từ 0--99
delay(500);//Đợi 0.5 s cho mỗi lần tăng số
}