-void matrix_init(void)
-{
- // To use PORTF disable JTAG with writing JTD bit twice within four cycles.
- MCUCR |= (1<<JTD);
- MCUCR |= (1<<JTD);
-
-
- // initialize row and col
- unselect_rows();
- init_cols();
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- matrix[i] = 0;
- matrix_debouncing[i] = 0;
- }
-
- matrix_init_kb();
-}
-
-
-uint8_t matrix_scan(void)
-{
-
-#if DIODE_DIRECTION == COL2ROW
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- matrix_row_t cols = read_cols();
- if (matrix_debouncing[i] != cols) {
- matrix_debouncing[i] = cols;
- if (debouncing) {
- debug("bounce!: "); debug_hex(debouncing); debug("\n");
- }
- debouncing = DEBOUNCE;
- }
- unselect_rows();
- }
-
- if (debouncing) {
- if (--debouncing) {
- _delay_ms(1);
- } else {
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = matrix_debouncing[i];
- }
- }
- }
-#else
- for (uint8_t i = 0; i < MATRIX_COLS; i++) {
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- matrix_row_t rows = read_cols();
- if (matrix_reversed_debouncing[i] != rows) {
- matrix_reversed_debouncing[i] = rows;
- if (debouncing) {
- debug("bounce!: "); debug_hex(debouncing); debug("\n");
- }
- debouncing = DEBOUNCE;
- }
- unselect_rows();
- }
-
- if (debouncing) {
- if (--debouncing) {
- _delay_ms(1);
- } else {
- for (uint8_t i = 0; i < MATRIX_COLS; i++) {
- matrix_reversed[i] = matrix_reversed_debouncing[i];
- }
- }
- }
- for (uint8_t y = 0; y < MATRIX_ROWS; y++) {
- matrix_row_t row = 0;
- for (uint8_t x = 0; x < MATRIX_COLS; x++) {
- row |= ((matrix_reversed[x] & (1<<y)) >> y) << x;
- }
- matrix[y] = row;
- }
-#endif
-
- matrix_scan_kb();
-
- return 1;
-}
-