aboutsummaryrefslogtreecommitdiffstats
path: root/mykey.c
diff options
context:
space:
mode:
Diffstat (limited to 'mykey.c')
-rw-r--r--mykey.c186
1 files changed, 150 insertions, 36 deletions
diff --git a/mykey.c b/mykey.c
index f69503e5f..098bb4e51 100644
--- a/mykey.c
+++ b/mykey.c
@@ -27,6 +27,7 @@
#include <util/delay.h>
#include "usb_keyboard_debug.h"
#include "print.h"
+#include "keymap.h"
#define LED_CONFIG (DDRD |= (1<<6))
#define LED_ON (PORTD &= ~(1<<6))
@@ -38,21 +39,127 @@ uint8_t number_keys[10]=
uint16_t idle_count=0;
+
+
+//
+// scan matrix
+//
+uint8_t MAX_ROW = 9;
+
+// initialize ports for matrix
+void port_setup(void)
+{
+ // Column: input w/pullup
+ DDRB = 0x00;
+ PORTB = 0xFF;
+
+ // Row: Hi-Z(unselected)
+ // PD:0,1,2,3,6,7
+ // PC:6,7
+ // PF:7
+ DDRD = 0x00;
+ PORTD = 0x00;
+ DDRC = 0x00;
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+}
+
+// select a row of matrix for read
+void select_row(uint8_t row)
+{
+ switch (row) {
+ case 0:
+ DDRD = (1<<0);
+ PORTD = 0x00;
+ DDRC = 0x00;
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+ break;
+ case 1:
+ DDRD = (1<<1);
+ PORTD = 0x00;
+ DDRC = 0x00;
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+ break;
+ case 2:
+ DDRD = (1<<2);
+ PORTD = 0x00;
+ DDRC = 0x00;
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+ break;
+ case 3:
+ DDRD = (1<<3);
+ PORTD = 0x00;
+ DDRC = 0x00;
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+ break;
+ case 4:
+ DDRD = (1<<6);
+ PORTD = 0x00;
+ DDRC = 0x00;
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+ break;
+ case 5:
+ DDRD = (1<<7);
+ PORTD = 0x00;
+ DDRC = 0x00;
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+ break;
+ case 6:
+ DDRD = 0x00;
+ PORTD = 0x00;
+ DDRC = (1<<6);
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+ break;
+ case 7:
+ DDRD = 0x00;
+ PORTD = 0x00;
+ DDRC = (1<<7);
+ PORTC = 0x00;
+ DDRF = 0x00;
+ PORTF = 0x00;
+ break;
+ case 8:
+ DDRD = 0x00;
+ PORTD = 0x00;
+ DDRC = 0x00;
+ PORTC = 0x00;
+ DDRF = (1<<7);
+ PORTF = 0x00;
+ break;
+ }
+}
+
+uint8_t read_col(void)
+{
+ return PINB;
+}
+
int main(void)
{
- uint8_t b, d, mask, i, reset_idle;
- uint8_t b_prev=0xFF, d_prev=0xFF;
+ uint8_t i, reset_idle;
+ uint8_t prev_state[MAX_ROW];
+ for (int i=0; i < MAX_ROW; i++) prev_state[i] = 0xFF;
// set for 16 MHz clock
CPU_PRESCALE(0);
- // Configure all port B and port D pins as inputs with pullup resistors.
- // See the "Using I/O Pins" page for details.
- // http://www.pjrc.com/teensy/pins.html
- DDRD = 0x00;
- DDRB = 0x00;
- PORTB = 0xFF;
- PORTD = 0xFF;
+ port_setup();
+
// Initialize the USB, and then wait for the host to set configuration.
// If the Teensy is powered without a PC connected to the USB port,
@@ -76,32 +183,40 @@ int main(void)
print("All Port B or Port D pins are inputs with pullup resistors.\n");
print("Any connection to ground on Port B or D pins will result in\n");
print("keystrokes sent to the PC (and debug messages here).\n");
+
+ uint8_t col;
+ uint8_t code;
while (1) {
- // read all port B and port D pins
- b = PINB;
- d = PIND;
- // check if any pins are low, but were high previously
- mask = 1;
- reset_idle = 0;
- for (i=0; i<8; i++) {
- if (((b & mask) == 0) && (b_prev & mask) != 0) {
- //usb_keyboard_press(KEY_B, KEY_SHIFT);
- //usb_keyboard_press(number_keys[i], 0);
- print("Port B, bit ");
- phex(i);
- print("\n");
- reset_idle = 1;
- }
- if (((d & mask) == 0) && (d_prev & mask) != 0) {
- //usb_keyboard_press(KEY_D, KEY_SHIFT);
- //usb_keyboard_press(number_keys[i], 0);
- print("Port D, bit ");
- phex(i);
- print("\n");
- reset_idle = 1;
- }
- mask = mask << 1;
- }
+ reset_idle = 0;
+
+ for (uint8_t r=0; r < MAX_ROW; r++) {
+ select_row(r);
+
+ // without this read unstable value.
+ _delay_us(30);
+
+ col = read_col();
+ if (col != prev_state[r]) {
+ prev_state[r] = col;
+ phex(r);
+ print(": ");
+ pbin(col);
+ print("\n");
+
+ for (int c = 0; c < 8; c++) {
+ if (col & 1<<c) continue;
+ code = get_keycode(r, c);
+ phex(code);
+ print("\n");
+ usb_keyboard_press(code, 0);
+ }
+
+ reset_idle = 1;
+ }
+ }
+
+
+
// if any keypresses were detected, reset the idle counter
if (reset_idle) {
// variables shared with interrupt routines must be
@@ -111,11 +226,10 @@ int main(void)
idle_count = 0;
sei();
}
+
// now the current pins will be the previous, and
// wait a short delay so we're not highly sensitive
// to mechanical "bounce".
- b_prev = b;
- d_prev = d;
_delay_ms(2);
}
}