реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> 4х разрядное DEC число разбить на цифры
Punk
сообщение Jan 27 2007, 14:37
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



Прет! Есть преременная unsigned int и её значение в программе не превышает 9999 необходимо разбить на отдельные числа для отображения на светодиодном индикаторе.
В хексе у меня все получилось без проблем а вот в деке че то ни хрена.Подскажите плз как надо грамотно разбивать?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 27 2007, 15:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



http://electronix.ru/forum/index.php?showtopic=24979&hl


--------------------
Go to the top of the page
 
+Quote Post
kv_addr
сообщение Jan 28 2007, 07:27
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Цитата(Punk @ Jan 27 2007, 15:37) *
Прет! Есть преременная unsigned int и её значение в программе не превышает 9999 необходимо разбить на отдельные числа для отображения на светодиодном индикаторе.
В хексе у меня все получилось без проблем а вот в деке че то ни хрена.Подскажите плз как надо грамотно разбивать?

Самое простое и короткое:
Код
...
__flash char Symbol[11]={0x88, 0x9F, 0xC4, 0x86, 0x93, 0xA2, 0xA0, 0x8F, 0x80, 0x82, 0xFF}; // образы цифр (могут быть иными)
char Digit[4]; //готовое к выводу на 7-сегментный индикатор 4-разрядное число
...
/*******************************************************************************
4-разрядное 10-ное число в виде семисегментных образов с подавлением незначащих нулей
*******************************************************************************/
void  DIG_LED(unsigned int i)
{
  char pos=4;
  char rem=0;
  do
  {
    if (i !=0) rem =(i % 10);
        pos--;
    Digit[pos]=Symbol[rem];
    rem=10;        
    i /= 10;
  }
  while(pos);
}
Go to the top of the page
 
+Quote Post
ahulap
сообщение Jan 28 2007, 12:43
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



ИМХО в данном случае все-таки лучше обойтись без деления:
unsigned int N = 1234;
unsigned char digits[4];
...
digits[3] = 0;
while (N >= 1000) { N -= 1000; digits[3]++; }

digits[2] = 0;
while (N >= 100) { N -= 100; digits[2]++; }

digits[1] = 0;
while (N >= 10) { N -= 10; digits[1]++; }

digits[0] = N;
Go to the top of the page
 
+Quote Post
Punk
сообщение Jan 29 2007, 10:57
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



ПАСИБА БОЛЬШОЕ
Go to the top of the page
 
+Quote Post
day177
сообщение Jan 30 2007, 16:41
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 25-01-07
Пользователь №: 24 755



Можно вопрос до кучи: Есть преременная unsigned char и её значение в программе не превышает 99 необходимо разбить на отдельные числа для отображения на светодиодном индикаторе, есть два семисегментника, подключены через сдвиговый регистр 74HC164.
Вывод одной цифирки от 0 до 9 одолел. Но вот с двумя никак не справлюсь. Please help! Бьюсь какой день - никак не могу догнать как это сделать при помощи BCD и библиотеки BCD.H ???
PS Компилятор CVAVREAL
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jan 30 2007, 17:14
Сообщение #7


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(day177 @ Jan 30 2007, 13:41) *
Можно вопрос до кучи: Есть преременная unsigned char и её значение в программе не превышает 99 необходимо разбить на отдельные числа для отображения на светодиодном индикаторе, есть два семисегментника, подключены через сдвиговый регистр 74HC164.
Вывод одной цифирки от 0 до 9 одолел. Но вот с двумя никак не справлюсь. Please help! Бьюсь какой день - никак не могу догнать как это сделать при помощи BCD и библиотеки BCD.H ???
PS Компилятор CVAVREAL

Вот же ahular чуть выше показал. Только вам нужно начать с digits[1]=0;
Если нужно в азки, то лучше так digits[1]=0х30;


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jan 30 2007, 21:49
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



#include <bcd.h>
unsigned char my_number; //ваше число
unsigned char temp,digit1,digit2;
temp= bcd2bin(my_number);
digit1=temp & 0x0f; //младшая тетрада
digit2=temp>>4; //старшая тетрада
Преобразуете в семисигментный код и выводите.
з.ы. Компилятор CVAVREAL? Межвидовое скрешивание? smile.gif


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
day177
сообщение Jan 31 2007, 09:36
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 25-01-07
Пользователь №: 24 755



Спасибо! вчера в час ночи меня тоже до этого доперло! получилось
Код
while (1){

              buf=zg7[(bin2bcd(sec) & 0x0f)]; //получаем единицы sec
              for (cnt=0;cnt<8;cnt++) {
              buf = buf << 1; // делаем логический сдвиг значения из знакогенератора
              bitc(PORTD,IND_DATA);
              if (SREG&0x01) {bits(PORTD,IND_DATA);} //проверяем флаг сдвига, если установлен, в DATA пишем 1
              bitc(PORTD,IND_CLK); //даем 0 на CLK
              bits(PORTD,IND_CLK); //даем 1 на CLK
              } //for
              PORTB.3=0;
              delay_ms(1);
              PORTB.3=1;
              
              buf=zg7[((bin2bcd(sec)>>4) & 0x0f)]; //получаем десятки sec          
              for (cnt=0;cnt<8;cnt++) {
              buf = buf << 1; // делаем логический сдвиг значения из знакогенератора
              bitc(PORTD,IND_DATA);
              if (SREG&0x01) {bits(PORTD,IND_DATA);} //проверяем флаг сдвига, если установлен, в DATA пишем 1
              bitc(PORTD,IND_CLK); //даем 0 на CLK
              bits(PORTD,IND_CLK); //даем 1 на CLK
              } //for
              PORTB.2=0;
              delay_ms(1);
              PORTB.2=1;
                                
  }//while
Go to the top of the page
 
+Quote Post
I_AM_WINER
сообщение Jan 31 2007, 22:47
Сообщение #10





Группа: Новичок
Сообщений: 4
Регистрация: 31-01-07
Пользователь №: 24 916



Можно делать через sprintf (... 4%D ...)
А декодер реализован так

switch(m_chr)
{
case '0' a_ret=0x3f; break;
case '1' a_ret=0x06; break;
// a_ret - код сегментов
// и так все цифирьки до 9

}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01439 секунд с 7
ELECTRONIX ©2004-2016