Вт апр 02, 2019 19:46:39
/// структура элемента меню
typedef struct{
uint8_t data_id; // номер данных
char name[4]; // текст пункта меню
} menu_item_t;
/// массив пунктов меню
static menu_item_t menu[] = {
{0, "CLOC"}, // настройка часов
{1, "t1on"}, // далее настройки моментов времени 4-х таймеров
{2, "t1of"},
{3, "t2on"},
{4, "t2of"},
{5, "t3on"},
{6, "t3of"},
{7, "t4on"},
{8, "t4of"}
};
/// структура записи времени
typedef struct{
uint8_t hour;
uint8_t min;
} time_t;
/// количество пунктов меню
#define MENU_CNT (sizeof(menu) / sizeof(menu_item_t))
/// внешний массив с данными о времени
extern time_t time_array[];
/// внешняя функция вывода строки из 4 символов на экран
extern void str_to_screen(char str[4]);
/// внешняя функция вывода времени на экран
extern void time_to_scren(time_t *t);
/// внешняя функция включения мигания позиций на экране
/// позиции задается единичками в 4-х младших битах
extern void blink_scren(uint8_t pos);
/// прототип функции редактирования времени
bool edit_time(uint8_t id);
/// навигация по меню
bool menu_navigate(void){
uint8_t item = 0; // текущий пункт меню на экране
uint8_t btn; // код нажатой кнопки
while(1){
// выводим на экран название текущего пункта
str_to_screen(menu[item].name);
// ждем нажатия кнопки
btn = get_button();
// обработка кнопки
switch(btn){
case BTN_ENTER:
// включаем редактирование времени
if(edit_time(menu[item].data_id)) break;
else return false;
case BTN_ESCAPE:
// выход (отмена меню)
return false;
case BTN_LEFT:
// предыдущий пункт меню по кругу
if(--item >= MENU_CNT) item = MENU_CNT-1;
break;
case BTN_RIGHT:
// следующий пункт меню по кругу
if(++item >= MENU_CNT) item = 0;
break;
}
}
}
/// тип результата редактирования числа
typedef enum{
EDIT_OK, // редактирование закончено успешно
EDIT_ESC, // редактирование отменяется
EDIT_CONT // редактирование продолжается
} edit_result_t;
/**
* редактирование числа с ограничением максимального значения
* @param btn код нажатой кнопки
* @param data указатель на однобайтное число
* @param max верхняя граница допустимого значения (не пересекаемая)
* @return результат редактирования
*/
edit_result_t edit_int(uint8_t btn, uint8_t *data, uint8_t max){
switch(btn){
case BTN_ENTER:
// закончили редактиование
return EDIT_OK;
case BTN_ESCAPE:
// отменили редактирование
return EDIT_ESC;
case BTN_LEFT:
// уменьшаем число по кругу
if(--(*data) >= max) *data = max-1;
break;
case BTN_RIGHT:
// увеличиваем число по кругу
if(++(*data) >= max) *data = 0;
break;
}
// редактирование продожается
return EDIT_CONT;
}
/**
* редактирование времени из массива
* @param id номер записи времени в массиве
* @return если время отредактировано полностью - true
*/
bool edit_time(uint8_t id){
edit_result_t cont = EDIT_CONT; // флаг продолжения редактирования
uint8_t tmp; // временное хранилище редактируемого числа
// редактирование ЧАСОВ:
// запоминаем текущее значение часов из указанного элемента массива
// включаем мигание перых 2 позиций
// цикл продолжается, пока результат равен EDIT_CONT
for(tmp = time_array[id].hour, blink_screen(0b00001100); cont == EDIT_CONT; cont = edit_int(get_button(), &time_array[id].hour, 24));
// если вышли из цикла по отмене редактирования
if(cont == EDIT_ESC){
// восстановим прежнее значение часов
time_array[id].hour = tmp;
// выключаем мигание
blink_screen(0);
// вернем результат отмены
return false;
}
// редактирвоание МИНУТ
cont = EDIT_CONT;
for(tmp = time_array[id].min, blink_screen(0b00000011); cont == EDIT_CONT; cont = edit_int(get_button(), &time_array[id].min, 60));
if(cont == EDIT_ESC){
time_array[id].min = tmp;
blink_screen(0);
return false;
}
// если добарись до этого места - время отредактировано полностью
// выключаем мигание
blink_screen(0);
// возвращаем результат успеха
return true;
}
Вт апр 02, 2019 20:26:42
Чт апр 04, 2019 06:45:54
Чт апр 04, 2019 06:54:20
вы, конечно, можете заниматься извратом сколько угодно, но проект подобного уровня влезет не только в мегу8, но и в attiny2313 на Си без маленйших извратов. а уж на меге8 можно просто вот вообще не париться.BOB51 писал(а):то придется извратом заняться
Чт апр 04, 2019 07:29:46
Чт апр 04, 2019 07:35:02
Чт апр 04, 2019 14:19:57
Чт апр 04, 2019 14:23:21
Чт апр 04, 2019 15:34:55
Пт апр 05, 2019 14:17:26