Как собрать число для регистра
- Войдите на сайт для отправки комментариев
Пнд, 30/05/2016 - 13:34
Чтобы засветить, например, число с точкой в одном разряде на семисегментике. Если есть отдельно число и точка.
Чтобы засветить, например, число с точкой в одном разряде на семисегментике. Если есть отдельно число и точка.
Например поднять старший (левый) бит отсылаемого 7-сегментнику числа: dig_to_send |= 0x80
Число к этому времени уже перекодировано в представление сегментов индикатора.
Т е универсального алгоритма нет? Поясню. Есть два числа размером по одному байту. По какому правилу их соединить, чтобы в конечном числе все еденички оказались на своих местах в итоговом.
Алгоритмы - фигня, если нет понимания вопроса (это о себе).
Вот какие-то 2 числа. Их зачем-то нужно соединить, ну предположим, и получить некое конечное число, оно же итоговое. Уже чудесатее, но пока понять можно. Но вот кто такие "единички" и какие такие "свои" места у них имеются... Тут мысль останавливается.
В сдвиговый регистр нужно загнать число с точкой или без точки. Как сделать?
В сдвиговый регистр загоняется не число, а цифра. Одна цифра из тех, что образуют число. Как правило эта цифра предварительно перекодируется в "представление сегментов индикатора", т.е. из цифры получают последовательность бит (8 штук, байт), зажигающую определенную последовательность сегментов индикатора.
Эту цифру можно отобразить с точкой или без точки. Как зажечь точку (если она есть на индикаторе) см. пост 1.
Спасибо, что перевели мой вопрос. И как это сделать?
Пожалуйста.
Насчет "как это сделать?" А вы точно не издеваетесь? Потому как "собрать число", "регистр" и "сдвиговый" - на мой взгляд весьма умные слова, подразумевающие определенный уровень знаний.
Дабы не плодить флуд. Охотно расскажу как это делается. Для этого пришлите, пожалуйста, свой код, т.е. _как_ вы пытаетесь это сделать, и хотя бы на словах опишите схему подключения 7-индикатора к регистру или чему там.
Ну или перечитайте пост #1.
Код то для этого зачем? Есть цифры А и В байтовые. Нужно А ??? В = С. Где ??? - некий алгоритм.
uragan, ни фига не понятно. Что у вас, цифры или данные для индикатора? Это разные вещи. Если данные, то два байта можно склеить в одно слово сдвиганием старшего байта на 8 бит. Если нужно 2 одиночные цифры склеить в двузначное число, то нужно умножить старшую цифру на 10 и сложить с младшей.
А и В отдельные байтовые цифры. В сдвиговый регистр нужно затолкать одну цифру С. Вот ее нужно предварительно собрать из А и В.
" Или лыжи не едут, или я ..."
Подробнее. Отображение информации на 3-х разрядном семисегментном индикаторе. Возможные сочетания записаны в массив в виде цифры байтового размера. На индикатор загоняются через сдвиговый регистр. По таймеру переключаются разряды. Есть необходимость отображать цифру с точкой. Для этого можно увеличить массив на 10 элементов или лишний раз дергать разряд, отображая только точку. Вот мне и подумалось, чтобы этого избежать , если есть необходимость, вначале сформировать цифру с точкой в один байт, а после уже отображать на индикаторе в один шаг. Как сформулировать запрос не знаю. Но задача для программиста представляется достаточно тривиальной.
uragan, значит всё таки байт данных. Вам уже в #1 ответили как установить отдельно взятый бит.
С одним битом допустим разобрались. Хотя и несколько кривоватенько. А если обобщить и усложнить. Есть такая операция в одну строчку?
Это просто праздник какой-то.
2 uragan
Разумеется такая обобщенная и усложненная операция есть. Но она секретна, как и ваш код, только еще секретнее. Ни один Программист вам эту тайну Мальчиша не выдаст, ибо потеряет тут же свою силу над прочими людишками и даже такие посты, как этот, писать уже не сможет. Поэтому вам все время подсовывают кривоватенькие решения, и то лишь для одного бита (напомню, что всего их 8, и это есть байт).
И да, если что - у этих так сказать "программистов" с лыжами все в полном порядке.
Прикалываетесь. Кода нет. Как же я его напишу, если нет алгоритма самого важного? Про биты и байты я уже почти год как в курсе. Вроде уже разобрались, что требуется, а ответа нет. Может уже скажете, как должен был прозвучать вопрос, чтобы получить на него ответ.
Ладно, извините, 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" на индикаторе? Перекодировать по таблице сегментов.
Теперь обратите внимание, что в таблице (массиве) digitToSegment нет явного указания сегмента DP, точки. Ей соответствовал бы старший, седьмой бит, а он всюду нулевой. Но. Мы знаем, что этот бит отвечает за отображение точки (и только точки, так подсоединяли линии). Поэтому - как отобразить цифру "5" с точкой? Составить комбинацию "пятерки" и точки. Вот так:
Ну вот так - зажечь точку отображаемой цифры 7-индикатора это выставить старший бит в "сегментном представлении" этой цифры. Т.е. возвращаясь к посту #1, таки да
dig_to_send |= 0x80
Это все.
А если у меня 8 сегментов уже соеденены в произвольном порядке со сдвиговым регистром? Ну удобнее так было схему развести. И не обязательно точка в старшем бите.
Байт с представлением точки выглядит как-то так - 0b00100000, т.е. все биты, кроме какого-то одного, нулевые. Бит, соответствующий соединительной линии между индикатором и выходом регистра для точки, ненулевой. Единственный ненулевой бит в байте.
Вот когда нужно будет высветить точку, перекодированную цифру логически объединяете с байтом представления точки
... и все единички займут уготованные им места, всё правильно уйдет на индикатор, и увидит человек, что это хорошо.
Спасибо. Все понятно. Что в одну строчку в моем случае нельзя. А не подскажите как взводить в единичку бит "точки" в какой- нибудь другой позиции. А позицию задавать дефайном.
Я тут некие глупости написал (а вы успели прочесть) по поводу конструкции switch, погорячился и подчистил пост, а зря. Исправляюсь.
Просто в вашем случае таблица (массив) будет выглядить несколько иначе. Нулевой элемент массива будет соответствовать "сегментному рисунку нуля", первый элемент - "сегментному рисунку единицы" и т.д.
Поэтому конструкция digitToSegment[<цифра>] никуда не делась, просто таблица поменялась (под вашу разводку).
Пусть у вас точка кодируется как 0b00100000 (0x20).
Соседняя тема может пригодится http://arduino.ru/forum/programmirovanie/dva-8-mi-segmentnykh-indikatorov