Здравствуйте,подскажите,пожалуйста, делаю часы на atmega8.
Нужно выводить время в формате 00:00:00. Вот сделал функцию, но чувствую, что этот код очень корявый. Проблема в выводе чисел:
Если 1..9, то дописываю статический 0 слева от них(01..09)
Если 10..59, то сдвигаю курсор и затираю статический 0
А можно ли по-другому решить, есть ли способы?
Код:
voidtimer(void){
lcd_gotoxy(10,1); lcd_putsf(":"); lcd_gotoxy(7,1); lcd_putsf(":"); //вывод секунд if (s>=10){
???
то есть использовать форматированный вывод (может в вашем любимом CVAVR и проще можно - подозреваю, что lcd_putsf сразу может форматированный вывод делать)...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
??? то есть использовать форматированный вывод (может в вашем любимом CVAVR и проще можно - подозреваю, что lcd_putsf сразу может форматированный вывод делать)...
совсем недавно меня убеждали, что Си не предполагает жадности а другие предлагали отказаться от оператора деления, заменив его каскадными if-ами...
используйте ассемблер, и вместо 500 байт кода получите 200, а то и меньше.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
используйте ассемблер, и вместо 500 байт кода получите 200, а то и меньше.
Вряд-ли настолько уменьшить получиться, но согласитесь, даже 1кб ради sprintf это многовато, а если это че-то типа тини или классики... за меги и иксмеги молчу, можно не задумываясь.
Добавлю:
Давайте следовать принципам того человека, что Вам сказал, что на Си не надо жадничать, и создавать встроенные системы на core2duo с гигом памяти. Тут же думать надо, под что на этом Си писать.
А насчет ассемблера хочу сказать: Вы думаете люди, которые создают эти компиляторы, на шарика там сидят? Уже давно из Си получается такой компактный asm, что даже те, кто всю жизнь писал на асме удивляются, что у компилятора за секунды получается то, что они месяц писали...
используйте ассемблер, и вместо 500 байт кода получите 200, а то и меньше.
Вряд-ли настолько уменьшить получиться, но согласитесь, даже 1кб ради sprintf это многовато, а если это че-то типа тини или классики... за меги и иксмеги молчу, можно не задумываясь.
предположим, тини13 к ЖКИ-индикатору вряд ли получится прикрутить, а с тини2313 уже можно рискнуть и sprintf использовать хотя без меги и это пахнет мазохизмом....
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 2
Рейтинг сообщений: 11
Зарегистрирован: Пт май 23, 2008 19:32:22 Сообщений: 2401 Откуда: Россия, Волгоград
Рейтинг сообщения:0 Медали: 1
__Alexander писал(а):
А насчет ассемблера хочу сказать: Вы думаете люди, которые создают эти компиляторы, на шарика там сидят? Уже давно из Си получается такой компактный asm, что даже те, кто всю жизнь писал на асме удивляются, что у компилятора за секунды получается то, что они месяц писали...
----------
улыбнуло.
_________________ Чем дальше, тем больше становлюсь занудой...
Давайте следовать принципам того человека, что Вам сказал, что на Си не надо жадничать, и создавать встроенные системы на core2duo с гигом памяти. Тут же думать надо, под что на этом Си писать.
практика показывает, что как раз над этим думать никто не намерен - иначе откуда бы такая популярность армов?
__Alexander писал(а):
Уже давно из Си получается такой компактный asm, что даже те, кто всю жизнь писал на асме удивляются, что у компилятора за секунды получается то, что они месяц писали...
не знаю, не знаю. во всяком случае WinAVR без особых извращений не делает программу менее примерно 62 байт, даже если эта программа состоит только из
Код:
intmain(void){}
а на ассемблере аналог этой программы, как вы понимаете, потребует ровно 2 байта.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
не знаю, не знаю. во всяком случае WinAVR без особых извращений не делает программу менее примерно 62 байт, даже если эта программа состоит только из
Код:
intmain(void){}
а на ассемблере аналог этой программы, как вы понимаете, потребует ровно 2 байта.
Да ладно тебе, в реальных программах картинка совсем-совсем другая. Если пишешь на 8КБ кода (мега88, тайни861) на С - получаешь при желании красивый код. На ассемблере - получится банально много букав, поддерживать сложнее, переносимость хуже и плюсов нет. Компилятор - IAR, gcc не пользую.
Больше чем два, во первых, надо обойти вектора прерываний, во вторых инициализировать стек. Но соглашусь что больше, на асме 9 байт, на Си 28. Но надо будет посмотреть в дебаге...
Больше чем два, во первых, надо обойти вектора прерываний, во вторых инициализировать стек. Но соглашусь что больше, на асме 9 байт, на Си 28. Но надо будет посмотреть в дебаге...
ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта.
а на счет "ладно тебе" - не тратьте время, я в ассемблере собаку съел, и отлично знаю все его плюсы и минусы, равно как и про Си знаю.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта..
Как это не надо? На сколько мне память не изменяет, векторам присвоен статический адрес памяти программ начиная от нулевого. И сишные компиляторы по умолчанию суют туда reti.
ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта..
Как это не надо? На сколько мне память не изменяет, векторам присвоен статический адрес памяти программ начиная от нулевого. И сишные компиляторы по умолчанию суют туда reti.
И че за команда rjmp $ ? Не видал такой.
Если вы имеете ввиду просто цикл, то да, два байта, но разве это можно назвать программой? Хотя можно , программа ведь, как-никак. Но на этом можно заканчивать разговор .
ничего обходить или инициализировать не надо. пустая программа есть rjmp $ - 2 байта..
Как это не надо? На сколько мне память не изменяет, векторам присвоен статический адрес памяти программ начиная от нулевого. И сишные компиляторы по умолчанию суют туда reti.
И че за команда rjmp $ ? Не видал такой.
Если вы имеете ввиду просто цикл, то да, два байта, но разве это можно назвать программой? Хотя можно , программа ведь, как-никак. Но на этом можно заканчивать разговор .
Так, господа, темы "Си vs Asm" уже есть, так что вы сами их найдете, или нужно подсказать, куда следует идти с такими дискуссиями из темы про вывод времени?
_________________ Оптимизм х (Опыт + Знания) = const
Карма: 2
Рейтинг сообщений: 11
Зарегистрирован: Пт май 23, 2008 19:32:22 Сообщений: 2401 Откуда: Россия, Волгоград
Рейтинг сообщения:0 Медали: 1
maglev писал(а):
Если пишешь на 8КБ кода (мега88, тайни861) на С - получаешь при желании красивый код. На ассемблере - получится банально много букав, поддерживать сложнее, переносимость хуже и плюсов нет. (??????????)
Интересно из чего такие выводы следуют???
_________________ Чем дальше, тем больше становлюсь занудой...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения