Поэтому я подключил два регистра сдвига (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 Это мой первый пост, так как я начинающий программист. Пожалуйста, дайте мне знать, если что-то не так 🙂
Задача ещё не решена.