Print this page

Библиотека для перевода двоичных чисел в двоично-десятичные числа и символы

23/06/2013 - 13:26 Павел Бобков

Введение

Иногда при программировании микроконтроллеров требуется выводить на дисплей или терминал какие-то числовые данные. Это могут быть показания АЦП, значение внутренних часов, коды ошибок, состояния автомата и т.п. Процедура вывода числа состоит из следующих шагов, нужно преобразовать двоичное число в двоично-десятичное, перевести двоично-десятичное число в символьное представление и после этого передать полученный результат какой-то функции вывода. Для выполнения этой задачи я написал небольшую библиотеку.

Особенности

- работает с любыми микроконтроллерами и компиляторами,
- быстрый алгоритм без использования операции деления,
- работает с 8, 16 и 32 разрядными двоичными числами,
- есть функции для работы с десятичными числами заданной разрядности,
- может сохранять результат преобразования в виде строки в буфере,
- если определена внешняя функция вывода, может сразу передавать результат ей.

Подключение к проекту

1. Переписываем файлы bcd.h и bcd.c в папку проекта.
2. Подключаем bcd.c к проекту внутри среды разработки.
3. Инклюдим заголовочный файл bcd.h к сишному файлу, в котором будут использоваться функции преобразования.
4. Настраиваем конфигурацию в заголовочном файле bcd.h.
5. Прописываем в код вызов функций библиотеки.

Настройка конфигурации

Настройка конфигурации включает в себя следующие шаги.

1. Подключение внешней библиотеки для вывода данных. Если этот функционал не используется, эту строчку можно закомментировать.


//подключаю библиотеку для вывода на lcd
#include "lcd_lib.h"

2. Переопределение функции вывода. Если этот функционал не используется макрос нужно оставить пустым.


//вывод не используется оставляем макрос пустым
#define BCD_SendData(data)

//вывод используется, переопределяем функцию
#define BCD_SendData(data) LCD_WriteData(data)

3. Отображение нуля в старших разрядах. Если закомментировать настройку ноль выводиться не будет, вместо него будет сохраняться символ пробела. Если оставить, ноль будет отображаться.


//при такой настройке BCD_Uchar(3) отобразит на экране 003
#define MIRROR_NULL

//если закомментировать BCD_Uchar(3) отобразит на экране 3
//#define MIRROR_NULL

4. Использование буфера.
В зависимости от настроек библиотеки, функции преобразования чисел могут сохранять результат в буфере в виде строки, которую потом можно передать какой-нибудь функции вывода. Если эту настройку закомментировать, то запись в буфер производиться не будет.


#define BCD_BUF_USE

5. Требуемый конечный результат. Библиотека позволяет переводить двоичные числа в двоично-десятичный вид или в символьный. Если данная настройка закомментирована используется двоично-десятичное представление, если нет, то символьное.


#define BCD_SYM

Описание функций

Общие функции для преобразования 8, 16 и 32 разрядных двоичных чисел. 

void BCD_Uchar(uint8_t value) - преобразует числа от 0 до 255
void BCD_Uint(uint16_t value) - преобразует числа от 0 до 65535 
void BCD_Ulong(uint32_t value) - преобразует числа от 0 до 4294967295

Пример


#define F_CPU 9600000UL
...
uint8_t count = 120;
uint16_t adc_value = 1020;
...
BCD_Uchar(count);
BCD_Uint(adc_value);
BCD_Ulong(F_CPU);

Функции для преобразования десятичных чисел заданной разрядности.

void BCD_1(uint8_t value) - преобразует числа от 0 до 9
void BCD_2(uint8_t value) - преобразует числа от 0 до 99
void BCD_3(uint8_t value) - преобразует числа от 0 до 255
void BCD_3Int(uint16_t value) - преобразует числа от 0 до 999
void BCD_4Int(uint16_t value) - преобразует числа от 0 до 9999
void BCD_5Int(uint16_t value) - преобразует числа от 0 до 65535

Пример


#define DATA 23
...
//переменная которая всегда < 10
uint8_t index = 0;

//счетчик до 999
uint8_t count;
...
BCD_1(index);
BCD_2(DATA);
BCD_3Int(count);

//а это неправильно
BCD_1(DATA);
BCD_3(count);

Функция для получения указателя на буфер, в котором сохраняется результат. Если буфер не используется, функция возвращает нулевой указатель.

uint8_t* BCD_GetPointerBuf(void);

Пример

//определяем переменную указатель на буфер
uint8_t* pBuf;

//инициализируем эту переменную 
pBuf = BCD_GetPointerBuf();

//преобразуем число, а затем выводим строку на экран
BCD_3Int(counter);
LCD_SendStr(pBuf);

Файлы

bcd.rar - библиотека для перевода двоичных чисел в двоично-десятичные и символы

Related items