Семисегментный LED-индикатор. Эффекты анимации

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Ivanoff-iv »

понял, согласен, если эти знаки - часть афавита (например при приеме строки извне) то конечно так удобнее
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение MLX90640 »

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

Рассмотрим организацию работы программного цикла, содержащего три КА: автомат выбора режима отображения на дисплее, автомат обновления текущего времени на дисплее в режиме показа часов и автомат работы динамической индикации.

Главная фукнция 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;
		}
	}
}
КА-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(), вызываемая из первого КА.
Спойлер

Код: Выделить всё

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-индикатор. Эффекты анимации

Сообщение Serzh2000 »

Рассмотрим автомат обновления текущего времени на дисплее в режиме показа часов и автомат работы динамической индикации.
СпойлерКод:
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;
}
}
}
организация работы программного цикла это понятно, у меня другими словами написано, но суть тажа
эффект: яркость уменьшается до нуля. меняется показание циферблата. и яркость увеличивается до назначенной яркости - работает отлично
эффект: любой эффект с сегментами благодаря Вашей "маски" - работает отлично
эффект: с разрядами (езда туды-суды) у меня затык.

мне не понятно как управлять разрядами, что писать в функции эффекта
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение MLX90640 »

А, если насчет езды туда-сюда, это, как я говорил ранее, эффект бегущей строки. Тут маска на сегменты не поможет. Тут надо изменять всё отображаемое число. Если изначально есть "1253", то при сдвиге влево нужно следующим шагом анимации вывести число "253_" ( _ - это пробел), затем еще один шаг анимации - число "53_ _", потом "5_ _ _", и в завершении "_ _ _ _ ". Чтобы вдвинуть слева направо новое число, нужно наоборот: "8 _ _ _ ", "08_ _", "908_", "1908".
Пишите простым способом. Если знаете работу с указателями, напишите через указатели.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Serzh2000 »

Если изначально есть "1253", то при сдвиге влево нужно следующим шагом анимации вывести число "253_" ( _ - это пробел), затем еще один шаг анимации - число "53_ _", потом "5_ _ _", и в завершении "_ _ _ _ ".
да, так я пробовал. строка убегает и возвращается, все ок.
Чтобы вдвинуть слева направо НОВОЕ число, нужно наоборот: "8 _ _ _ ", "08_ _", "908_", "1908".
А ВОТ СМЕНА "НОВОГО" числа :dont_know:

наверно нужно прочесть что у нас буфере на пример время
Спойлер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;

}
присвоить d0 = digit_out[0] что в первом разряде ,
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 = во втором разряде
и т.д.
и вызвать функцию эффект
пошел обедать сижу и и думаю, а ведь правильно написал то :idea:
в коде поправил и вот и все эффект "туды-суды" готов :))) правда сточками подумать надо

Реклама
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение MLX90640 »

Ну воо! Шикардос :) А говорили что не умеете
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Demiurg »

Как сторонник конечных автоматов. Хотел бы попросить ваши примеры использования разных КА. Примеры, шаблоны.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Serzh2000 »

MLX90640 Вы так ловко писали примеры для часов с анимацией. наверно когда то делали такие?
и опубликовывали где то? если да то где, ссылочку киньте, интересно очень. если нет может выложите исходник или напишите статейку :beer:
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Serzh2000 »

спасибо MLX90640 и Dimon456 за помощь! :beer:

Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Just_Fluffy »

А что такое 238t ?
Белая и Пушистая
Up2805
Встал на лапы
Сообщения: 148
Зарегистрирован: Сб июн 04, 2022 05:21:07

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Up2805 »

23-е число, Вторник :)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Just_Fluffy »

есть смысл тогда разделить число и день недели.
День недели просится на 3 символа
ПОН
ВРН
СРЕ
ЧВГ
ПНЦ
СУБ
ВОС


Ибо 8t или Bt без отрыва от 23 - не читаются, как вторник.
Белая и Пушистая
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Serzh2000 »

ПН, 8t, CP, Чt, Пt, C6, 8С. у меня так :wink:
День недели просится на 3 символа
сегментов только 4 :dont_know:
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Just_Fluffy »

Serzh2000, день недели показывать отдельным экраном. 3 знакоместа из четырех.
Ибо пардон, но 238 t - не читается, как 23-Вt
а число можно с месяцем, через точечку
Белая и Пушистая
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение OKF »

[uquote="Serzh2000",url="/forum/viewtopic.php?p=4279407#p4279407"]ПН, 8t, CP, Чt, Пt, C6, 8С. у меня так :wink:[/uquote]
bt, bc.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Demiurg »

Изображать на семисегментниках дни недели убого. Это мое мнение. Я никогда нигде не видел индикацию дней недели, если семисегментники. И не надо. Для дней недели тогда спецсредства. Что, решать вам.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Serzh2000 »

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

и Вы действительно думаете трех значная аббревиатура лучше читается ? ВРН что это :shock:

я так не думаю :sleep:

Изображение
Я никогда нигде не видел индикацию дней недели, если семисегментники. И не надо.
изначально эти часы показывали число-месяц. число можно забыть какое сегодня, но месяц!!!
и лично для меня актуальнее знать день недели. теперь мои часы показывают мне, число-день недели :)))
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Just_Fluffy »

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 - только время. Ночью мне нафиг не надо день недели за бортом, нужно время. Причем на минимальной яркости.
Белая и Пушистая
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Serzh2000 »

меня одни часы на 7сегментниках показывают время - число_месяц - время - день_недели - время, 8 сек/1.5 сек/8 сек/1.5 сек
вторые - время - число_месяц - день_недели - температура_за_бортом - время 8 сек/1.5 сек/1.5 сек/2 сек
покажите видео, очень интересно! :shock:
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Just_Fluffy »

Serzh2000, абсолютно ничего интересного на самом деле там нет. Эффектов нет. Смена показаний через угасание яркости стразу по всему дисплею. В темноте, когда яркость минимальна - показания просто меняются.
23.59
28. 8
23.59
d.--7
23.59

23.59
28. 8
d.--7
t.28°
23.59
Белая и Пушистая
Ответить

Вернуться в «AVR»