IC 74HC595 là một IC dịch và chốt (Shift Register with Latch) phổ biến trong việc mở rộng số lượng chân đầu ra của vi điều khiển. Nó thường được sử dụng để điều khiển LED, 7 đoạn, hoặc các thiết bị yêu cầu nhiều chân điều khiển.
1. Tổng quan về IC 74HC595
Cấu tạo: IC 74HC595 có 16 chân với các chức năng chính như sau:
- DS (Data Serial): Chân nhận dữ liệu đầu vào.
- SH_CP (Shift Clock): Xung clock để dịch dữ liệu.
- ST_CP (Storage Clock): Xung clock để chốt dữ liệu.
- Q0-Q7: 8 chân đầu ra dữ liệu song song.
- OE (Output Enable): Kích hoạt đầu ra (mức thấp để bật).
- MR (Master Reset): Xóa toàn bộ dữ liệu trong IC (mức thấp để xóa).
- VCC và GND: Nguồn cấp cho IC.
Chức năng chính: IC 74HC595 dịch dữ liệu đầu vào dạng nối tiếp và chốt lại để xuất ra song song trên 8 chân Q0-Q7. Điều này giúp tiết kiệm số lượng chân I/O cần sử dụng của vi điều khiển.
2. Sơ đồ chân của IC 74HC595
3. Nguyên lý hoạt động
Dịch dữ liệu:
- Khi một xung SH_CP được kích hoạt, một bit dữ liệu từ chân DS sẽ được dịch vào hàng thanh ghi dịch của IC.
Chốt dữ liệu:
- Sau khi dữ liệu được dịch đầy đủ, một xung ST_CP sẽ lưu dữ liệu hiện tại vào các thanh ghi chốt. Từ đó, dữ liệu được xuất ra các chân Q0-Q7.
Kích hoạt đầu ra:
- Chân OE cần được kéo xuống mức thấp (0) để cho phép dữ liệu xuất ra các chân Q0-Q7.
4. Kết nối cơ bản với vi điều khiển
4.1. Kết nối phần cứng
- VCC và GND: Kết nối nguồn 5V và đất.
- DS: Nối với chân dữ liệu của vi điều khiển.
- SH_CP và ST_CP: Nối với các chân điều khiển xung clock trên vi điều khiển.
- OE: Kéo xuống GND để kích hoạt đầu ra.
- MR: Kéo lên mức logic cao (5V) để cho phép hoạt động bình thường.
- Q0-Q7: Kết nối với tải (LED, 7 đoạn, v.v.).
4.2. Ví dụ sử dụng Arduino
Dưới đây là mã Arduino mẫu để điều khiển LED sử dụng 74HC595:
#define DS_PIN 8 // Chân Data
#define SH_CP_PIN 10 // Chân Shift Clock
#define ST_CP_PIN 9 // Chân Latch Clock
void setup() {
pinMode(DS_PIN, OUTPUT);
pinMode(SH_CP_PIN, OUTPUT);
pinMode(ST_CP_PIN, OUTPUT);
}
void loop() {
byte data = 0b00000001; // Dữ liệu ban đầu với 1 LED sáng
for (int i = 0; i < 8; i++) { // Dịch qua từng LED
shiftOut(DS_PIN, SH_CP_PIN, MSBFIRST, data); // Gửi dữ liệu nối tiếp
digitalWrite(ST_CP_PIN, HIGH); // Chốt dữ liệu
digitalWrite(ST_CP_PIN, LOW);
delay(500); // Dừng 500ms
data = data << 1; // Dịch dữ liệu sang trái (dịch bit)
}
}
Giải thích
Dữ liệu khởi đầu (
data
):- Mặc định, chỉ bật LED đầu tiên (
0b00000001
).
- Mặc định, chỉ bật LED đầu tiên (
Dịch bit (
data = data << 1
):- Lệnh này sẽ dịch bit sang trái. Ví dụ:
- Lần 1:
0b00000001
→ bật LED 1. - Lần 2:
0b00000010
→ bật LED 2. - Lần 3:
0b00000100
→ bật LED 3. - Cứ thế cho đến LED cuối cùng.
- Lần 1:
- Lệnh này sẽ dịch bit sang trái. Ví dụ:
Xung clock (
SH_CP
vàST_CP
):- Mỗi lần gửi dữ liệu (
shiftOut
), dữ liệu sẽ được đẩy vào IC. - SH_CP: Gửi từng bit theo thứ tự.
- ST_CP: Chốt dữ liệu để xuất ra chân Q0-Q7.
- Mỗi lần gửi dữ liệu (
Dừng thời gian (
delay(500)
):- Tạo hiệu ứng chuyển động giữa các LED.
Mở rộng: Hiệu ứng dịch vòng lặp (circular shift)
Nếu muốn dịch bit theo dạng vòng lặp, bạn có thể sử dụng mã sau:
void loop() {
byte data = 0b00000001; // Dữ liệu ban đầu với 1 LED sáng
while (true) { // Lặp vô hạn
shiftOut(DS_PIN, SH_CP_PIN, MSBFIRST, data); // Gửi dữ liệu
digitalWrite(ST_CP_PIN, HIGH); // Chốt dữ liệu
digitalWrite(ST_CP_PIN, LOW);
delay(500); // Dừng 500ms
data = (data << 1) | (data >> 7); // Dịch vòng
}
}
Trong đoạn mã này:
data << 1
: Dịch bit sang trái.data >> 7
: Lấy bit cao nhất (MSB) đưa xuống vị trí thấp nhất (LSB).
Kết quả: LED sẽ sáng tuần tự từ đầu đến cuối và quay lại LED đầu tiên, tạo hiệu ứng vòng lặp.
5. Ứng dụng thực tế
- Điều khiển LED và ma trận LED: Điều khiển nhiều LED bằng cách mở rộng số chân I/O.
- Điều khiển 7 đoạn: Hiển thị số bằng cách kết hợp với 7 đoạn.
- Điều khiển relay: Bật/tắt các thiết bị thông qua relay
6. Lưu ý khi sử dụng
- Dòng tải trên mỗi chân Q0-Q7 không nên vượt quá 20mA.
- Sử dụng điện trở hạn dòng khi kết nối LED để bảo vệ IC và LED.
- Khi cần điều khiển số lượng lớn đầu ra, có thể kết nối daisy chain nhiều IC 74HC595.