Arduino shiftOut () дает странные выходные данные на 1-й и 8-й бит

Поэтому я подключил два регистра сдвига (CD4021BE для ввода и HC595N для вывода) и написал небольшую программу, которая печатает на последовательном мониторе, какие кнопки нажимаются, и подсвечивает соответствующие диоды с помощью переменной без знака. Ввод отлично работает с функцией shiftIn, но вывод работает странно.

При нажатии кнопок 2-7 все в порядке. Нажатие 1-й кнопки печатает правильное значение символа, но не горит диод. Нажатие 8-й кнопки также печатает правильно, но загорается как 1-й, так и 8-й диод.

Я думаю, что проблема лежит где-то в функции shiftOut, но я не могу ее найти. При использовании примеров, найденных в интернете (двоичный обратный отсчет на диодах), эти диоды работали отлично, поэтому проводка хорошая, но с моим кодом она не работает. Пожалуйста, скажите мне, что я делаю не так.

// Support for HCF4021BE IC, basically any 4021 should work. The fastest way I could manage + debugging to console

#define pinLatch 8
#define pinInput 9                               //defining pins
#define pinClock 7
#define pinOutput 6

unsigned char currentByte, inputByte = 72;      //non-zero value for debug purposes

void setup() {
Serial.begin(9600);
pinMode(pinLatch, OUTPUT);                    //standard setup
pinMode(pinClock, OUTPUT);
pinMode(pinInput, INPUT);
pinMode(pinOutput, OUTPUT);
}

void loop() {
digitalWrite(pinLatch, 1);
delayMicroseconds(20);                        //pulsing latch so that 4021 read inputs
digitalWrite(pinLatch, 0);

inputByte = shiftIn(pinInput, pinClock);      //read the byte returned by shiftIn to var
if (currentByte != inputByte)                 //print only changes
{
if (inputByte != 0)
{
for (int n = 0; n <= 7; n++)              //print which button is pressed
if (inputByte & (1 << n))               //if given n-th bit of input is true
{
Serial.print(n + 1);                  //print the number of the button (byte+1)
Serial.print(" ");
}
Serial.println();
} else {
Serial.println(0);
}
}
currentByte = inputByte;
shiftOut(pinOutput, pinClock, LSBFIRST, inputByte);
}

byte shiftIn(int myDataPin, int myClockPin) {

byte myDataIn = 0;
for (int i = 7; i >= 0; i--)
{
digitalWrite(myClockPin, 0);                //pulsing the clockPin to read consequent bits/inputs of 4021
delayMicroseconds(1);                     //the responsiveness of 4021
if (digitalRead(myDataPin)) {               //if i-th input of 4021 is 1
myDataIn = myDataIn |(1 << i);            //sets i-th bit of myDataIn byte to 1
}
digitalWrite(myClockPin, 1);
}

return myDataIn;
}

Код на пастин

PS Это мой первый пост, так как я начинающий программист. Пожалуйста, дайте мне знать, если что-то не так 🙂

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]