Saltar al contenido principal
LibreTexts Español

4.5: Ajuste, Borrado y Lectura de Bits de Registro

  • Page ID
    82474
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    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 y 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 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.


    1. 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

    This page titled 4.5: Ajuste, Borrado y Lectura de Bits de Registro is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.