NOkia LCD & Joystick Shield for Arduino

I have received mine a few days ago and the quality is OK.

I have made a keypad application:

#include "Nokia_lcd.h"
#include "stdio.h"
#include "EEPROM.h"

int adckey[5] = {27, 123, 264, 379, 533};
const int numkeys = 42;
const int strlength = 14;
char buttons[numkeys] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9',',','.',' ','<','*','='};
char buf[strlength+1];
int charpos = 0;
int width = 7;
int height = 6;
int x,y;
char curchar = 'A';
  
Nokia_lcd lcd=Nokia_lcd();

void setup(void){
  DDRB=0x2F;
  LCD_BACKLIGHT(1);
  lcd.cLCD_Init();
  lcd.cLCD_Box(0,0,131,131,FILL,BLACK); 
}

void loop(void) {
  int i,j;
  int k = 0;
 
  switch(getkey()) {
    case 0:
      if (x > 0) {
        x -= 1;
      }
      break;
    case 2:
      if (y < height-1) {
        y += 1;
      }
      break;
    case 3:
      if (y > 0) {
        y -= 1;
      }
      break;
    case 4:
      if (x < width-1) {
        x += 1; 
      }
      break;
    case 1:
      int l,m;
      switch(curchar) {
        default:
          if (charpos < strlength) {
            buf[charpos] = curchar;
            charpos++;
          }
          break;
        case '*':
          for (l=0; l<strlength+1; l++) {
            if (buf[l] != NULL) {
              EEPROM.write(l,buf[l]);
            } else {
              if (l != strlength) {
                EEPROM.write(l,' ');
              } else {
                EEPROM.write(l,NULL);
              }
            }
          }
          break;
        case '=':
          charpos = 0;
          for (l=0; l<strlength+1; l++) {
            buf[l] = EEPROM.read(l);
            if (buf[l] != NULL) {
              charpos++;
            } else {
              for (m=l-1; m>0; m--) {
                if (buf[m] == ' ') {
                  charpos--;
                } else {
                  break; 
                }
              }
            }
          }
          break;
        case '<':
          if (charpos > 0) {
            buf[charpos-1] = ' ';
            charpos--;
          }
          break;
       }
      break;
  }
  delay(150);

  int fg,bg;
  for (i=0; i<height; i++) {
    for (j=0; j<width; j++) {
      if (j == x && i == y) {
        fg = WHITE;
        bg = BLUE;
        curchar = buttons[k];
      } else {
        fg = BLACK;
        bg = WHITE;  
      }
      lcd.cLCD_Box(5+j*16,5+i*16,19+j*16,19+i*16,FILL,bg);
      lcd.cLCD_Char(buttons[k],8+j*16,8+i*16,fg,bg);
      k++;
      if (buttons[k+1] == NULL) {
        break;  
      }
    }
  }
  
  lcd.cLCD_String(buf,8,112,WHITE,BLACK);
  
}

int getkey(void) {
  int i;
  int sig = analogRead(0);
  for (i=0; i<5; i++) {
    if (sig <= adckey[i]) {
        break;
    }
  }
  return i;
}