Вывод времени

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение 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]
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

почему не сделать так:

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

char tmp_str[10];
sprintf(tmp_str,"%02d:02d:02d",hour,min,sec);
lcd_puts(tmp_str);
???
то есть использовать форматированный вывод (может в вашем любимом CVAVR и проще можно - подозреваю, что lcd_putsf сразу может форматированный вывод делать)...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

ARV писал(а):почему не сделать так:

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

char tmp_str[10];
sprintf(tmp_str,"%02d:02d:02d",hour,min,sec);
lcd_puts(tmp_str);
???
то есть использовать форматированный вывод (может в вашем любимом CVAVR и проще можно - подозреваю, что lcd_putsf сразу может форматированный вывод делать)...

Ого,спасибо,буду разбираться!
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

ARV писал(а):почему не сделать так:
И получить вместо 500 байт кода - 2500 :))

Я бы сделал в обратную сторону, выводи все, но если первым символом является ноль, то выводи пробел.

x = (hour % 100) / 10;
if (x == 0) putlcd(0x20);



---------
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

__Alexander писал(а):
ARV писал(а):почему не сделать так:
И получить вместо 500 байт кода - 2500 :))
совсем недавно меня убеждали, что Си не предполагает жадности :) а другие предлагали отказаться от оператора деления, заменив его каскадными if-ами...
используйте ассемблер, и вместо 500 байт кода получите 200, а то и меньше. :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

ARV писал(а): используйте ассемблер, и вместо 500 байт кода получите 200, а то и меньше. :)))
Вряд-ли настолько уменьшить получиться, но согласитесь, даже 1кб ради sprintf это многовато, а если это че-то типа тини или классики... за меги и иксмеги молчу, можно не задумываясь.

Добавлю:

Давайте следовать принципам того человека, что Вам сказал, что на Си не надо жадничать, и создавать встроенные системы на core2duo с гигом памяти. Тут же думать надо, под что на этом Си писать.

А насчет ассемблера хочу сказать: Вы думаете люди, которые создают эти компиляторы, на шарика там сидят? Уже давно из Си получается такой компактный asm, что даже те, кто всю жизнь писал на асме удивляются, что у компилятора за секунды получается то, что они месяц писали... :))



-----------------------------
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

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



-----------------------------
:)) улыбнуло.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

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

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 316
Зарегистрирован: Пт апр 17, 2009 22:45:42
Откуда: Minsk

Сообщение maglev »

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

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

int main(void){}
а на ассемблере аналог этой программы, как вы понимаете, потребует ровно 2 байта.
Да ладно тебе, в реальных программах картинка совсем-совсем другая. Если пишешь на 8КБ кода (мега88, тайни861) на С - получаешь при желании красивый код. На ассемблере - получится банально много букав, поддерживать сложнее, переносимость хуже и плюсов нет. Компилятор - IAR, gcc не пользую.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Больше чем два, во первых, надо обойти вектора прерываний, во вторых инициализировать стек. Но соглашусь что больше, на асме 9 байт, на Си 28. Но надо будет посмотреть в дебаге...



--------------------
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

__Alexander писал(а):Больше чем два, во первых, надо обойти вектора прерываний, во вторых инициализировать стек. Но соглашусь что больше, на асме 9 байт, на Си 28. Но надо будет посмотреть в дебаге...
ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта.

а на счет "ладно тебе" - не тратьте время, я в ассемблере собаку съел, и отлично знаю все его плюсы и минусы, равно как и про Си знаю.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

ARV писал(а):ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта..
Как это не надо? На сколько мне память не изменяет, векторам присвоен статический адрес памяти программ начиная от нулевого. И сишные компиляторы по умолчанию суют туда reti.

И че за команда rjmp $ ? Не видал такой.



-------------------------
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

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

И че за команда rjmp $ ? Не видал такой.

Если вы имеете ввиду просто цикл, то да, два байта, но разве это можно назвать программой? Хотя можно :)) , программа ведь, как-никак. Но на этом можно заканчивать разговор :)) .



-------------------------
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

ARV писал(а):ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта..
Как это не надо? На сколько мне память не изменяет, векторам присвоен статический адрес памяти программ начиная от нулевого. И сишные компиляторы по умолчанию суют туда reti.

И че за команда rjmp $ ? Не видал такой.

Если вы имеете ввиду просто цикл, то да, два байта, но разве это можно назвать программой? Хотя можно :)) , программа ведь, как-никак. Но на этом можно заканчивать разговор :)) .



-------------------------
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

Так, господа, темы "Си vs Asm" уже есть, так что вы сами их найдете, или нужно подсказать, куда следует идти с такими дискуссиями из темы про вывод времени? :)
Оптимизм х (Опыт + Знания) = const
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

maglev писал(а): Если пишешь на 8КБ кода (мега88, тайни861) на С - получаешь при желании красивый код. На ассемблере - получится банально много букав, поддерживать сложнее, переносимость хуже и плюсов нет. (??????????)
Интересно из чего такие выводы следуют??? :shock:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Переносимость конечно хуже. Вы попробуйте код на асме для авр перенести на какой-нибудь другой процессор (:
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

но внутри семейства - ноу проблем
и что-то я не видел чтобы с пиков на авры так легко переносилось. :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Сообщение boobonick »

Полазил по буржуйским сайтам - везде форматирование и вывод времени на ЖКИ со sprintf идет, думаю, что не с проста все это :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»