воскресенье, 1 октября 2023 г.

Как разбить число на цифры на языке Си на примере Microchip Studio

 

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

        Алгоритм достаточно прост: Число делится на 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) 
    {
				
    }
}

        На этом пока все.

Комментариев нет:

Отправить комментарий