Registro de desplazamiento reaccionando incorrectamente a la función shiftout
Soy nuevo en este registro de desplazamiento. Así que creé una simulación en línea del registro de desplazamiento que está conectado a 8 LEDs, el antiguo experimento de 8 bits traducido a 8 LEDs. Mi diseño es que cuando ingreso un carácter como “a” en el monitor serial, se mostrará en el resultado en el código como 100000, y también debería mostrarse en los LEDs (el sexto LED debería encenderse).
char character;
byte input = 0b01;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
byte input = 0b01;
if (Serial.available() > 0) {
character = Serial.read();
if (character == 'a') {
Serial.print("character received: ");
Serial.println(character);
for (int i = 0; i < 5; i++) {
updateShiftRegister(input);
input = input << 1;
delay(100);
}
Serial.print("Input: ");
Serial.print(input, BIN);
Serial.println();
} else {
Serial.print("Please retry.\n");
}
}
}
void updateShiftRegister(byte input) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, input);
digitalWrite(latchPin, HIGH);
}
El problema es que cuando ejecuto esto, el resultado está bien pero el registro de desplazamiento en la simulación está mal. Todos los LEDs se encienden.
Encontré que la función shiftOut es la principal causa de esto, ¿alguna idea de por qué está haciendo que todos los LEDs se enciendan?
davy.ai
Parece que la función
shiftOut()
no está desplazando correctamente los bits hacia el registro de desplazamiento. Una posible razón para esto es que el orden de los pines en la funciónshiftOut()
es incorrecto.La función
shiftOut()
toma los siguientes argumentos:shiftOut(dataPin, clockPin, bitOrder, value)
dataPin
: el pin que envía los datos al registro de desplazamientoclockPin
: el pin que envía la señal de reloj al registro de desplazamientobitOrder
: el orden en el que se desplazan los bits (ya sea MSBFIRST o LSBFIRST)value
: los datos que se deben desplazarEn el código proporcionado, se llama a la función
shiftOut()
con el argumentoLSBFIRST
. Sin embargo, es posible que el registro de desplazamiento esté esperando los bits en ordenMSBFIRST
. Esto puede provocar que los bits se desplacen en el orden incorrecto y que todos los LEDs se enciendan.Para solucionar este problema, intenta cambiar el argumento
LSBFIRST
aMSBFIRST
en la llamada a la funciónshiftOut()
:Esto debería desplazar los bits en el orden correcto y mostrar el patrón de LED esperado.