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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
max_mart
сообщение Nov 22 2011, 05:22
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Здравствуйте.
Реализую клавиатуру числовую 0-9. Для окончания ввода использую клавишу принятия ввода. Работаю с 1,2,3,4,5 значными цифрами, если введено чило, содержащее более 5 цифр, то ошибка. Как преобразовать из двоично-десятичной формы в двоичную знаю.
Но вот как реализовать сохранение группы нажатых цифр в одну переменную 16-битную - вот проблема. Например ввели число 4563, надо чтобы оно было сохранено в 16-битной переменнойи и цифры были сохранены в нужной мне последовательности после нажатия клавиши "accept".
Помогите, пожалуйста, в данной проблеме?
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Nov 22 2011, 06:21
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Цитата(max_mart @ Nov 22 2011, 08:22) *
Здравствуйте.
Реализую клавиатуру числовую 0-9. Для окончания ввода использую клавишу принятия ввода. Работаю с 1,2,3,4,5 значными цифрами, если введено чило, содержащее более 5 цифр, то ошибка. Как преобразовать из двоично-десятичной формы в двоичную знаю.
Но вот как реализовать сохранение группы нажатых цифр в одну переменную 16-битную - вот проблема. Например ввели число 4563, надо чтобы оно было сохранено в 16-битной переменнойи и цифры были сохранены в нужной мне последовательности после нажатия клавиши "accept".
Помогите, пожалуйста, в данной проблеме?

я уже сталкивался с этой проблемой. Решил всё очень просто. Ввел счетчик нажатий клавиш. Выделил для каждого десятичного разряда байт в ОЗУ.Нажал первый раз - сохранил в область ОЗУ "тысячи", нажал второй раз -сотни, нажал третий раз - десятки, четвертый - единицы. Так же счетчиком включаю кнопку "стереть по символьно". Т.е. если нажал >=1-ого раза - загорается надпись удалить и кнопка "удалить" становиться активной. Когда ввел значение полностью загорается надпись "принять", по нажатии соответствующей кнопки "принять" умножаем число из ОЗУ"1000" на тысячу, затем сотни, десятки, единицы, и все суммируем.
Go to the top of the page
 
+Quote Post
stells
сообщение Nov 22 2011, 06:27
Сообщение #3


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(max_mart @ Nov 22 2011, 09:22) *
Помогите, пожалуйста, в данной проблеме?

на кодирование кода клавиши (от 0 до 9) нужно 3 бита, для запоминания 5 кодов соответственно нужно 15 бит... так что просто последовательно пишете в 16-битный регистр коды клавиш в порядке нажатия, да и все laughing.gif

стоп, не 3, а 4 бита нужно... надо подумать

Сообщение отредактировал stells - Nov 22 2011, 06:29
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 22 2011, 06:39
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (max_mart @ Nov 22 2011, 13:22) *
Здравствуйте.
Помогите, пожалуйста, в данной проблеме?

Здравствуйте!
Необходимо, как говорят, отделить мух от котлет)
Отдельно реализуйте функции ввода с клавиатуры, отдельно складывайте числа в переменную.

Пусть у Вас есть функция readKey(), которая возращает скан-код нажатой клавиши, или, если есть буфер, то позволяет считать последовательность нажатых кнопок.

Допустим, Вы приняли коды 15, 13, 17, 18, которые обозначают цифры 5, 3, 7 и 8. Коды могут быть любыми, зависит от аппаратной реализации клавиатуры. Могут быть и сразу необходимые нам цифры. Однако у клавиши "ВВОД" все равно будет какой-то свой код, например 20.

Как из скан-кодов получить цифры, объяснять не буду. Используется вычитание.

Поскольку, как правило, заранее не известно, сколько разрядов будет в числе, Вы не знаете сколько цифер введет пользователь, прежде, чем нажать "ВВОД". Следовательно, цифры необходимо складывать в буфер.

Затем считаете количество цифр. Так Вы знаете сколько разрядов необходимо. В нашем случае 4 (цифры 5, 3, 7 и 8). Значит максимальное число, введенное пользователем, может быть 9999. Проверяете, входит в 16 разрядов. Да, входит, в независимости от того, знаковая или беззнаковая переменная используется. Если бы не входила - выдали бы ошибку, не задумываясь.

Далее, из буфер выбираете цифры в любом порядке, но с учетом веса. Например 5 - это тысячи, 8 - единицы.

Далее, проходясь циклом по буферу, выбираете цифру, домножаете на "вес" и суммируете результат в переменную, предварительно ее обнулив.

Примерно так (цикл не пишу нарочно, просто по шагам):

uint16_t sum.

sum = 0;

sum += 5 * 1000;
sum += 3 * 100;
sum += 7 * 10;
sum += 8;

Вроде все. Если ошибся, коллеги поправят rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Nov 22 2011, 06:40
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Можно сделать еще интересней. Допустим диапазон от 0 до 999 999 999. Так же имеем 9 байт ОЗУ под хранение разрядов и счетчик нажатий кнопок. нажали один раз сохр. значение в ОЗУ "единицы" нажали второй раз - перенесли значение из ОЗУ " единицы" в ОЗУ "десятки", сохр. новое значение в ОЗУ "единицы" и так далее. Потом множим и суммируем .Но программа у меня вышла очень объемной.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 22 2011, 06:49
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Navovvol @ Nov 22 2011, 14:40) *
Можно сделать еще интересней.

Я предлагаю подход разделения. Функции опроса клавиатуры не коим образом не связаны с какими-либо счетчиками. Это уже можно сделать снаружи, иерархично. Таким образом, каждая часть программы самостоятельна, но является тесно связанной в целом. Ваш подход несколько иной, и это здорово! rolleyes.gif чем больше у автора темы будет рекомендаций, тем проще ему сделать выбор (или сложнее))))


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
stells
сообщение Nov 22 2011, 06:49
Сообщение #7


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



так все красиво расписывают: буфер , ОЗУ...

вопрос к автору: я правильно понял, что для сохранения кодов нажатых клавиш есть только 16 бит и больше ничего? это студенческая задачка? она точно решается?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 22 2011, 06:57
Сообщение #8


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (stells @ Nov 22 2011, 14:49) *
так все красиво расписывают: буфер , ОЗУ...

Автор темы не дал нам больше информации для рамышлений, поэтомы мы вольны давать советы, не вдаваясь в отсутствующие подробности. Да и вопрос задан не в теме для начинающих, хотя его и можно туда переместить.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
stells
сообщение Nov 22 2011, 06:58
Сообщение #9


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(haker_fox @ Nov 22 2011, 10:57) *
Автор темы не дал нам больше информации для рамышлений

а по-моему он вполне конкретно описал задачу:

Цитата(max_mart @ Nov 22 2011, 09:22) *
как реализовать сохранение группы нажатых цифр в одну переменную 16-битную

Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 22 2011, 07:05
Сообщение #10


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (stells @ Nov 22 2011, 14:58) *
а по-моему он вполне конкретно описал задачу:

Чтож, вполне возможно, что его не вполне корректно поняли, т.к. человеческий язык, в отличие от машинного, допускает вариации в понимании rolleyes.gif bb-offtopic.gif
Подождем автора, пусть прояснит ситуацию.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 07:16
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Во первых я замарачиваться не стал сделал клаву просто от ножки МК через резистор на конпку.
Во вторых цифре от 0-9 соответствует 4 разрядный двоичный код, поэтому 5 цифр числа просто в 16-битную пер. не уместится, если исп. ее для хран. нажатой цифры.
И как я уже выше написал: Я не пойму только одного момента: как мне сохранить нажатый код цифры, ячтобы в дальнейшем ее расчитать и получить нужное мне число.
Вот пример на 6 цифрах:
unsigned char counter=0; // для подсчета кол-ва введенных цифр
unsigned key[6]; // массив для хранения цифры для опред. кнопки
unsigned int addr=0;

if (!ZERO)
{

writed(10); // 0 on LCD
key[0]=0;
counter++;
}
if (!ONE)
{
if (pp == 0)
{
writed(1); // 1 on LCD
key[1]=1;
counter++;
}
pp=10000;
}
if (!TWO)
{
if (pp == 0)
{
writed(2); // 2 on LCD
key[2]=2;
counter++;
}
pp=10000;
}
if (!THREE)
{
if (pp == 0)
{
writed(3); // 3 on LCD
key[3]=3;
counter++;
}
pp=10000;
}
if (!FOUR)
{
if (pp == 0)
{
writed(4); // 4 on LCD
key[4]=4;
counter++;
}
pp=10000;
}
if (!FIVE)
{
if (pp == 0)
{
writed(5); // 5 on LCD
key[5]=5;
counter++;
}
pp=10000;
}

if (!ACCEPT) // accept input data(end of inputting data)
{
if (pp == 0)
{
if (counter == 1) // 1 digit
{
// надо сохр введеные цифры в пер. addr, чтобы получить 1 значное число
counter=0;
//..

}
if (counter == 2) // 2 digits
{
// надо сохр введеные цифры в пер. addr, чтобы получить 2 значное число
counter=0;
//..

}
if (counter == 3) // 3 digits
{
// надо сохр введеные цифры в пер. addr, чтобы получить 3 значное число
counter=0;
//..

}
if (counter == 4) // 4 digits
{
// надо сохр введеные цифры в пер. addr, чтобы получить 4 значное число
counter=0;
//..

}
if (counter == 5) // 5 digits
{
// надо сохр введеные цифры в пер. addr, чтобы получить 5 значное число

counter=0;
//..

}
if (counter > 5)
{
counter=0;
// отображаю ошибку


}
Вот как мне сохр. в пер. addr я не знаю.
Я знаю что, чтобы получить например число 453 из введенных цифр надо просто: 4*100+5*10+3=453 в 16 битной переменной.
Но я не знаю как мне их сохранять при нажатии клавиши, чтобы не потерять последовательность.
Помогите, пожалуйста с кодом? Дописать его, чтобы реализовать задуманное.
Go to the top of the page
 
+Quote Post
stells
сообщение Nov 22 2011, 07:20
Сообщение #12


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(max_mart @ Nov 22 2011, 11:16) *
5 цифр числа просто в 16-битную пер. не уместится

так и "не просто" не уместится... диапазон чисел от 00000 до 99999 не помещается в 16 бит никак

вот только непонятно, почему Вы себя ограничили этими 16-ю битами?
Go to the top of the page
 
+Quote Post
max_mart
сообщение Nov 22 2011, 07:34
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



мне нужно число 0-65535. Если мне надо будит большее число, то я по этой же схеме преобразую в число до 3 миллионов(long int).
А пока 16-битное
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Nov 22 2011, 08:21
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



к сожалению я ни черта не понимаю в С/С++
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 22 2011, 09:48
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Автор, как я понял, хочет получить, допустим, число 468, если ему нажмут кнопки 4, 6, 8.

Берёте одну переменную-накопитель, 16 бит. Инициализируете её нулём.
Далее простой алгоритм - нажали какую-то цифру, вы получаете из какого-то сканкода саму цифру, текущий накопитель умножаете на 10 и прибавляете только что введённую цифру. Всё.
Плюс контроль, чтобы накопитель не переполнился при очередном умножении.
Захотите больше - сделайте накопитель не 16 бит, а 32, 64 ....
Классический алгоритм с бородой ....

Зачем тут буфер, накопление n-разрядных кодов в нём и прочие сложности?
Потом ведь всё равно этот буфер в число конвертить надо ...
Буфер надо, если необходима возможность полного редактирования числа. Да и то - проще не сканкоды в буфер класть, а готовые цифры. Проще и понятнее. У вас же не матрица 105 клавиш от компа?

Сообщение отредактировал hd44780 - Nov 22 2011, 09:56


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 04:53
Рейтинг@Mail.ru


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