Введение
Иногда при программировании микроконтроллеров требуется выводить на дисплей или терминал какие-то числовые данные. Это могут быть показания АЦП, значение внутренних часов, коды ошибок, состояния автомата и т.п. Процедура вывода числа состоит из следующих шагов, нужно преобразовать двоичное число в двоично-десятичное, перевести двоично-десятичное число в символьное представление и после этого передать полученный результат какой-то функции вывода. Для выполнения этой задачи я написал небольшую библиотеку.
Особенности
- работает с любыми микроконтроллерами и компиляторами,
- быстрый алгоритм без использования операции деления,
- работает с 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 - библиотека для перевода двоичных чисел в двоично-десятичные и символы
Comments
и еще как выводить отрицательные значения?
Вывод отрицательных чисел там не предусмотрен.
вроде разобрался
надо еще библиотеку для отрицательных чисел накромсать
хотя бы типовых значений(не рассматривая худший лучший варианты)
Большое спасибо за эту библиотеку и за все остальные тоже :)
Немного дурацкий вопрос: сюда можно символ запятой прикрутить?
Хотел попробовать перекинуть из старой версии библиотеки, но не получилось разобраться :(
Подскажите че не так... решил прикрутить bcd в нагрузку к lcd_lib . Строки выводятся нормально а вот переменную... как-то не очень. Ошибочки лезут. Вот кусок кода:
Code:
...
#include "lcd_lib.c"
#include <stdint.h>
#include "bcd.h"
int main(void)
{
LCD_Init();
while(1)
{
LCD_Goto(0, 0);
LCD_SendString(" 1 string ");
LCD_Goto(0, 1);
LCD_SendString(" 2 string ");
LCD_Goto(0, 2);
LCD_SendString("3 Third string");
for ( uint8_t count = 10; k; --k)
{
LCD_Goto(6, 3);
uint8_t* pBuf =BCD_GetPointerBuf();
BCD_3(count);
LCD_SendString(pBuf);
_delay_ms(200);
}
}
}
ошибки вот такие:
invalid conversion from uint8_t* {aka unsigned char*} to char*
initializing argument 1 of void LCD_SendString(char*)
Вот, собственно, никак не догоню ... помогите.
Atmel Studio 6.2
RSS feed for comments to this post