Skip to content

Instantly share code, notes, and snippets.

@acspike
Created June 12, 2011 22:30
Show Gist options
  • Save acspike/1022059 to your computer and use it in GitHub Desktop.
Save acspike/1022059 to your computer and use it in GitHub Desktop.
firmware for an arduino based usb arrow keypad
#include "UsbKeyboard.h"
#define BUTTON_PIN_RIGHT 9
#define BUTTON_PIN_LEFT 10
#define BUTTON_PIN_UP 11
#define BUTTON_PIN_DOWN 12
#define KEY_ARROW_RIGHT 0x4F
#define KEY_ARROW_LEFT 0x50
#define KEY_ARROW_UP 0x51
#define KEY_ARROW_DOWN 0x52
// If the timer isr is corrected
// to not take so long change this to 0.
#define BYPASS_TIMER_ISR 1
int send_stroke = 0;
int right_down = 0;
int left_down = 0;
int up_down = 0;
int down_down = 0;
void setup() {
pinMode(BUTTON_PIN_RIGHT, INPUT);
digitalWrite(BUTTON_PIN_RIGHT, HIGH);
pinMode(BUTTON_PIN_LEFT, INPUT);
digitalWrite(BUTTON_PIN_LEFT, HIGH);
pinMode(BUTTON_PIN_UP, INPUT);
digitalWrite(BUTTON_PIN_UP, HIGH);
pinMode(BUTTON_PIN_DOWN, INPUT);
digitalWrite(BUTTON_PIN_DOWN, HIGH);
#if BYPASS_TIMER_ISR
// disable timer 0 overflow interrupt (used for millis)
TIMSK0&=!(1<<TOIE0); // ++
#endif
}
#if BYPASS_TIMER_ISR
void delayMs(unsigned int ms) {
/*
*/
for (int i = 0; i < ms; i++) {
delayMicroseconds(1000);
}
}
#endif
void loop() {
send_stroke = 0;
UsbKeyboard.update();
digitalWrite(13, !digitalRead(13));
if (digitalRead(BUTTON_PIN_RIGHT) == 0) {
if (!right_down){
UsbKeyboard.sendKeyStroke(KEY_ARROW_RIGHT);
send_stroke = 1;
}
right_down = 1;
} else {
right_down = 0;
}
if (digitalRead(BUTTON_PIN_LEFT) == 0) {
if (!left_down){
UsbKeyboard.sendKeyStroke(KEY_ARROW_LEFT);
send_stroke = 1;
}
left_down = 1;
} else {
left_down = 0;
}
if (digitalRead(BUTTON_PIN_UP) == 0) {
if (!up_down){
UsbKeyboard.sendKeyStroke(KEY_ARROW_UP);
send_stroke = 1;
}
up_down = 1;
} else {
up_down = 0;
}
if (digitalRead(BUTTON_PIN_DOWN) == 0) {
if (!down_down){
UsbKeyboard.sendKeyStroke(KEY_ARROW_DOWN);
send_stroke = 1;
}
down_down = 1;
} else {
down_down = 0;
}
if (send_stroke) {
#if BYPASS_TIMER_ISR // check if timer isr fixed.
delayMs(20);
#else
delay(20);
#endif
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment