Tôi đã kiểm tra shiftOut()
mã chức năng wiring_shift.c
và tôi hoàn toàn không hiểu những gì đang diễn ra trong chức năng digitalWrite. Tôi thấy !!(val & (1 << i))
là lấy giá trị bit từ val
nhưng chính xác thì nó hoạt động như thế nào?
Toàn bộ chức năng dưới đây.
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
uint8_t i;
for (i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
@ edgar-bonet Thật ra đây là câu hỏi. Tôi có thể thấy nó bằng cách nào đó tính toán giá trị bit, nhưng tôi không hiểu làm thế nào nó làm điều này.
—
wizofwor
Bạn có hiểu hành vi của hàm shiftOut không? Ý tôi là, bạn hiểu rằng đó sẽ
—
Paul
shift out
là một giá trị (ở dạng nhị phân). Và sẽ cho một xung đồng hồ cùng với nó.
!!(val & (1 << i))
là phần phức tạp nhất của mã này. Nếu bạn làm hiểu được điều này, thì phần bạn là những gì không hiểu?