Un procedimiento que se llama "Leer-Modificar-Escribir".
Lo que implica es totalmente en el nombre. Usted leer. Luego de modificar. Luego de escribir.
Leer:
//Read in the value of the output register
tempVariable = [output register]
Modificar:
//set all bits you want to modify to be 0.
tempVariable &= [some mask];
//or in the values of the bits with those bits you want unchanged set to 0
tempVariable |= [new value of bits];
Escribir:
//Write the new value back to the output register
[output register] = tempVariable;
La clave es, básicamente, para finalizar con los valores de bits que desea ser invariable a ser escrita a la salida de registro junto con los nuevos valores de los bits que no desea cambiar.
Para determinar lo que el registro de salida es para su dispositivo, debe consultar su hoja de datos.
No podemos escribir en el registro directamente porque va a afectar a los bits no queremos cambiar. Así que tenemos una secuencia de operaciones que va a cambiar sólo los bits que queremos. Esto es donde los operadores bit a bit vienen en.
Hay varios operadores bit a bit, pero lo importante son dos &
(y) y |
(o). Bit a bit y cualquier cosa con un 0 y en ella se establece que el bit a 0, bit a bit y cualquier cosa con 1 y se mantiene la misma. Bit a bit o cualquier cosa con un 1 y se establece que poco a ser un 1, bit a bit o nada con 0 y se mantiene la misma. Estos dos operadores nos permiten hacer los cambios necesarios, porque ahora tenemos una manera de establecer sólo algunos de los bits a 0 y una manera de establecer sólo algunos de los bits a 1.
El nuevo valor que se desea escribir se requieren algunos bits a 0 y algunos bits a 1. Podemos lograr esto haciendo un bit a bit y seguido por un bit a bit o. El y se utiliza para establecer todos los bits que queremos cambiar a ser 0 para que nos permiten hacer la o el que establece que sólo los bits que queremos ser 1 ser 1.
Un ejemplo ayudará. Digamos que usted desea modificar los 5 bits más bajos para un valor de 0b01011
pero deja la parte superior de 3 bits sin cambios. Permite también dicen que el valor actual es 0b10111101
. Así que siga el procedimiento:
Paso 1, de la máscara:
Current: 0b101 11101
Bitmask: 0b111 00000 <- remember a 1 means don't change, a 0 means clear.
Result : 0b101 00000
Paso 2, modificar:
Masked : 0b101 00000
New Val: 0b000 01011 <- remember a 1 means set to 1, a 0 means unchanged
Result : 0b101 01011
Y ahí lo tienen - aviso de la parte superior de 3 bits se mantuvieron sin cambios en ambas operaciones, mientras que la parte inferior de bits se han actualizado para que coincida con el nuevo valor.
Para llevar hasta un punto que se menciona en los comentarios y la otra respuesta, que este hecho debe ser hecho en el registro de salida, que era la intención original de mi respuesta. Parece que hay cierta confusión en el supuesto de que por el puerto me estaba refiriendo a la PORTx registra en Fotos - de hecho el registro de salida en algunos dispositivos es el LATx registro. Algunas Fotos no tienen un LATx registro. En los retornos voluntarios asistidos por ejemplo PORTx es el registro de salida. La hoja de datos para su dispositivo le dirá lo que la salida del registro.
Además, la técnica puede ser utilizada para modificar las variables así como la creación de registros, y puede ser usado cuando se modifican los registros para otras cosas que no sean sólo los puertos e/S - usted puede modificar cosas como los registros de control de periféricos seriales y como bien.
Debido a las diferencias en la nomenclatura de los registros y el hecho de que el proceso es un enfoque universal, en el anterior yo había tratado de ser genérico como la misma cosa se aplica no sólo Fotos, sino de cualquier microcontrolador - de hecho, casi cualquier cosa que se requiere de una serie de bits de un registro para ser modificados, pero no a los demás.