93 lines
2.2 KiB
C
93 lines
2.2 KiB
C
#include "matrix.h"
|
|
|
|
#include "gpio.h"
|
|
|
|
static uint8_t read_rows(void) {
|
|
return (readPin(C7) ? 0 : 1) |
|
|
(readPin(B1) ? 0 : 2) |
|
|
(readPin(B2) ? 0 : 4) |
|
|
(readPin(C6) ? 0 : 8) |
|
|
(readPin(B4) ? 0 : 16) |
|
|
(readPin(B5) ? 0 : 32);
|
|
}
|
|
|
|
static void select_col(uint8_t col) {
|
|
writePinLow(D3);
|
|
|
|
writePin(D4, (col & 1));
|
|
writePin(D5, (col & 2));
|
|
writePin(D6, (col & 4));
|
|
writePin(D7, (col & 8));
|
|
}
|
|
|
|
static void unselect_cols(void) {
|
|
writePinHigh(D3);
|
|
}
|
|
|
|
void matrix_init_custom(void) {
|
|
/* 74HC154 col pin configuration
|
|
* pin: D3 D7 D6 D5 D4
|
|
* row: off 0 x x x x
|
|
* 0 1 0 0 0 0
|
|
* 1 1 0 0 0 1
|
|
* 2 1 0 0 1 0
|
|
* 3 1 0 0 1 1
|
|
* 4 1 0 1 0 0
|
|
* 5 1 0 1 0 1
|
|
* 6 1 0 1 1 0
|
|
* 7 1 0 1 1 1
|
|
* 8 1 1 0 0 0
|
|
* 9 1 1 0 0 1
|
|
* 10 1 1 0 1 0
|
|
* 11 1 1 0 1 1
|
|
* 12 1 1 1 0 0
|
|
* 13 1 1 1 0 1
|
|
* 14 1 1 1 1 0
|
|
* 15 1 1 1 1 1
|
|
*/
|
|
setPinOutput(D3);
|
|
writePinHigh(D3);
|
|
|
|
setPinOutput(D4);
|
|
setPinOutput(D5);
|
|
setPinOutput(D6);
|
|
setPinOutput(D7);
|
|
|
|
|
|
/* Row pin configuration
|
|
*
|
|
* row: 0 1 2 3 4 5
|
|
* pin: C7 B1 B2 C6 B4 B5
|
|
*
|
|
*/
|
|
setPinInputHigh(C7);
|
|
setPinInputHigh(B1);
|
|
setPinInputHigh(B2);
|
|
setPinInputHigh(C6);
|
|
setPinInputHigh(B4);
|
|
setPinInputHigh(B5);
|
|
}
|
|
|
|
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
|
|
bool changed = false;
|
|
|
|
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
|
|
select_col(col);
|
|
matrix_io_delay();
|
|
uint8_t rows = read_rows();
|
|
|
|
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
|
bool prev_bit = current_matrix[row] & ((matrix_row_t)1 << col);
|
|
bool curr_bit = rows & (1 << row);
|
|
|
|
if (prev_bit != curr_bit) {
|
|
current_matrix[row] ^= ((matrix_row_t)1 << col);
|
|
changed = true;
|
|
}
|
|
}
|
|
unselect_cols();
|
|
}
|
|
|
|
return changed;
|
|
}
|