Esta rutina funciona bien en Arduino y es capaz de realizar una conversión de binario 16 bits a string en 66 microsegundos (unos 1000 ciclos) es decir, es muy rápida y ocupa muy pocos bytes de código, muchísimos menos que sprintf o que el método de las divisiones.
#define BIN16_DECIMAL_DIGITS 5
void bin16_to_str(char *str, unsigned int bin) {
char maxdig, digcnt, bitcnt;
static char *p, carry;
// Clear string
p = str;
digcnt = BIN16_DECIMAL_DIGITS + 1;
do { *p++ = 0; } while (--digcnt);
// Transform binary to BCD
bitcnt = 16;
maxdig = (BIN16_DECIMAL_DIGITS - 1);
str += (BIN16_DECIMAL_DIGITS - 1);
do {
// Shift left binary number with carry
carry = 0;
if (bin & 0x8000)
carry |= 1;
bin <<= 1;
// Shift left decimal number with carry
p = str;
digcnt = BIN16_DECIMAL_DIGITS - maxdig;
do {
carry = (*p<<1) + carry;
if (carry >= 10) {
*p-- = carry - 10;
carry = 1;
if (digcnt == 1) {
maxdig--;
digcnt++;
}
}
else {
*p-- = carry;
carry = 0;
}
} while(--digcnt);
} while(--bitcnt);
// Transform BCD to ASCII
digcnt = BIN16_DECIMAL_DIGITS;
do *str-- += '0'; while (--digcnt);
}
void setup() {
Serial.begin(9600);
}
void loop() {
unsigned long timeit;
unsigned int bin;
char strnum[BIN16_DECIMAL_DIGITS + 1];
strnum[BIN16_DECIMAL_DIGITS] = 0; // End of char
timeit = millis();
for(bin=0; bin<50000; bin++) {
bin16_to_str(strnum, bin);
}
timeit = millis() - timeit;
Serial.print("50000 conversions in ");
Serial.print(timeit);
Serial.println(" milliseconds");
delay(5000);
for(bin=0; bin<50000; bin++) {
bin16_to_str(strnum, bin);
Serial.println(strnum);
}
}
Es curioso que menciones el arduino, precisamente me llego ayer un Arduino Uno, empece con Arduino hace 12 horas literalmente, en toda mi vida jamas lo habia tocado hasta que me ha llegado el Arduino Uno, lo pedi a principios de Junio y me llego ayer, casi 4 meses mas tarde tras pedirlo, y nada mas llegarme me he liado con una pantalla china que incorpora panel tactil y me esta volviendo loco, es una ILI9341 con panel tactil pero se ve que es una version muy antigua, porque usa un driver SPFD-5408, pero lo curioso es que a diferencia de las mas modernas que tienen los pines en la parte estrecha del PCB, esta mas antigua tiene 2 hileras de pines en la parte ancha y encaja a la perfeccion en los slots del Arduino Uno, pero no tengo ni idea de que puertos tengo libres en el 328 tras acoplarle la pantalla, la pantalla la he encendido y he hecho mi primer trabajo con exito, un contador a la inversa, pero controlar la pantalla tactil es otro cantar, se ha convertido en toda una odisea, no consigo que obedezca a la pulsacion tactil sin que el contador deje de funcionar.

Creo que voy a pedir un Arduino Mega 2560 porque aunque la potencia y capacidad del arduino uno de momento me es suficiente para controlar una TFT y un panel tactil, el tener 28 pins me corta las alas porque necesito varios pins libres y ahora mismo no tengo ni idea de cuantos pins me ha dejado libres la pantalla, fisicamente mirandolo la pantalla tiene 28 pines conectados a la placa del arduino y ni un solo pin esta descocupado,

Con que tuviese 2 o 3 libres me seria de momento suficiente para que el contador funcione con el panel tactil y active esos 2 o 3 pins libres cuando el contador esta en marcha y los desactive cuando finaliza.
Voy a intentar sacar el 328P de su placa y colocarlo en una proto para ver si puedo trabajar con la TFT+tactil desde la proto y asi poder usar los pines que me deja libres, si es que deja alguno.