При программировании микроконтроллеров для вывода числа на дисплей очень часто это число сначала приходится разбить на цифры и уже потом каждую цифру вывести в определённый разряд дисплея. в данной статье я расскажу, как это можно сделать.
Алгоритм достаточно прост: Число делится на 10 с остатком. Остаток – это и есть искомая цифра младшего разряда. Потом данное действие повторяем с числом, которое в 10 раз меньше первоначального и остаток теперь является цифрой второго разряда. И так повторяем столько раз, сколько разрядов в числе:
for (unsigned char i = 1; i <= number_digits; ++i){ digit_tmp = numb_b % 10; TM1638_display_digit(display_digits-i, digit_tmp, 0); //вывести разр¤д на дисплей(digit_tmp) numb_b = numb_b / 10; }
Где:
numb_b – число, которое нужно разложить на разряды. Если разрядов 4, то данная переменная может типа int (максимальное значение 32768). Если же разрядов 8 – то это то переменной нужно задать тип unsigned long (макс. значение 4 294 967 295).
number_digits – количество разрядов числа
display_digits – количество разрядов индикатора
TM1638_display_digit – команда вывода на дисплей числа, более подробно описана в статье про библиотеку для TM1638.
Количество разрядов числа можно рассчитать по следующему алгоритму: Число делится на 10 до тех пор, пока результат больше нуля. Сколько раз делилось число – столько и разрядов в числе.
number_digits = 0; unsigned long n = numb_b; while (n > 0) { n /= 10; number_digits += 1;
Где
number_digits – число разрядов в числе.
numb_b – число, количество разрядов которого нужно узнать.
Ниже для примера оформил вывод на 8ми разрядный дисплей на tm1638 в виде функции num_to_dig(numb_b, display_digits). Что такое numb_b и display_digits описал ранее в этой статье. В старший разряд индикатора выводится рассчитанное количество разрядов числа.
/* * number_to_digits.c * * ============================================ * H A R D W A R E I N F O R M A T I O N S * ============================================ * Attiny13a ___________ * 1 /____ |8 * o--|RESET Vcc|--o +5V * ADC o--|PB3/ADC3 PB2|--o Key2 * Led2 o--|PB4/ADC2 PB1|--o Key1 * GND o--|GND PB0|--o Led1 * |_____________| * * Author : Vyacheslav */ #include <avr/io.h> #include "tm1638.h" unsigned char //numb_d, //Число которое нужно разложить на разряды digit_tmp, // число в разряде; number_digits; void num_to_dig (unsigned long int numb_b, unsigned char display_digits) //число, разрядность дисплея { // Количество разрядов в числе number_digits = 0; unsigned long n = numb_b; while (n > 0) { n /= 10; number_digits += 1 ; } //вывод количества разрядов на дисплей TM1638_display_digit(0, number_digits, 0); // разложение числа на цифры и вывод на дисплей for (unsigned char i = 1; i <= number_digits; ++i){ digit_tmp = numb_b % 10; TM1638_display_digit(display_digits-i, digit_tmp, 0);//вывести разряд на дисплей(digit_tmp) numb_b = numb_b / 10; } } int main(void) { TM1638_init(1, 6); TM1638_clear_segments(); num_to_dig(8706, 8); while (1) { } }
На этом пока все.
Комментариев нет:
Отправить комментарий