summaryrefslogtreecommitdiff
path: root/macway/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'macway/matrix.c')
-rw-r--r--macway/matrix.c100
1 files changed, 32 insertions, 68 deletions
diff --git a/macway/matrix.c b/macway/matrix.c
index c2b3fb8b2a..7c2a421059 100644
--- a/macway/matrix.c
+++ b/macway/matrix.c
@@ -7,16 +7,10 @@
#include <util/delay.h>
#include "print.h"
#include "util.h"
-#include "controller.h"
#include "matrix_skel.h"
-// matrix is active low. (key on: 0/key off: 1)
-// row: Hi-Z(unselected)/low output(selected)
-// PD0, PC7, PD7, PF6, PD6, PD1, PD2, PC6, PF7
-// col: input w/pullup
-// PB0-PB7
-// matrix state buffer
+// matrix state buffer (key on: 1/key off: 0)
static uint8_t *matrix;
static uint8_t *matrix_prev;
static uint8_t _matrix0[MATRIX_ROWS];
@@ -45,6 +39,7 @@ void matrix_init(void)
{
// initialize row and col
unselect_rows();
+ // Input with pull-up(DDR:0, PORT:1)
DDRB = 0x00;
PORTB = 0xFF;
@@ -64,11 +59,12 @@ int matrix_scan(void)
matrix = tmp;
for (int i = 0; i < MATRIX_ROWS; i++) {
+ unselect_rows();
select_row(i);
_delay_us(30); // without this wait read unstable value.
matrix[i] = ~read_col();
- unselect_rows();
}
+ unselect_rows();
return 1;
}
@@ -145,88 +141,56 @@ static uint8_t read_col(void)
static void unselect_rows(void)
{
- DDRD = 0x00;
- PORTD = 0x00;
- DDRC = 0x00;
- PORTC = 0x00;
- DDRF = 0x00;
- PORTF = 0x00;
+ // Hi-Z(DDR:0, PORT:0) to unselect
+ DDRC &= ~0b11000000; // PC: 7,6
+ PORTC &= ~0b11000000;
+ DDRD &= ~0b11000111; // PD: 7,6,2,1,0
+ PORTD &= ~0b11000111;
+ DDRF &= ~0b11000000; // PF: 7,6
+ PORTF &= ~0b11000000;
}
static void select_row(uint8_t row)
{
+ // Output low(DDR:1, PORT:0) to select
+ // row: 0 1 2 3 4 5 6 7 8
+ // pin: PD0, PC7, PD7, PF6, PD6, PD1, PD2, PC6, PF7
switch (row) {
case 0:
- DDRD = (1<<0);
- PORTD = 0x00;
- DDRC = 0x00;
- PORTC = 0x00;
- DDRF = 0x00;
- PORTF = 0x00;
+ DDRD |= (1<<0);
+ PORTD &= ~(1<<0);
break;
case 1:
- DDRD = 0x00;
- PORTD = 0x00;
- DDRC = (1<<7);
- PORTC = 0x00;
- DDRF = 0x00;
- PORTF = 0x00;
+ DDRC |= (1<<7);
+ PORTC &= ~(1<<7);
break;
case 2:
- DDRD = (1<<7);
- PORTD = 0x00;
- DDRC = 0x00;
- PORTC = 0x00;
- DDRF = 0x00;
- PORTF = 0x00;
+ DDRD |= (1<<7);
+ PORTD &= ~(1<<7);
break;
case 3:
- DDRD = 0x00;
- PORTD = 0x00;
- DDRC = 0x00;
- PORTC = 0x00;
- DDRF = (1<<6);
- PORTF = 0x00;
+ DDRF |= (1<<6);
+ PORTF &= ~(1<<6);
break;
case 4:
- DDRD = (1<<6);
- PORTD = 0x00;
- DDRC = 0x00;
- PORTC = 0x00;
- DDRF = 0x00;
- PORTF = 0x00;
+ DDRD |= (1<<6);
+ PORTD &= ~(1<<6);
break;
case 5:
- DDRD = (1<<1);
- PORTD = 0x00;
- DDRC = 0x00;
- PORTC = 0x00;
- DDRF = 0x00;
- PORTF = 0x00;
+ DDRD |= (1<<1);
+ PORTD &= ~(1<<1);
break;
case 6:
- DDRD = (1<<2);
- PORTD = 0x00;
- DDRC = 0x00;
- PORTC = 0x00;
- DDRF = 0x00;
- PORTF = 0x00;
+ DDRD |= (1<<2);
+ PORTD &= ~(1<<2);
break;
case 7:
- DDRD = 0x00;
- PORTD = 0x00;
- DDRC = (1<<6);
- PORTC = 0x00;
- DDRF = 0x00;
- PORTF = 0x00;
+ DDRC |= (1<<6);
+ PORTC &= ~(1<<6);
break;
case 8:
- DDRD = 0x00;
- PORTD = 0x00;
- DDRC = 0x00;
- PORTC = 0x00;
- DDRF = (1<<7);
- PORTF = 0x00;
+ DDRF |= (1<<7);
+ PORTF &= ~(1<<7);
break;
}
}