Go Down

Topic: keypad : special case key (backspace-clear-entry) (Read 4035 times) previous topic - next topic

0verLock

Jun 18, 2010, 03:14 am Last Edit: Jun 18, 2010, 03:24 am by 0verLock Reason: 1
Hello,
I'm using keypad library to interface a 4x4 keypad to my arduino and display it to computer.

{'1','2','3','A'}
{'4','5','6','B'}
{'7','8','9','C'}
{'#','0','*','D'}

Output keypresses are display on serial monitor as an array of 5 digits numbers. So now i'm trying to attribute special function to key A, B, C.
'A' key to "delete" the last/previous number entered (Backspace)
'B' key to "erase" the actual array and start again entry on keypad (reset the actual array)
'C' key will be the key "enter" (to valid the 5 numbers entered: when the array is full (5 numbers)).

Despite several research I've found nothing on the subject.

How can i sketch cases for this special key routine... thanks in advance for your responses.

Grumpy_Mike

Quote
Despite several research I've found nothing on the subject


Well top hit on google for ASCII codes was:-
http://www.asciitable.com/
That should tell you all you need to know

0verLock

Thank you for your reply, so when i says i found nothing on the subject, i mean nothing about coding this routine using keypad arduino library.
http://www.arduino.cc/playground/Main/KeypadTutorial
i'm using this code:

Code: [Select]
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'#','0','*','D'}
};
byte rowPins[ROWS] = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6,7,8,9}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
byte ledPin = 13;

boolean blink = false;

void setup(){
 Serial.begin(9600);
 pinMode(ledPin, OUTPUT);      // sets the digital pin as output
 digitalWrite(ledPin, HIGH);   // sets the LED on
 keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}
 
void loop(){
 char key = keypad.getKey();
 
 if (key != NO_KEY) {
   Serial.println(key);
 }
 if (blink){
   digitalWrite(ledPin,!digitalRead(ledPin));
   delay(100);
 }
}

//take care of some special events
void keypadEvent(KeypadEvent key){
 switch (keypad.getState()){
   case PRESSED:
     switch (key){
       case '#': digitalWrite(ledPin,!digitalRead(ledPin)); break;
       case '*':
         digitalWrite(ledPin,!digitalRead(ledPin));
       break;
     }
   break;
   case RELEASED:
     switch (key){
       case '*':
         digitalWrite(ledPin,!digitalRead(ledPin));
         blink = false;
       break;
     }
   break;
   case HOLD:
     switch (key){
       case '*': blink = true; break;
     }
   break;
 }
}


how can i complete this code to display different array of 5 numbers with special function for 'A' 'B' 'C' keys.
Thanks.

raron

It seems to me it already have a "keyPadEvent" function (interrupt) that is filled with some special cases already.

I have never used that library, but I guess the simplest solution is to have your 5-digit input in a global array, and work with that array in the keyPadEvent routine for your use. Just expand on that KeyPadEvent.

Something like this (untested, uncomplete example, just a suggestion):

Code: [Select]

#include <Keypad.h>

const int maxDigits = 5;         // nr. of digits to enter
byte inputDigits[maxDigits];   // array of digits
int digitsEntered = 0;             // nr. of digits entered via keypad

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'#','0','*','D'}
};
byte rowPins[ROWS] = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6,7,8,9}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
byte ledPin = 13;

boolean blink = false;

void setup(){
 Serial.begin(9600);
 pinMode(ledPin, OUTPUT);      // sets the digital pin as output
 digitalWrite(ledPin, HIGH);   // sets the LED on
 keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}
 
void loop(){
 char key = keypad.getKey();
 
 if (key != NO_KEY) {
  if (digitsEntered < maxDigits)
  {
     inputDigits[digitsEntered++] = key;
     Serial.print(key);
  }

 }
 if (blink){
   digitalWrite(ledPin,!digitalRead(ledPin));
   delay(100);
 }
}



//take care of some special events

void keypadEvent(KeypadEvent key){

 switch (keypad.getState()){
   case PRESSED:
     switch (key){
       case '#': digitalWrite(ledPin,!digitalRead(ledPin)); break;
       case '*':
         digitalWrite(ledPin,!digitalRead(ledPin));
       break;
     }
   break;
   case RELEASED:
     switch (key){
       case 'A':   // erase digit
         if (digitsEntered > 0)
         {
            inputDigits[--digitsEntered] = 0; // erase digit (sort of..)
           Serial.print(0x08) ; // backspace
         }
         break;
       case 'B'  // erase all digits
         // more case B code...
         digitsEntered = 0; // start over the array index
         break;
       case 'C':  // Validate digits
         if (digitsEntered == 5)
         {
           Serial.println(); // next line on serial
           // more validate digits code
         }
         break;
     }
   break;
   case HOLD:
     switch (key){
       case '*': blink = true; break;
     }
   break;
 }
}

0verLock

Hi,
Thank you for your reply but it doesn't work ... when i press A, B or C after entering for example 12345, it display it but doesn't do the routine associated to this key.
Namely :
- key 'A' to "delete" the last/previous number entered (Backspace)
- key 'B' to "clear" the actual array and start again new entry on keypad (reset the actual array)
- key 'C' as "enter" key (to valid the 5 numbers entered: when the array is full (5 numbers).
However, this 3 keys should not be display on the array, it is just routine key ... and the array must only shows number (from 0 to 9)
for exemple:
12345
70954
45039

Go Up