Хранение данных и функция shiftOut
- Войдите на сайт для отправки комментариев
Вс, 17/05/2020 - 19:54
digitalWrite(ST, LOW); //начало передачи shiftOut(DS, SH, LSBFIRST, B00000000); //1 разряд shiftOut(DS, SH, LSBFIRST, B11111111); //2 разряд digitalWrite(ST, HIGH); //передача окончена
Проблема в следующем, есть два последовательно соединенных сдвиговых регистра sn74hc595dr. Все бы ничего, но светодиоды к ним подключены ни как "одна цифра - один регистр", а довольно таки хаотично. Есть перечень соответствия в excel, например,
0 0 B00111111 B01111110 0 1 B00111001 B01110010 0 2 B01111011 B01111100 0 3 B01111011 B01111010 и далее до 99...
Как лучше организовать хранение значений регистров, что бы было проще их вызывать в функции shiftOut& Думал в двухмерном массиве, но никак...
Проблема в следующем, есть два последовательно соединенных сдвиговых регистра sn74hc595dr. Все бы ничего, но светодиоды к ним подключены ни как "одна цифра - один регистр", а довольно таки хаотично. Есть перечень соответствия в excel, например,
Как лучше организовать хранение значений регистров, что бы было проще их вызывать в функции shiftOut& Думал в двухмерном массиве, но никак...
Потом или разбирать на байты, или написать функцию shiftOut32(uint32_t)
Не нужен тут двумерный массив, можно взять одномерный от 0 до 99. Но в таком случае он займер 200 байт.
Правильнее - определить соответвие конкретных битов конкретным сегментам и сделать два одномерных массива шестнадцати-битных значений для цифр от 0 до 9 в первом регистре и во втором. При выводе конкретного числа делать логическое побитовое "И" для цифр первого и второго регистра. Этот вариант займер 40 байт
Не нужен тут двумерный массив, можно взять одномерный от 0 до 99. Но в таком случае он займер 200 байт.
Правильнее - определить соответвие конкретных битов конкретным сегментам и сделать два одномерных массива шестнадцати-битных значений для цифр от 0 до 9 в первом регистре и во втором. При выводе конкретного числа делать логическое побитовое "И" для цифр первого и второго регистра. Этот вариант займер 40 байт
Чет я похоже не понял, не получается так:
чет код вставляется плохо:
Чет я похоже не понял, не получается так:
Во-первых, чисто матиматически вы складываете строчки неверно. Если третья и четвертая строчка - это результат применения "И" к первым двум - то оба результата неправильные.
Ну а во-вторых, у вас концептуальная ошибка. Для того чтобы вывести число "33", совмещать надо не "30" и "03", а "3_" и "_3", где символ подчеркивания означает отсутствие свечения сегментов вовсе
Чет я похоже не понял, не получается так:
Во-первых, чисто матиматически вы складываете строчки неверно. Если третья и четвертая строчка - это результат применения "И" к первым двум - то оба результата неправильные.
Ну а во-вторых, у вас концептуальная ошибка. Для того чтобы вывести число "33", совмещать надо не "30" и "03", а "3_" и "_3", где символ подчеркивания означает отсутствие свечения сегментов вовсе
Третья строка это результат побитового "и" согласно википедии (тут) Четвертая строка, как должно выглядеть число "33"
Еще хуже получилось:
очевидная ошибка - в первой строке третий слева разряд - "1", значит в этом месте в результате заведомо должна быть единица, а у вас в вашей строчке "должно быть" - почему-то ноль
Третья строка это результат побитового "и" согласно википедии (тут) Четвертая строка, как должно выглядеть число "33"
еще раз - у вас и в расчете ошибка, и в логике, разбирайтесь
очевидная ошибка - в первой строке третий слева разряд - "1", значит в этом месте в результате заведомо должна быть единица, а у вас в вашей строчке "должно быть" - почему-то ноль
не думаю
Еще хуже получилось:
сорри, не "И", а "ИЛИ"
Простите, сам зарапортовался. Но вообще-то это должно быть очевидно :)
Еще хуже получилось:
сорри, не "И", а "ИЛИ"
Простите, сам зарапортовался. Но вообще-то это должно быть очевидно :)
Да, это было очевидно, стоило подумать и... я подумал и догадался) но все равно спасибо)
Заработало
const byte ST = A0; //ST_CP 74HC595 const byte SH = A1; //SH_CP 74HC595 const byte DS = 13; //DS 74HC595 byte first[] = { B00001110 , B00001110 , //0 B00001000 , B00000010 , //1 B01001010 , B00001100 , //2 B01001010 , B00001010 , B01001100 , B00000010 , B01000110 , B00001010 , B01000110 , B00001110 , B00001010 , B00000010 , B01001110 , B00001110 , B01001110 , B00001010 , }; byte second[] = { B00110001 , B01110000 , //0 B00010000 , B00010000 , //1 B00010001 , B01100001 , //2 B00010001 , B01010001 , B00110000 , B00010001 , B00100001 , B01010001 , B00100001 , B01110001 , B00010001 , B00010000 , B00110001 , B01110001 , B00110001 , B01010001 , }; byte q = 0; byte r = 0; void setup() { pinMode(ST, OUTPUT); pinMode(SH, OUTPUT); pinMode(DS, OUTPUT); pinMode(A2, INPUT_PULLUP); pinMode(A3, INPUT_PULLUP); pinMode(A4, INPUT_PULLUP); } void loop() { if (digitalRead(A2) == 0) q++; delay(100); q = first[0]|second[2]; r = first[1]|second[3]; //if (0 == 0) { digitalWrite(ST, LOW); //начало передачи shiftOut(DS, SH, LSBFIRST, q); //1 разряд shiftOut(DS, SH, LSBFIRST, r); //2 разряд digitalWrite(ST, HIGH); //передача окончена //} }