|
Функция вывода времени на жк. |
|
|
|
Apr 8 2006, 16:46
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Код lcd_clear(); itoa(hour,temp); if (hour<10){lcd_putsf('0');lcd_puts(temp);}else{lcd_puts(temp);} lcd_putsf(":"); itoa(min, temp); if (min<10){lcd_putsf('0');lcd_puts(temp);}else{lcd_puts(temp);} lcd_putsf(":"); itoa(sec, temp); if (sec<10){lcd_putsf('0');lcd_puts(temp);}else{lcd_puts(temp);} - по идее этот код должен выводить на экран время в формате ЧЧ:ММ:СС причем если число часов, минут или секунд меньше 10 то перед ним добавляется 0. Однако этого почему-то не происходит (( Вместо этого если например реальное время - 08:23:09 то получается - 88:23:99 Где-же ошибка? з.ы. Среда разработки - CVAVR
|
|
|
|
|
Apr 8 2006, 17:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(beer_warrior @ Apr 8 2006, 20:33)  lcd_putsf('0') Так что же выводится символ или строка? Символ конца строки :-) :-) И что? Скажите компилятор не выругался когда ему в функции вместо указателя байт подсунули! Ну хоть сообщения читайте!
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 8 2006, 18:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Ну хоть сообщения читайте! Читаю, только вот по такому коду дельный ответ дать трудно. Скорее всего напутано с буферами, а где фиг поймешь.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Apr 8 2006, 18:16
|
Участник

Группа: Свой
Сообщений: 38
Регистрация: 25-11-05
Из: Россия, Москва
Пользователь №: 11 377

|
void lcd_putsf(char flash *str) - вывод символов из FLASH памяти void lcd_puts(char *str) - вывод из памяти данных
|
|
|
|
|
Apr 8 2006, 19:00
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Вот так объявленны переменные. char *temp; int year,month,day,hour,min,sec; Надо писать FAQ по этому вопросу - каждую неделю кто-то накалываться. char *temp - это просто указатель в никуда - ручка от чашки - а самой чашки нет. Надо писать: char temp[размер строки], а потом передавать в функцию указатель - т.е. адрес первого байта массива. lcd_puts(temp); что эквивалентно lcd_puts( &temp[0]). В качестве эксперимента можно попробовать : lcd_puts( &temp[1]);что эквивалентно temp++; lcd_puts(temp);
Сообщение отредактировал beer_warrior - Apr 8 2006, 19:01
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Apr 8 2006, 19:06
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(beer_warrior @ Apr 8 2006, 21:04)  Цитата Ну хоть сообщения читайте! Читаю, только вот по такому коду дельный ответ дать трудно. Скорее всего напутано с буферами, а где фиг поймешь. Это не к Вам относилось :-( Я имел ввиду автора который НЕ ПРОЧИТАЛ предупреждающие сообщения компилятора. Извините за невнятно изложенную мысль. Цитата(ps1x @ Apr 8 2006, 21:10)  Чесно говоря, компилятору все равно символ это или строка, кроме того он даже не заикнулся что где нибудь может быть ошибка... ЭТО ПРАКТИЧЕСКИ НЕВЕРОЯТНО, если конечно все warnings не задешены на корню в командной строке/проекте.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 8 2006, 19:15
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 22-02-06
Из: Россия, Курск
Пользователь №: 14 603

|
Для вывода одного символа лучше пользоваться оператором lcd_putchar и вообще надо для преобразования числа в сторку использовать оператор sprintf. например
char lcd_buuff[2]; // обявляем массив (это строка)
time=8; sprintf(lcd_buff,"%-i",time); if (time<10) lcd_buff[0]='0'; lcd_dotoxy(x,y); lcd_puts(lcd_buff);
|
|
|
|
|
Apr 8 2006, 21:52
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(Focus @ Apr 8 2006, 23:15)  Для вывода одного символа лучше пользоваться оператором lcd_putchar и вообще надо для преобразования числа в сторку использовать оператор sprintf. например
char lcd_buuff[2]; // обявляем массив (это строка)
time=8; sprintf(lcd_buff,"%-i",time); if (time<10) lcd_buff[0]='0'; lcd_dotoxy(x,y); lcd_puts(lcd_buff); Такой код приводит к заполнению всего дисплея (2х16) черными квадратами. Проблема не решена.
|
|
|
|
|
Apr 8 2006, 22:28
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
sprintf не совсем хороша для вывода непосредственно на LCD, т.к. в конце преобразованной строки символов '\0' добавляет. Однако если сначала формируется буфер и только потом целиком выводится на LCD, то можно и sprintf использовать. Тогда и ведущие нули не нужно самому добавлять. Код pos+=sprintf(&lcd_buf[pos],"%02u:%02u:%02u", hour, min, sec); преобразует переменные времени в строку с ведущими нулями, разделителем ':' и кроме того вернет количество символов, добавав их к текущему значению pos которое можно трактовать как позицию для смещения курсора или для добавления другой строки, что иногда тоже полезно. Если формировать строку не нужно, то pos можно и не использовать. Код sprintf(lcd_buf,"%02u:%02u:%02u", hour, min, sec);
|
|
|
|
|
Apr 8 2006, 23:42
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(rezident @ Apr 9 2006, 02:28)  sprintf не совсем хороша для вывода непосредственно на LCD, т.к. в конце преобразованной строки символов '\0' добавляет. Однако если сначала формируется буфер и только потом целиком выводится на LCD, то можно и sprintf использовать. Тогда и ведущие нули не нужно самому добавлять. Код pos+=sprintf(&lcd_buf[pos],"%02u:%02u:%02u", hour, min, sec); преобразует переменные времени в строку с ведущими нулями, разделителем ':' и кроме того вернет количество символов, добавав их к текущему значению pos которое можно трактовать как позицию для смещения курсора или для добавления другой строки, что иногда тоже полезно. Если формировать строку не нужно, то pos можно и не использовать. Код sprintf(lcd_buf,"%02u:%02u:%02u", hour, min, sec); Тоже не работает!!! (виснет) Может дело в том что я использую протеус?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|