Добрый День! Помогите, пожалуйста, разобраться со сдвиговым выходным регистром 74HC595. Как подключать, как посылать байты, я, вроде, понимаю. В случае с циферблатом мне все понятно, есть опеделенные байты, которые хранятся в массиве. Но как сделать так, чтобы данные из "двоичного" массива (допустим это массив длиной 8: {0,1,0,1,0,1,0,1}) загружались в регистр? Я так понимаю, что грубо говоря этот массив нужно преобразовать в байт? Пробовал сделать двумя способами: Код (Text): #include <SPI.h> int latchPin=8; uint8_t data[8]={0,0,0,0,0,0,0,0}; void setup() { //устанавливаем режим OUTPUT SPI.begin(); pinMode(latchPin, OUTPUT); writeShiftRegister(latchPin,0); } void writeShiftRegister(int ss, uint8_t val[8]) { digitalWrite(ss,LOW); for (int i=0;i<8;i++) SPI.transfer(val[i]); digitalWrite(ss,HIGH); } void loop() { data[2]=1; data[1]=0; data[4]=1; data[6]=1; writeShiftRegister(latchPin,data); } И без SPI: Код (Text): //Пин подключен к ST_CP входу 74HC595 int latchPin = 8; //Пин подключен к SH_CP входу 74HC595 int clockPin = 9; //Пин подключен к DS входу 74HC595 int dataPin = 7; int data[8]={0,0,0,0,0,0,0,0}; void setup() { //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { data[2]=1; data[1]=0; data[4]=1; data[6]=1; digitalWrite(latchPin,LOW); for (int i=0;i<8;i++) shiftOut(dataPin,clockPin,LSBFIRST,data[i]); digitalWrite(latchPin,HIGH); while(true); } Схема подключена корректно, т.к. при обычной передаче все работает. Я чувствую, что т.к. элементы массива являются целочисленными переменными, то, скорее всего, проблема в этом. Может стоит сделать его булевым и передавать туда true или false? Подскажите, что я неправильно делаю? Заранее спасибо!
Спасибо за ответ! Этот метод я понимаю, но мне хочется принципиально понять: возможно ли массив "использовать в качестве байта/нескольких байтов"? Мне это гораздо удобнее!
Можно сделать битовую структуру: http://www.c-cpp.ru/books/bitovye-polya Битовых массивов не предусмотрено, только через преобразование.
А если делать вот так? это не ошибочно? Код (Text): //Пин подключен к ST_CP входу 74HC595 int latchPin = 8; //Пин подключен к SH_CP входу 74HC595 int clockPin = 12; //Пин подключен к DS входу 74HC595 int dataPin = 11; int MAS[8]={0,0,0,0,0,0,0,0}; void setup() { //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { MAS[0]=1; MAS[2]=1; MAS[6]=1; digitalWrite(latchPin, LOW); for (int i=7;i>=0;i--) { digitalWrite(dataPin,MAS[i]); digitalWrite(clockPin,LOW); digitalWrite(clockPin,HIGH); MAS[i]=0; } digitalWrite(latchPin, HIGH); // пауза перед следующей итерацией delay(500); }
Не, ну если повыпендриваться, то можно написать так: Код (Text): digitalWrite(dataPin,(MAS[i]==0)?LOW:HIGH); Но и без этого должно работать
Можно еще вопрос: будут ли эти платы расширения стабильно работать с 3.3 В Arduino Due? http://amperka.ru/collection/arduino-shield/product/arduino-sd-card-shield http://amperka.ru/collection/arduino-shield/product/arduino-ethernet-shield
Код (C++): const byte latchPin = 6; const byte clockPin = 7; const byte dataPin = 5; byte number[] = {0b10000010, 0b10011111, 0b1000110, 0b01100010, 0b00110011, 0b00101010, 0b00001010, 0b11100011, 0b00000010, 0b00100010}; void setup() { pinmode(latchPin, OUTPUT); pinmode(clockPin, OUTPUT); pinmode(dataPin, OUTPUT); } void loop() { digitalWrite (latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, number[1]); digitalWrite (latchPin, HIGH); } Доброго времени суток! Освоил только один сдвиговый регистр, два и более не даются пониманию. Те примеры что есть в сети, дают понимание бегущего огонька... Не могли бы помочь в этом деле?