Ви не увійшли.
Сторінки 1
#include <Keypad.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);
long num1,num2 ;
double total;
char operation,button;
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','+'},
{'4','5','6','-'},
{'7','8','9','*'},
{'C','0','=','/'}
};
byte rowPins[ROWS] = {9,8,7,6};
byte colPins[COLS] = {5,4,3,2};
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup()
{
lcd.begin(16,2);
Serial.begin(9600);
}
void loop()
{
while(1)
{
button = customKeypad.getKey();
if (button=='C')
{
num1=0;
num2=0;
total=0;
operation=0;
lcd.clear();
}
if (button >='0' && button <='9')
{
num1 = num1*10 + (button -'0');
lcd.setCursor(0,0);
lcd.print(num1);
}
if (num1 !=0 && (button=='-' || button=='+' || button=='*' || button=='/'))
{
operation = button;
lcd.setCursor(0,1);
lcd.print(operation);
break;
}
}
while(1)
{
if (button =='C')
break;
button = customKeypad.getKey();
if (button=='C')
{
num1=0;
num2=0;
total=0;
operation=0;
lcd.clear();
break;
}
if (button >='0' && button <='9')
{
num2 = num2*10 + (button -'0');
lcd.setCursor(1,1);
lcd.print(num2);
}
if (button == '=' && num2 !=0)
{
domath();
break;
}
}
while(1)
{
if (button =='C')
break;
button = customKeypad.getKey();
if (button =='C')
{
lcd.clear();
lcd.setCursor(0,0);
num1=0;
num2=0;
total=0;
operation=0;
break;
}
}
}
void domath()
{
switch(operation)
{
case '+':
total = num1+num2;
break;
case '-':
total = num1-num2;
break;
case '/':
total = (float)num1/(float)num2;
break;
case '*':
total = num1*num2;
break;
}
lcd.setCursor(0,1);
lcd.print('=');
lcd.setCursor(1,1);
lcd.print(total);
}
как ето реализовиать
одиночное нажатие на кнопку «удалить»(C) должно удалять один символ;
удержание кнопки в течение двух секунд должно очищать экран;
удержание кнопки «0» должно выводить на дисплей точку, для работы с
десятичными дробями;
не могу понять как в коде задать удержания клавиш
Остання редакція angruh (2018-03-14 19:47:41)
Неактивний
как ето реализовиать
Как вам уже подсказали, какими-то стандартными средствами библиотеки вы это не сделает.
Но вам можно это сделать вручную анализируя состояние (нажата-отжата) клавиш ... по крайней мере "0" и "C".
У вас классическая задача switch-автомата...
1. Уберите все свои while() - у вас loop() есть как цикл для switch анализа.
2. Поставьте в конце loop(), после switch фиксированную задержку ... скажем delay( 100 ), и забудьте про время, а считайте числа циклов (по 0.1 сек.) прошедшие с какого-то события...
одиночное нажатие на кнопку «удалить»(C) должно удалять один символ;
удержание кнопки в течение двух секунд должно очищать экран;
удержание кнопки «0» должно выводить на дисплей точку, для работы с
десятичными дробями;
не могу понять как в коде задать удержания клавиш
3. при нажатии "C" устанавливает boolean признак bC.
4. и считаете число циклов (nC) при bC == true ...
5. если bC сбросится в false при nC < 20, то удаляете 1 символ: сдвигаете курсор на позицию влево + записываете туда пробел
6. а вот если nC > 20, а bC всё ещё true - чистите весь экран
7. при нажатии "0" записываете на индикатор "0", но взводите признак b0 = true, и если на следующем цикле loop() клавиша "0" всё ещё нажата - затираете "0" на индикаторе + ставите "." + переводите программу (boolean признак) в режим ввода дробной части.
Вот где-то такую логику строите...
Ничего там особенно "военного" нет!
Остання редакція Olej (2018-03-14 20:41:43)
Неактивний
Сторінки 1