Страница 1 из 1

Подключение семисегментных индикаторов

Добавлено: Чт фев 14, 2008 01:43:13
pirotehnick
Подскажите пожалуйста, как можно вывести результаты измерений, которые хранятся в регистрах МК, на семисегментный индикатор, т.е. как получить цифры, которые входят в состав полученного значения.
Допустим, у меня в результате измерений получилось 16-разрядное число 42357 и мне нужно узнать какие цифры входят в это число, т.е. определить, что число содержит 4, 2, 3, 5 и 7.
Долго ломал голову, но так ни чего и не придумал…, видно совсем отупел уже :) .

Добавлено: Чт фев 14, 2008 10:44:13
Mamonth
делить.... А вообще в обучалке написано.

Добавлено: Чт фев 14, 2008 11:19:42
pirotehnick
А можно по конкретнее, ссылочку дать например :)

Добавлено: Чт фев 14, 2008 11:48:13
Aheir
http://www.radiokot.ru/start/mcu_fpga/avr/15/, например...
можно делить:
первая цифра (4): 42357 / 10000
вторая (2): 42357 % 10000 / 1000
ну и т.д.
было уже, ищите по форуму.

Добавлено: Чт фев 14, 2008 13:04:09
Pahan
А если проц не поддерживает хардварно команды деления, то вычитать в цикле :)))

Re: Подключение семисегментных индикаторов

Добавлено: Чт фев 14, 2008 13:31:48
ARV
pirotehnick писал(а):Подскажите пожалуйста, как можно вывести результаты измерений, которые хранятся в регистрах МК, на семисегментный индикатор, т.е. как получить цифры, которые входят в состав полученного значения.
Допустим, у меня в результате измерений получилось 16-разрядное число 42357 и мне нужно узнать какие цифры входят в это число, т.е. определить, что число содержит 4, 2, 3, 5 и 7.
Долго ломал голову, но так ни чего и не придумал…, видно совсем отупел уже :) .
вот, может, поможет...

Добавлено: Пт фев 15, 2008 19:43:02
Artem333
Если пишется на асме АВР то на их сайте есть подпрограммы 16ти битного деления/умножения и BCD перевод чисел. Ими я и пользуюсь до сих пор.

Добавлено: Сб фев 16, 2008 10:49:31
Krik99
Можно также сделать цикл и отнимать например по 100 и с каждым циклом прибавлять к ещё одной переменной 1, потом цикл в котором отнимается по 10 и прибавлять к другой переменной 1, а всё что осталось это первая цифра числа.
Например цикл для третий цифры, число например 125:

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

a=125;
while(a>=100){
    a=a-100;
    sot++;       //тут определяем первою цифру (в примере тут будет 1)
}
while(a>=10){   
    a=a-10;        
    des++;        //тут определяем вторую цифру (в примере тут будет 2)
}
edi=a;           //тут определяем третию цифру (в примере тут будет 5)
Хотя можно и просто делить. Кому как больше нравится. :)

Добавлено: Сб фев 16, 2008 13:05:51
Negor
Неплохой пример на асме по переводу из hex в bcd есть на atmel.ru. Довольно юзаьбельный. Причём легко можно подогнать разрядность.

Добавлено: Сб фев 16, 2008 14:23:37
ARV
друзья, я рекомендую вам поглядеть на мой сайт - специально по этой теме статью написал, по крайней мере алгоритмы поглядите...

Добавлено: Сб фев 16, 2008 18:40:17
knyaz*
Мой вариант таков

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

int seg[3];
temp=123;
seg[0]=temp%10;
temp=temp/10;
seg[1]=temp%10;
seg[2]=temp/10;
for(int i=0;i<=3;i++)
printf("&i\n",seg[i]);
При выполнении проги получим результат
3
2
1

Добавлено: Пн фев 18, 2008 19:46:56
pirotehnick
Большое спасибо всем за помощь. :)
Вспользовался по принципу ступенчатого вычитания.

Re: Подключение семисегментных индикаторов

Добавлено: Вс мар 21, 2010 18:46:47
Александр 2677
Подскажите пожалуйста , можно ли по такой схеме подключить семисегментный индикатор с общим анодом через полевой транзистор IRF7311, к микроконтроллеру? А то я видел схему с общим катодом, проверьте правильно ли я её переделал?
Снимок.JPG
(19.37 КБ) 753 скачивания

Re: Подключение семисегментных индикаторов

Добавлено: Пн мар 22, 2010 23:28:34
12val12
так вывожу на lcd частоту в герцах из лонга(32бит)

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

 void print_longint (unsigned long int s)   
 {
     c9=0;c8=0;c7=0;c6=0;c5=0;c4=0;c3=0;c2=0;c1=0;   
while (s>=1000000000){s-=1000000000;c9++;}   
while (s>=100000000){s-=100000000;c8++;}    
while (s>=10000000){s-=10000000;c7++;}   
while (s>=1000000){s-=1000000;c6++;}   
while (s>=100000){s-=100000;c5++;}     
while (s>=10000){s-=10000;c4++;}
while (s>=1000){s-=1000;c3++;}
while (s>=100){s-=100;c2++;}
while (s>=10){s-=10;c1++;}
c0=s;      
            print_char(c9+16);
            print_char(c8+16);
            print_char(c7+16);
            print_char(c6+16);
            print_char(c5+16);
            print_char(c4+16);
            print_char(c3+16);  
            print_char(c2+16);
            print_char(c1+16);
            print_char(c0+16);
         }

Re: Подключение семисегментных индикаторов

Добавлено: Вт мар 23, 2010 11:17:00
stas00n
pirotehnick, поищи в нете по ключевому слову bin2bcd - должно быть много решений. На AVR для преобразования 1байт -> 3 bcd разряда пользую такую рутину:

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

сырой код удален по просьбам трудящихся
Есть и более эффективные алгоритмы, там используется сложение-вычитание-сравнение с волшебными цифрами 3 и 7, но я с ними так и не разобрался, описание алгоритма было в древней советской книжке по цифровой технике, и еще был пример с его использованием на PIC, но в том примере диапазон значений был от 0 до 99, чтоб влезало в один байт в упакованном виде.

Re: Подключение семисегментных индикаторов

Добавлено: Вт мар 23, 2010 13:11:37
stas00n
Кстати, сейчас решил в кои-то веки соптимизировать свою bin2bcd рутину - получилось чуть более компактно, правда в скорости выполнения выиграть не получилось, но и так вроде неплохо - максимум 90 тактов (для числа 0хС7 = 199):

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

сырой код удален по просьбам трудящихся

Re: Подключение семисегментных индикаторов

Добавлено: Вт мар 23, 2010 14:22:44
stas00n
И модификация для преобразования 16 бит -> 5 десятичных разрядов; вход - r16,r17, выход - r18-r22. Максимум 217 тактов для числа 59999:

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

сырой код удален по просьбам трудящихся

Re: Подключение семисегментных индикаторов

Добавлено: Вт мар 23, 2010 15:03:58
stas00n
P.P.S.: Немного протупил - ведь единицы в конце получаются сами собой, их считать не надо. Теперь преобразование выполняется за 51 и 179 тактов соответственно для 8- и 16-битного вариантов (для чисел 199 и 59999):

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

_bin2bcd:
	ldi		r17,255
	ldi		r18,255
_calc_hundreds:
	inc		r17
	subi	r16,100
	brbc	sreg_c,_calc_hundreds
	subi	r16,156
 _calc_tens:
	inc		r18
	subi	r16,10
	brbc	sreg_c,_calc_tens
	subi	r16,246
;	mov	r19,r16	;не обязательно, чисто для удобства просмотра в дебугере.
	ret

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

_bin2bcd16:
	
	ldi		r18,255
	ldi		r19,255
	ldi		r20,255
	ldi		r21,255
_calc_tens_of_thousands:
	inc		r18
	subi	r17,0x10
	sbci	r16,0x27
	brbc	sreg_c,_calc_tens_of_thousands
	subi	r17,0xF0
	sbci	r16,0xD8
_calc_thousands:
	inc		r19
	subi	r17,0xE8
	sbci	r16,0x03
	brbc	sreg_c,_calc_thousands
	subi	r17,0x18
	sbci	r16,0xFC
_calc_hundreds:
	inc		r20
	subi	r17,100
	sbci	r16,0
	brbc	sreg_c,_calc_hundreds
	subi	r17,0x9C
	sbci	r16,0xFF
 _calc_tens:
	inc		r21
	subi	r17,10
	brbc	sreg_c,_calc_tens
	subi	r17,246
	mov		r22,r17	;не обязательно, чисто для удобства просмотра в дебугере.
	ret

Re: Подключение семисегментных индикаторов

Добавлено: Ср мар 24, 2010 10:18:05
kalobyte