Estoy empezando a aprender más sobre la programación de AVR ATMEGA.
Al leer un artículo sobre el funcionamiento interno de Arduinos, estoy aprendiendo cómo se estructura el método shiftOut
. Estoy un poco familiarizado con las operaciones bitwise hasta ahora, pero tengo una expresión que aún no entiendo:
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) {
PORTD |= !!(val & (HIGH << i));
} else {
PORTD |= !!(val & (HIGH << (7 - i)));
}
PORTB |= (HIGH << clockPin);
PORTB ^= (HIGH << clockPin);
}
}
La línea PORTD |= !!(val & (HIGH << i));
no es 100% clara para mí. Entiendo que establecí el i-th bit High en PORTD, pero lo que da !!
mean y val&(HIGH <<i))
Sé que esto puede sonar básico, pero ¿puedes ayudarme?