Эх, жалко, что я в 1998году выбрал профессию инженера-электрика а не программиста, когда поступал в университет. Так бы я сейчас понимал о чем вы говорите.
К слову, сегодня ночью я дописал исходный код своего листинга, в котором используется стандартная функция itoa. И выводится число и символьный массив разной длины через универсальную функцию вывода по USART. Вы мне в прошлых постах помогли с прерываниями по USART и у меня заработала функция вывода, которую я переписывал из учебника Шпака. Данный листинг будет, наверное, полезен новичкам, типо меня. Он экономичнее в три раза функции printf. Чего я и добивался.
//********************************************************************************
//
// Автор : DruidCat
//
// МК : ATMega8L
//
// Компилятор : WinAVR
//
// Назначение : Выводим число и строку по USART через универсальную функцию
//
// Дата : 18.08.2012
//
//********************************************************************************
#include <avr/io.h>
#include <util/delay.h> //Для вызова функции _delay_ms()
#include <avr/interrupt.h> //Для доступа к функции sei()
#define F_CPU 8000000UL //Частота МК
#define USART_SPEED 9600 //Скорость USART желаемая
#define BAUD ((F_CPU/(USART_SPEED*16UL)) + 1) //Формула расчета БОД
#include <stdlib.h> //Вызов функции itoa, ltoa
unsigned char queueC, sendC; //Индексы текущего и переданного символа
unsigned char queue[50]; //Очередь
ISR(USART_TXC_vect){ //Подпрограмма обработки прерывания при завершении передачи очередного символа
if (queueC != sendC) UDR = queue[sendC++]; //Если был передан не последний символ, то передаем текущий и увеличиваем счетчик переданных на 1
}
void SEND_USART(char *s){ //Функция формирования очереди символов из строки
queueC = 0; //Текущий символ - первый
sendC = 1; //Первый символ считаем уже переданным
queue[queueC++] = 0x0D; //Добавляем в конец очереди символы
queue[queueC++] = 0x0A; //возврата каретки и переноса строки
while (*s) queue[queueC++] = *s++; //Просматриваем строку и помещаем в очередь символы
UDR = queue[0]; //Передаем первый символ, чтоб начать процесс
}
void INIT_USART(void){ //Функция настройка USART
UCSRB = (0<<RXCIE)|(1<<TXCIE)|(0<<RXEN)|(1<<TXEN); //Активизируем прерывание по окончание передачи и передатчик
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //размер слова 8 разрядов
UBRRH = (unsigned char)(BAUD >> 8 ); //Скорость передач
UBRRL = (unsigned char)BAUD; //Скорость передач
}
int main (void){
INIT_USART(); //Вызываем функцию для настройки USART
char HIGHT[] = "Высота 239"; //Массив символов HIGHT
long int NUMBERS = 1234567; //Число для преобразования NUMBERS
char *CHAR_NUMBERS; //Результат преобразования будет сюда записываться CHAR_NUMBERS
char BUFFER[20]; //Символьный буфер преобразуемого числа
CHAR_NUMBERS = ltoa(NUMBERS, BUFFER, 10); //Отсылаем в функцию ltoa число
sei(); //Разрешаем прерывание
while (1){ //Бесконечный цикл
SEND_USART(CHAR_NUMBERS); //Отсылаем массив CHAR_NUMBERS в функцию SEND_USART
_delay_ms(1000); //Пауза в 1сек
SEND_USART(HIGHT); //Отсылаем массив HIGHT в функцию SEND_USART
_delay_ms(1000); //Пауза в 1сек
}
}
PS: Спасибо всем кто мне помогал, приятно понимать, что такие грамотные ребята помогают новичкам, типо меня.

Кот должен прожить жизнь без сожаления.