Created
April 8, 2012 05:13
-
-
Save houmei/2334909 to your computer and use it in GitHub Desktop.
Arduino PS2Keyboard Library for Japanese
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
PS2Keyboard.cpp - PS2Keyboard library | |
Copyright (c) 2007 Free Software Foundation. All right reserved. | |
Written by Christian Weichel <info@32leaves.net> | |
** Mostly rewritten Paul Stoffregen <paul@pjrc.com> 2010, 2011 | |
** Modified for use beginning with Arduino 13 by L. Abraham Smith, <n3bah@microcompdesign.com> * | |
** Modified for easy interrup pin assignement on method begin(datapin,irq_pin). Cuningan <cuninganreset@gmail.com> ** | |
for more information you can read the original wiki in arduino.cc | |
at http://www.arduino.cc/playground/Main/PS2Keyboard | |
or http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html | |
Version 2.3 (October 2011) | |
- Minor bugs fixed | |
Version 2.2 (August 2011) | |
- Support non-US keyboards - thanks to Rainer Bruch for a German keyboard :) | |
Version 2.1 (May 2011) | |
- timeout to recover from misaligned input | |
- compatibility with Arduino "new-extension" branch | |
- TODO: send function, proposed by Scott Penrose, scooterda at me dot com | |
Version 2.0 (June 2010) | |
- Buffering added, many scan codes can be captured without data loss | |
if your sketch is busy doing other work | |
- Shift keys supported, completely rewritten scan code to ascii | |
- Slow linear search replaced with fast indexed table lookups | |
- Support for Teensy, Arduino Mega, and Sanguino added | |
This library is free software; you can redistribute it and/or | |
modify it under the terms of the GNU Lesser General Public | |
License as published by the Free Software Foundation; either | |
version 2.1 of the License, or (at your option) any later version. | |
This library is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
Lesser General Public License for more details. | |
You should have received a copy of the GNU Lesser General Public | |
License along with this library; if not, write to the Free Software | |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
*/ | |
#include "PS2Keyboard.h" | |
#define BUFFER_SIZE 45 | |
static volatile uint8_t buffer[BUFFER_SIZE]; | |
static volatile uint8_t head, tail; | |
static uint8_t DataPin; | |
static uint8_t CharBuffer=0; | |
static uint8_t UTF8next=0; | |
static const PS2Keymap_t *keymap=NULL; | |
// The ISR for the external interrupt | |
void ps2interrupt(void) | |
{ | |
static uint8_t bitcount=0; | |
static uint8_t incoming=0; | |
static uint32_t prev_ms=0; | |
uint32_t now_ms; | |
uint8_t n, val; | |
val = digitalRead(DataPin); | |
now_ms = millis(); | |
if (now_ms - prev_ms > 250) { | |
bitcount = 0; | |
incoming = 0; | |
} | |
prev_ms = now_ms; | |
n = bitcount - 1; | |
if (n <= 7) { | |
incoming |= (val << n); | |
} | |
bitcount++; | |
if (bitcount == 11) { | |
uint8_t i = head + 1; | |
if (i >= BUFFER_SIZE) i = 0; | |
if (i != tail) { | |
buffer[i] = incoming; | |
head = i; | |
} | |
bitcount = 0; | |
incoming = 0; | |
} | |
} | |
static inline uint8_t get_scan_code(void) | |
{ | |
uint8_t c, i; | |
i = tail; | |
if (i == head) return 0; | |
i++; | |
if (i >= BUFFER_SIZE) i = 0; | |
c = buffer[i]; | |
tail = i; | |
return c; | |
} | |
// http://www.quadibloc.com/comp/scan.htm | |
// http://www.computer-engineering.org/ps2keyboard/scancodes2.html | |
// These arrays provide a simple key map, to turn scan codes into ISO8859 | |
// output. If a non-US keyboard is used, these may need to be modified | |
// for the desired output. | |
// | |
const PROGMEM PS2Keymap_t PS2Keymap_US = { | |
// without shift | |
{0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12, | |
0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, '`', 0, | |
0, 0 /*Lalt*/, 0 /*Lshift*/, 0, 0 /*Lctrl*/, 'q', '1', 0, | |
0, 0, 'z', 's', 'a', 'w', '2', 0, | |
0, 'c', 'x', 'd', 'e', '4', '3', 0, | |
0, ' ', 'v', 'f', 't', 'r', '5', 0, | |
0, 'n', 'b', 'h', 'g', 'y', '6', 0, | |
0, 0, 'm', 'j', 'u', '7', '8', 0, | |
0, ',', 'k', 'i', 'o', '0', '9', 0, | |
0, '.', '/', 'l', ';', 'p', '-', 0, | |
0, 0, '\'', 0, '[', '=', 0, 0, | |
0 /*CapsLock*/, 0 /*Rshift*/, PS2_ENTER /*Enter*/, ']', 0, '\\', 0, 0, | |
0, 0, 0, 0, 0, 0, PS2_BACKSPACE, 0, | |
0, '1', 0, '4', '7', 0, 0, 0, | |
'0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/, | |
PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0, | |
0, 0, 0, PS2_F7 }, | |
// with shift | |
{0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12, | |
0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, '~', 0, | |
0, 0 /*Lalt*/, 0 /*Lshift*/, 0, 0 /*Lctrl*/, 'Q', '!', 0, | |
0, 0, 'Z', 'S', 'A', 'W', '@', 0, | |
0, 'C', 'X', 'D', 'E', '$', '#', 0, | |
0, ' ', 'V', 'F', 'T', 'R', '%', 0, | |
0, 'N', 'B', 'H', 'G', 'Y', '^', 0, | |
0, 0, 'M', 'J', 'U', '&', '*', 0, | |
0, '<', 'K', 'I', 'O', ')', '(', 0, | |
0, '>', '?', 'L', ':', 'P', '_', 0, | |
0, 0, '"', 0, '{', '+', 0, 0, | |
0 /*CapsLock*/, 0 /*Rshift*/, PS2_ENTER /*Enter*/, '}', 0, '|', 0, 0, | |
0, 0, 0, 0, 0, 0, PS2_BACKSPACE, 0, | |
0, '1', 0, '4', '7', 0, 0, 0, | |
'0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/, | |
PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0, | |
0, 0, 0, PS2_F7 }, | |
0 | |
}; | |
const PROGMEM PS2Keymap_t PS2Keymap_German = { | |
// without shift | |
{0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12, | |
0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, '^', 0, | |
0, 0 /*Lalt*/, 0 /*Lshift*/, 0, 0 /*Lctrl*/, 'q', '1', 0, | |
0, 0, 'y', 's', 'a', 'w', '2', 0, | |
0, 'c', 'x', 'd', 'e', '4', '3', 0, | |
0, ' ', 'v', 'f', 't', 'r', '5', 0, | |
0, 'n', 'b', 'h', 'g', 'z', '6', 0, | |
0, 0, 'm', 'j', 'u', '7', '8', 0, | |
0, ',', 'k', 'i', 'o', '0', '9', 0, | |
0, '.', '-', 'l', PS2_o_DIAERESIS, 'p', PS2_SHARP_S, 0, | |
0, 0, PS2_a_DIAERESIS, 0, PS2_u_DIAERESIS, '\'', 0, 0, | |
0 /*CapsLock*/, 0 /*Rshift*/, PS2_ENTER /*Enter*/, '+', 0, '#', 0, 0, | |
0, '<', 0, 0, 0, 0, PS2_BACKSPACE, 0, | |
0, '1', 0, '4', '7', 0, 0, 0, | |
'0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/, | |
PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0, | |
0, 0, 0, PS2_F7 }, | |
// with shift | |
{0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12, | |
0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, PS2_DEGREE_SIGN, 0, | |
0, 0 /*Lalt*/, 0 /*Lshift*/, 0, 0 /*Lctrl*/, 'Q', '!', 0, | |
0, 0, 'Y', 'S', 'A', 'W', '"', 0, | |
0, 'C', 'X', 'D', 'E', '$', PS2_SECTION_SIGN, 0, | |
0, ' ', 'V', 'F', 'T', 'R', '%', 0, | |
0, 'N', 'B', 'H', 'G', 'Z', '&', 0, | |
0, 0, 'M', 'J', 'U', '/', '(', 0, | |
0, ';', 'K', 'I', 'O', '=', ')', 0, | |
0, ':', '_', 'L', PS2_O_DIAERESIS, 'P', '?', 0, | |
0, 0, PS2_A_DIAERESIS, 0, PS2_U_DIAERESIS, '`', 0, 0, | |
0 /*CapsLock*/, 0 /*Rshift*/, PS2_ENTER /*Enter*/, '*', 0, '\'', 0, 0, | |
0, '>', 0, 0, 0, 0, PS2_BACKSPACE, 0, | |
0, '1', 0, '4', '7', 0, 0, 0, | |
'0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/, | |
PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0, | |
0, 0, 0, PS2_F7 }, | |
1, | |
// with altgr | |
{0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12, | |
0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, 0, 0, | |
0, 0 /*Lalt*/, 0 /*Lshift*/, 0, 0 /*Lctrl*/, '@', 0, 0, | |
0, 0, 0, 0, 0, 0, PS2_SUPERSCRIPT_TWO, 0, | |
0, 0, 0, 0, PS2_CURRENCY_SIGN, 0, PS2_SUPERSCRIPT_THREE, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, PS2_MICRO_SIGN, 0, 0, '{', '[', 0, | |
0, 0, 0, 0, 0, '}', ']', 0, | |
0, 0, 0, 0, 0, 0, '\\', 0, | |
0, 0, 0, 0, 0, 0, 0, 0, | |
0 /*CapsLock*/, 0 /*Rshift*/, PS2_ENTER /*Enter*/, '~', 0, '#', 0, 0, | |
0, '|', 0, 0, 0, 0, PS2_BACKSPACE, 0, | |
0, '1', 0, '4', '7', 0, 0, 0, | |
'0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/, | |
PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0, | |
0, 0, 0, PS2_F7 } | |
}; | |
const PROGMEM PS2Keymap_t PS2Keymap_Japanese = { | |
// without shift | |
{0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12, | |
0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, 0, 0, | |
0, 0 /*Lalt*/, 0 /*Lshift*/, 0, 0 /*Lctrl*/, 'q', '1', 0, | |
0, 0, 'z', 's', 'a', 'w', '2', 0, | |
0, 'c', 'x', 'd', 'e', '4', '3', 0, | |
0, ' ', 'v', 'f', 't', 'r', '5', 0, | |
0, 'n', 'b', 'h', 'g', 'y', '6', 0, | |
0, 0, 'm', 'j', 'u', '7', '8', 0, | |
0, ',', 'k', 'i', 'o', '0', '9', 0, | |
0, '.', '/', 'l', ';', 'p', '-', 0, | |
0, '\\', ':', 0, '@', '^', 0, 0, | |
0 /*CapsLock*/, 0 /*Rshift*/, PS2_ENTER /*Enter*/, '[', 0, ']', 0, 0, | |
0, 0, 0, 0, 0 /*Henkan*/, 0, PS2_BACKSPACE, 0 /*MuHenkan*/, | |
0, '1', '\\', '4', '7', 'I', 'J', 0, | |
'0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/, | |
PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0, | |
0, 0, 0, PS2_F7 }, | |
// with shift | |
{0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12, | |
0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, 0, 0, | |
0, 0 /*Lalt*/, 0 /*Lshift*/, 0, 0 /*Lctrl*/, 'Q', '!', 0, | |
0, 0, 'Z', 'S', 'A', 'W', '"', 0, | |
0, 'C', 'X', 'D', 'E', '$', '#', 0, | |
0, ' ', 'V', 'F', 'T', 'R', '%', 0, | |
0, 'N', 'B', 'H', 'G', 'Y', '&', 0, | |
0, 0, 'M', 'J', 'U', '\'', '(', 0, | |
0, '<', 'K', 'I', 'O', 0, ')', 0, | |
0, '>', '?', 'L', '+', 'P', '=', 0, | |
0, '_', '*', 0, '`', '~', 0, 0, | |
0 /*CapsLock*/, 0 /*Rshift*/, PS2_ENTER /*Enter*/, '{', 0, '}', 0, 0, | |
0, 0, 0, 0, 0, 0, PS2_BACKSPACE, 0, | |
0, '1', '|', '4', '7', 0, 0, 0, | |
'0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/, | |
PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0, | |
0, 0, 0, PS2_F7 }, | |
1, | |
// with altgr | |
{0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12, | |
0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, 0, 0, | |
0, 0 /*Lalt*/, 0 /*Lshift*/, 0, 0 /*Lctrl*/, '@', 0, 0, | |
0, 0, 0, 0, 0, 0, PS2_SUPERSCRIPT_TWO, 0, | |
0, 0, 0, 0, PS2_CURRENCY_SIGN, 0, PS2_SUPERSCRIPT_THREE, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, PS2_MICRO_SIGN, 0, 0, '{', '[', 0, | |
0, 0, 0, 0, 0, '}', ']', 0, | |
0, 0, 0, 0, 0, 0, '\\', 0, | |
0, 0, 0, 0, 0, 0, 0, 0, | |
0 /*CapsLock*/, 0 /*Rshift*/, PS2_ENTER /*Enter*/, '~', 0, '#', 0, 0, | |
0, '|', 0, 0, 0, 0, PS2_BACKSPACE, 0, | |
0, '1', 0, '4', '7', 0, 0, 0, | |
'0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/, | |
PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0, | |
0, 0, 0, PS2_F7 } | |
}; | |
#define BREAK 0x01 | |
#define MODIFIER 0x02 | |
#define SHIFT_L 0x04 | |
#define SHIFT_R 0x08 | |
#define ALTGR 0x10 | |
static char get_iso8859_code(void) | |
{ | |
static uint8_t state=0; | |
uint8_t s; | |
char c; | |
while (1) { | |
s = get_scan_code(); | |
if (!s) return 0; | |
if (s == 0xF0) { | |
state |= BREAK; | |
} else if (s == 0xE0) { | |
state |= MODIFIER; | |
} else { | |
if (state & BREAK) { | |
if (s == 0x12) { | |
state &= ~SHIFT_L; | |
} else if (s == 0x59) { | |
state &= ~SHIFT_R; | |
} else if (s == 0x11 && (state & MODIFIER)) { | |
state &= ~ALTGR; | |
} | |
// CTRL, ALT & WIN keys could be added | |
// but is that really worth the overhead? | |
state &= ~(BREAK | MODIFIER); | |
continue; | |
} | |
if (s == 0x12) { | |
state |= SHIFT_L; | |
continue; | |
} else if (s == 0x59) { | |
state |= SHIFT_R; | |
continue; | |
} else if (s == 0x11 && (state & MODIFIER)) { | |
state |= ALTGR; | |
} | |
c = 0; | |
if (state & MODIFIER) { | |
switch (s) { | |
case 0x70: c = PS2_INSERT; break; | |
case 0x6C: c = PS2_HOME; break; | |
case 0x7D: c = PS2_PAGEUP; break; | |
case 0x71: c = PS2_DELETE; break; | |
case 0x69: c = PS2_END; break; | |
case 0x7A: c = PS2_PAGEDOWN; break; | |
case 0x75: c = PS2_UPARROW; break; | |
case 0x6B: c = PS2_LEFTARROW; break; | |
case 0x72: c = PS2_DOWNARROW; break; | |
case 0x74: c = PS2_RIGHTARROW; break; | |
case 0x4A: c = '/'; break; | |
case 0x5A: c = PS2_ENTER; break; | |
default: break; | |
} | |
} else if ((state & ALTGR) && keymap->uses_altgr) { | |
if (s < PS2_KEYMAP_SIZE) | |
c = pgm_read_byte(keymap->altgr + s); | |
} else if (state & (SHIFT_L | SHIFT_R)) { | |
if (s < PS2_KEYMAP_SIZE) | |
c = pgm_read_byte(keymap->shift + s); | |
} else { | |
if (s < PS2_KEYMAP_SIZE) | |
c = pgm_read_byte(keymap->noshift + s); | |
} | |
state &= ~(BREAK | MODIFIER); | |
if (c) return c; | |
} | |
} | |
} | |
bool PS2Keyboard::available() { | |
if (CharBuffer || UTF8next) return true; | |
CharBuffer = get_iso8859_code(); | |
if (CharBuffer) return true; | |
return false; | |
} | |
int PS2Keyboard::read() { | |
uint8_t result; | |
result = UTF8next; | |
if (result) { | |
UTF8next = 0; | |
} else { | |
result = CharBuffer; | |
if (result) { | |
CharBuffer = 0; | |
} else { | |
result = get_iso8859_code(); | |
} | |
if (result >= 128) { | |
UTF8next = (result & 0x3F) | 0x80; | |
result = ((result >> 6) & 0x1F) | 0xC0; | |
} | |
} | |
if (!result) return -1; | |
return result; | |
} | |
PS2Keyboard::PS2Keyboard() { | |
// nothing to do here, begin() does it all | |
} | |
void PS2Keyboard::begin(uint8_t data_pin, uint8_t irq_pin, const PS2Keymap_t &map) { | |
uint8_t irq_num=0; | |
DataPin = data_pin; | |
keymap = ↦ | |
// initialize the pins | |
#ifdef INPUT_PULLUP | |
pinMode(irq_pin, INPUT_PULLUP); | |
pinMode(data_pin, INPUT_PULLUP); | |
#else | |
pinMode(irq_pin, INPUT); | |
digitalWrite(irq_pin, HIGH); | |
pinMode(data_pin, INPUT); | |
digitalWrite(data_pin, HIGH); | |
#endif | |
switch(irq_pin) { | |
#ifdef CORE_INT0_PIN | |
case CORE_INT0_PIN: | |
irq_num = 0; | |
break; | |
#endif | |
#ifdef CORE_INT1_PIN | |
case CORE_INT1_PIN: | |
irq_num = 1; | |
break; | |
#endif | |
#ifdef CORE_INT2_PIN | |
case CORE_INT2_PIN: | |
irq_num = 2; | |
break; | |
#endif | |
#ifdef CORE_INT3_PIN | |
case CORE_INT3_PIN: | |
irq_num = 3; | |
break; | |
#endif | |
#ifdef CORE_INT4_PIN | |
case CORE_INT4_PIN: | |
irq_num = 4; | |
break; | |
#endif | |
#ifdef CORE_INT5_PIN | |
case CORE_INT5_PIN: | |
irq_num = 5; | |
break; | |
#endif | |
#ifdef CORE_INT6_PIN | |
case CORE_INT6_PIN: | |
irq_num = 6; | |
break; | |
#endif | |
#ifdef CORE_INT7_PIN | |
case CORE_INT7_PIN: | |
irq_num = 7; | |
break; | |
#endif | |
default: | |
irq_num = 0; | |
break; | |
} | |
head = 0; | |
tail = 0; | |
attachInterrupt(irq_num, ps2interrupt, FALLING); | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
PS2Keyboard.h - PS2Keyboard library | |
Copyright (c) 2007 Free Software Foundation. All right reserved. | |
Written by Christian Weichel <info@32leaves.net> | |
** Mostly rewritten Paul Stoffregen <paul@pjrc.com>, June 2010 | |
** Modified for use with Arduino 13 by L. Abraham Smith, <n3bah@microcompdesign.com> * | |
** Modified for easy interrup pin assignement on method begin(datapin,irq_pin). Cuningan <cuninganreset@gmail.com> ** | |
This library is free software; you can redistribute it and/or | |
modify it under the terms of the GNU Lesser General Public | |
License as published by the Free Software Foundation; either | |
version 2.1 of the License, or (at your option) any later version. | |
This library is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
Lesser General Public License for more details. | |
You should have received a copy of the GNU Lesser General Public | |
License along with this library; if not, write to the Free Software | |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
*/ | |
#ifndef PS2Keyboard_h | |
#define PS2Keyboard_h | |
#include <avr/io.h> | |
#include <avr/interrupt.h> | |
#include <avr/pgmspace.h> | |
#if defined(ARDUINO) && ARDUINO >= 100 | |
#include "Arduino.h" // for attachInterrupt, FALLING | |
#else | |
#include "WProgram.h" | |
#endif | |
// Every call to read() returns a single byte for each | |
// keystroke. These configure what byte will be returned | |
// for each "special" key. To ignore a key, use zero. | |
#define PS2_TAB 9 | |
#define PS2_ENTER 13 | |
#define PS2_BACKSPACE 127 | |
#define PS2_ESC 27 | |
#define PS2_INSERT 0 | |
#define PS2_DELETE 127 | |
#define PS2_HOME 0 | |
#define PS2_END 0 | |
#define PS2_PAGEUP 25 | |
#define PS2_PAGEDOWN 26 | |
#define PS2_UPARROW 11 | |
#define PS2_LEFTARROW 8 | |
#define PS2_DOWNARROW 10 | |
#define PS2_RIGHTARROW 21 | |
#define PS2_F1 0 | |
#define PS2_F2 0 | |
#define PS2_F3 0 | |
#define PS2_F4 0 | |
#define PS2_F5 0 | |
#define PS2_F6 0 | |
#define PS2_F7 0 | |
#define PS2_F8 0 | |
#define PS2_F9 0 | |
#define PS2_F10 0 | |
#define PS2_F11 0 | |
#define PS2_F12 0 | |
#define PS2_SCROLL 0 | |
#define PS2_INVERTED_EXCLAMATION 161 // ! | |
#define PS2_CENT_SIGN 162 // ¢ | |
#define PS2_POUND_SIGN 163 // £ | |
#define PS2_CURRENCY_SIGN 164 // ? | |
#define PS2_YEN_SIGN 165 // \ | |
#define PS2_BROKEN_BAR 166 // | | |
#define PS2_SECTION_SIGN 167 // § | |
#define PS2_DIAERESIS 168 // ¨ | |
#define PS2_COPYRIGHT_SIGN 169 // c | |
#define PS2_FEMININE_ORDINAL 170 // a | |
#define PS2_LEFT_DOUBLE_ANGLE_QUOTE 171 // ≪ | |
#define PS2_NOT_SIGN 172 // ¬ | |
#define PS2_HYPHEN 173 | |
#define PS2_REGISTERED_SIGN 174 // R | |
#define PS2_MACRON 175 //  ̄ | |
#define PS2_DEGREE_SIGN 176 // ° | |
#define PS2_PLUS_MINUS_SIGN 177 // ± | |
#define PS2_SUPERSCRIPT_TWO 178 // 2 | |
#define PS2_SUPERSCRIPT_THREE 179 // 3 | |
#define PS2_ACUTE_ACCENT 180 // ´ | |
#define PS2_MICRO_SIGN 181 // μ | |
#define PS2_PILCROW_SIGN 182 // ¶ | |
#define PS2_MIDDLE_DOT 183 // ・ | |
#define PS2_CEDILLA 184 // , | |
#define PS2_SUPERSCRIPT_ONE 185 // 1 | |
#define PS2_MASCULINE_ORDINAL 186 // o | |
#define PS2_RIGHT_DOUBLE_ANGLE_QUOTE 187 // ≫ | |
#define PS2_FRACTION_ONE_QUARTER 188 // ? | |
#define PS2_FRACTION_ONE_HALF 189 // ? | |
#define PS2_FRACTION_THREE_QUARTERS 190 // ? | |
#define PS2_INVERTED_QUESTION MARK 191 // ? | |
#define PS2_A_GRAVE 192 // A | |
#define PS2_A_ACUTE 193 // A | |
#define PS2_A_CIRCUMFLEX 194 // A | |
#define PS2_A_TILDE 195 // A | |
#define PS2_A_DIAERESIS 196 // A | |
#define PS2_A_RING_ABOVE 197 // A | |
#define PS2_AE 198 // A | |
#define PS2_C_CEDILLA 199 // C | |
#define PS2_E_GRAVE 200 // E | |
#define PS2_E_ACUTE 201 // E | |
#define PS2_E_CIRCUMFLEX 202 // E | |
#define PS2_E_DIAERESIS 203 // E | |
#define PS2_I_GRAVE 204 // I | |
#define PS2_I_ACUTE 205 // I | |
#define PS2_I_CIRCUMFLEX 206 // I | |
#define PS2_I_DIAERESIS 207 // I | |
#define PS2_ETH 208 // D | |
#define PS2_N_TILDE 209 // N | |
#define PS2_O_GRAVE 210 // O | |
#define PS2_O_ACUTE 211 // O | |
#define PS2_O_CIRCUMFLEX 212 // O | |
#define PS2_O_TILDE 213 // O | |
#define PS2_O_DIAERESIS 214 // O | |
#define PS2_MULTIPLICATION 215 // × | |
#define PS2_O_STROKE 216 // O | |
#define PS2_U_GRAVE 217 // U | |
#define PS2_U_ACUTE 218 // U | |
#define PS2_U_CIRCUMFLEX 219 // U | |
#define PS2_U_DIAERESIS 220 // U | |
#define PS2_Y_ACUTE 221 // Y | |
#define PS2_THORN 222 // T | |
#define PS2_SHARP_S 223 // s | |
#define PS2_a_GRAVE 224 // a | |
#define PS2_a_ACUTE 225 // a | |
#define PS2_a_CIRCUMFLEX 226 // a | |
#define PS2_a_TILDE 227 // a | |
#define PS2_a_DIAERESIS 228 // a | |
#define PS2_a_RING_ABOVE 229 // a | |
#define PS2_ae 230 // a | |
#define PS2_c_CEDILLA 231 // c | |
#define PS2_e_GRAVE 232 // e | |
#define PS2_e_ACUTE 233 // e | |
#define PS2_e_CIRCUMFLEX 234 // e | |
#define PS2_e_DIAERESIS 235 // e | |
#define PS2_i_GRAVE 236 // i | |
#define PS2_i_ACUTE 237 // i | |
#define PS2_i_CIRCUMFLEX 238 // i | |
#define PS2_i_DIAERESIS 239 // i | |
#define PS2_eth 240 // d | |
#define PS2_n_TILDE 241 // n | |
#define PS2_o_GRAVE 242 // o | |
#define PS2_o_ACUTE 243 // o | |
#define PS2_o_CIRCUMFLEX 244 // o | |
#define PS2_o_TILDE 245 // o | |
#define PS2_o_DIAERESIS 246 // o | |
#define PS2_DIVISION 247 // ÷ | |
#define PS2_o_STROKE 248 // o | |
#define PS2_u_GRAVE 249 // u | |
#define PS2_u_ACUTE 250 // u | |
#define PS2_u_CIRCUMFLEX 251 // u | |
#define PS2_u_DIAERESIS 252 // u | |
#define PS2_y_ACUTE 253 // y | |
#define PS2_thorn 254 // t | |
#define PS2_y_DIAERESIS 255 // y | |
#define PS2_KEYMAP_SIZE 136 | |
typedef struct { | |
uint8_t noshift[PS2_KEYMAP_SIZE]; | |
uint8_t shift[PS2_KEYMAP_SIZE]; | |
uint8_t uses_altgr; | |
uint8_t altgr[PS2_KEYMAP_SIZE]; | |
} PS2Keymap_t; | |
extern const PROGMEM PS2Keymap_t PS2Keymap_US; | |
extern const PROGMEM PS2Keymap_t PS2Keymap_German; | |
extern const PROGMEM PS2Keymap_t PS2Keymap_Japanese; | |
/** | |
* Purpose: Provides an easy access to PS2 keyboards | |
* Author: Christian Weichel | |
*/ | |
class PS2Keyboard { | |
public: | |
/** | |
* This constructor does basically nothing. Please call the begin(int,int) | |
* method before using any other method of this class. | |
*/ | |
PS2Keyboard(); | |
/** | |
* Starts the keyboard "service" by registering the external interrupt. | |
* setting the pin modes correctly and driving those needed to high. | |
* The propably best place to call this method is in the setup routine. | |
*/ | |
static void begin(uint8_t dataPin, uint8_t irq_pin, const PS2Keymap_t &map = PS2Keymap_US); | |
/** | |
* Returns true if there is a char to be read, false if not. | |
*/ | |
static bool available(); | |
/** | |
* Returns the char last read from the keyboard. | |
* If there is no char availble, -1 is returned. | |
*/ | |
static int read(); | |
}; | |
// interrupt pins for known boards | |
#if !defined(CORE_INT0_PIN) | |
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) // Arduino Mega | |
#define CORE_INT0_PIN 2 | |
#define CORE_INT1_PIN 3 | |
#define CORE_INT2_PIN 21 | |
#define CORE_INT3_PIN 20 | |
#define CORE_INT4_PIN 19 | |
#define CORE_INT5_PIN 18 | |
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) // Sanguino | |
#define CORE_INT0_PIN 10 | |
#define CORE_INT1_PIN 11 | |
#define CORE_INT2_PIN 2 | |
#else // Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc... | |
#define CORE_INT0_PIN 2 | |
#define CORE_INT1_PIN 3 | |
#endif | |
#endif | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment