Страница 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 байт, даже если эта программа состоит только из

Код: Выделить всё

int main(void){}
а на ассемблере аналог этой программы, как вы понимаете, потребует ровно 2 байта.

Добавлено: Вс авг 09, 2009 21:53:54
maglev
ARV писал(а):не знаю, не знаю. во всяком случае WinAVR без особых извращений не делает программу менее примерно 62 байт, даже если эта программа состоит только из

Код: Выделить всё

int main(void){}
а на ассемблере аналог этой программы, как вы понимаете, потребует ровно 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) на С - получаешь при желании красивый код. На ассемблере - получится банально много букав, поддерживать сложнее, переносимость хуже и плюсов нет. (??????????)
Интересно из чего такие выводы следуют??? :shock:

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

Добавлено: Пн авг 10, 2009 21:47:16
GP1
но внутри семейства - ноу проблем
и что-то я не видел чтобы с пиков на авры так легко переносилось. :wink:

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