Chuyên đề arduino – Ứng dụng thanh ghi dịch 74HC595 để dịch trái phải dữ liệu

     Thanh ghi dịch 74HC595 được sử dụng trong lập trình vi điều khiển cũng như arduino rất nhiều. Bởi nhờ tính năng chuyển đổi dữ liệu từ nối tiếp sang song song sẽ tiết kiệm được số chân tín hiệu cho vi điều khiển. Ứng dụng của thanh ghi dịch 74HC595 để dịch trái phải dữ liệu trong arduino hướng dẫn cho các bạn cách thực hiện dịch bit trong arduino.

     Trong arduino để điều khiển được nhiều led đơn thì các bạn nên sử dụng đến thanh ghi dịch 74HC595. Với chỉ có 3 đường tín hiệu kết nối từ arduino thì bạn đã có thể điều khiển được số lượng đèn led lên đến 8 led. Ngoài ra, nếu bạn muốn điều khiển số led nhiều hơn thì cũng chỉ cần tăng số lượng IC 74HC595 lên mà thôi. Bài viết hôm nay, chúng ta sẽ tập trung phân tích cách chúng ta dịch trái và dịch phải dữ liệu trong arduino. Các tín hiệu dịch sẽ được đưa đến điều khiển cho đèn led đơn. 

 NỘI DUNG BÀI VIẾT 

  • Thanh ghi dữ liệu 8 bit
  • Nguyên lý dịch trái dữ liệu
  • Chương trình dịch trái 1 bit 0
  • Nguyên lý dịch phải dữ liệu
  • Chương trình dịch phải 1 bit 0

 1.  THANH GHI DỮ LIỆU 8 BIT 

     Để thực hiện được việc dịch dữ liệu, các bạn cần biết cách lưu trữ dữ liệu trong thanh ghi 8 bit như thế nào. Trong thanh ghi dữ liệu 8 bit nghĩa là thanh ghi đó có 8 ô nhớ. Mỗi ô nhớ sẽ lưu trữ được một bit dữ liệu. Bit dữ liệu sẽ mang 2 trạng thái 0 hoặc 1 tương ứng với mức điện áp 0V hoặc 5V. Bit bên trái nhất được quy định là bit MSB với địa chỉ là 7, bit bên phải nhất được định nghĩa là LSB với địa chỉ là 0. 

Thanh ghi dữ liệu

    Trong arduino để định nghĩa cho biến có kiểu dữ liệu là 1 byte thì các bạn sử dụng kiểu dữ byte, char, boolean. Nếu bạn sử dụng khai báo kiểu dữ liệu int, word, short thì là 2 byte. Các bạn xem lại kiểu dữ liệu với phạm vi dữ liệu ở bài viết kiểu dữ liệu

 2. NGUYÊN LÝ DỊCH TRÁI DỮ LIỆU

     Dịch trái dữ liệu là cách mà dữ liệu trong thanh ghi dịch chuyển từ phải sang trái. Cụ thể là dữ liệu sẽ được dịch chuyển theo chiều từ LSB sang MSB. Để dữ liệu dịch chuyển được thì bắt buộc các bạn phải chèn 1 bit vào cho thanh ghi, thì dữ liệu mới dịch chuyển tuần tự được. Bit dịch chuyển vào thanh ghi có thể là 0 hoặc là 1. Các bạn có thể xem sơ đồ dịch chuyển mô tả như hình bên dưới.

Dịch trái dữ liệu

 3. CHƯƠNG TRÌNH DỊCH TRÁI 1 BIT 0

     Trong chương trình dịch trái một bit 0, chúng ta tiến hành đưa 1 bit 0 từ bên ngoài vào dữ liệu đang có trong arduino. Dữ liệu trong thanh ghi sẽ lần lượt dịch sang trái từng bit 1. Để dịch chuyển bit 0 này sang trái. Bạn sử dụng thuật toán nhân giá trị nhị phân của thanh ghi dữ liệu với 2.

     Chương trình dịch 1 bit 0 vào cho thanh ghi 8 bit được thực hiện cụ thể ở ví dụ sau. Ví dụ tắt dần 8 led đơn bằng thanh ghi dịch 74HC595.

     Sơ đồ mạch

     Đoạn code chương trình

int latchPin=6;
int clockPin=7;
int dataPin=5;
byte Giatri=0b11111111;
 
 void setup() {
pinMode(latchPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
}
 
void loop() {
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,LSBFIRST,Giatri);
digitalWrite(latchPin,HIGH);
delay(1000);  
  
if(Giatri == 0)
    Giatri = 255;
else
  Giatri = Giatri*2;
}

    Giải thích chương trình

     Khai báo các chân điều khiển 

int latchPin=6;
int clockPin=7;
int dataPin=5;
byte Giatri=0b11111111;
 

     Để điều khiển thanh ghi dịch 74HC595 chúng ta cần 3 chân tín hiệu. Trong đó chân latchPin chính là chân để điều khiển xung clock xuất tín hiệu ra cho led. Chân clockPin là chân điều khiển xung clock để dịch các bit ở trong arduino vào thanh ghi dịch của 75HC595. Còn chân dataPin là chân xuất tín hiệu nối từ arduino ra cho thanh ghi dịch 74HC595.

     Biến Giatri là biến được sử dụng để mang dữ liệu cần xuất ra cho thanh ghi dịch. Biến này sẽ được cập nhật dữ liệu trước khi có xung latchPin xuất dữ liệu.

     Định nghĩa chức năng các chân trong void setup()

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

     Trong chương trình void setup() sử dụng các lệnh pinMode() để định nghĩa chức năng xuất dữ liệu ra bên ngoài. Trong chương trình chúng ta sử dụng các chân latchPin, dataPin, clockPin để xuất dữ liệu. Do đó, các chân này đều phải định nghĩa dạng OUTPUT.

     Nội dung chương trình chính

void loop() {
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,LSBFIRST,Giatri);
digitalWrite(latchPin,HIGH);
delay(1000);  
  
if(Giatri == 0)
    Giatri = 255;
else
  Giatri = Giatri*2;
}

     Trong chương trình void loop() chúng ta tiến hành cập nhật dữ liệu cần xuất cho biến Giatri. Và sử dụng xung latchPin để đưa dữ liệu vào cho thanh ghi 74HC595. Mỗi lần sử dụng lệnh shitOut() thì sẽ dịch 8 bit ra cho 74HC595. Do vậy, chúng ta cần cập nhật và thay đổi giá trị cần xuất trước khi thực hiện dịch. Có thể biểu diễn trạng thái của thanh ghi biến Giatri như sau:

Giá trị thanh ghi dữ liệu qua các lần dịch

 4. NGUYÊN LÝ DỊCH PHẢI BIT 0

     Khi thực hiện dịch bit 0 sang phải chúng ta cũng tiến hành dịch tuần tự các bit trong thanh ghi sang phải. Chiều dịch chuyển của dữ liệu lúc bây giờ là từ MSB sang LSB. Và dữ liệu dịch vào là bit 0. Sơ đồ dịch chuyển được mô tả như hình bên dưới.

Dịch bit 0 sang phải

 5. CHƯƠNG TRÌNH DỊCH PHẢI 1 BIT 0

     Để thực hiện được việc dịch một bit 0 sang phải, bạn thực hiện phương pháp ngược lại so với cách dịch sang phải. Và để thực hiện điều này, bạn tiến hành chia giá trị của thanh ghi cho 2. Chương trình sẽ được mô tả cụ thể qua ví dụ sau.

     Chương trình tắt dần 8 led đơn theo chiều từ phải sang trái bằng thanh ghi dịch 74HC595. 

     Sơ đồ kết nối mạch 

   Đoạn code chương trình

int latchPin=6;
int clockPin=7;
int dataPin=5;
byte Giatri=0b11111111; 
 
void setup() {
pinMode(latchPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
}
 
void loop() {
digitalWrite(latchPin,LOW);
shiftOut(dataPin,clockPin,LSBFIRST,Giatri);
digitalWrite(latchPin,HIGH);
delay(1000);
  
if(Giatri==0)
  Giatri=255;
else
  Giatri=Giatri/2;
}

     Đoạn chương trình các bạn có thể nhận thấy rằng tương tự như chương trình dịch sang trái. Tuy nhiên, giá trị để dịch chuyển không phải là nhân 2 mà là chia 2. Như vậy, các bạn có thể thấy rằng để dịch chuyển dữ liệu, cho dù là sang phải hay sang trái. Chúng ta đều phải xử lý dữ liệu cần dịch chuyển, sau đó kích xung latchPin thì dữ liệu sẽ được dịch ra ngoài.

 

   

 


Categories:

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *