|
Редактирование строки на ЖКИ., Ввод времени в RTC |
|
|
|
Dec 14 2007, 16:53
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Простая, казалось бы на первый взгляд задача... Но вот уже вторые сутки ломаю голову. Не могу придумать как это лучше сделать. Хочу, как в мобильном телефоне настраивать время. Вот мой кусок кода: Код void EditTime_Func(void) { unsigned char temp; rtc_get_time(0x99); //значение времени в yr, mn, dt, dy, hr, min, sec ClearScreen(); // display clear GotoXY(0,0); sprintf_P(lcd_buf,"%d/%d/%d %d %02d:%02d:%02d", yr, mn, dt, dy, hr, min, sec); PutStr(lcd_buf); w=CharWidth(*plcd_buf)-2; start_Timer(TIMER_0, 500, blink, TIMER_CYCLE);
for(;;) { temp=key_get(); switch(temp) //key_code.scan { case LEFT: //k_esc {......} break; case RIGHT: //k_enter {......} break; case DOWN: //k_left {......} break; case UP: //k_right {......} break; default: // 0...9 {......} break; } if(key_code.scan == LEFT) //выход из функции { stop_Timer(TIMER_0); break; } } }
//------------------------------------------------------------------------------ void blink(void) { InvertRect(x, y, w, 9); } Идея такая. Вывожу на экран значение времени в виде строки: "2007/12/24 1 12:32:00" Ф-ция start_Timer() запускает каждые 0,5 сек ф-цию blink(), которая в свою очередь инвертирует заданный прямоугольник. Т.е. должно мигать текущее знакоместо. Кнопками UP, DOWN выбираю следующее, предыдущее знакоместо. Ввод числа осуществляется с клавиатуры 4х4. Это все у меня работает. Проблема еще в том, что символы имеют переменную ширину. Поэтому после каждого ввода символа необходимо ,наверное, перерисовывать всю строку. После нажатия ENTER новые значения переменных необходимо записать в RTC. Как сделать ввод чисел только в заданные места, т.е. пропускать '/' , ' ' , ':' ? Меня не покидает чувство, что изобретаю велосипед.
|
|
|
|
|
 |
Ответов
|
Dec 16 2007, 18:03
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(rezident @ Dec 16 2007, 00:21)  Дык у каждого процесса своя переменная заданного периода. Простым вычитанием двух беззнаковых переменных определяется закончился требуемый процессу интервал времени или еще нет. Понятно, только я прикинул, что по количеству используемых флагов, регистров и всего оверхеда ваш вариант получается примерно равноценен моему. Так что, действительно, хозяин-барин Цитата(rezident @ Dec 16 2007, 00:21)  Это довольно плохие контакты. Я не припомню, чтобы мы применяли кнопки у которых дребезг превышал 10мс. Обычно не более единиц мс. Это я неточно выразился, имел в виду что через 50-70 мс нажатия взводится флаг. Цитата(alux @ Dec 14 2007, 18:53)  Проблема еще в том, что символы имеют переменную ширину. Поэтому после каждого ввода символа необходимо ,наверное, перерисовывать всю строку. Я как-то упустил главную мысль вопроса Может речь идет о том, что применяется графический LCD с разноширинными шрифтами? Если это так, то просто примените моноширинный шрифт (типа courier). Тогда не будет нужды перерисовывать строку во время редактирования. Цитата(alux @ Dec 16 2007, 14:47)  Переменную, наверное, необходимо сделать bin2bcd, чтобы редактировать каждую цифру числа. Пока не представляю как это все реализовать. Если же речь не об этом, а о том каким образом редактировать отдельную цифру в бинарной переменной, то тогда ваша мысль правильная: - бинарное число читается из часов, преобразуется в BCD или ASCII, выводится на дисплей; - далее в том же виде (BCD или ASCII) редактируется по одной цифре; - преобразуется обратно в бинарный вид и сохраняется в часах.
|
|
|
|
|
Dec 16 2007, 19:40
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(alux @ Dec 16 2007, 22:24)  В начале я упоминал, что символы имеют разную ширину. Очевидно, что речь идет об графическом индикаторе. В данном случае 128х64. Я специально потратил два дня на создание этих разноширинных шрифтов. Теперь вы мне предлагаете отказаться от этого только потому, что так было бы проще.  По-моему, это глупо. Я, в одном изделии, применяю разные шрифты - моноширинные и разноширинные. И, я высказываю своё личное мнение, мне кажется что вы мешаете всё в кучу. У вас должно быть разделение. Уровень работы со шрифтами и уровень вывода, грубо говоря. Уровень работы со шрифтами - это уровень драйвера дисплея, а уровень вывода текста - уровень прикладной. Это значит что на этом уровне не должно иметь значения как выводится информация. То есть не имеет смысла это обсуждать или имеет смысл завести две темы - два вопроса. (Один из вариантов решения проблемы уровня драйвера вы приводите сами (насколько я понял) - вы регенерируете изображение полностью при его изменении. Могу отметить, что это не единственный способ) То что вам предложили - а именно использование моноширинного фонта - это не из-за проблем с выводом, а рекомендации для получения "красивой" картинки. Я в этом сам убедился. Дело в том, что при применении разноширинных шрифтов цифры времени будут немного "плясать" по понятной причине, что не очень приятно для глаза. Вас не призывают отказаться от применения этих шрифтов. Вам предлагают в данном месте применить моноширинные. А это не одно и тоже. Я, к примеру так и сделал. Но, я повторяю, писать надо так, чтобы изменение номера шрифта - никак не сказалось на работоспособности программы. Цитата Извините, не понял что этим сказано. Если используется "более менее универсальные способы" , то это по-вашему плохо? Нет не плохо. Но иногда универсальность вредит удобству использования. У меня, к примеру, в редакторе используется возможность прямого ввода значения и +/-. Но есть и моменты, которые вам, как мне кажется, не подойдут. С другой стороны, у меня вводится признак типа редактируемого значения. Там есть значение int8, int16, real. Можно добавить и date. Если размер свободной флэш позволяет, то можно использовать универсальные способы. Жаль что я поздно стал работать с СИ. Иначе и вам бы помог и самому бы сейчас было бы полегче. Наработано было бы больше.
|
|
|
|
|
Dec 17 2007, 08:07
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(SasaVitebsk @ Dec 16 2007, 23:40)  То что вам предложили - а именно использование моноширинного фонта - это не из-за проблем с выводом, а рекомендации для получения "красивой" картинки. Я в этом сам убедился. Дело в том, что при применении разноширинных шрифтов цифры времени будут немного "плясать" по понятной причине, что не очень приятно для глаза... У разноширинного шрифта одно главное преимущество - компактность. Для меня это самое главное. Я вначале начал с моноширинных. Но текcты меню пришлось писать сокращенно, что не есть хорошо. Например, надпись "hello, world!" моноширинным 7х10_bold занимает 13х8=104 пикселя. Почти весь экран. В то время как разноширинным - 69. Разница - очевидна. Может вы не заметили, я немного изменил задачу вывода времени. Каждая переменная выводится отдельной строкой. Т.е. при вводе чисел, например, года (2007) картинка меняется на один пиксель, в случае ввода '1'или '4'. Что не так "ужасно", как вы описали. Возможно, при динамическом выводе результатов измерения (до этого пока дело не дошло) меня это станет раздражать. Мне ничего не стоит добавить в фонт '1' пустой столбец, а в '4' убрать последний и сделать таким образом все числа моноширинными (все остальные у меня имеют ширину 5 байт). А проблему с вводом чисел я решил. Все равно сделал по-своему  Спасибо всем за ответы. Хотелось бы побольше конкретики... Отдельное спасибо zltiqo за реальную помощь. На полном серьезе. Он понял меня с первого раза. Есть еще немало вопросов. Но об этом позже...
|
|
|
|
Сообщений в этой теме
alux Редактирование строки на ЖКИ. Dec 14 2007, 16:53 SasaVitebsk Я реализовывал такую задачу. Правда на ассемблере ... Dec 14 2007, 17:27 rezident Разделите логически в программе ввод, вывод и реда... Dec 14 2007, 18:16 Baser Цитата(rezident @ Dec 14 2007, 20:16) Раз... Dec 14 2007, 20:32  alux Цитата(Baser @ Dec 15 2007, 00:32) Всегда... Dec 15 2007, 09:57   Baser Цитата(alux @ Dec 15 2007, 11:57) Можете ... Dec 15 2007, 16:15    rezident Цитата(Baser @ Dec 15 2007, 21:15) - Один... Dec 15 2007, 20:28     Baser Цитата(rezident @ Dec 15 2007, 22:28) А я... Dec 15 2007, 21:49      rezident Цитата(Baser @ Dec 16 2007, 02:49) При та... Dec 15 2007, 22:21 Сергей Борщ Цитата(alux @ Dec 14 2007, 18:53) Проблем... Dec 16 2007, 10:01 alux Цитата(Сергей Борщ @ Dec 16 2007, 14:01) ... Dec 16 2007, 11:47  SasaVitebsk Цитата(alux @ Dec 16 2007, 15:47) В каких... Dec 16 2007, 15:23   alux Цитата(SasaVitebsk @ Dec 16 2007, 19:23) ... Dec 16 2007, 15:51 zltigo Цитата(Сергей Борщ @ Dec 16 2007, 12:01) ... Dec 16 2007, 11:55  alux Цитата(zltigo @ Dec 16 2007, 15:55) Все э... Dec 16 2007, 13:09 SasaVitebsk Тоже делаю временные метки.
Сейчас сделаю отдельну... Dec 16 2007, 10:50 rezident Дык алгоритм-то редактирования простейший.
1 урове... Dec 16 2007, 12:16 alux Цитата(rezident @ Dec 14 2007, 22:16) Раз... Dec 16 2007, 12:47  rezident Цитата(alux @ Dec 16 2007, 17:39) Не вижу... Dec 16 2007, 12:52  zltigo Цитата(alux @ Dec 16 2007, 14:47) А можно... Dec 16 2007, 13:13   alux Если не жалко, выложите код. Dec 16 2007, 13:26    zltigo Цитата(alux @ Dec 16 2007, 15:26) Если не... Dec 16 2007, 13:41  Baser Цитата(alux @ Dec 16 2007, 20:24) В начал... Dec 16 2007, 19:48 SasaVitebsk Вы можете добавить ещё один фонт состоящий только ... Dec 17 2007, 16:50 alux При выводе на экран строки, например шрифтом 7х10,... Dec 18 2007, 19:41 SasaVitebsk А какой у вас дисплей/контроллер? Dec 18 2007, 20:20 alux MT12864J ks0108
Добавлено
Простите за тупой воп... Dec 18 2007, 21:26 Сергей Борщ Цитата(alux @ Dec 18 2007, 23:26) А если ... Dec 19 2007, 19:21 SasaVitebsk Примерный смысл дойдёт из конструкции.
Код maska =... Dec 19 2007, 15:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|