Например TDA7294

Форум РадиоКот • Просмотр темы - Как выводить на 7-LED цифры с запятой?
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс дек 21, 2025 01:36:38

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 06:25:02 
Опытный кот
Аватар пользователя

Карма: 18
Рейтинг сообщений: 44
Зарегистрирован: Чт апр 12, 2012 07:19:59
Сообщений: 873
Откуда: Тюмень
Рейтинг сообщения: 0
Доброго времени суток, хочу спросить по поводу вывода циферки на 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)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 06:34:52 
Модератор
Аватар пользователя

Карма: 68
Рейтинг сообщений: 424
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Сообщений: 13490
Откуда: Тамбовская обл.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Вывести 325 и зажечь запятую на втором индикаторе.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 06:40:16 
Опытный кот
Аватар пользователя

Карма: 18
Рейтинг сообщений: 44
Зарегистрирован: Чт апр 12, 2012 07:19:59
Сообщений: 873
Откуда: Тюмень
Рейтинг сообщения: 0
Это то понятно, меня интересует, как преобразовать число с запятой(можно на примере функции ConvertToBCD), чтобы при выводе я знал, что 1. Эта запятая вообще в числе есть и 2. В каком разряде её выводить :?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 06:50:51 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
Код:
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)?


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 07:25:28 
Опытный кот
Аватар пользователя

Карма: 18
Рейтинг сообщений: 44
Зарегистрирован: Чт апр 12, 2012 07:19:59
Сообщений: 873
Откуда: Тюмень
Рейтинг сообщения: 0
Цитата:
в чем смысл switch(CurrentDigit)?

Включает определённый разряд, по очереди, это ведь динамическая индикация :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 07:29:09 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
Код:
     PORTB  = (1 << CurrentDigit);
         PORTD = digits[datarray[CurrentDigit]];
... вполне достаточно


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 07:37:34 
Опытный кот
Аватар пользователя

Карма: 18
Рейтинг сообщений: 44
Зарегистрирован: Чт апр 12, 2012 07:19:59
Сообщений: 873
Откуда: Тюмень
Рейтинг сообщения: 0
Кстати да, не подумал, спасибо... осталось узнать, как добавить поддержку точки в преобразование числа. (Минус уж не спрашиваю, это не сложно) :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 07:40:36 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
Цитата:
как преобразовать число с запятой
... зависит от того, зачем это нужно - самый "тупой" способ - подключить float.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 08:00:12 
Опытный кот
Аватар пользователя

Карма: 18
Рейтинг сообщений: 44
Зарегистрирован: Чт апр 12, 2012 07:19:59
Сообщений: 873
Откуда: Тюмень
Рейтинг сообщения: 0
Делаю стопицотый термометр :) И вот думаю, как мне преобразовать свою функцию ConvertToBCD чтобы она учитывала запятую, т.е если я на вход её подам, скажем 21.8, то в лучшем случае у меня выведет 218

Цитата:
самый "тупой" способ - подключить float.

Это как? Можно пример?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 11:05:00 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
xterro писал(а):
И вот думаю, как мне преобразовать свою функцию ConvertToBCD чтобы она учитывала запятую, т.е если я на вход её подам, скажем 21.8, то в лучшем случае у меня выведет 218
для начала выучить матчасть. Как в свою ConvertToBCD(unsigned int num) вы собрались "подать скажем 21.8", когда unsigned int - это число от 0 до 65535 ?

PS. чтобы получить правильный ответ, нужно задать правильный вопрос


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 11:11:26 
Опытный кот
Аватар пользователя

Карма: 18
Рейтинг сообщений: 44
Зарегистрирован: Чт апр 12, 2012 07:19:59
Сообщений: 873
Откуда: Тюмень
Рейтинг сообщения: 0
Это всё понятно, поменять на float не проблема, проблема, как выбрать дробную часть и узнать позицию точки?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 11:20:45 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
xterro писал(а):
Это всё понятно, поменять на float не проблема
..ну если все понятно и поменять не проблема, то welcome сюда


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 11:28:51 
Встал на лапы

Карма: 2
Рейтинг сообщений: 17
Зарегистрирован: Пт фев 01, 2013 17:47:26
Сообщений: 85
Откуда: Украина, Луганская область
Рейтинг сообщения: 0
можно так, если допустим значение находиться в переменной value типа float, тогда:

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

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 11:32:05 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
srg320, чем "так....." - лучше использовать printf


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как выводить на 7-LED цифры с запятой?
СообщениеДобавлено: Вт апр 09, 2013 11:33:10 
Опытный кот
Аватар пользователя

Карма: 18
Рейтинг сообщений: 44
Зарегистрирован: Чт апр 12, 2012 07:19:59
Сообщений: 873
Откуда: Тюмень
Рейтинг сообщения: 0
srg320 Благодарю, попробую так :)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y