Skip to content

Commit 26eecac

Browse files
committed
Improve exampls to handle Space and both Enter keys
Add correct handling of Caps and Num Lock when used with shift
1 parent 839e104 commit 26eecac

File tree

2 files changed

+33
-44
lines changed

2 files changed

+33
-44
lines changed

examples/KeyToLCD/KeyToLCD.ino

Lines changed: 29 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -106,49 +106,29 @@
106106

107107
/* Keyboard constants Change to suit your Arduino
108108
define pins used for data and clock from keyboard */
109-
//#define DATAPIN 4
110-
//#define IRQPIN 3
111-
#if defined(ARDUINO_ARCH_AVR)
112-
#define DATAPIN 19
113-
#define IRQPIN 18
114-
#elif defined(ARDUINO_ARCH_SAM)
115-
#define DATAPIN 14
116-
#define IRQPIN 15
117-
#endif
109+
#define DATAPIN 4
110+
#define IRQPIN 3
118111

119-
/* LCD pins definitions to match your LCD */
120-
#if 0
112+
/* LCD pins definitions to match your LCD 4 bit mode */
121113
#define RS 12
122114
#define ENA 11
123-
//#define RW 0
124-
#define D7 7
115+
#define RW 10
116+
#define D7 9
125117
#define D6 8
126-
#define D5 9
127-
#define D4 10
128-
#endif
129-
#if defined(ARDUINO_ARCH_AVR)
130-
#define RS 33
131-
#define ENA 31
132-
#define RW 35
133-
#define D7 29
134-
#define D6 28
135-
#define D5 27
136-
#define D4 26
137-
#elif defined(ARDUINO_ARCH_SAM)
138-
#define RS 38
139-
#define ENA 40
140-
#define RW 41
141-
#define D7 47
142-
#define D6 46
143-
#define D5 49
144-
#define D4 48
145-
#endif
118+
#define D5 7
119+
#define D4 6
146120

147121
/* LCD Constants to match your display */
148122
/* Columns in display */
149123
#define MAX_COL 16
150124
/* Rows in display */
151-
#define MAX_ROW 2
125+
#define MAX_ROW 2
126+
127+
/* LCD Constants to match your display */
128+
/* Columns in display */
129+
#define MAX_COL 20
130+
/* Rows in display */
131+
#define MAX_ROW 4
152132

153133
/* current cursor position */
154134
signed char cols = 0;
@@ -158,10 +138,11 @@ signed char rows = 0;
158138
/* Key codes and strings for keys producing a string */
159139
/* three arrays in same order ( keycode, string to display, length of string ) */
160140
#if defined(ARDUINO_ARCH_AVR)
161-
const uint8_t codes[] PROGMEM = { PS2_KEY_TAB, PS2_KEY_ESC, PS2_KEY_DELETE,
141+
const uint8_t codes[] PROGMEM = { PS2_KEY_SPACE, PS2_KEY_TAB, PS2_KEY_ESC, PS2_KEY_DELETE,
162142
PS2_KEY_F1, PS2_KEY_F2, PS2_KEY_F3, PS2_KEY_F4,
163143
PS2_KEY_F5, PS2_KEY_F6, PS2_KEY_F7, PS2_KEY_F8,
164144
PS2_KEY_F9, PS2_KEY_F10, PS2_KEY_F11, PS2_KEY_F12 };
145+
const char spacestr[] PROGMEM = " ";
165146
const char tabstr[] PROGMEM = "[Tab]";
166147
const char escstr[] PROGMEM = "[ESC]";
167148
const char delstr[] PROGMEM = "[Del]";
@@ -178,20 +159,25 @@ const char f10str[] PROGMEM = "[F10]";
178159
const char f11str[] PROGMEM = "[F11]";
179160
const char f12str[] PROGMEM = "[F12]";
180161

181-
const int8_t sizes[] PROGMEM = { 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 };
162+
// Due to AVR Harvard architecture array of string pointers to actual strings
182163
const char *const keys[] PROGMEM = {
183-
tabstr, escstr, delstr, f1str, f2str, f3str,
184-
f4str, f5str, f6str, f7str, f8str,
164+
spacestr, tabstr, escstr, delstr, f1str, f2str,
165+
f3str, f4str, f5str, f6str, f7str, f8str,
185166
f9str, f10str, f11str, f12str };
167+
const int8_t sizes[] PROGMEM = { 1, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 };
186168
char buffer[ 8 ];
169+
187170
#elif defined(ARDUINO_ARCH_SAM)
188-
const uint8_t codes[] = { PS2_KEY_TAB, PS2_KEY_ESC, PS2_KEY_DELETE, PS2_KEY_F1, PS2_KEY_F2,
189-
PS2_KEY_F3, PS2_KEY_F4, PS2_KEY_F5, PS2_KEY_F6, PS2_KEY_F7,
190-
PS2_KEY_F8, PS2_KEY_F9, PS2_KEY_F10, PS2_KEY_F11, PS2_KEY_F12 };
191-
const char *const keys[] = { "[Tab]", "[ESC]", "[Del]", "[F1]", "[F2]", "[F3]",
171+
const uint8_t codes[] = { PS2_KEY_SPACE, PS2_KEY_TAB, PS2_KEY_ESC,
172+
PS2_KEY_DELETE, PS2_KEY_F1, PS2_KEY_F2, PS2_KEY_F3,
173+
PS2_KEY_F4, PS2_KEY_F5, PS2_KEY_F6, PS2_KEY_F7,
174+
PS2_KEY_F8, PS2_KEY_F9, PS2_KEY_F10, PS2_KEY_F11,
175+
PS2_KEY_F12 };
176+
const char *const keys[] = { " ", "[Tab]", "[ESC]", "[Del]", "[F1]", "[F2]", "[F3]",
192177
"[F4]", "[F5]", "[F6]", "[F7]", "[F8]",
193178
"[F9]", "[F10]", "[F11]", "[F12]" };
194-
const int8_t sizes[] = { 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 };
179+
const int8_t sizes[] = { 1, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 };
180+
195181
#else
196182
#error “This library only supports boards with an AVR or SAM processor.”
197183
#endif

src/PS2KeyMap.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,9 +296,12 @@ else
296296
// Remainder convert printable to US-ASCII
297297
if( !( code & PS2_FUNCTION ) )
298298
{ // Some codes are straight return values We deal with ones that need work
299-
// When A-Z not shifted create lower case a - z
299+
// When A-Z not shifted create lower case a - z
300300
if( temp >= PS2_KEY_A && temp <= PS2_KEY_Z )
301301
{
302+
// Deal with Caps Lock by inverting PS2_SHIFT and remove caps lock
303+
if( ( code & PS2_CAPS ) )
304+
code ^= ( PS2_SHIFT + PS2_CAPS );
302305
if( !( code & PS2_SHIFT ) )
303306
code |= 0x20;
304307
// When shifted pass through code as received as the codes are A - Z

0 commit comments

Comments
 (0)