Jo takhle, ono je to v hlavičkovém souboru
S tím const si vůbec nelam hlavu, to se tam dává proto, aby knihovní funkce nemohla omylem změnit řetezec který jí posíláš na zpracování. Ty ho v programu máš normálně a můžeš do něj zapisovat, ale kdyby se ho ta knihovna někde pokoušela měnit, tak kompilátor vyhodí chybu. Prostě na to const zapomeň, když tam necháš jen
char msg[]="... tak to bude fungovat úplně stejně a bez warningů!
Zato ten vzorec mě pěkně potrápil, než jsem přišel na to co to vlastně znamená - ten čas je v second[0] uložený v kódu BCD (Binary Coded Decimal), v horních čtyřech bitech je vyšší desítková číslice, v dolních čtyřech nižší, takže například 59 sekund bude 0x59 (= 0101 1001). To načítáš z nějakého hodinového obvodu? Tohle se tím výpočtem převádí na desítkové číslo, a to pak příkazem sprintf vepíšeš do řetězce msg:
Kód: Vybrat vše
/* odeslání znaku na displej */
void HD44780_print_byte(unsigned char b)
{
putchar(b);
}
/* vypisuje řetězec po znacích */
void HD44780_print_string(const char c[])
{
while (*c)
HD44780_print_byte(*c++);
}
/* převede číslo z BCD do desítkového */
int dec_sec(unsigned char second[])
{
int decimal_second=0;
decimal_second=(second[0]>>4)*10+(second[0]&15);
return decimal_second;
}
/* zobrazí zprávy */
int main(void)
{
char msg[]="**Hello World!**";
unsigned char second[]={0x59,0};
HD44780_print_string(msg);
putchar('\n');
sprintf(msg,"%d",dec_sec(second));
HD44780_print_string(msg);
putchar('\n');
return 0;
}
Použil jsem pro výpis funkce z toho tvého odkazu, akorát jsem si je trošičku očesal o nepotřebné parametry, aby to šlo přeložit. Pro jaký to máš mikrokontrolér?
EDIT: Ještě mě napadlo, kdybys nechtěl použít nebo neměl k dispozici funkci sprintf, tak dvoumístné číslo převedeš do msg třeba takhle:
Kód: Vybrat vše
int decimal_second;
decimal_second=(second[0]>>4)*10+(second[0]&15);
msg[0]=decimal_second/10+48;
msg[1]=decimal_second%10+48;
msg[2]='\0';
HD44780_print_string(msg);
putchar('\n');