#include "DigiJoystick.h" #define CLOCK 2 #define DATA 0 #define CENTER 128 #define BUFFER_SIZE 16 static volatile uint8_t keyBuffer[BUFFER_SIZE]; static volatile uint8_t head, tail, code, counter; uint8_t btno; bool isbreak; //ボタンが離されたか uint8_t joyData[8]; void setup() { pinMode(CLOCK, INPUT_PULLUP); pinMode(DATA, INPUT); //ジョイスティック初期化 for(int i=0; i<6; i++) joyData[i] = CENTER; joyData[6] = 0; joyData[7] = 0; head = 0; tail = 0; code = 0; counter = 0; isbreak = false; attachInterrupt(0, receiveData, FALLING); } void loop() { btno = getCode(); if(btno != 0) { switch(btno) { case 1: //上 if(isbreak) { joyData[1] = CENTER; isbreak = false; } else { joyData[1] = 0; } break; case 2: //左 if(isbreak) { joyData[0] = CENTER; isbreak = false; } else { joyData[0] = 0; } break; case 3: //右 if(isbreak) { joyData[0] = CENTER; isbreak = false; } else { joyData[0] = 255; } break; case 4: //下 if(isbreak) { joyData[1] = CENTER; isbreak = false; } else { joyData[1] = 255; } break; case 15: isbreak = true; break; default: //ボタン if(isbreak) { joyData[6] &= ~((uint8_t)1 << (btno-5)); isbreak = false; } else { joyData[6] |= ((uint8_t)1 << (btno-5)); } } DigiJoystick.setValues(joyData); } DigiJoystick.delay(50); } uint8_t getCode() { uint8_t retcode; if(head == tail) return 0; retcode = keyBuffer[head]; if(++head == BUFFER_SIZE) head = 0; return retcode; } void receiveData() { uint8_t p; code |= ((uint8_t)digitalRead(DATA) << counter); if(++counter > 3) { //バッファにコードを入れる p = tail; keyBuffer[p++] = code; if(p == BUFFER_SIZE) p = 0; if(p != head) tail = p; code = 0; counter = 0; } }