Как собрать число для регистра

uragan
Offline
Зарегистрирован: 23.02.2015

Чтобы засветить, например, число с точкой в одном разряде на  семисегментике. Если есть отдельно число и точка.

dhog1
Offline
Зарегистрирован: 01.03.2016

Например поднять старший (левый) бит отсылаемого 7-сегментнику числа: dig_to_send |= 0x80

Число к этому времени уже перекодировано в представление сегментов индикатора.

uragan
Offline
Зарегистрирован: 23.02.2015

Т е универсального алгоритма нет?  Поясню. Есть два числа размером по одному байту. По какому правилу их соединить, чтобы в конечном числе все еденички оказались на своих местах в итоговом.

dhog1
Offline
Зарегистрирован: 01.03.2016

Алгоритмы - фигня, если нет понимания вопроса (это о себе).

Вот какие-то 2 числа. Их зачем-то нужно соединить, ну предположим, и получить некое конечное число, оно же итоговое. Уже чудесатее, но пока понять можно. Но вот кто такие "единички" и какие такие "свои" места у них имеются... Тут мысль останавливается.

uragan
Offline
Зарегистрирован: 23.02.2015

В сдвиговый регистр нужно загнать число с точкой или без точки. Как сделать?

dhog1
Offline
Зарегистрирован: 01.03.2016

В сдвиговый регистр загоняется не число, а цифра. Одна цифра из тех, что образуют число. Как правило эта цифра предварительно перекодируется в "представление сегментов индикатора", т.е. из цифры получают последовательность бит (8 штук, байт), зажигающую определенную последовательность сегментов индикатора.

Эту цифру можно отобразить с точкой или без точки. Как зажечь точку (если она есть на индикаторе) см. пост 1.

uragan
Offline
Зарегистрирован: 23.02.2015

Спасибо, что перевели мой вопрос. И как это сделать?

dhog1
Offline
Зарегистрирован: 01.03.2016

Пожалуйста.

Насчет "как это сделать?"  А вы точно не издеваетесь? Потому как "собрать число", "регистр" и "сдвиговый" - на мой взгляд весьма умные слова, подразумевающие определенный уровень знаний.

Дабы не плодить флуд. Охотно расскажу как это делается. Для этого пришлите, пожалуйста, свой код, т.е. _как_ вы пытаетесь это сделать, и хотя бы на словах опишите схему подключения 7-индикатора к регистру или чему там.

Ну или перечитайте пост #1.

uragan
Offline
Зарегистрирован: 23.02.2015

Код то для этого зачем? Есть цифры А и В байтовые. Нужно А ??? В = С.  Где ??? - некий алгоритм. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

uragan, ни фига не понятно. Что у вас, цифры или данные для индикатора? Это разные вещи. Если данные, то два байта можно склеить в одно слово сдвиганием старшего байта на 8 бит. Если нужно 2 одиночные цифры склеить в двузначное число, то нужно умножить старшую цифру на 10 и сложить с младшей.

uragan
Offline
Зарегистрирован: 23.02.2015

А и В отдельные байтовые цифры. В сдвиговый регистр нужно затолкать одну цифру С. Вот ее нужно предварительно собрать из А и В.

uragan
Offline
Зарегистрирован: 23.02.2015

" Или лыжи не едут, или я ..."

Подробнее. Отображение информации на 3-х разрядном семисегментном индикаторе. Возможные сочетания записаны в массив в виде цифры байтового размера. На индикатор загоняются через сдвиговый регистр. По таймеру переключаются разряды. Есть необходимость отображать цифру с точкой. Для этого можно увеличить массив на 10 элементов или лишний раз дергать разряд, отображая только точку. Вот мне и подумалось, чтобы этого избежать , если есть необходимость, вначале сформировать цифру с точкой в один байт, а после уже отображать на индикаторе в один шаг. Как сформулировать запрос не знаю. Но задача для программиста представляется достаточно тривиальной.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

uragan, значит всё таки байт данных.  Вам уже в #1 ответили как установить отдельно взятый бит.

uragan
Offline
Зарегистрирован: 23.02.2015

С одним битом допустим разобрались.  Хотя и несколько кривоватенько. А если обобщить и усложнить. Есть такая операция в одну строчку?

dhog1
Offline
Зарегистрирован: 01.03.2016

Это просто праздник какой-то.

2 uragan

Разумеется такая обобщенная и усложненная операция есть. Но она секретна, как и ваш код, только еще секретнее. Ни один Программист вам эту тайну Мальчиша не выдаст, ибо потеряет тут же свою силу над прочими людишками и даже такие посты, как этот, писать уже не сможет. Поэтому вам все время подсовывают кривоватенькие решения, и то лишь для одного бита (напомню, что всего их 8, и это есть байт).

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

uragan
Offline
Зарегистрирован: 23.02.2015

Прикалываетесь. Кода нет. Как же я его напишу, если нет алгоритма самого важного? Про биты и байты я уже почти год как в курсе. Вроде уже разобрались, что требуется, а ответа нет. Может уже скажете, как должен был прозвучать вопрос, чтобы получить на него ответ.

dhog1
Offline
Зарегистрирован: 01.03.2016

Ладно, извините, uragan. Пар выпустил, больше не буду.

Благодаря вашей настойчивости, давайте закончим с этим делом.

uragan пишет:

Отображение информации на 3-х разрядном семисегментном индикаторе. Возможные сочетания записаны в массив в виде цифры байтового размера. На индикатор загоняются через сдвиговый регистр. По таймеру переключаются разряды. Есть необходимость отображать цифру с точкой. Для этого можно увеличить массив на 10 элементов или лишний раз дергать разряд, отображая только точку. Вот мне и подумалось, чтобы этого избежать , если есть необходимость, вначале сформировать цифру с точкой в один байт, а после уже отображать на индикаторе в один шаг.

В цитате есть неверное суждение, которое начинается со слов "для этого можно..." и заканчивается "вот мне и подумалось..."

В 7-сегментном индикаторе обычно 8 сегментов, один из которых (dp) это десятичная точка. Семь диодов отвечают за формирование изображения, восьмой отвечает за отображение точки. Когда индикатор подключают, например, к регистру, выход Q0 (младший бит регистра) соединяют с сегментом А индикатора; выход Q1 - с сегментом В индикатора и т.д. по порядку. Последний выход регистра Q7 (старший бит, самый левый) соединяют с сегментом DP. Смотрите рисунок.

А это "магическая" таблица перекодировки отображаемой цифры в "представление сегментов" индикатора в двоичной записи.

const unsigned char digitToSegment[] = {
  0b00111111,    // 0
  0b00000110,    // 1
  0b01011011,    // 2
  0b01001111,    // 3
  0b01100110,    // 4
  0b01101101,    // 5
  0b01111101,    // 6
  0b00000111,    // 7
  0b01111111,    // 8
  0b01101111,    // 9
  0b01000000,    // - (minus)
  0b00000000     // blank (0x0B)
};

 

Присмотритесь к таблице (массиву), посмотрите на двоичную запись, например, представления числа "5", мысленно нарисуйте пятерку на индикаторе. Должны гореть сегменты A, F, G, C и D - пять сегментов. Сравните с соответствующей битовой строкой приведенной таблицы (шестым элементом массива) 0b01101101, читая справа налево и припоминая, что младший бит (самый правый) соответствует сегменту А, следующий бит - сегменту В и т.д. Фактически эта битовая строка есть перечисление сегментов с А по F справа налево, в порядке подключения выводов индикатора и регистра.

Как отобразить цифру "5" на индикаторе? Перекодировать по таблице сегментов.

byte c = 5;
byte dig_to_send;

dig_to_send = digitToSegment[c];

// отправить dig_to_send в сдвиговый регистр

Теперь обратите внимание, что в таблице (массиве) digitToSegment нет явного указания сегмента DP, точки. Ей соответствовал бы старший, седьмой бит, а он всюду нулевой. Но. Мы знаем, что этот бит отвечает за отображение точки (и только точки, так подсоединяли линии). Поэтому - как отобразить цифру "5" с точкой? Составить комбинацию "пятерки" и точки. Вот так:

byte c = 5;
byte dig_to_send;

dig_to_send = digitToSegment[c];
dig_to_send |= 0b10000000;          // т.е. dig_to_send |= 0x80

// ну или одной строчкой

dig_to_send = digitToSegment[c] | 0x80;

// отправить dig_to_send в сдвиговый регистр

Ну вот так - зажечь точку отображаемой цифры 7-индикатора это выставить старший бит в "сегментном представлении" этой цифры. Т.е. возвращаясь к посту #1, таки да

dig_to_send |= 0x80

Это все.

uragan
Offline
Зарегистрирован: 23.02.2015

А если у меня 8 сегментов уже соеденены в произвольном порядке со сдвиговым регистром? Ну удобнее так было схему развести. И не обязательно точка в старшем бите. 

dhog1
Offline
Зарегистрирован: 01.03.2016

Байт с представлением точки выглядит как-то так - 0b00100000, т.е. все биты, кроме какого-то одного, нулевые. Бит, соответствующий соединительной линии между индикатором и выходом регистра для точки, ненулевой. Единственный ненулевой бит в байте.

Вот когда нужно будет высветить точку, перекодированную цифру логически объединяете с байтом представления точки

// byte_seg_dp - байт с сегментным кодом dp, где все нули и одна единица

dig_to_send |= byte_seg_dp;

... и все единички займут уготованные им места, всё правильно уйдет на индикатор, и увидит человек, что это хорошо.

 

uragan
Offline
Зарегистрирован: 23.02.2015

Спасибо. Все понятно. Что в одну строчку в моем случае нельзя. А не подскажите как взводить в единичку бит "точки" в какой- нибудь другой позиции. А позицию задавать дефайном.

dhog1
Offline
Зарегистрирован: 01.03.2016

Я тут некие глупости написал (а вы успели прочесть) по поводу конструкции switch, погорячился и подчистил пост, а зря. Исправляюсь.

Просто в вашем случае таблица (массив) будет выглядить несколько иначе. Нулевой элемент массива будет соответствовать "сегментному рисунку нуля", первый элемент - "сегментному рисунку единицы" и т.д.

Поэтому конструкция digitToSegment[<цифра>] никуда не делась, просто таблица поменялась (под вашу разводку).

Пусть у вас точка кодируется как 0b00100000 (0x20).

#define _DP   0x20

byte c;    // байт с отображаемой цифрой

// и там, где нужно высветить точку

dig_to_send = digitToSegment[c] | _DP;

// отправить dig_to_send в регистр

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Соседняя тема может пригодится http://arduino.ru/forum/programmirovanie/dva-8-mi-segmentnykh-indikatorov