#1 2018-03-14 19:47:16

angruh
Учасник
Зареєстрований: 2018-02-17
Повідомлень: 6

удержание кнопки Keypad

#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)

Неактивний

#2 2018-03-14 20:41:01

Olej
Учасник
З Харьков
Зареєстрований: 2018-03-08
Повідомлень: 234

Re: удержание кнопки Keypad

angruh пише:

как ето реализовиать

Как вам уже подсказали, какими-то стандартными средствами библиотеки вы это не сделает.
Но вам можно это сделать вручную анализируя состояние (нажата-отжата) клавиш ... по крайней мере "0" и "C".
У вас классическая задача switch-автомата...
1. Уберите все свои while() - у вас loop() есть как цикл для switch анализа.
2. Поставьте в конце loop(), после switch фиксированную задержку ... скажем delay( 100 ), и забудьте про время, а считайте числа циклов (по 0.1 сек.) прошедшие с какого-то события...

angruh пише:

одиночное нажатие на кнопку «удалить»(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 признак) в режим ввода дробной части.

Вот где-то такую логику строите...
Ничего там особенно "военного" нет! big_smile

Остання редакція Olej (2018-03-14 20:41:43)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму