Как сохронить данные введёные с на LCD?
|
|
Alexej79 |
Дата: Пн, 12.05.2014, 22:56 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Привет. Такая ситуация, ввожу значение с цифровой клавиатуры на LCD и надо записать это значение для последующей обработки программой. Что то типа калькулятора. Введённое значение запомнить в переменную потом произвести с ним математическое действие. Использую Pic18F4550 в паре с LCD ALpha 4 ряда по 20 символов. Клавиатура последовательно спаянные резисторы с кнопками опрос через через АЦП. Буду очень признателен любой помощи.
|
|
|
|
Andriy76 |
Дата: Пн, 12.05.2014, 23:19 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
231
Замечания:
±
На сайте с 06.04.2010
Статус:
Offline
|
Если просто кнопками то так . If UP = 0 Then DelayMS 200 GoSub BEEP C = C + 0.1 If C > CMAX Then C = CMAX EndIf
If DOWN = 0 Then DelayMS 200 GoSub BEEP C = C - 0.1 If C < 0 Then C = 0 EndIf
А для АЦП думаю что будет аналогично .
|
|
|
|
Alexej79 |
Дата: Пн, 12.05.2014, 23:35 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Я попробую уточнить вопрос. С клавиатуры вывожу число на LCD например 35,4 оно у меня высветилось на экране. Надо при нажатии на кнопку ОК или же ENTER чтобы число 35,4 записалось в переменную Х следующим этапом вводится следующее значение 98,6 его записать в переменную Y и т.д. Потом уже на основании этих переменных с данными идёт выполнение программы, например прибавление X+Y=134 Как то так.
|
|
|
|
ADMIN |
Дата: Вт, 13.05.2014, 03:25 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Здесь нужно, по идее, говорить обратно - я вывожу на LCD вводимое мной число. В программе присваиваем X какое-то число, выводим на дисплей, потом присваиваем Y какое-то число и тоже выводим. В чем конкретно проблема?
|
|
|
|
xvovanx |
Дата: Вт, 13.05.2014, 10:29 | Сообщение # 5 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
332
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Цитата ADMIN ( ) Здесь нужно, по идее, говорить обратно - я вывожу на LCD вводимое мной число.
+1. Дисплей надо использовать только для вывода информации, а исходные данные и результат (X, Y, X+Y) прописывать и считывать в память проца, либо хранить во временных переменных программы
|
|
|
|
Alexej79 |
Дата: Вт, 13.05.2014, 14:45 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
ADMIN, xvovanx, правильно поправили. У меня не получается никак свою мысль в буквы переписать. Так оно и есть, при нажатии на клавишу, АЦП определяет что за цифра нажата и записывает её в переменную Z следующим шагом программы выводит это значение на LCD потом сдвигает позицию знакоместа на одно положение вправо и ждёт следуещего нажатия кнопки. если это символ от 0 до 9 то присваивает значение переменной Z и та же процедура что и с первой цифрой пока не будет нажата клавиша ентер. Это алгоритм а вот проблема в том что при нажатии последующих кнопок переменная Z переписывается и ей остаётся присвоенно только значение последней нажатой цифры. На LCD светится 246 а в переменной Z имею только символ последней нажатой кнопки в данном примере 6. Если создать массив и прописывать каждый символ в свою ячейку то представления не имею как на основании массива присвоить всё его содержимое одной переменной. Вот собственно в этом и есть моя проблема.
|
|
|
|
ADMIN |
Дата: Вт, 13.05.2014, 15:00 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Я так понимаю, это калькулятор? Может на код глянуть? Я вот решительно проблемы не понимаю.
|
|
|
|
Matrix252005 |
Дата: Вт, 13.05.2014, 15:31 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток!!!!
Цитата На LCD светится 246 а в переменной Z имею только символ последней нажатой кнопки в данном примере 6. Alexej79, как я Вас понял, Вы хотите связать все числа в одно значение..
Если это так, то путей решения этого очень много... Например так:
i = (i * 10) + х,
где i - Ваша переменная типа Word, в которой и будет сохраняться Ваше число, например 246. "х" - это номер кнопки.
Можно по другому, если использовать массив: Arr [x]- где х нужное кол-во элементов массива. В данном случае - 3
i = (Arr[0] * 100) + (Arr[1] * 10) + Arr[2]
Ну или что то похожее, если нужно большее число, чем 999
Последний пример не проверял, а вот i = (i * 10) + х проверен в железе!!!
С уважением, Николай.
|
|
|
|
ivan_fd |
Дата: Вт, 13.05.2014, 17:30 | Сообщение # 9 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Alexej79, если Вам не трудно, нарисуйте алгоритм (блоками), что нужно сделать? Потому, что, если честно, не совсем понятно, что у Вас не получается.
|
|
|
|
Alexej79 |
Дата: Вт, 13.05.2014, 21:11 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Цитата ADMIN ( ) Я так понимаю, это калькулятор? Да, правильно это типа калькулятора. Надо делать математические операции с числами.
Цитата Matrix252005 ( ) Вы хотите связать все числа в одно значение.. Вот это совершенно верно это мне и надо. Возможно ли с первым примером решать задачи с дробными частями?
Спасибо Вам большое что помогаете мне.
|
|
|
|
Matrix252005 |
Дата: Ср, 14.05.2014, 08:39 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток!!!
Цитата Спасибо Вам большое что помогаете мне. Alexej79, для этого мы тут и собрались, чтобы помогать друг другу!!!
Цитата Возможно ли с первым примером решать задачи с дробными частями? Думаю что НЕТ, если сделать переменную I и Х типа Float (Dim I, Х as Float) то получится следующее. Например:
С формулой i = (i * 10) + х :
i = 0 x = 36.6 i = (0 * 10) + 36.6 i = 36.6
дальше мы хотим приплюсовать целое число, что может случится:
i = (36.6 * 10) + 5 i = 371
Результат не верен... Значит, эта формула не приемлема к такой задаче!!!
В таком случае, формула должна быть проста:
I = I + X
и получаем, значения I и X выше:
I = 0 + 36.6 I = 36.6 I = 36.6 + 5 I = 41.6
Ответ верен!!!
Либо я что то не так понял, в Вашем условии!!! Если это калькулятор, то до нажатия кнопок (+, -, *, /) должно работать по первой формуле, при нажатии на любую из тех кнопок, то по другой...
Так что, если Вас не затруднит, то опишите вкратце алгоритм работы этой части программы...
С уважением, Николай.
|
|
|
|
xvovanx |
Дата: Ср, 14.05.2014, 12:05 | Сообщение # 12 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
332
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Цитата Alexej79 ( ) На LCD светится 246 а в переменной Z имею только символ последней нажатой кнопки
Я бы для упрощения наоборот не привязывался бы к одной переменной Z, а делал бы в цикле Z(i)=Z1, Z2, ... , где i-введенный по порядку знак. А потом бы вычислял Z=Z3*100+Z2*10+Z1. Как писали форумчане выше идей много и попроще и посложней
Сообщение отредактировал
xvovanx - Ср, 14.05.2014, 12:10
|
|
|
|
Alexej79 |
Дата: Ср, 14.05.2014, 20:28 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Цитата Matrix252005 ( ) Либо я что то не так понял, в Вашем условии!!! Если это калькулятор, то до нажатия кнопок (+, -, *, /) должно работать по первой формуле, при нажатии на любую из тех кнопок, то по другой... Так что, если Вас не затруднит, то опишите вкратце алгоритм работы этой части программы... Всё правильно. Я просто очень залез в дебри а ответ оказался до безобразия прост чистая математика. Алгоритм программы таков. Пытаюсь создать меню для использования моторов. В меню должен быть выбор номера двигателя и когда он выбран надо отрегулировать время продолжительности его включения для перекачки жидкости. При помощи цифровой клавиатуры вводить данные в литрах потом при помощи формулы просчитать сколько времени должен быть мотор включен что бы перекачать определённое количество жидкости. Да вот вводить данные надо с точностью до десятых то есть 0,1 0,2 и так далее. Поэтому и интересуюсь как можно сделать решения с дробными числами. Я так понимаю что после ввода запятой (нажатия клавиши) формула должна поменяться и выглядеть будет примерно так I=I+(X/10) тем самым я получу десятые доли числа.
Сообщение отредактировал
Alexej79 - Ср, 14.05.2014, 22:49
|
|
|
|
ivan_fd |
Дата: Ср, 14.05.2014, 22:51 | Сообщение # 14 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Вот теперь более менее понятно, что Вам нужно.
Можно сделать, например, так:
Код Dim I As Float Dim X As Float Dim OUT As Float
I = 12 X = 5
OUT = I + (X/10)
Тут получается, что если Вы ввели число 12, записали его в переменную Х (как Вы будете записывать, это другое дело), потом добавили число после точки - 5.
|
|
|
|
Matrix252005 |
Дата: Чт, 15.05.2014, 08:44 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток!!!
Alexej79, а можно немного уточнить, у Вас клавиатура какая будет, матричная или просто "+", "-" и "ОК"??? Если последний вариант, то проблем вообще нет... Просто, нужное число изменяйте на 0,1.
Если клавиатура матричная (или АЦП не важно).... То тогда, нужна будет переменная (флаг) для запятой... Например...
Вы вводите число: 12, потом нажимаете ".", флаг запятой был Flag = 0, стал Flag = 1. Дальше Вы вводите число 3. То в коде получается:
I = (I * 10) + X ... и получаем число I = 123... Затем смотрим флаг, если он равен 1 (Flag = 1) то:
OUT = I / 10
Но это все догадки... Не видя схемы, тяжело гадать...
Так что, способов реализации Вашей проблемы очень много, но нам нужно точка опоры, чтобы мы могли хоть от чего то оттолкнуться... Если Вас не затруднит, выложите блок схему Вашего устройства, хотя бы, ту часто, которая отвечает за клавиатуру...
С уважением, Николай.
|
|
|
|