Цитата(ILYAUL @ Jan 13 2011, 21:57)

1. Распоковать BCD на десятки и единицы и установить каждый отдельно. Но "вылезают" проблемы с часами и датой ( день месяца) и месяцем - не может быть 24 часа и выше и конечно 32 и выше дня.
Т.е. приходится отслеживать десятки , что бы задать диапазон изменения единиц - что "утяжеляет" программу
2. Перевести BCD to HEX ( элементарно). НО - если из 00:00 надо выставить 12:30 - 42 нажатия кнопок . Да забыл , кнопок is used всего 4 (+) (-) (MENU) (SET) Таймер 16 - свободен , можно конечно устроить "залипание" кнопки......
Вообщем за неделю так и не пришёл к окончательному пути. Help.
Только вчера закончил подменю настройки даты/времени в одном устройстве. 4 кнопки +, -, ENTER, BACK.
ENTER выбирает что настраиваем - день, месяц, год, час, минута, секунда - под соотв позицию подводится нижнее подчёркивание на LCD-индикаторе, +/- - инкремент/декремент параметра (для месяца учитывается кол-во дней (для февраля ещё и учёт високосного года)), по нажатию на BACK время сохраняется если было фактическое изменение. По нажатию и удержанию кнопки автоповтор инкремента/декремента соотв позиции. Получилось довольно удобно и оперативно настраивать время. По поводу кода - написал процедуры инкремента/декремента параметра с органичением:
Код
//----------------------------------
unsigned int incParam(unsigned int val, unsigned int low,unsigned int high)
{
unsigned int result = val;
if(result >= high) result = low;
else result++;
return result;
}
//----------------------------------
//----------------------------------
unsigned int decParam(unsigned int val, unsigned int low,unsigned int high)
{
unsigned int result = val;
if(result <= low) result = high;
else result--;
return result;
}
//----------------------------------
Применяется при настройке абсолютно всех параметров часов, занимает минимум кода.
Пример инкремента по нажатию кнопки +
Код
if(KEYBOARD.key_status & MENU_UP_KEY)
{
common_val = 1; //изменение параметра
if(common_index == 0)
{
//day
if( (LocalTime.RTC_Mon == 2) && ((LocalTime.RTC_Year % 4) == 0) )
{
//високосный год
LocalTime.RTC_Mday = incParam(LocalTime.RTC_Mday, 1, MONTH_LIMIT_DAY[LocalTime.RTC_Mon]+1);
}
else
{
LocalTime.RTC_Mday = incParam(LocalTime.RTC_Mday, 1, MONTH_LIMIT_DAY[LocalTime.RTC_Mon]);
}
}
else if(common_index == 1)
{
LocalTime.RTC_Mon = incParam(LocalTime.RTC_Mon, 1, 12);
}
else if(common_index == 2)
{
LocalTime.RTC_Year = incParam(LocalTime.RTC_Year, 2011, 2099);
}
else if(common_index == 3)
{
LocalTime.RTC_Hour = incParam(LocalTime.RTC_Hour, 0, 23);
}
else if(common_index == 4)
{
LocalTime.RTC_Min = incParam(LocalTime.RTC_Min, 0, 59);
}
else if(common_index == 5)
{
LocalTime.RTC_Sec = incParam(LocalTime.RTC_Sec, 0, 59);
}
RTC_Display_Time(&LocalTime);
//задержка отображения
setServiceTimeoutStatus(MENU_KEY_SHIFT_TIMEOUT, 35);
return;
}