Хранение данных и функция shiftOut

Lictor
Offline
Зарегистрирован: 01.10.2015
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& Думал в двухмерном массиве, но никак...

SLKH
Offline
Зарегистрирован: 17.08.2015

Lictor пишет:

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& Думал в двухмерном массиве, но никак...

например, хранить в одномерном массиве (в PROGMEM) в виде uint32_t.

Потом или разбирать на байты, или написать функцию shiftOut32(uint32_t)

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Не нужен тут двумерный массив, можно взять одномерный от 0 до 99. Но в таком случае он займер 200 байт.

Правильнее -  определить соответвие  конкретных битов конкретным сегментам и сделать два одномерных массива шестнадцати-битных значений для цифр от 0 до 9 в первом регистре и во втором. При выводе конкретного числа делать логическое побитовое "И" для цифр первого и второго регистра. Этот вариант займер 40 байт

Lictor
Offline
Зарегистрирован: 01.10.2015

b707 пишет:

Не нужен тут двумерный массив, можно взять одномерный от 0 до 99. Но в таком случае он займер 200 байт.

Правильнее -  определить соответвие  конкретных битов конкретным сегментам и сделать два одномерных массива шестнадцати-битных значений для цифр от 0 до 9 в первом регистре и во втором. При выводе конкретного числа делать логическое побитовое "И" для цифр первого и второго регистра. Этот вариант займер 40 байт

 

Чет я похоже не понял, не получается так:

1 разряд	2 разряд																		
0	3		                0	1	1	1	1	0	1	1		0	1	1	1	1	0	1	0
3	0		                0	0	0	1	1	1	1	1		0	1	0	1	1	1	1	1
итог			        0	0	0	1	1	0	1	1		0	1	0	1	1	0	1	0
должно быть		        0	1	0	1	1	0	1	1		0	1	0	1	1	0	1	1

чет код вставляется плохо:

b707
Онлайн
Зарегистрирован: 26.05.2017

Lictor пишет:

Чет я похоже не понял, не получается так:

1 разряд	2 разряд																		
0	3		        0	1	1	1	1	0	1	1		0	1	1	1	1	0	1	0
3	0		        0	0	0	1	1	1	1	1		0	1	0	1	1	1	1	1
итог			0	0	0	1	1	0	1	1		0	1	0	1	1	0	1	0
должно быть		0	1	0	1	1	0	1	1		0	1	0	1	1	0	1	1

 

Во-первых, чисто матиматически вы складываете строчки неверно. Если третья и четвертая строчка - это результат применения "И" к первым двум - то оба результата неправильные.

Ну а во-вторых, у вас концептуальная ошибка. Для того чтобы вывести число "33", совмещать надо не "30" и "03", а "3_" и "_3", где символ подчеркивания означает отсутствие свечения сегментов вовсе

Lictor
Offline
Зарегистрирован: 01.10.2015

b707 пишет:

Lictor пишет:

Чет я похоже не понял, не получается так:

1 разряд	2 разряд																		
0	3		        0	1	1	1	1	0	1	1		0	1	1	1	1	0	1	0
3	0		        0	0	0	1	1	1	1	1		0	1	0	1	1	1	1	1
итог			0	0	0	1	1	0	1	1		0	1	0	1	1	0	1	0
должно быть		0	1	0	1	1	0	1	1		0	1	0	1	1	0	1	1

 

Во-первых, чисто матиматически вы складываете строчки неверно. Если третья и четвертая строчка - это результат применения "И" к первым двум - то оба результата неправильные.

Ну а во-вторых, у вас концептуальная ошибка. Для того чтобы вывести число "33", совмещать надо не "30" и "03", а "3_" и "_3", где символ подчеркивания означает отсутствие свечения сегментов вовсе

 

Третья строка это результат побитового "и" согласно википедии (тут) Четвертая строка, как должно выглядеть число "33"

 

Еще хуже получилось:

b707
Онлайн
Зарегистрирован: 26.05.2017

Lictor пишет:

очевидная ошибка - в первой строке третий слева разряд - "1", значит в этом месте в результате заведомо должна быть единица, а у вас в вашей строчке "должно быть" - почему-то ноль

b707
Онлайн
Зарегистрирован: 26.05.2017

Lictor пишет:

Третья строка это результат побитового "и" согласно википедии (тут) Четвертая строка, как должно выглядеть число "33"

еще раз - у вас и в расчете ошибка, и в логике, разбирайтесь

Lictor
Offline
Зарегистрирован: 01.10.2015

b707 пишет:

Lictor пишет:

очевидная ошибка - в первой строке третий слева разряд - "1", значит в этом месте в результате заведомо должна быть единица, а у вас в вашей строчке "должно быть" - почему-то ноль

 

не думаю

b707
Онлайн
Зарегистрирован: 26.05.2017

Lictor пишет:

Еще хуже получилось:

сорри, не "И", а "ИЛИ"

Простите, сам зарапортовался. Но вообще-то это должно быть очевидно :)

Lictor
Offline
Зарегистрирован: 01.10.2015

b707 пишет:

Lictor пишет:

Еще хуже получилось:

сорри, не "И", а "ИЛИ"

Простите, сам зарапортовался. Но вообще-то это должно быть очевидно :)

 

Да, это было очевидно, стоило подумать и... я подумал и догадался) но все равно спасибо)

Lictor
Offline
Зарегистрирован: 01.10.2015

Заработало

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); //передача окончена
//}

}