Страница 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, к микроконтроллеру? А то я видел схему с общим катодом, проверьте правильно ли я её переделал?
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