Как выводить на 7-LED цифры с запятой?

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Сообщение xterro »

Доброго времени суток, хочу спросить по поводу вывода циферки на 7-сегментный индикатор. Накидал такой вот простой счётчик, просто выводит поочерёдно цифры от 0 до 999:
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define DIGITS_ARRAY_SIZE    10
#define LED_AMOUNT    3

unsigned int digits[DIGITS_ARRAY_SIZE] = {0x3, 0x9F, 0x25, 0xD, 0x99, 0x49, 0x41, 0x1F, 0x1, 0x9};

unsigned int GPeriod = 0;
unsigned int CurrentDigit = 1;
unsigned int Counter = 0;

int datarray[3];

void InitAll()
{
   DDRB = 0xFF;
   DDRD = 0xFF;

   PORTB = 0x0;

   /* Timer */
   TCNT0 = 0x0;
   TCCR0B |= (1<<CS02);//|(1<<CS00);
   TIMSK0 |= (1 << TOIE0);

   sei();
}

void UpdateLED() {

   switch(CurrentDigit) {
      case 0:
         PORTB  = (1 << CurrentDigit);
         PORTD = digits[datarray[CurrentDigit]];
         break;
      case 1:
         PORTB  = (1 << CurrentDigit);
         PORTD = digits[datarray[CurrentDigit]];
         break;
      case 2:
         PORTB  = (1 << CurrentDigit);
         PORTD = digits[datarray[CurrentDigit]];
         break;
   }
}

void ConvertToBCD(unsigned int num)
{
   unsigned int temp ;
   signed char i ;

   for (i=2; i>=0; i--) {
      datarray[i] = 0;
   }

   for (i=2; num>0; i--) {
      temp = num / 10 ;
      datarray[i] = num-(10*temp);
      num = temp ;
   }

}


ISR(TIMER0_OVF_vect) {

   if (CurrentDigit == 2)
      CurrentDigit = 0;
   else
      CurrentDigit++;

   if(GPeriod == 10) {
      if(Counter == 999)
         Counter = 0;
      else
         Counter++;
      ConvertToBCD(Counter);
      GPeriod=0;
   } else
      GPeriod++;

}


int main() {

   InitAll();
   //ConvertToBCD(459);

   while(1) {

      UpdateLED();
   }

   return 0;
}
Не могу понять, как обрабатывать числа с запятой, т.е как например вывести 32.5? (Преобразование у меня идёт в функции ConvertToBCD)
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Вывести 325 и зажечь запятую на втором индикаторе.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Сообщение xterro »

Это то понятно, меня интересует, как преобразовать число с запятой(можно на примере функции ConvertToBCD), чтобы при выводе я знал, что 1. Эта запятая вообще в числе есть и 2. В каком разряде её выводить :?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Код: Выделить всё

void UpdateLED() {

   switch(CurrentDigit) {
      case 0:
         PORTB  = (1 << CurrentDigit);
         PORTD = digits[datarray[CurrentDigit]];
         break;
      case 1:
         PORTB  = (1 << CurrentDigit);
         PORTD = digits[datarray[CurrentDigit]];
         break;
      case 2:
         PORTB  = (1 << CurrentDigit);
         PORTD = digits[datarray[CurrentDigit]];
         break;
   }
}
в чем смысл switch(CurrentDigit)?
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Сообщение xterro »

в чем смысл switch(CurrentDigit)?
Включает определённый разряд, по очереди, это ведь динамическая индикация :)
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Код: Выделить всё

     PORTB  = (1 << CurrentDigit);
         PORTD = digits[datarray[CurrentDigit]];
... вполне достаточно
Реклама
Опытный кот
Аватара пользователя
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Сообщение xterro »

Кстати да, не подумал, спасибо... осталось узнать, как добавить поддержку точки в преобразование числа. (Минус уж не спрашиваю, это не сложно) :)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

как преобразовать число с запятой
... зависит от того, зачем это нужно - самый "тупой" способ - подключить float.
Опытный кот
Аватара пользователя
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Сообщение xterro »

Делаю стопицотый термометр :) И вот думаю, как мне преобразовать свою функцию ConvertToBCD чтобы она учитывала запятую, т.е если я на вход её подам, скажем 21.8, то в лучшем случае у меня выведет 218
самый "тупой" способ - подключить float.
Это как? Можно пример?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

xterro писал(а):И вот думаю, как мне преобразовать свою функцию ConvertToBCD чтобы она учитывала запятую, т.е если я на вход её подам, скажем 21.8, то в лучшем случае у меня выведет 218
для начала выучить матчасть. Как в свою ConvertToBCD(unsigned int num) вы собрались "подать скажем 21.8", когда unsigned int - это число от 0 до 65535 ?

PS. чтобы получить правильный ответ, нужно задать правильный вопрос
Опытный кот
Аватара пользователя
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Сообщение xterro »

Это всё понятно, поменять на float не проблема, проблема, как выбрать дробную часть и узнать позицию точки?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

xterro писал(а):Это всё понятно, поменять на float не проблема
..ну если все понятно и поменять не проблема, то welcome сюда
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Сообщение srg320 »

можно так, если допустим значение находиться в переменной value типа float, тогда:

int temp = value*100;
десятки=(temp/1000)%10;
единицы=(temp/100)%10;
десятые=(temp/10)%10;
сотые=temp%10;

между единицами и десятыми выводите запятую
диапазон от 0 до 99,99

при таком варианте производительность будет не ахти, но для начала пройдёт.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

srg320, чем "так....." - лучше использовать printf
Опытный кот
Аватара пользователя
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Сообщение xterro »

srg320 Благодарю, попробую так :)
Ответить

Вернуться в «Периферия»