Search…

Arduino với IC 74HC595

19/09/20206 min read
Giới thiệu nguyên tắc hoạt động của IC 74HC595 và cách sử dụng IC 74HC595 với Arduino.

Giới thiệu

IC 74HC595 là một IC thông dụng với khả năng dịch bit và ghi nhớ tạm thời 8-bit. Với khả năng đó, IC 74HC595 có khả năng mở rộng số lượng chân vốn đã ít của Board mạch Arduino.

Chuẩn bị

  • Board mạch Arduino – Arduino Uno
  • 1 breadboard – bảng mạch test
  • Các đèn LED nhỏ số lượng nhiều
  • 2 IC 74HC595
  • 1 con trở nhỏ - 510 Ohm

Giới thiệu về IC 74HC595

IC 74HC595 là một IC thông dụng:

IC 74HC595
IC 74HC595
  • VCC là chân nối điện cực dương
  • GND là chân nối đất
  • ENABLE là chân có cho phép IC chạy hay không, khi ở trạng thái LOW, IC được phép chạy
  • RESET khi chân này ở trạng thái HIGH, toàn bộ bộ nhớ trong IC bị xóa sạch

Các chân mà ta quan tâm nhiều nhất:

  • Q0 → Q7 là các chân tượng trưng cho 8 bit trong vùng nhớ của IC
  • INPUT là chân đưa dữ liệu vào IC
  • LATCH khi chân ở trạng thái từ LOW chuyển sang HIGH thì IC xuất dữ liệu từ ô nhớ ra các chân Q0 Q7
  • CLOCK khi có một xung clock (1 lần LOW và một lần HIGH) thì dữ liệu được dịch vào một bit theo trạng thái hiện tại của chân INPUT
  • QH IC có vùng nhớ 8 bit, nếu như truyền vào IC nhiều hơn 8 bit thì sẽ tràn vùng nhớ và bit bị tràn truyền qua QH này

Giải thích

Ví dụ nếu ta muốn truyền vào IC 1 byte tương đương 8 bit có giá trị là 5 thì các chân từ Q0 Q7 sẽ có giá trị như sau:

Với các chân có giá trị 0 tương ứng chân đó có hiệu điện thế là 0v, còn các chân có giá trị 1 sẽ có hiệu điện thế là 5v. Dựa vào đặc tính này ta dễ dàng mở rộng số lượng chân cho Arduino.

Trong bộ complier mà Arduino cung cấp, ta đã có sẵn hàm shiftOut() để thực hiện thao tác này.

Hiện thực

Thử nghiệm

Các bạn cho lắp các linh kiên nêu trên như sau:

Các bạn có thể cắm các đèn LED như sau để dễ thao tác:

Sau đó nối các chân lại với nhau như thiết kế.

Các chân 5, 6, 7 và nguồn 5v nối từ dây màu đỏ như trên hình, các dây màu đen là chân GND.

Nối chân như sau:

  • Chân số 5 – INPUT của IC 74HC595
  • Chân số 6 – LATCH của IC 74HC595
  • Chân số 7 – CLOCK của IC 74HC595

Để IC hoạt động

  • ENABLE - chân GND tức là có giá trị LOW
  • RESET - điện cực dương có hiệu điện thế 5v tức là HIGH
  • Các chân Q0 Q7 tôi nối lần lượt cho 8 bóng đèn LED

Nếu như một chân bất kỳ có giá trị 1, tức là chân đó có nguồn điện 5v, dòng điện sẽ chênh lệch với dòng điện từ chân dương của LED ở khoảng ~2v. Tuy nhiên khi đó dòng điện này ngược dòng với đèn LED nên đèn sẽ không sáng, còn khi chân của IC có giá trị 0 thì điện thế là 0. Dòng điện đi qua LED là ~3v nên đèn sẽ sáng.

Vậy với giá trị 1 thì LED tắt, còn giá trị 0 thì LED sáng.

Code 1

Nạp vào Arduino và chạy thử.

#define _clock 7
#define _latch 6
#define _data 5

void setup() {
  pinMode(_latch, OUTPUT);
  pinMode(_clock, OUTPUT);
  pinMode(_data, OUTPUT);
}

void loop() {
  for (int i = 0; i < 256; i++)
  {
    digitalWrite(_latch, LOW);
    shiftOut(_data, _clock, LSBFIRST, i);
    digitalWrite(_latch, HIGH);
    delay(500);
  }
} 	

Kết quả

Giải thích

Cho lần lượt các con số từ 1 256 tức là các con số trong giới hạn 8 bit để đưa vào Arduino thông qua hàm shiftOut(). Hàm shiftOut() là hàm mà complier Arduino đã hiện thực sẵn, bạn chỉ việc sử dụng lại.

Chân _latch mỗi lần đưa một dãy bit mới vào IC, phải bật tắt chân _latch một lần vì IC chỉ xuất từ bộ nhớ ra các chân Q0 Q7 khi chân _latch ở trạng thái từ LOW chuyển sang HIGH.

Hàm shiftOut():

  • Vế 1: chân INPUT của IC 74HC595
  • Vế 2: chân CLOCK của IC 74HC595
  • Vế 3: tượng trưng cho việc bạn dịch bit theo thứ tự chính xác của một số hay đảo chiều
    • LSBFIRST – dịch theo thứ tự chính xác của một số
    • MSBFIRST – theo thứ tự ngược lại

Ví dụ nếu tôi dịch con số 5 như ví dụ ban đầu thì:

Thử lại với đoạn code khác

Ta có đoạn code sau:

#define _clock 7
#define _latch 6
#define _data 5

void setup() 
{
  pinMode(_latch, OUTPUT);
  pinMode(_clock, OUTPUT);
  pinMode(_data, OUTPUT);
}

void loop() 
{
  for (int i = 1; i < 256; i = i << 1)
  {
    digitalWrite(_latch, LOW);
    shiftOut(_data, _clock, LSBFIRST, i);
    digitalWrite(_latch, HIGH);
    delay(1000);
  }
}

Đoạn code này không dịch các con số từ 1 256.

Cho con số i ban đầu là 1 – 0000 0001. Sau mỗi vòng lặp i sẽ dịch bit sang trái 1 lần, vậy tức là với một con số 8 bit, i lần lượt có các giá trị:

  • 0000 0001 - 1
  • 0000 0010 - 2
  • 0000 0100 - 4
  • 0000 1000 - 8
  • 0001 0000 - 16
  • 0010 0000 - 32
  • 0100 0000 - 64
  • 1000 0000 - 128

Do đó, giới hạn vòng lặp khi i chạm 256 thì dừng.

Kết quả

Chồng 2 IC 74HC595

Như đã đê cập ở trên, vẫn còn 1 chân QH là chân đưa ra các bit bị tràn. Dựa vào điều này, mở rộng được thêm chân nữa tức là 1 con số 16 bit nếu chồng thêm 1 IC lên.

Ngoài ra có thể chồng nhiều IC hơn nữa theo thứ tự : IC 2 lấy từ QH của IC 1, IC 3 lấy từ QH của IC 2, IC 4 lấy từ QH của IC 3, ….

Các chân CLOCK và chân LATCH của IC 2 vẫn phải được đảm bảo có giá trị tương đương với các chân CLOCK và chân LATCH của IC1.

Giả sử cắm mạch như sau:

Sơ đồ mạch
Thực tế

Sử dụng đoạn code

#define _clock 7
#define _latch 6
#define _data 5

#define HC595_count 2

void setup() 
{
  pinMode(_latch, OUTPUT);
  pinMode(_clock, OUTPUT);
  pinMode(_data, OUTPUT);
}

void loop() 
{
  char* temp;
  unsigned int i;
  temp = (char*) &i;
  for( i = 1 ; i < 32768 ; i = i << 1)
  {
    digitalWrite(_latch, LOW);
    for (int j = 0; j < HC595_count; j++)
    {
      shiftOut(_data, _clock, LSBFIRST, *(temp + j));
    }
    digitalWrite(_latch, HIGH);
    delay(1000);
  }
  digitalWrite(_latch, LOW);
  for (int j = 0; j < HC595_count; j++)
  {
    shiftOut(_data, _clock, LSBFIRST, *(temp + j));
  }
  digitalWrite(_latch, HIGH);
  delay(1000);
}

Giải thích

HC595_count là số lượng IC 74HC595 đang dùng.

Hàm shiftOut() chỉ có thể dịch 1 lần 8 bit. Trường hợp này dùng đến 16 bit (biến 2 bytes) nên khai báo unsigned int.

Khi i đạt đến giá trị 16.384 - 0100 0000 0000 0000 thì thoát vòng lặp, tiếp tục dịch i qua trái thêm một lần nữa để có giá trị là 32.768 - 1000 0000 0000 0000, để có thể hiển thị đèn cuối cùng.

Kết quả

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024