4.5: Ajuste, Borrado y Lectura de Bits de Registro
- Page ID
- 82474
Las operaciones bitwise pueden parecer algo arcanas para los no iniciados, pero de hecho se usan comúnmente. Un uso principal es establecer, borrar y probar bits específicos en registros. Un ejemplo implica configurar puertos bidireccionales para el modo de entrada o salida a través de un registro de dirección de datos, normalmente abreviado DDR. Cada bit del DDR representa un pin de salida específico. Una lógica alta podría indicar el modo de salida, mientras que una lógica baja indicaría el modo de entrada. Suponiendo que DDR es un registro de 8 bits, si desea establecer todos los bits excepto el bit 0 en modo de entrada, podría escribir 1:
DDR = 0x01; // set bit zero to output mode
Si en algún momento después también querías establecer los bits 1º y 2º en modo de salida manteniendo todo lo demás intacto, la manera más fácil de hacerlo es simplemente O los bits que deseas:
DDR = DDR | 0x06;
La operación previa se puede realizar utilizando la taquigrafía más común:
DDR |= 0x06;
Tenga en cuenta que el código anterior no afecta a ninguno de los otros bits por lo que permanecen en cualquier modo en el que fueron originalmente. Por cierto, un conjunto de bits específicos (como el 0x06 anterior) a menudo se conoce como un patrón de bits o máscara de bits.
Para ver si se establece un bit específico, simplemente Y en lugar de OR. Entonces, para ver si el primer bit de DDR está configurado para el modo de salida, podría usar algo como:
if ( DDR & 0x02 ) // true if set
La limpieza de bits requiere AnDing con una máscara de bits que se ha complementado. En otras palabras, todos los 1s y 0s se han invertido en el patrón de bits. Si, por ejemplo, queremos borrar los bits 0 th y 4 th, primero complementaríamos el patrón de bits 0x11 dando 0xee. Entonces nosotros Y:
DDR &= 0xee;
A menudo, es más fácil simplemente usar el operador de complemento lógico en el patrón de bits original y luego Y:
DDR &= (~0x11);
Si estás tratando con un solo bit, puedes usar el operador de turno a la izquierda para que ni siquiera tengas que molestarte en averiguar el patrón de bits en hexadecimal. Para establecer el 3er bit y luego borrar el 4º bit de DDR, podría usar lo siguiente:
DDR |= (0x01<<3); DDR &= ~(0x01<<4);
Estas operaciones son tan comunes que a menudo se invocan usando una expansión en línea a través de un #define
.
- En C, el conteo de posiciones de bits, como la mayoría de las secuencias, comienza desde la posición 0 no desde la posición 1