Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
moybiyis
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 17
1

Как запихнуть 16 bit число в 4 символьный 7seg дисплей?

17.02.2011, 11:05. Просмотров 7157. Ответов 14
Метки нет (Все метки)

Приветствую! Не судите строго, мы еще совсем зеленые :) Хочу сделать тахометр с выводом показаний на 4х символьный 7-сегментный дисплей, тоесть от 0000 до 9999. И появилась проблема как 16 битное число разделить на Тысячи, Сотни, Десятки и Единицы. Если отбросить Тысячи, то тут проблем нет, воспользовался примером из всем известной книги:
Код
DigitConvirt:
clr      Hundreds
clr      Tens
clr      ones
FindHundreds:
subi   lowerbyte,100
sbci   upperbyte,0
brcs   FindTens
yms      Hundreds

rjmp   FindHundreds
FindTens:
subi   lowerbyte,-100
subi   lowerbyte,10
brcs   FindOnes

yms      Tens
rjmp   FindTens+1
FindOnes:
subi   lowerbyte,-10
mov      Ones,lowerbyte
ret
Тут все прекрасно работает, только это от 000 до 999... Может кто подскажет чего дельного? Я уже запутался совсем,
bin2bcd и так далее :(
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2011, 11:05
Ответы с готовыми решениями:

Вывод текста на символьный дисплей
Как бы поизящнее текст выводить? Пока стандартные либы не использую, так как...

Как вывести разные цифры в 6 разрядов 7seg mpx6 ca?
ca это общий анод. Я подключил так,схему,исходник и прошивку прилагаю. Моя...

7seg ЖКИ
Поделитесь ссылочкой (уверен что есть инфа, только что-то не могу найти) как к...

2х разрядный 7seg индикатор
Написал данную программу которая выводит числа от 0 до 99 на 2х разрядном 7seg...

Как запихнуть запихнуть объект Me в Long?
Как запихнуть Me в Long, а потом достать его? Спасибо?

14
OTPYMI
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 880
17.02.2011, 12:43 2
Код
FindHundreds:
subi   lowerbyte,100
sbci   upperbyte,0
кэп как бы намекает, что по аналогии стрчокой выше можно добавить:
Код
FindThousomds:
subi lowerbyte, LOW(1000)
sbci upperbyte, HIGH(1000)
Только не забудь подправить и FindHundreds, где первой строчкой надо будет вернуть последнюю тысячу, а в RJMP добавить +1. даже не +1, а столько, сколько команд займет это добавление тысячи (скорее всего две).

Таким образом и десятки тысяч тоже можно сделать.
0
moybiyis
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 17
17.02.2011, 13:24 3
Спасибо! :) Я поверх той строчки уже чего только и не пытался добавить... И сотни пытался считать, выдергивая потом из них тысячи :) Осталось теперь вкурить смысл...
0
moybiyis
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 17
17.02.2011, 14:30 4
Все сделал, спасибо большое! :)
0
ptoop
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
17.02.2011, 15:41 5
Как бы принято показывать, что получилось... Мало ли, у кого подобная проблема возникнет..
0
zhu4oro
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 167
17.02.2011, 20:37 6
Цитата Сообщение от ptoop
Как бы принято показывать, что получилось... Мало ли, у кого подобная проблема возникнет..
на Си это будет выглядеть вот так:
Код
void DysplayMin (int Num)
{
char Num0,Num1, Num2, Num3;
Num1=Num2=Num0=0;
while (Num >= 1000)
{
Num -= 1000;
Num0++;
}
while (Num >= 100)
{
Num -= 100;
Num1++;
}
while (Num >= 10)
{
Num -= 10;
Num2++;
}
Num3 = Num;
}
0
boxstir
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 132
17.02.2011, 21:14 7
Если уж пошла речь про Си, то, думаю, есть более простой код, насколько он оптимален - вопрос:)

Код
void Dig(short num)
{
char Num0,Num1, Num2, Num3;
Num1=Num2=Num0=0;

Num0 = num / 1000;
num %= 1000;

Num1 = num / 100;
num %= 100;

Num2 = num / 10;
num %= 10;

Num3 = num;

// TODO: Добавить код отображения чиселок
}
0
OTPYMI
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 880
17.02.2011, 21:17 8
У автора ассемблер, и мы надеемся он поделится получившимся кодом :)
0
somyo_3
0 / 0 / 0
Регистрация: 09.01.2011
Сообщений: 544
17.02.2011, 21:22 9
Ну зачем быдлокодить?
Код
int number[5];
#define DIGIT 4
//just for test---
number[DIGIT] = 1234;
//-------------------

for (mntl=0;mntl<=3;mntl  )
{
while (number[DIGIT]>pow(10,3-mntl))
{
number[DIGIT] -= pow(10,3-mntl);
number[mntl]++;
}
}
По-моему так.
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
17.02.2011, 21:41 10
Цитата Сообщение от somyo_3
Ну зачем быдлокодить?
А теперь, господа/товарищи быдлокодеры поделитесь временем выполнения данной операции в тактах. Просто, что бы нормальным эмбеддерам поплохело.
0
somyo_3
0 / 0 / 0
Регистрация: 09.01.2011
Сообщений: 544
17.02.2011, 21:43 11
Ладно, признаю, моя по тактам уступает. :)
0
OTPYMI
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 880
17.02.2011, 22:27 12
Код
sykned short num;
char num0, num1, num2, num3;
num0 = num1 = num2 = num3 = 0;

while ( (num = num - 1000) >= 0) {
num0++;
}
num = num + 1000;

while ( (num = num - 100) >= 0) {
num1++;
}
num = num + 100;

while ( (num = num - 10) >= 0) {
num2++;
}

num3 = num + 10;

// num0: тысячи
// num1: сотни
// num2: десятки
// num3: единицы
0
moybiyis
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 17
18.02.2011, 03:36 13
Прошу прощения. Закопался в рабочих делах, а потом еще и в прерываниях AVR`а :) Обещаю впредь соблюдать местные обычаи :) Конструкция получилась следующая:

Код
DigitConvirt:
clr      Thousomds
clr      Hundreds
clr      Tens
clr      ones
FindThousomds:
subi    lowerbyte, LOW(1000)
sbci    upperbyte, HIGH(1000)
brcs   FindHundreds
yms      Thousomds

rjmp   FindThousomds

FindHundreds:
subi   lowerbyte,LOW(-1000)
subi   upperbyte,HIGH(-1000)
subi   lowerbyte,100
sbci   upperbyte,0
brcs   FindTens
yms      Hundreds

rjmp   FindHundreds+2
FindTens:
subi   lowerbyte,-100
subi   lowerbyte,10
brcs   FindOnes

yms      Tens
rjmp   FindTens+1
FindOnes:
subi   lowerbyte,-10
mov      Ones,lowerbyte
ret
Теперь осталось разобраться и написать то, что будет скармливать этой штуке нужный нам HEX. Пока все мои потуги безуспешны, даже стыдно показывать :)
0
Otixomdr_1
0 / 0 / 0
Регистрация: 28.06.2010
Сообщений: 211
18.02.2011, 11:40 14
Писать надо на графическом ассемблере АБ, который представляет собой нормальный «человеческий» язык программирования, а не «умодолбительный» классический ассемблер.
В порядке агитации работы на нем привожу пример этой задачи.

Upakovka (Tahometr)

Kodirovka ([@Upakovannoe+3])
Kodirovannoe -> [@Ind+3]

Kodirovka ([@Upakovannoe+2])
Kodirovannoe -> [@Ind+2]

Kodirovka ([@Upakovannoe+1])
Kodirovannoe -> [@Ind+1]

Kodirovka ([@Upakovannoe+0])
Kodirovannoe -> [@Ind+0]

Собственно, запрошенная программа содержится в первой строчке, это Upakovka, она как раз разбивает 2-байтную переменную Tahometr на 1000, 100 и т.д. Результат появляется в 4-байтной переменной Upakovannoe.
Остальные строчки кодируют байты для вывода на 7-сегментный индикатор.
Обращение к отдельному байту в переменной, например, к самому старшему – к третьему, пишется в виде [@Upakovannoe+3] и т.д.
Подпрограмма Kodirovka кодирует один байт в вид, необходимый для вывода на 7-сегментный дисплей.
А 4 байта переменной Ind предназначены для вывода на индикатор.
Написать всю Вашу программу занимает по времени минуты. Использовать надо, естественно, готовые подпрограммы. Это случай типовой, и они есть.
А сами подпрограммы выложил в приложении. Там все очень наглядно и ясно, но графический вид в тексте затруднительно привести. Программу АБ нетрудно скачать с сайта http://www.algrom.net, она бесплатная.
Чтобы расширить упаковку с сотен до тысяч, про что спрашивает автор темы, понадобится несколько минут, настолько там все очевидно, на мой взгляд.

Кстати, раз уж тут зашла речь о сопоставлении, то предлагаю сравнить объем этой программы на Си и на АБ, а также сравнить время их выполнения в тактах.

[16.42 Кб]
0
pysumkomy
0 / 0 / 0
Регистрация: 13.02.2011
Сообщений: 15
22.02.2011, 01:51 15
поделитесь временем выполнения данной операции в тактах
простите мою нубоватость, а как это можно сделать?
0
22.02.2011, 01:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2011, 01:51

Как сгенерировать псевдослучайное число размером 1024 bit?
Уважаемые программисты, очень срочно нужна помощь. Помогите с реализацией...

Как узнать какая у меня винда (Windows XP SP3 2008): 32 bit или 64 bit?
Как узнать какая у меня винда (Windows XP SP3 2008): 32 bit или 64 bit?

Как создать корректную статическую (lib) библиотеку под MS-DOS (16 bit) из Windos (32-64 bit) или из MS-DOS?
Привет всем! Кто подскажет, как корректно создавать статические библиотеки для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru