что такое BCD и для чего оно нужноBCD - Binary Coded Decimal -- это десятичное кодированное двоичным
Binay Coded Decimal- это кодирование которое упрощает хранение,доступ к ним и конвертацию данных для вывода к примеру на ЖКИ.
В результате конвертации мы в байте (8-bit) будем иметь два нибла (4-bit) каждый из которых будет содержать число
в размере от 0 до 16.Таким образом это позволяет нам хранить в каждом нибле десятичное число от 0 до 9 и два в одном
байте, тоесть в оном байте два десятичных числа.
Пример конвертации десятичного числа переменной mybyte если её значение находится в пределах от 0 до 99:
Код
char mybyte = 78;
Объявим переменную для значения старшего нибла.
Код
char upper_nibble = 0;
//Подсчитаем колличество десятков в переменной mybyte.
while (mybyte >= 10)
{
upper_nibble++;
mybyte -= 10;
}
После таких преобразований в переменной mybyte осталось число 8, а upper_nibble равно 7.
Чтобы получить сконвертированный байт объединим старший и младший ниблы:
Код
char result = (upper_nibble << 4) | mybyte;
Такой алгоритм исспользуется для конвертации в программе функции CHAR2BCD2.
Код
char CHAR2BCD2(char input)
{
char high = 0;
while (input >= 10) // Подсчитаем десятки
{
high++;
input -= 10;
}
return (high << 4) | input; // Добавляем единицы и возвращаем результат
}
Если входное значение находится в пределах от 0 до 255 то исспользуют следующую функцию
Код
unsigned int CHAR2BCD3(char input)
{
int high = 0;
while (input >= 100) // Подсчитаем сотни
{
high++;
input -= 100;
}
high <<= 4;
while (input >= 10) // Подсчитаем десятки
{
high++;
input -= 10;
}
return (high << 4) | input; // Добавляем единицы и возвращаем результат
}
Ещё один маленький пример ковертации байта в эквивалентное значение ASCII
с исспользованием BCD.
К примеру мы имеем байт Number размерностью от 0 до 99 который нужно сконвертировать BCD
в два эквивалентных кодировке ASCII значениям.
Код
char Tens = 0; // десятки
char Ones = 0; // единицы
char Number = 93; // значение для конвертации
Переведём десятичное значение в BCD исспользуя вышеописсаную функцию:
Код
Tens = CHAR2BCD2(Number);
Теперь переменная Tens в старшем нибле содержит десятки а в младшем - единицы. Дальше всё
очень просто, только необходимо помнить что ASCII ‘0’ - это 48, ‘9’ - это 48+9=57,‘3’ - это 48+3=51,
и наоборот 57 это десятичное значение ASCII ‘9’,51 это десятичное значение ASCII ‘3’.Таким образом конвертация десятичного значения в его эквивалентное ASCII значение - это простое суммирование десятичного значения и 48. Поскольку функция CHAR2BCD2 загрузила десятки и единицы переменной Number в Tens то мы должны сначала извлечь переменные Tens и Ones и добавляя 48 получить эквивалентные ASCII значения для Number.
Код
Ones = Tens;
Ones = (Ones & 0x0F) + '0';
Десятые мы получаем сдвигом на 4 и добавим 48.
Код
Tens = (Tens >> 4) + '0';
Теперь можно посимвольно выводить значения на ЖКИ, передавать в компютер и т.п.Пользуйтесь, это удобно. В общем может где-то есть и другая инфа на русском, я её не нашол, разобрался сам и решил другим помочь. Всё вышеперечиссленное тестировалось в компиляторе ИАР вер.5.10А.
Если будут найдены ошибки прощу исправить