|
Редактирование строки на ЖКИ., Ввод времени в 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, 12:16
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Дык алгоритм-то редактирования простейший. 1 уровень - "бегаем" по строке вправо-влево в заданных размером строки пределах. Если нажата кнопка, отличающаяся от "вправо"/"влево", то "проваливаемся" на второй уровень. 2 уровень - в зависимости от текущего положения курсора, редактируем какую-то конкретную переменную - year, month, day, hour, min, sec. Причем изменение ее (инкремент или декремент) идет на величину кратную положению курсора. Т.е. если редактируем вторую цифру минут, то декремент/инкремент переменной min при нажатии на кнопки "вверх"/"вниз" (или какие там у вас выделены для редактирования?) идет не на 1, а на 10. Естественно тут нужна проверка на выход за разрешенный для данной переменной диапазон значений. Например, 70 минут не бывает. Поэтому min может меняться только в пределах 0-59. При нажатии на любую другую кнопку, кроме выделенных для редактирования, возвращаемся на первый уровень.
|
|
|
|
|
Dec 16 2007, 12:47
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(rezident @ Dec 14 2007, 22:16)  Разделите логически в программе ввод, вывод и редактирование, а потом совместите их. Т.е. с помощью клавиатуры вы будете редактировать какую-то переменную время/дата. И эту же переменную выводить на экран после каждой модификации полностью. Не нужно будет ломать голову как совместить видимую позицию курсора и редактируемый символ. Переменную, наверное, необходимо сделать bin2bcd, чтобы редактировать каждую цифру числа. Пока не представляю как это все реализовать. Цитата(rezident @ Dec 16 2007, 16:16)  Дык алгоритм-то редактирования простейший. Не вижу ничего простейшего! Наоборот. Вы что, в мобильном телефоне тоже так время настраиваете? Т.е. подводите курсор на нужный символ, затем нажимаете на кнопку, отличающаяся от "вправо"/"влево". Затем кнопками "вправо"/"влево" редактируете значение времени??? Если это так, то я вам сочувствую... Если вы обратили внимание на мой код в первом посте, то у меня кнопки обрабатывается в одном уровне оператором switch. Т.е. если не нажата кнопка "вверх"/"вниз", то по умолчанию обрабатывается нажатие цифровых кнопок (если скан-код нажатой клавиши отличается от 0xff-нет нажатия).
|
|
|
|
|
Dec 16 2007, 12:52
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(alux @ Dec 16 2007, 17:39)  Не вижу ничего простейшего! Наоборот. Вы что, в мобильном телефоне тоже так время настраиваете? Т.е. подводите курсор на нужный символ, затем нажимаете на кнопку, отличающаяся от "вправо"/"влево". Затем кнопками "вправо"/"влево" редактируете значение времени??? Если это так, то я вам сочувствую... Ну не обратил я внимания, на то что у вас цифровые клавиши имеются.  Привык что у нас в приборах их нету. Сути дела это особо не меняет. Перемещение по строке - один уровень. Ввод/редактирование - другой уровень. Редактируется конкретная переменная, связанная с позицией курсора. Вот и все. Цитата(alux @ Dec 16 2007, 17:47)  (если скан-код нажатой клавиши отличается от 0xff-нет нажатия). У меня вообще-то такого не бывает. Т.е. если клавиша не нажата и/или буфер клавиатуры пуст, то возвращается код NULL, который обычно имеет значение 0x00.
|
|
|
|
Сообщений в этой теме
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  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 Цитата(rezident @ Dec 16 2007, 00:21) Дык... Dec 16 2007, 18:03 alux Цитата(Baser @ Dec 16 2007, 22:03) Может ... Dec 16 2007, 18:24  SasaVitebsk Цитата(alux @ Dec 16 2007, 22:24) В начал... Dec 16 2007, 19:40   alux Цитата(SasaVitebsk @ Dec 16 2007, 23:40) ... Dec 17 2007, 08:07  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
|
|
|