¿Cómo puedo detectar una entrada ALTA o BAJA en un microcontrolador NXP?

Estoy usando el microcontrolador NXP P89V51RD2 . Necesito detectar ALTO o BAJO a partir de 2 bits individuales. ¿Cómo almaceno el estado de entrada en una dirección predefinida para que mis funciones puedan detectarlo como datos?

Necesito usar 2 transistores emisor acoplado a la base para detectar cambios en la resistencia (indirectamente midiendo corriente y voltaje) en una celda de carga. El acoplamiento es un intento de un tipo rudimentario de conmutación. Esto necesito darle un poco en, por ejemplo, el puerto P1 para la detección. Tengo problemas para obtener el código correcto ( identificación de bit H/L ) para esta configuración de conexión AND (¿se necesita un búfer u otro acondicionador de señal?) para esto.

La compilación del código se realiza en Keil μVision v4 .

El sitio web oficial de Keil dice que se puede hacer con el código: sbit b1 = P1^0. Sin embargo, no sé cómo proceder después, ya que este código no da los resultados requeridos.

Aclare el aspecto del diseño electrónico de esta pregunta... ¿O es la pregunta "¿Qué líneas de código uso para guardar o usar un valor booleano en el lenguaje ensamblador de NXP?" En general, la pregunta necesita que se elimine su vaguedad.
Es más como buscar una señal para cambiar la salida.
b1 = P1^0b1es igual No tiene sentido XOR nada con 0.
b1 = P1^0 " ^ " asigna el bit 0 (LSB) de P1 a una variable b1.
No, no lo hace. Su pregunta está etiquetada como C. Para asignar el bit 0 de P1 a b1, escribiríab1 = P1 & 1;
No. La compilación del programa se realiza en Keil μVision, cuya sintaxis esb1 = P1^0

Respuestas (2)

Miré la guía a la que se vinculó, y su problema es que ha confundido una declaración con una declaración de programa. Cuando escribe sbit b1 = P1^0;, le ha dicho al compilador cómo obtener el bit que desea, pero aún no ha creado ningún código. Entonces, la forma en que lo usaría es tratar este "b1" declarado como si fuera una variable que representa el bit de puerto que desea. Entonces,

if(b1) {
  led_on();
}
else {
  led_off();
}

Cuando el compilador encuentra b1, leerá el puerto y extraerá el bit, según la declaración anterior.

Esa forma particular de declarar bits de puerto es particular de ese compilador, por lo que confunde a cualquiera que no lo haya visto antes (incluido yo).

Entiendo. Pero como dijiste cuando el compilador encuentra b1, leerá el puerto y extraerá el bit, según la declaración anterior. Quiero almacenarlo en una variable permanente (como, por ejemplo, char bit1 sin firmar).
bit1 = b1; hará eso por ti. Esa declaración inicial hace que b1 ya actúe como una variable, por lo que puede copiarla en cualquier lugar. Pero luego, bit1 solo tiene el valor de la última vez que lo copió. Tal vez eso es lo que quieres.

Su código no es correcto. b1 = P1^0significa P1 XOR 0. Cualquier cosa XOR 0 da el valor original.

Para asignar el bit 0 a b1, debe escribir b1 = P1 & 1, o preferiblemente:

b1 = P1 & (1<<0)

La última forma es universal, para obtener el bit 1, escribiría 1<<1. Para el bit 2, escribiría 1<<2, y así sucesivamente.

Guía del usuario de Cx51 : el sitio de ayuda oficial dice que mi código es correcto. También tuve éxito en la manipulación de bits para encender y apagar los LED en el kit de aprendizaje. Debería haber mencionado esto en la pregunta de que, según el sitio anterior, el puerto P1es un sfrregistro de función especial.
@ ved2254 El estándar C ISO 9899:2011 6.5.11: "Operador OR exclusivo bit a bit. Sintaxis: expresión OR exclusiva ^ expresión AND ". Debería obtener un compilador de C en lugar de cualquier compilador que no sea de C que esté utilizando actualmente. Estoy seguro de que debe haber puertos GCC disponibles para MCU 8051-ish.
Además, parece muy sospechoso que Keil decidiera eliminar el operador XOR cuando rehicieron C al lenguaje Keil. XOR es un operador bastante importante en la programación integrada: alternancia de bits, cálculos de CRC, cifrado, etc.
Keil no ha eliminado XOR. Este tipo de declaración es válida solo en la declaración global de sbits. Si se usa dentro de alguna función, da error.