Ian Harvey
/
electron_kbd
Acorn Electron keyboard scanner, turns an old Acorn Electron into a USB keyboard.
main.cpp
- Committer:
- IH
- Date:
- 2014-04-30
- Revision:
- 0:9fd3dad2dc25
- Child:
- 1:84cd616cc684
File content as of revision 0:9fd3dad2dc25:
#include "mbed.h" #include "USBKeyboard.h" #include "hid_keys.h" #define MAX_ROWS 5 #define MAX_COLS 14 #define REPORT_LEN 9 #define REPORT_ID_KEYBOARD 1 const uint8_t hid_keys[MAX_ROWS * MAX_COLS] = { KEY_PERIOD, KEY_L, KEY_O, KEY_9, KEY_BACKSPACE, KEY_SLASH, KEY_SEMICOLON, KEY_P, KEY_0, KEY_NONE, KEY_NONE, KEY_EQUALS, KEY_UP_ARROW, KEY_MINUS, KEY_NONE, KEY_DELETE, KEY_ENTER, KEY_DOWN_ARROW, KEY_LEFT_ARROW, KEY_NONE, KEY_SPACE, KEY_NONE, KEY_OPEN_SQUARE, KEY_RIGHT_ARROW, KEY_NONE, KEY_COMMA, KEY_K, KEY_I, KEY_8, KEY_NONE, KEY_M, KEY_J, KEY_U, KEY_7, KEY_NONE, KEY_N, KEY_H, KEY_Y, KEY_6, KEY_NONE, KEY_B, KEY_G, KEY_T, KEY_5, KEY_NONE, KEY_V, KEY_F, KEY_R, KEY_4, KEY_NONE, KEY_C, KEY_D, KEY_E, KEY_3, KEY_NONE, KEY_X, KEY_S, KEY_W, KEY_2, KEY_NONE, KEY_Z, KEY_A, KEY_Q, KEY_1, KEY_NONE, KEY_LEFT_SHIFT, KEY_LEFT_CTRL, KEY_TAB, KEY_ESC, KEY_NONE, }; BusOut leds(LED1, LED2, LED3); BusOut scanCols( PTC10,PTC8, PTC6, PTA5, PTC5, PTA4, PTC4, PTA12, PTC3, PTD4, PTC0, PTA2, PTC7, PTA1 ); BusIn inRows( PTB10, PTB11, PTE2, PTE3, PTE5 ); DigitalOut extLed(PTE4); USBKeyboard kbd; static int scanColumn(int col) { int rowBits; // Drive output low to scan scanCols.write(0x3FFF ^ (1 << col)); leds.write(col >> 1); wait(0.01); rowBits = inRows.read(); scanCols.write(0x3FFF); // Inputs also active-low return rowBits ^ 0x1F; } int main() { // Setup inRows.mode(PullUp); extLed = 1; // Run loop while(1) { int col, ocount; HID_REPORT report; report.data[0] = REPORT_ID_KEYBOARD; report.data[1] = 0; // modifiers report.data[2] = 0; ocount = 3; for (col=0; col < MAX_COLS; col++) { int row; int rowBits = scanColumn(col); if ( !rowBits ) continue; for (row=0; row < MAX_ROWS; row++) { if ( rowBits & (1 << row) ) { uint8_t key = hid_keys[col * MAX_ROWS + row]; if ( IS_MODIFIER(key) ) report.data[1] |= MODIFIER_BIT(key); else if ( key != KEY_NONE ) { if ( ocount < REPORT_LEN ) report.data[ocount++] = key; } //kbd.printf("c%dr%d ", col, row); } } } while( ocount < REPORT_LEN ) report.data[ocount++] = KEY_NONE; report.length = REPORT_LEN; kbd.send(&report); } }