Я вот тут дорабатываю программу, написанную в IAR Embedded Workbench, для одного устройства. Мне необходимо, чтобы датчик регистрировал значения до 1000 не важно чего. В предыдущей версии достигались значения только 500, поэтому ниже описанная мной проблема не стояла.
В программе используются дробные значения. По каким-то неведомым мне причинам разработчики программы решили использовать целочисленные переменные, только в выводе на экран перед двумя последними цифрами ставить точку.
Для хранения данной переменной переменной используется тип unsigned short. Как известно, тип unsigned short может хранить максимальное значение 65535. Если мы теперь поделим его на 100, у нас получится всего лишь 655.35. А мне необходимо записывать значения до 1000 (ну, если быть точным - до 1050).
Если я просто изменяю тип переменной на unsigned long, то программа успешно выполняется (компилится), только ЖК экран при выполнении функции вывода заполнется полностью символами "/".
Хотелось бы узнать, из-за чего может происходить данная ошибка и как ее можно решить, не слишком сильно меняя код всей программы.
Вот код функции, выполняющей вывод на экран псевдодробного числа.
Код
void WriteFloatValue(unsigned short Value, unsigned char intDigits,
unsigned char fraqDigits)
{ unsigned short Divisor = INIT_DEC_MASK_VALUE;
unsigned short tmpValue;
unsigned char i,chDigit;
tmpValue = Value; // tmpValue - рабочия копия числа
// Рассматриваем целую часть числа Value
for (i=MAX_INT_POSITIONS; i>0; i--)
{ chDigit = tmpValue / Divisor; // Цифра i-го разряда числа
tmpValue -= chDigit * Divisor; // Устранение i-го разряда из числа
if (i <= intDigits) // Добрались до отображаемых разрядов
{ chDigit += 0x30; // Формируем код символа
lcdWriteData(chDigit); // Вывод цифры на индикатор
}
Divisor /= 10;
}
lcdWriteData(0x2E); // Ставим десятичную точку
// Рассматриваем дробную часть числа Value
for (i=fraqDigits; i>0; i--)
{ chDigit = tmpValue / Divisor; // Цифра i-го разряда числа
tmpValue -= chDigit * Divisor; // Устранение i-го разряда из числа
chDigit += 0x30; // Формируем код символа
lcdWriteData(chDigit); // Вывод цифры на индикатор
Divisor /= 10;
}
}
unsigned char fraqDigits)
{ unsigned short Divisor = INIT_DEC_MASK_VALUE;
unsigned short tmpValue;
unsigned char i,chDigit;
tmpValue = Value; // tmpValue - рабочия копия числа
// Рассматриваем целую часть числа Value
for (i=MAX_INT_POSITIONS; i>0; i--)
{ chDigit = tmpValue / Divisor; // Цифра i-го разряда числа
tmpValue -= chDigit * Divisor; // Устранение i-го разряда из числа
if (i <= intDigits) // Добрались до отображаемых разрядов
{ chDigit += 0x30; // Формируем код символа
lcdWriteData(chDigit); // Вывод цифры на индикатор
}
Divisor /= 10;
}
lcdWriteData(0x2E); // Ставим десятичную точку
// Рассматриваем дробную часть числа Value
for (i=fraqDigits; i>0; i--)
{ chDigit = tmpValue / Divisor; // Цифра i-го разряда числа
tmpValue -= chDigit * Divisor; // Устранение i-го разряда из числа
chDigit += 0x30; // Формируем код символа
lcdWriteData(chDigit); // Вывод цифры на индикатор
Divisor /= 10;
}
}