Семисегментный LED-индикатор. Эффекты анимации
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Семисегментный LED-индикатор. Эффекты анимации
понял, согласен, если эти знаки - часть афавита (например при приеме строки извне) то конечно так удобнее
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Реклама
Re: Семисегментный LED-индикатор. Эффекты анимации
Касательно конечных автоматов (КА), о которых я упомянул на предыдущ.странице. Их задача - организовать циклическое выполнение программы и выполнение тех или иных функций упорядоченным способом.
Простейший конечный автомат представляет собой "селектор" исполняемых функций, выбираемый по входному условию. Входным условием может быть простой флаг запроса на выполнение функции с двумя состояниями ("выполнить/не выполнить"), или же более сложный алгоритм с несколькими входными состояниями в переменной, принимающей извне разные значения и в зависимости от этого выбирающий один из путей (функций) выполнения. Может быть даже несколько входных условий, определяющих путь, по которому пойдет выполнение КА.
Рассмотрим организацию работы программного цикла, содержащего три КА: автомат выбора режима отображения на дисплее, автомат обновления текущего времени на дисплее в режиме показа часов и автомат работы динамической индикации.
Главная фукнция main и главный цикл:
КА-1 - первый конечный автомат. Условие начала его выполениея - флаг change_display_flag = 1 (или любое отличное от 0 число), он является запросом на смену режима показа на дисплее и этот флаг может выставляться например в прерывании по таймеру или из другого конечного автомата. Переменная display_mode может изменяться как извне одновременно с выставлением флага change_display_flag, так и внутри конечного автомата, реализуя циклическое переключение. Зависит от требуемых задач.
Второй КА производит обновление текущего времени на дисплее в режиме показа часов. Будет выполняться только если display_mode = WATCH_MODE и update_curr_time = 1. В принципе, этот КА можно было бы не писать, перенеся его функции в предыдущий, но без смены текущего режима display_mode. Но для примера работы алгоритмов - годится.
Ну и третий КА - работа динамической индикации, переключение активного разряда индикатора. Выполняется он при dynascan_flag = 1. Этот флаг может выставляться в прерывании таймера, отсчитывающего интервал смены разрядов.
Функция ShowWatch(), вызываемая из первого КА.
Тут всё понятно, думаю. Функция запрашивает текущее время и отправляет на преобразование чисел в комбинации сегментов, которые будут зажжены на дисплее.
Остальные функции - аналогичны. Функцию DND_DynaScan() уже ранее показывал.
Анимацию сегментов при смене режима отображения можно выполнять так же в КА. Анимацию сдвига цифр - тоже.
Суть КА в том, чтобы построить циклическую структуру программы.
Простейший конечный автомат представляет собой "селектор" исполняемых функций, выбираемый по входному условию. Входным условием может быть простой флаг запроса на выполнение функции с двумя состояниями ("выполнить/не выполнить"), или же более сложный алгоритм с несколькими входными состояниями в переменной, принимающей извне разные значения и в зависимости от этого выбирающий один из путей (функций) выполнения. Может быть даже несколько входных условий, определяющих путь, по которому пойдет выполнение КА.
Рассмотрим организацию работы программного цикла, содержащего три КА: автомат выбора режима отображения на дисплее, автомат обновления текущего времени на дисплее в режиме показа часов и автомат работы динамической индикации.
Главная фукнция main и главный цикл:
Спойлер
Код: Выделить всё
uint8_t change_display_flag = 1; // флаг выполнения для КА1. При запуске от =1, чтобы сразу вывести на дисплей первый режим.
uint8_t update_curr_time = 0; // флаг выполнения для КА2
uint8_t dynascan_flag = 0; // флаг выполнения для КА3
uint8_t display_mode = 0; // переменная выбора для КА1
#define WATCH_MODE 0
#define DATA_MODE 1
#define TEMPER_MODE 2
int main(void)
{
/* функции, выполняемые до основного цикла */
/* основной бесконечный цикл работы программы */
while(1)
{
/* КА-1. Обработка запроса на смену режима дисплея */
if(change_display_flag)
{
/* Выбор режима (что будет показываться) */
switch(display_mode) {
case WATCH_MODE:
ShowWatch(); // вызов функции, выводящей часы
break;
case DATA_MODE:
ShowDate(); // вызов функции, выводящей дату
break;
case TEMPER_MODE:
ShowTemperature(); // вызов функции, выводящей температуру
break;
}
change_display_flag = 0; // сброс флага смены дисплея
}
/* КА-2. Обработка запроса на обновление показаний дисплея в режиме часов.
* Если текущий режим на дисплее - часы, и есть запрос
* изменить показываемое время */
if((display_mode == WATCH_MODE) && (update_curr_time))
{
ShowWatch(); // вызов функции, выводящей часы
update_curr_time = 0; // сброс флага запроса обновления показаний
}
/* КА-3. Обработка запроса на переключение разрядов динам.индикации дисплея.
* вызывается по флагу, который устанавливается в прерывании таймера */
if(dynascan_flag)
{
DND_DynaScan();
dynascan_flag = 0;
}
}
}
Второй КА производит обновление текущего времени на дисплее в режиме показа часов. Будет выполняться только если display_mode = WATCH_MODE и update_curr_time = 1. В принципе, этот КА можно было бы не писать, перенеся его функции в предыдущий, но без смены текущего режима display_mode. Но для примера работы алгоритмов - годится.
Ну и третий КА - работа динамической индикации, переключение активного разряда индикатора. Выполняется он при dynascan_flag = 1. Этот флаг может выставляться в прерывании таймера, отсчитывающего интервал смены разрядов.
Функция ShowWatch(), вызываемая из первого КА.
Спойлер
Код: Выделить всё
void ShowWatch(void)
{
/* переменные для десятков и единиц часов,
* десятков и единиц минут */
uint8_t dHour, uHour, dMin, uMin;
/* Получение текущего времени */
GetCurrentTime(&dHour, &uHour, &dMin, &uMin);
/* Вывод на дисплей текущего времени
* (преобразование чисел в комбинации сегментов) */
_DND_Print(dHour, uHour, dMin, uMin);
}
Остальные функции - аналогичны. Функцию DND_DynaScan() уже ранее показывал.
Анимацию сегментов при смене режима отображения можно выполнять так же в КА. Анимацию сдвига цифр - тоже.
Суть КА в том, чтобы построить циклическую структуру программы.
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Семисегментный LED-индикатор. Эффекты анимации
организация работы программного цикла это понятно, у меня другими словами написано, но суть тажаРассмотрим автомат обновления текущего времени на дисплее в режиме показа часов и автомат работы динамической индикации.Спойлер
Код:
uint8_t change_display_flag = 1; // флаг выполнения для КА1. При запуске от =1, чтобы сразу вывести на дисплей первый режим.
uint8_t update_curr_time = 0; // флаг выполнения для КА2
uint8_t dynascan_flag = 0; // флаг выполнения для КА3
uint8_t display_mode = 0; // переменная выбора для КА1
#define WATCH_MODE 0
#define DATA_MODE 1
#define TEMPER_MODE 2
int main(void)
{
/* функции, выполняемые до основного цикла */
/* основной бесконечный цикл работы программы */
while(1)
{
/* КА-1. Обработка запроса на смену режима дисплея */
if(change_display_flag)
{
/* Выбор режима (что будет показываться) */
switch(display_mode) {
case WATCH_MODE:
ShowWatch(); // вызов функции, выводящей часы
break;
case DATA_MODE:
ShowDate(); // вызов функции, выводящей дату
break;
case TEMPER_MODE:
ShowTemperature(); // вызов функции, выводящей температуру
break;
}
change_display_flag = 0; // сброс флага смены дисплея
}
/* КА-2. Обработка запроса на обновление показаний дисплея в режиме часов.
* Если текущий режим на дисплее - часы, и есть запрос
* изменить показываемое время */
if((display_mode == WATCH_MODE) && (update_curr_time))
{
ShowWatch(); // вызов функции, выводящей часы
update_curr_time = 0; // сброс флага запроса обновления показаний
}
/* КА-3. Обработка запроса на переключение разрядов динам.индикации дисплея.
* вызывается по флагу, который устанавливается в прерывании таймера */
if(dynascan_flag)
{
DND_DynaScan();
dynascan_flag = 0;
}
}
}
эффект: яркость уменьшается до нуля. меняется показание циферблата. и яркость увеличивается до назначенной яркости - работает отлично
эффект: любой эффект с сегментами благодаря Вашей "маски" - работает отлично
эффект: с разрядами (езда туды-суды) у меня затык.
мне не понятно как управлять разрядами, что писать в функции эффекта
Re: Семисегментный LED-индикатор. Эффекты анимации
А, если насчет езды туда-сюда, это, как я говорил ранее, эффект бегущей строки. Тут маска на сегменты не поможет. Тут надо изменять всё отображаемое число. Если изначально есть "1253", то при сдвиге влево нужно следующим шагом анимации вывести число "253_" ( _ - это пробел), затем еще один шаг анимации - число "53_ _", потом "5_ _ _", и в завершении "_ _ _ _ ". Чтобы вдвинуть слева направо новое число, нужно наоборот: "8 _ _ _ ", "08_ _", "908_", "1908".
Пишите простым способом. Если знаете работу с указателями, напишите через указатели.
Пишите простым способом. Если знаете работу с указателями, напишите через указатели.
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Семисегментный LED-индикатор. Эффекты анимации
да, так я пробовал. строка убегает и возвращается, все ок.Если изначально есть "1253", то при сдвиге влево нужно следующим шагом анимации вывести число "253_" ( _ - это пробел), затем еще один шаг анимации - число "53_ _", потом "5_ _ _", и в завершении "_ _ _ _ ".
А ВОТ СМЕНА "НОВОГО" числаЧтобы вдвинуть слева направо НОВОЕ число, нужно наоборот: "8 _ _ _ ", "08_ _", "908_", "1908".
наверно нужно прочесть что у нас буфере на пример время
Спойлер
if (indicate == IND_CLOCK) { // час : минdigit_out[0] = (myhour >> 4) ? (myhour >> 4) : (PROBEL);
digit_out[1] = myhour & 0x0F;
digit_out[2] = mymin >> 4;
digit_out[3] = mymin >> 4;
}
d1 = во втором разряде
и т.д.
и вызвать функцию эффект
когда придет время для смены индикации снова нужно прочесть что у нас буфере на пример температуру
присвоить d0 = digit_out[0] что в первом разряде ,
d1 = во втором разряде
и т.д.
и вызвать функцию эффект
Спойлер
void effect_down (void) {digit_out[0] = PROBEL;
digit_out[1] = PROBEL;
digit_out[2] = PROBEL;
digit_out[3] = PROBEL;
delay_ms(600);
digit_out[0] = d3;
digit_out[1] = PROBEL;
digit_out[2] = PROBEL;
digit_out[3] = PROBEL;
delay_ms(600);
digit_out[0] = d2;
digit_out[1] = d3;
digit_out[2] = PROBEL;
digit_out[3] = PROBEL;
delay_ms(600);
digit_out[0] = d1;
digit_out[1] = d2;
digit_out[2] = d3;
digit_out[3] = PROBEL;
delay_ms(600);
digit_out[0] = d0;
digit_out[1] = d1;
digit_out[2] = d2;
digit_out[3] = d3;
delay_ms(600);
}
как прочесть экран и присвоить им значения d0-d3 я никак не въеду.
Добавлено after 1 hour 41 minute 36 seconds:
во! сам написал
пошел обедать сижу и и думаю, а ведь правильно написал тонаверно нужно прочесть что у нас буфере на пример время
присвоить d0 = digit_out[0] что в первом разряде ,
d1 = во втором разряде
и т.д.
и вызвать функцию эффект
в коде поправил и вот и все эффект "туды-суды" готов
- Реклама
Re: Семисегментный LED-индикатор. Эффекты анимации
Ну воо! Шикардос
А говорили что не умеете
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
Как сторонник конечных автоматов. Хотел бы попросить ваши примеры использования разных КА. Примеры, шаблоны.
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Семисегментный LED-индикатор. Эффекты анимации
MLX90640 Вы так ловко писали примеры для часов с анимацией. наверно когда то делали такие?
и опубликовывали где то? если да то где, ссылочку киньте, интересно очень. если нет может выложите исходник или напишите статейку
и опубликовывали где то? если да то где, ссылочку киньте, интересно очень. если нет может выложите исходник или напишите статейку
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Семисегментный LED-индикатор. Эффекты анимации
спасибо MLX90640 и Dimon456 за помощь!
- Just_Fluffy
- Вымогатель припоя
- Сообщения: 532
- Зарегистрирован: Ср июн 29, 2022 16:25:45
Re: Семисегментный LED-индикатор. Эффекты анимации
23-е число, Вторник 
- Just_Fluffy
- Вымогатель припоя
- Сообщения: 532
- Зарегистрирован: Ср июн 29, 2022 16:25:45
Re: Семисегментный LED-индикатор. Эффекты анимации
есть смысл тогда разделить число и день недели.
День недели просится на 3 символа
ПОН
ВРН
СРЕ
ЧВГ
ПНЦ
СУБ
ВОС
Ибо 8t или Bt без отрыва от 23 - не читаются, как вторник.
День недели просится на 3 символа
ПОН
ВРН
СРЕ
ЧВГ
ПНЦ
СУБ
ВОС
Ибо 8t или Bt без отрыва от 23 - не читаются, как вторник.
Белая и Пушистая
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Семисегментный LED-индикатор. Эффекты анимации
ПН, 8t, CP, Чt, Пt, C6, 8С. у меня так

сегментов только 4День недели просится на 3 символа
- Just_Fluffy
- Вымогатель припоя
- Сообщения: 532
- Зарегистрирован: Ср июн 29, 2022 16:25:45
Re: Семисегментный LED-индикатор. Эффекты анимации
Serzh2000, день недели показывать отдельным экраном. 3 знакоместа из четырех.
Ибо пардон, но 238 t - не читается, как 23-Вt
а число можно с месяцем, через точечку
Ибо пардон, но 238 t - не читается, как 23-Вt
а число можно с месяцем, через точечку
Белая и Пушистая
Re: Семисегментный LED-индикатор. Эффекты анимации
[uquote="Serzh2000",url="/forum/viewtopic.php?p=4279407#p4279407"]ПН, 8t, CP, Чt, Пt, C6, 8С. у меня так
[/uquote]
bt, bc.
bt, bc.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
Изображать на семисегментниках дни недели убого. Это мое мнение. Я никогда нигде не видел индикацию дней недели, если семисегментники. И не надо. Для дней недели тогда спецсредства. Что, решать вам.
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Семисегментный LED-индикатор. Эффекты анимации
высветить отдельно температуру, число , день недели не дождёшься когда часы время покажутдень недели показывать отдельным экраном. 3 знакоместа из четырех.
и Вы действительно думаете трех значная аббревиатура лучше читается ? ВРН что это
я так не думаю
изначально эти часы показывали число-месяц. число можно забыть какое сегодня, но месяц!!!Я никогда нигде не видел индикацию дней недели, если семисегментники. И не надо.
и лично для меня актуальнее знать день недели. теперь мои часы показывают мне, число-день недели
- Just_Fluffy
- Вымогатель припоя
- Сообщения: 532
- Зарегистрирован: Ср июн 29, 2022 16:25:45
Re: Семисегментный LED-индикатор. Эффекты анимации
Serzh2000, ВРН - это ВтоРНик.
А вообще это пошло еще из каких старых, еще советских, журналов. Вроде из Радио или из МК (не помню).
Для часов на 176ИЕ12-13 предлагалось еще замутить день недели. Он типа сам по себе, а отображение делалось железной дешифрацией. Диоды или ПЗУха. Не помню, давно это было.
Но там двусимвольный вариант был.
ПН ВР СР ЧВ ПЦ СБ ВС
Я пробовала разные варианты, всё некрасиво.
В результате день недели пишу номером.
d.--1 d.--2 . . . . . d.--7
У меня одни часы на 7сегментниках показывают время - число_месяц - время - день_недели - время, 8 сек/1.5 сек/8 сек/1.5 сек
вторые - время - число_месяц - день_недели - температура_за_бортом - время 8 сек/1.5 сек/1.5 сек/2 сек
с 23 до 7 - только время. Ночью мне нафиг не надо день недели за бортом, нужно время. Причем на минимальной яркости.
А вообще это пошло еще из каких старых, еще советских, журналов. Вроде из Радио или из МК (не помню).
Для часов на 176ИЕ12-13 предлагалось еще замутить день недели. Он типа сам по себе, а отображение делалось железной дешифрацией. Диоды или ПЗУха. Не помню, давно это было.
Но там двусимвольный вариант был.
ПН ВР СР ЧВ ПЦ СБ ВС
Я пробовала разные варианты, всё некрасиво.
В результате день недели пишу номером.
d.--1 d.--2 . . . . . d.--7
У меня одни часы на 7сегментниках показывают время - число_месяц - время - день_недели - время, 8 сек/1.5 сек/8 сек/1.5 сек
вторые - время - число_месяц - день_недели - температура_за_бортом - время 8 сек/1.5 сек/1.5 сек/2 сек
с 23 до 7 - только время. Ночью мне нафиг не надо день недели за бортом, нужно время. Причем на минимальной яркости.
Белая и Пушистая
- Serzh2000
- Опытный кот
- Сообщения: 867
- Зарегистрирован: Пт фев 27, 2015 12:00:53
- Откуда: Рязанская область
Re: Семисегментный LED-индикатор. Эффекты анимации
покажите видео, очень интересно!меня одни часы на 7сегментниках показывают время - число_месяц - время - день_недели - время, 8 сек/1.5 сек/8 сек/1.5 сек
вторые - время - число_месяц - день_недели - температура_за_бортом - время 8 сек/1.5 сек/1.5 сек/2 сек
- Just_Fluffy
- Вымогатель припоя
- Сообщения: 532
- Зарегистрирован: Ср июн 29, 2022 16:25:45
Re: Семисегментный LED-индикатор. Эффекты анимации
Serzh2000, абсолютно ничего интересного на самом деле там нет. Эффектов нет. Смена показаний через угасание яркости стразу по всему дисплею. В темноте, когда яркость минимальна - показания просто меняются.
23.59
28. 8
23.59
d.--7
23.59
23.59
28. 8
d.--7
t.28°
23.59
23.59
28. 8
23.59
d.--7
23.59
23.59
28. 8
d.--7
t.28°
23.59
Белая и Пушистая


