Роман, доходчиво объяснили. Извините, что я Вас так дотошно достаю. Но хотелось бы этот вопрос довести до логического завершения.
Теперь по Вашим пунктам. Сам понимаю, что у меня быдлокод. Потому и хочу его причесать да и для себя разобраться.
ARV писал(а):индикацию сделал бы, как я делал её всегда: массив байт по числу индикаторов - экранная область. по прерыванию идет вывод этой экранной области на реальные индикаторы.
Библиотека по такому принципу и работает. Правда я в нее подописывал функции вывода времени, часов и минут. Возможно вывод можно было сделать одной функцией, добавив в нее какой-нибудь параметр, который указывал бы на принадлежность выводимых значений. Но я не допер как так красиво сделать, потому сделал как смог. но оно работает.
ARV писал(а):дополнительно к экранной обалсти массив признаков мерцания - если в этом массиве индикатор помечен, то он мерцает. мерцание в том делается в том же прерывании путем пропуска "отмеченного" индикатора втечение определенного количества циклов обновления.
в библиотеке семисегментного индикатора эта опция есть, работает нормально
ARV писал(а):таким образом, процесс вывода заключается в обновлении сордержимого экранной области и пометки мигающих позиций, если надо.
в моем коде так и реализовано
ARV писал(а):сделал бы функции вывода "текста" и "времени", которые просто выводили в экранную оласть соответствующие "символы".
выше уже написал, что в библиотеке есть функции вывода числовых значений и строк.
ARV писал(а):систему меню сделал бы так. в массиве хранил бы "текст", отображаемый на индикаторе.
Вот здесь хотелось бы поподробней. У меня есть переменная - указатель на массив строк.
Спойлер
char* str[] = { "coLc", "Fnoc", "ruoh", "ninn", // cloc conF hour min
"1t", "2t", "3t", "4t", // t1 t2 t3 t4
"no1t", "Fo1t", "no2t", "Fo2t", // t1on t1of t2on t2of
"no3t", "Fo3t", "no4t", "Fo4t", // t3on t3of t4on t4of
"FFo", "no" // off on
};
Так как вывод осуществляется справа налево в индикатор, все названия меню развернуты. Вы подразумеваете под системой меню именно логическую последовательность, или просто все используемые надписи к меню. Потому как у меня самих используемых строк 18, но некоторые строки используются по несколько раз в разных разделах меню.
ARV писал(а):логика функции навигации по меню заключалась бы в том, что брался бы очередной элемент массива "имен" пунктов, и выводился при помощи той функции, о которой писал ранее, затем ожидался бы ввод кнопки. свитчем по коду кнопки менял бы либо номер пункта меню (индкс массива), либо вызывал бы функцию "редактирования" времени.
Вот сделал функцию
Спойлер
//Функция получения кода меню в зависимости от кода нажатой кнопки
unsigned int MenuGet(char btn)
{
unsigned int keyMenu;
//если нажата кнопка OK
if (btn == BTN_SHRT_OK)
{
if (!buttonEdit)
keyMenu *= 10;
}
//если нажата кнопка LEFT
if (btn == BTN_SHRT_LEFT)
{
if (!fConf) keyMenu--;
//сбрасываю бит 6 - значит последняя операция была -
MDCR &= 0b10111111;
}
//если нажата кнопка RIGHT
if (btn == BTN_SHRT_RIGHT)
{
if (!fConf) keyMenu++;
//выставляю бит 6 в единицу, - значит последняя операция была +
MDCR |= 0b01000000;
}
//если нажата кнопка ESC
if (btn == BTN_SHRT_ESC)
{
if (keyMenu >= 10 && !fConf)
{
keyMenu /= 10;
}
}
return keyMenu;
}
Считаете, лучше сделать через switch? В данном случае эта функция просто указывает какой пункт меню нужно вывести. но для того, чтобы получить по коду меню какой текст или данные следует вывести необходимо иметь массив, который бы четко сделал привязку кода меню к пунктам меню. плюс туда же можно добавить дополнительным признаком возможность редактирования
ARV писал(а):все время (включая текущее), хранил бы в массиве. поэтому при нажатии Enter номер текущего индекса меню сразу бы соответствовал номеру структуры в массиве времен, что позволло бы его редактировать путем передачи в функцию единственного "индекса".
то есть параметры таймеров хранить в одномерном массиве с шагом 5 (так как параметров по каждому таймеру 5) и обращаться к ним по индексу, не заморачиваясь со структурой