I were examining shiftOut()
function code in wiring_shift.c
and I didn't quite understand what is going in digitalWrite function. I see !!(val & (1 << i))
is taking the bit value from val
but how exactly it works?
The whole function is below.
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);
}
}
!!(val & (1 << i))
is the most complex part of this code. If you do understand this, then what is the part you do not understand? – Edgar Bonet Jun 1 '15 at 8:56shift out
a value (in binary form). And will give a clock pulse along with it. – Paul Jun 1 '15 at 10:29