2014-10-04 3 views
0

Im은 여전히 ​​C++ 프로그래밍 세계에 새로워서 사람들이 쉽게 따라 할 수 있습니다. 하하Arduino 멀티 탭 기능 혼란

나는 아빠가 좋아하는 게임 중 하나에 대한 높은 점수를 추적하는 시스템을 만들려고 노력하고 있습니다. 나는 점수 입력을 위해 LCD 스크린과 3x4 키패드를 사용하고있다. 키패드에 멀티 탭 기능을 추가하여 사용자 이니셜을 저장하기위한 전화 키패드처럼 작동하고 싶습니다. 점수를 저장하는 함수를 만들었지 만 (그것을 수행하는 가장 좋은 방법은 아닐지도 모르지만 개선 방법에 대한 의견은 크게 감사 할 것입니다.) 어디서부터 시작해야할지 모르겠습니다. 나는 아두 이노 키패드 라이브러리에 동적 키패드의 예를 살펴 보았다하지만 난 내가 씹을 수있는 것보다 더 많은의 물린 수도 느낄 내 코드는 다음과 같다 :

#include <SoftwareSerial.h> 
#include "Keypad.h" 

// Create a software serial port! 
SoftwareSerial lcd = SoftwareSerial(11,10); 
char scoreinput[] = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}; 
int counter = -2; 
int counter2=0; 
uint8_t red, green, blue; 



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

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


void setup() { 
lcd.begin(9600); 
Serial.begin(9600); 

lcd.write(0xFE); //clear display 
lcd.write(0x58); 
delay(10); 
lcd.print("****PinScore*******************"); 
lcd.write(0xFE);//set cursor at home 
lcd.write(0x48); 
delay(5000); 



lcd.write(0xFE); //clear display 
lcd.write(0x58); 
delay(10); 
lcd.print("New High Score?"); 
lcd.write(0xFE); 
lcd.write(0x47); 
lcd.write((uint8_t)2); 
lcd.print(" Press  \"#\""); 
delay(5000); 

lcd.write(0xFE); //clear display 
lcd.write(0x58); 
delay(10); 
lcd.print("Display Scores?"); 
lcd.write(0xFE); 
lcd.write(0x47); 
lcd.write((uint8_t)2); 
lcd.print(" Press  \"*\""); 
delay(5000); 

lcd.write(0xFE); //clear display 
lcd.write(0x58); 
lcd.print("  Press  "); 
lcd.write(0xFE); 
lcd.write(0x47); 
lcd.write((uint8_t)2); 
lcd.print(" \"*\" or \"#\" "); 
} 


void loop() { 



char key = keypad.getKey(); 

if (key != NO_KEY){ 
Serial.print(key); 
lcd.print(key); 
counter++; 
counter2++; 
scoreinput[counter]=(key); 
} 

switch (key == '#'){ 
    case 1: 




lcd.write(0xFE); //clear display 
lcd.write(0x58); 
delay(10); 
lcd.print("Enter Your New High Score"); 
delay(3000); 
lcd.write(0xFE); //clear display 
lcd.write(0x58); 
lcd.print("Press \"#\" At Any Time To Reset"); 
delay(3000); 
lcd.write(0xFE); //clear display 
lcd.write(0x58); 
lcd.print("Enter High Score:"); 


lcd.write(0xFE); 
lcd.write(0x47); 
lcd.write((uint8_t)18); 
lcd.print(key); 

if (counter==8){ 
    break; 
} 
} 

if (counter==8){ 
lcd.write(0xFE); //clear display 
lcd.write(0x58); 
delay(1000); 
lcd.print(scoreinput[0]); 
lcd.print(scoreinput[1]); 
lcd.print(scoreinput[2]); 
lcd.print(","); 
lcd.print(scoreinput[3]); 
lcd.print(scoreinput[4]); 
lcd.print(scoreinput[5]); 
lcd.print(","); 
lcd.print(scoreinput[6]); 
lcd.print(scoreinput[7]); 
lcd.print(scoreinput[8]); 
counter=-2; 
delay(3000); 
lcd.write(0xFE); //clear display 
lcd.write(0x58); 
lcd.print("Enter your  Initals:"); 
    } 
while (counter2>10){ 
if (key == '2'){ 
//this is where the multi tap function would be called to allow users to enter their intials 

} 
} 

답변

0

당신은 이후의 시간을 측정하는 타이머를 필요 마지막 키 엔트리. 마지막 키 스트로크 이후 일정 시간 (아마도 1 초) 이상이거나 키가 마지막으로 눌려진 키와 다른 경우 문자 (키의 첫 번째 문자, 2 = A, 3 = D 등) 그렇지 않으면 문자를 증가시킵니다 (줄 바꿈, A => B, B => C, C => A). 따라서 "234"는 "ADG"를 입력하고 "222"는 "C"를 입력하지만 "2 (지연) 22"는 "AB"를 입력합니다.