Nội dung bài viết
STDIO Một chiếc Arduino UNO vốn có khá ít chân, và sẽ bị hạn chế nếu ta làm việc với 2 đèn led matrix 8x8. Số chân sẽ là (8 + 8) x 2 = 32 chân, vậy để làm được việc đó ta sẽ sử dụng tới con IC 74HC595. IC này có khả năng dịch bit và lưu lại trạng thái của 8 bit, ngoài ra còn có thể đẩy các bit bị tràn ra ngoài và chúng ta có thể sử dụng các bit tràn này để truyền vào 1 con IC khác và làm tiếp tục công việc của nó.

Giới thiệu

Một chiếc Arduino UNO vốn có khá ít chân, và sẽ bị hạn chế nếu ta làm việc với 2 đèn led matrix 8x8. Số chân sẽ là (8 + 8) x 2 = 32 chân, vậy để làm được việc đó ta sẽ sử dụng tới con IC 74HC595. IC này có khả năng dịch bit và lưu lại trạng thái của 8 bit, ngoài ra còn có thể đẩy các bit bị tràn ra ngoài và chúng ta có thể sử dụng các bit tràn này để truyền vào 1 con IC khác và làm tiếp tục công việc của nó.

Tiền đề bài viết

Rất nhiều bạn mới học về điện tử thắc mắc về con IC này và công dụng của nó, bản thân gia đình tôi từ bé có nghiệp về điện tử nên tôi cũng rất thắc mắc mấy con IC này để làm gì. Tôi tìm hiểu và chia sẻ kiến thức với những bạn có cùng thắc mắc như tôi.

Đối tượng hướng đến

Các bạn bước đầu làm quen với điện tử căn bản.

Giới thiệu IC 74HC595

ic74hc595

Ý nghĩa của các chân

ss_2

  • VCC : chân để dòng điện đi vào, nối với cực dương.

  • GND : chân để dòng điện đi ra, nối với cực âm.

  • DS Serial Data Input : dữ liệu sẽ được truyền vào IC thông qua cổng này.

  • OE Output Enable : chân này dung để bật/tắt IC, IC được phép chạy khi ở trạng thái LOW.

  • ST_CP Storage register clock pin : hay còn gọi là chân LATCH, khi chân này từ trạng thái LOW chuyển sang HIGH thì data trong IC sẽ được xuất ra các chân Q1->Q7.

  • SH_CP Shift register clock pin : còn gọi là chân CLOCK, khi từ trạng thái LOW->HIGH tức là một xung, dữ liệu sẽ được dịch vào một bit theo trạng thái hiện tại của của chân DS.

  • MR Master Reclear : khi ở trạng thái HIGH , bộ nhớ trong IC sẽ được xóa hoàn toàn.

  • Q1->Q7 : tượng trưng cho 8 bit trong vùng nhớ IC.

Mạch điện với một IC

Chuẩn bị

  • 2 breadboard

  • 1 Arduino UNO

  • 1 IC74HC595N

  • 8 bóng đèn tùy màu

  • 8 điện trở 560 ohm

  • Wire số lượng nhiều

Sơ đồ mạch

so_do_mach_74hc595_arduino_va_8_led

Nguồn điện 5v được nối từ dây màu đỏ qua các con trở và tới cực dương của đèn led. Các chân 8, 11, 12 lần lượt điều khiển các chân LATCH, CLOCK, INPUT.

  • OE (Enable) được nối vào chân GND vậy nó mang giá trị LOW.

  • MR nối với cực dương có hiệu điện thế 5v nên mang giá trị HIGH

  • Các chân từ Q0 -> Q7 lần lượt nối với các cực dương của bóng đèn thông qua con trở.

Code

int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  // đếm từ 1 -> 255
  for (int numberToDisplay = 1; numberToDisplay < 256; numberToDisplay = numberToDisplay << 1) {
    // giữ trạng thái chân LATCH LOW 
    digitalWrite(latchPin, LOW);
    // dịch bit
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  

    // chuyển trạng thái chân LATCH sang HIGH
    digitalWrite(latchPin, HIGH);
    // Delay 0.5s cho lần chạy kế tiếp
    delay(500);
  }
}

Giải thích

Trong hàm setup() tôi sử dụng pin 8, 11, 12 để điều khiển lần lượt 3 chân của LATCH, CLOCK, INPUT của IC.

Tại hàm loop() tôi tạo một vòng lặp có giá trị từ 1 -> 255, và bước nhảy của vòng lặp này là dịch qua một bit.

Mỗi một vòng lặp ta bắt đầu bằng việc cài đặt cho chân LATCH có trạng thái LOW.

Lệnh shiftOut có các tham số lần lượt là:

  • Chân INPUT

  • Chân CLOCK

  • LSBFIRST dịch bit theo thứ tự hiện có của data trong IC.

  • MSBFIRST dịch bit theo chiểu ngược lại.

Kết Quả

ss_5

Mạch điện với hai IC

Sơ đồ mạch

so_do_mach_x2_74hc595_arduino_va_8_led

Code

int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

#define HC595_count 2
 
void setup() 
{
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
 
void loop() 
{
  char* temp;
  unsigned short i;
  temp = (char*) &i;
  for( i = 1 ; i < 32768 ; i = i << 1)
  {
    digitalWrite(latchPin, LOW);
    for (int j = 0; j < HC595_count; j++)
    {
      shiftOut(dataPin, clockPin, LSBFIRST, temp[j]);
    }
    digitalWrite(latchPin, HIGH);
    delay(500);
  }
  digitalWrite(latchPin, LOW);
  for (int j = 0; j < HC595_count; j++)
  {
    shiftOut(dataPin, clockPin, LSBFIRST, temp[j]);
  }
  digitalWrite(latchPin, HIGH);
  delay(500);
}

Trong sơ đồ mạch với 2 IC, chân Q7" sẽ xuất dữ liệu sang cho chân DS (INPUT) của IC thứ 2. Ta vẫn phải giữ cho chân CLOCK và chân LATCH của IC 2 có giá trị tương đương với IC 1.

Ở mạch một IC một lần dịch bit ta dịch tối đa 8 bit và hàm shiftOut cũng vậy, nên trong trường hợp này ta dịch bit theo số lượng IC tức là với 2 IC, một lần dịch sẽ là 8x2= 16 bit.

Khi biến i đạt đến giá trị 16 384 tương đương 0100 0000 0000 0000 thì vòng lặp sẽ thoát, nên phía dưới tôi tiếp tục dịch thêm một lần nữa để làm sáng đèn cuối cùng và giá trị đó là 32768 - 1000 0000 0000 0000.

Kết quả

ss_6

 

THẢO LUẬN
ĐÓNG