Страница 1 из 2
Вывод времени
Добавлено: Вс авг 09, 2009 14:36:56
boobonick
Здравствуйте,подскажите,пожалуйста, делаю часы на atmega8.
Нужно выводить время в формате 00:00:00. Вот сделал функцию, но чувствую, что этот код очень корявый. Проблема в выводе чисел:
Если 1..9, то дописываю статический 0 слева от них(01..09)
Если 10..59, то сдвигаю курсор и затираю статический 0
А можно ли по-другому решить, есть ли способы?
Код: Выделить всё
void timer(void){
lcd_gotoxy(10,1);
lcd_putsf(":");
lcd_gotoxy(7,1);
lcd_putsf(":");
//вывод секунд
if (s>=10){
lcd_gotoxy(11,1);
}
if (s>59)
{
++min;
lcd_gotoxy(11,1);
lcd_putsf("0");
lcd_gotoxy(12,1);
s=0;
}
itoa(s,lcd_buffer);
lcd_puts(lcd_buffer);
//вывод Минут
if (min>=10) {
lcd_gotoxy(8,1);
}
if(min>59){
lcd_gotoxy(8,1);
lcd_putsf("0");
lcd_gotoxy(9,1);
min=0;
++chas;
}
itoa(min,lcd_buffer);
lcd_puts(lcd_buffer);
//вывод часов
if (chas>=10) {
lcd_gotoxy(5,1);
}
if (chas>24){
chas=0;
lcd_gotoxy(5,1);
lcd_putsf("0");
lcd_gotoxy(6,1);
}
itoa(chas,lcd_buffer);
lcd_puts(lcd_buffer);
}
[/code]
Добавлено: Вс авг 09, 2009 14:51:31
ARV
почему не сделать так:
Код: Выделить всё
char tmp_str[10];
sprintf(tmp_str,"%02d:02d:02d",hour,min,sec);
lcd_puts(tmp_str);
???
то есть использовать форматированный вывод (может в вашем любимом CVAVR и проще можно - подозреваю, что lcd_putsf сразу может форматированный вывод делать)...
Добавлено: Вс авг 09, 2009 15:01:09
boobonick
ARV писал(а):почему не сделать так:
Код: Выделить всё
char tmp_str[10];
sprintf(tmp_str,"%02d:02d:02d",hour,min,sec);
lcd_puts(tmp_str);
???
то есть использовать форматированный вывод (может в вашем любимом CVAVR и проще можно - подозреваю, что lcd_putsf сразу может форматированный вывод делать)...
Ого,спасибо,буду разбираться!
Добавлено: Вс авг 09, 2009 19:49:57
__Alexander
ARV писал(а):почему не сделать так:
И получить вместо 500 байт кода - 2500
Я бы сделал в обратную сторону, выводи все, но если первым символом является ноль, то выводи пробел.
x = (hour % 100) / 10;
if (x == 0) putlcd(0x20);
---------
Добавлено: Вс авг 09, 2009 20:31:07
ARV
__Alexander писал(а):ARV писал(а):почему не сделать так:
И получить вместо 500 байт кода - 2500
совсем недавно меня убеждали, что Си не предполагает жадности

а другие предлагали отказаться от оператора деления, заменив его каскадными
if-ами...
используйте ассемблер, и вместо 500 байт кода получите 200, а то и меньше.

Добавлено: Вс авг 09, 2009 20:49:41
__Alexander
ARV писал(а):
используйте ассемблер, и вместо 500 байт кода получите 200, а то и меньше.

Вряд-ли настолько уменьшить получиться, но согласитесь, даже 1кб ради sprintf это многовато, а если это че-то типа тини или классики... за меги и иксмеги молчу, можно не задумываясь.
Добавлю:
Давайте следовать принципам того человека, что Вам сказал, что на Си не надо жадничать, и создавать встроенные системы на core2duo с гигом памяти. Тут же думать надо, под что на этом Си писать.
А насчет ассемблера хочу сказать: Вы думаете люди, которые создают эти компиляторы, на шарика там сидят? Уже давно из Си получается такой компактный asm, что даже те, кто всю жизнь писал на асме удивляются, что у компилятора за секунды получается то, что они месяц писали...
-----------------------------
Добавлено: Вс авг 09, 2009 21:05:39
ARV
__Alexander писал(а):ARV писал(а):
используйте ассемблер, и вместо 500 байт кода получите 200, а то и меньше.

Вряд-ли настолько уменьшить получиться, но согласитесь, даже 1кб ради sprintf это многовато, а если это че-то типа тини или классики... за меги и иксмеги молчу, можно не задумываясь.
предположим, тини13 к ЖКИ-индикатору вряд ли получится прикрутить, а с тини2313 уже можно рискнуть и sprintf использовать

хотя без меги и это пахнет мазохизмом....
Добавлено: Вс авг 09, 2009 21:11:07
GP1
__Alexander писал(а):
А насчет ассемблера хочу сказать: Вы думаете люди, которые создают эти компиляторы, на шарика там сидят? Уже давно из Си получается такой компактный asm, что даже те, кто всю жизнь писал на асме удивляются, что у компилятора за секунды получается то, что они месяц писали...
-----------------------------

улыбнуло.
Добавлено: Вс авг 09, 2009 21:14:35
ARV
__Alexander писал(а):Давайте следовать принципам того человека, что Вам сказал, что на Си не надо жадничать, и создавать встроенные системы на core2duo с гигом памяти. Тут же думать надо, под что на этом Си писать.
практика показывает, что как раз над этим думать никто не намерен - иначе откуда бы такая популярность армов?
__Alexander писал(а):Уже давно из Си получается такой компактный asm, что даже те, кто всю жизнь писал на асме удивляются, что у компилятора за секунды получается то, что они месяц писали...

не знаю, не знаю. во всяком случае WinAVR без особых извращений не делает программу менее примерно 62 байт, даже если эта программа состоит только из
а на ассемблере аналог этой программы, как вы понимаете, потребует ровно 2 байта.
Добавлено: Вс авг 09, 2009 21:53:54
maglev
ARV писал(а):не знаю, не знаю. во всяком случае WinAVR без особых извращений не делает программу менее примерно 62 байт, даже если эта программа состоит только из
а на ассемблере аналог этой программы, как вы понимаете, потребует ровно 2 байта.
Да ладно тебе, в реальных программах картинка совсем-совсем другая. Если пишешь на 8КБ кода (мега88, тайни861) на С - получаешь при желании красивый код. На ассемблере - получится банально много букав, поддерживать сложнее, переносимость хуже и плюсов нет. Компилятор - IAR, gcc не пользую.
Добавлено: Вс авг 09, 2009 22:07:53
__Alexander
Больше чем два, во первых, надо обойти вектора прерываний, во вторых инициализировать стек. Но соглашусь что больше, на асме 9 байт, на Си 28. Но надо будет посмотреть в дебаге...
--------------------
Добавлено: Вс авг 09, 2009 22:18:09
ARV
__Alexander писал(а):Больше чем два, во первых, надо обойти вектора прерываний, во вторых инициализировать стек. Но соглашусь что больше, на асме 9 байт, на Си 28. Но надо будет посмотреть в дебаге...
ничего обходить или инициализировать не надо. пустая программа есть
rjmp $ - 2 байта.
а на счет "ладно тебе" - не тратьте время, я в ассемблере собаку съел, и отлично знаю все его плюсы и минусы, равно как и про Си знаю.
Добавлено: Вс авг 09, 2009 22:37:20
__Alexander
ARV писал(а):ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта..
Как это не надо? На сколько мне память не изменяет, векторам присвоен статический адрес памяти программ начиная от нулевого. И сишные компиляторы по умолчанию суют туда reti.
И че за команда rjmp $ ? Не видал такой.
-------------------------
Добавлено: Вс авг 09, 2009 22:41:55
__Alexander
__Alexander писал(а):ARV писал(а):ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта..
Как это не надо? На сколько мне память не изменяет, векторам присвоен статический адрес памяти программ начиная от нулевого. И сишные компиляторы по умолчанию суют туда reti.
И че за команда rjmp $ ? Не видал такой.
Если вы имеете ввиду просто цикл, то да, два байта, но разве это можно назвать программой? Хотя можно

, программа ведь, как-никак. Но на этом можно заканчивать разговор

.
-------------------------
Добавлено: Вс авг 09, 2009 22:42:34
__Alexander
ARV писал(а):ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта..
Как это не надо? На сколько мне память не изменяет, векторам присвоен статический адрес памяти программ начиная от нулевого. И сишные компиляторы по умолчанию суют туда reti.
И че за команда rjmp $ ? Не видал такой.
Если вы имеете ввиду просто цикл, то да, два байта, но разве это можно назвать программой? Хотя можно

, программа ведь, как-никак. Но на этом можно заканчивать разговор

.
-------------------------
Добавлено: Пн авг 10, 2009 19:46:54
Aheir
Так, господа, темы "Си vs Asm" уже есть, так что вы сами их найдете, или нужно подсказать, куда следует идти с такими дискуссиями из темы про вывод времени?

Добавлено: Пн авг 10, 2009 21:19:24
GP1
maglev писал(а): Если пишешь на 8КБ кода (мега88, тайни861) на С - получаешь при желании красивый код. На ассемблере - получится банально много букав, поддерживать сложнее, переносимость хуже и плюсов нет. (??????????)
Интересно из чего такие выводы следуют???

Добавлено: Пн авг 10, 2009 21:39:15
BCluster
Переносимость конечно хуже. Вы попробуйте код на асме для авр перенести на какой-нибудь другой процессор (:
Добавлено: Пн авг 10, 2009 21:47:16
GP1
но внутри семейства - ноу проблем
и что-то я не видел чтобы с пиков на авры так легко переносилось.

Добавлено: Пн авг 10, 2009 22:50:54
boobonick
Полазил по буржуйским сайтам - везде форматирование и вывод времени на ЖКИ со sprintf идет, думаю, что не с проста все это
