Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Пак въпрос за функцията sprintf
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4269
Страница 1 от 1

Автор:  Ugeen [ Чет Май 31, 2007 11:20 am ]
Заглавие:  Пак въпрос за функцията sprintf

Колеги идеята е следната.Искам да анимирам часове,минути и секунди при сверяването на часовник.Ползвам LCD .Идеята е следната.Имам брояч за сверяването Set_counter.Когато е 1 се сверяват часове,когато е 2 се сверяват минути iи когато е 3 се сверяват секунди.Искам това което се сверява да мига с честота 2Hz.Да предположим че това го правя с таймера и на всяко прекъсване ако Set_counter !=0 се изпълнява i^=1,t.e.i се променя се с честота 2Hz от 0 в 1 и обратно.Идеята ми е да ползвам предварително записани във флаша форматиращи стрингове,които да се определят с индекса i.Така в единия стринг параметъра който ще се сверява го няма,а в другия го има.На практика се получи така, че както съм написал стринговете
имам проблеми със сверяването на часовете и минутите.Когато започне да мига часа, аргумента Hour се таксува като втори и часа се изписва в полето на минутите,а те отиват на мястото на секундите. Има ли начин да направя така ,че да се извършва преобразуването което е указано след знака%,ползвайки съответния аргумент,но да не се изписва на екрана.Пробвах какви ли не варианти и не успях.Разчитам на компетентното ви мнение.Предварително благодаря.

Примерно кода е следният:
Работя с CodevisionAVRи Atmega8
unsigned char Hour,Min,Sec,Set_counter,i;
char lcd_buffer[20];
char *Hour_animation[2]={"%\n h:%.2um:%.2us","%.2uh:%.2um:%.2us"};
char *Hour_animation[2]={"%.2uh:%\n m:%.2us","%.2uh:%.2um:%.2us"};
char *Hour_animation[2]={"%.2uh:%.2um:%\n s","%.2uh:%.2um:%.2us"};

void main(void)
{
i=0;
..........................................
..........................................
..........................................
Пропускам инициализаците на портовете ,LCD-то и прекъсванията


while(1)
{

switch (Set_counter)

{
case 0: sprintf (lcd_buffer,"%.2uh:%.2um:%.2us"}; ,Hour,Min,Sec);break;
case 1: sprintf(lcd_buffer,Hour_animation[i],Hour,Min,Sec);break;
case 2: sprintf(lcd_buffer,Min_animation[i],Hour,Min,Sec);break;
case 3: sprintf(lcd_buffer,Sec_animation[i],Hour,Min,Sec);break;
}

lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);

}

}

Автор:  Ugeen [ Чет Май 31, 2007 11:31 am ]
Заглавие: 

Извинявам се това трябва да е така
char *Hour_animation[2]={"%\n h:%.2um:%.2us","%.2uh:%.2um:%.2us"};
char *Min_animation[2]={"%.2uh:%\n m:%.2us","%.2uh:%.2um:%.2us"};
char *Sec_animation[2]={"%.2uh:%.2um:%\n s","%.2uh:%.2um:%.2us"};

Автор:  solenoid [ Чет Май 31, 2007 6:59 pm ]
Заглавие: 

Ами доколкото знам, когато няма да печатиш нищо аргумента на sprintf трябва да е указател към signed int, в който се връща бройката на отпечатаните символи.
Пробвай вместо това да ползваш "пауза" вместо /n.

Автор:  miro_atc [ Чет Май 31, 2007 7:41 pm ]
Заглавие:  Re: Пак въпрос за функцията sprintf

Ugeen написа:
switch (Set_counter)

{
case 0: sprintf (lcd_buffer,"%.2uh:%.2um:%.2us"}; ,Hour,Min,Sec);break;
case 1: sprintf(lcd_buffer,Hour_animation[i],Hour,Min,Sec);break;
case 2: sprintf(lcd_buffer,Min_animation[i],Hour,Min,Sec);break;
case 3: sprintf(lcd_buffer,Sec_animation[i],Hour,Min,Sec);break;
}




Код:
sprintf (lcd_buffer,"%.2uh:%.2um:%.2us"};
if(Set_counter && !i)
{
  lcd_buffer[(Set_counter-1)<<2] = '\n';
  lcd_buffer[(Set_counter-1)<<2 +1] = ' ';
}

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/