Доброго времени суток, форумчане. Обращаюсь с просьбой растолковать методику и помочь решить проблему. Суть такова. Есть двухкаскадный регистр сдвига на 74HC595, соответственно, на 16 бит. К его выходам подсоединены четыре четырехбитных двоично-десятичных дешифратора(по два на каждый регистр). На вход дешифратора нужно подавать числа от 0 до 9 в виде 4 бит - разрядности для этого более, чем достаточно. Вопрос: как правильно программно сделать так, чтобы, представленное число, например, 1985, подавалось в регистр сдвига как последовательность: 0001(1) 1001(9) 1000(8) 0101(5) , а не как 0000011111000001 Буду крайне благодарен. Заранее спасибо.
Код (C++): #include <SPI.h> // 10 пин будет чипселектом 595-й const int slaveSelectPin = 10; void setup() { // он - выход pinMode (slaveSelectPin, OUTPUT); // инит SPI: SPI.begin(); } void loop() { // посылка байтиков на 595 digitalWrite(slaveSelectPin,LOW); SPI.transfer(modifyThis(1985)); digitalWrite(slaveSelectPin,HIGH); } // функция для преобразования числа uint16_t modifyThis(uint16_t needSend) { uint16_t send_buffer=0; for (int i=0; i<4; ++i) { // получаем последнюю циферку числа отдельно uint16_t nextDigit = needSend % 10; // мотаем ее в нужное нам место nextDigit <<= i*4; // вставляем полученную перемотку в буффер send_buffer |= nextDigit; // на следующем шаге мы получим новую последнюю циферку needSend /= 10; } return send_buffer; }
Спасибо за наводку! Вгрузил код, однако на выходе получил одинаковые результаты на первом и на втором регистрах. То есть, дешифраторы на выходах выдали дважды 8 и 5. Где искать ошибку?
Все решилось вот таким способом: Код (C++): #include <SPI.h> // 10 пин будет чипселектом 595-й const int slaveSelectPin = 10; void setup() { // он - выход pinMode (slaveSelectPin, OUTPUT); // инит SPI: SPI.begin(); } void writeShiftRegister16 (int slaveSelectPin, uint16_t needSend){ digitalWrite (slaveSelectPin,LOW); //старший байт SPI.transfer (highByte (needSend)); //младший байт SPI.transfer (lowByte (needSend)); digitalWrite(slaveSelectPin,HIGH); } void loop() { // посылка байтиков на 595 writeShiftRegister16 (slaveSelectPin, modifyThis(n)); } // функция для преобразования числа uint16_t modifyThis(uint16_t needSend) { uint16_t send_buffer=0; for (int i=0; i<4; ++i) { // получаем последнюю циферку числа отдельно uint16_t nextDigit = needSend % 10; // мотаем ее в нужное нам место nextDigit <<= i*4; // вставляем полученную перемотку в буффер send_buffer |= nextDigit; // на следующем шаге мы получим новую последнюю циферку needSend /= 10; } return send_buffer; } Всем спасибо!!