Подскажите пожалуйста, как можно вывести результаты измерений, которые хранятся в регистрах МК, на семисегментный индикатор, т.е. как получить цифры, которые входят в состав полученного значения.
Допустим, у меня в результате измерений получилось 16-разрядное число 42357 и мне нужно узнать какие цифры входят в это число, т.е. определить, что число содержит 4, 2, 3, 5 и 7.
Долго ломал голову, но так ни чего и не придумал…, видно совсем отупел уже .
pirotehnick писал(а):Подскажите пожалуйста, как можно вывести результаты измерений, которые хранятся в регистрах МК, на семисегментный индикатор, т.е. как получить цифры, которые входят в состав полученного значения.
Допустим, у меня в результате измерений получилось 16-разрядное число 42357 и мне нужно узнать какие цифры входят в это число, т.е. определить, что число содержит 4, 2, 3, 5 и 7.
Долго ломал голову, но так ни чего и не придумал…, видно совсем отупел уже .
Можно также сделать цикл и отнимать например по 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)
Хотя можно и просто делить. Кому как больше нравится.
Подскажите пожалуйста , можно ли по такой схеме подключить семисегментный индикатор с общим анодом через полевой транзистор IRF7311, к микроконтроллеру? А то я видел схему с общим катодом, проверьте правильно ли я её переделал?
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);
}
pirotehnick, поищи в нете по ключевому слову bin2bcd - должно быть много решений. На AVR для преобразования 1байт -> 3 bcd разряда пользую такую рутину:
Есть и более эффективные алгоритмы, там используется сложение-вычитание-сравнение с волшебными цифрами 3 и 7, но я с ними так и не разобрался, описание алгоритма было в древней советской книжке по цифровой технике, и еще был пример с его использованием на PIC, но в том примере диапазон значений был от 0 до 99, чтоб влезало в один байт в упакованном виде.
Последний раз редактировалось stas00n Чт мар 25, 2010 12:49:15, всего редактировалось 2 раза.
Кстати, сейчас решил в кои-то веки соптимизировать свою bin2bcd рутину - получилось чуть более компактно, правда в скорости выполнения выиграть не получилось, но и так вроде неплохо - максимум 90 тактов (для числа 0хС7 = 199):
P.P.S.: Немного протупил - ведь единицы в конце получаются сами собой, их считать не надо. Теперь преобразование выполняется за 51 и 179 тактов соответственно для 8- и 16-битного вариантов (для чисел 199 и 59999):