@ -45,7 +45,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    extern  const  matrix_row_t  matrix_mask [ ] ; 
 
					 
					 
					 
					    extern  const  matrix_row_t  matrix_mask [ ] ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# endif 
 
					 
					 
					 
					# endif 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# if (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) 
 
					 
					 
					 
					# ifdef DIRECT_PINS 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					static  pin_t  direct_pins [ MATRIX_ROWS ] [ MATRIX_COLS ]  =  DIRECT_PINS ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					# elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  const  pin_t  row_pins [ MATRIX_ROWS ]  =  MATRIX_ROW_PINS ; 
 
					 
					 
					 
					static  const  pin_t  row_pins [ MATRIX_ROWS ]  =  MATRIX_ROW_PINS ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  const  pin_t  col_pins [ MATRIX_COLS ]  =  MATRIX_COL_PINS ; 
 
					 
					 
					 
					static  const  pin_t  col_pins [ MATRIX_COLS ]  =  MATRIX_COL_PINS ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# endif 
 
					 
					 
					 
					# endif 
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -54,20 +56,6 @@ static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  matrix_row_t  raw_matrix [ MATRIX_ROWS ] ;  //raw values
 
 
					 
					 
					 
					static  matrix_row_t  raw_matrix [ MATRIX_ROWS ] ;  //raw values
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  matrix_row_t  matrix [ MATRIX_ROWS ] ;  //debounced values
 
 
					 
					 
					 
					static  matrix_row_t  matrix [ MATRIX_ROWS ] ;  //debounced values
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# if (DIODE_DIRECTION == COL2ROW) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  void  init_cols ( void ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  bool  read_cols_on_row ( matrix_row_t  current_matrix [ ] ,  uint8_t  current_row ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  void  unselect_rows ( void ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  void  select_row ( uint8_t  row ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  void  unselect_row ( uint8_t  row ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# elif (DIODE_DIRECTION == ROW2COL) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  void  init_rows ( void ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  bool  read_rows_on_col ( matrix_row_t  current_matrix [ ] ,  uint8_t  current_col ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  void  unselect_cols ( void ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  void  unselect_col ( uint8_t  col ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    static  void  select_col ( uint8_t  col ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# endif 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					__attribute__  ( ( weak ) ) 
 
					 
					 
					 
					__attribute__  ( ( weak ) ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					void  matrix_init_quantum ( void )  { 
 
					 
					 
					 
					void  matrix_init_quantum ( void )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    matrix_init_kb ( ) ; 
 
					 
					 
					 
					    matrix_init_kb ( ) ; 
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -106,49 +94,6 @@ uint8_t matrix_cols(void) {
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  MATRIX_COLS ; 
 
					 
					 
					 
					    return  MATRIX_COLS ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					void  matrix_init ( void )  { 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    // initialize row and col
 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# if (DIODE_DIRECTION == COL2ROW) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    unselect_rows ( ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    init_cols ( ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# elif (DIODE_DIRECTION == ROW2COL) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    unselect_cols ( ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    init_rows ( ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# endif 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    // initialize matrix state: all keys off
 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for  ( uint8_t  i = 0 ;  i  <  MATRIX_ROWS ;  i + + )  { 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        raw_matrix [ i ]  =  0 ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        matrix [ i ]  =  0 ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    } 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    debounce_init ( MATRIX_ROWS ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    matrix_init_quantum ( ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					uint8_t  matrix_scan ( void ) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  bool  changed  =  false ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# if (DIODE_DIRECTION == COL2ROW) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  // Set row, read cols
 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  for  ( uint8_t  current_row  =  0 ;  current_row  <  MATRIX_ROWS ;  current_row + + )  { 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    changed  | =  read_cols_on_row ( raw_matrix ,  current_row ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  } 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# elif (DIODE_DIRECTION == ROW2COL) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  // Set col, read rows
 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  for  ( uint8_t  current_col  =  0 ;  current_col  <  MATRIX_COLS ;  current_col + + )  { 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    changed  | =  read_rows_on_col ( raw_matrix ,  current_col ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  } 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# endif 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  debounce ( raw_matrix ,  matrix ,  MATRIX_ROWS ,  changed ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  matrix_scan_quantum ( ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  return  1 ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					//Deprecated.
 
 
					 
					 
					 
					//Deprecated.
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					bool  matrix_is_modified ( void ) 
 
					 
					 
					 
					bool  matrix_is_modified ( void ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					{ 
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -195,16 +140,60 @@ uint8_t matrix_key_count(void)
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					# ifdef DIRECT_PINS 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					static  void  init_pins ( void )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  for  ( int  row  =  0 ;  row  <  MATRIX_ROWS ;  row + + )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    for  ( int  col  =  0 ;  col  <  MATRIX_COLS ;  col + + )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      pin_t  pin  =  direct_pins [ row ] [ col ] ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      if  ( pin  ! =  NO_PIN )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        setPinInputHigh ( pin ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# if (DIODE_DIRECTION == COL2ROW) 
 
					 
					 
					 
					static  bool  read_cols_on_row ( matrix_row_t  current_matrix [ ] ,  uint8_t  current_row )  { 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  matrix_row_t  last_row_value  =  current_matrix [ current_row ] ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  current_matrix [ current_row ]  =  0 ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  init_cols ( void ) 
 
					 
					 
					 
					  for  ( uint8_t  col_index  =  0 ;  col_index  <  MATRIX_COLS ;  col_index + + )  { 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    pin_t  pin  =  direct_pins [ current_row ] [ col_index ] ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    if  ( pin  ! =  NO_PIN )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      current_matrix [ current_row ]  | =  readPin ( pin )  ?  0  :  ( ROW_SHIFTER  < <  col_index ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  return  ( last_row_value  ! =  current_matrix [ current_row ] ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					# elif (DIODE_DIRECTION == COL2ROW) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					static  void  select_row ( uint8_t  row ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					{ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for ( uint8_t  x  =  0 ;  x  <  MATRIX_COLS ;  x + + )  { 
 
					 
					 
					 
					    setPinOutput ( row_pins [ row ] ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					        setPinInputHigh ( col_pins [ x ] ) ; 
 
					 
					 
					 
					    writePinLow ( row_pins [ row ] ) ; 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					static  void  unselect_row ( uint8_t  row ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					{ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    setPinInputHigh ( row_pins [ row ] ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					static  void  unselect_rows ( void ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					{ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    for ( uint8_t  x  =  0 ;  x  <  MATRIX_ROWS ;  x + + )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        setPinInput ( row_pins [ x ] ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    } 
 
					 
					 
					 
					    } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					static  void  init_pins ( void )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  unselect_rows ( ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  for  ( uint8_t  x  =  0 ;  x  <  MATRIX_COLS ;  x + + )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    setPinInputHigh ( col_pins [ x ] ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  bool  read_cols_on_row ( matrix_row_t  current_matrix [ ] ,  uint8_t  current_row ) 
 
					 
					 
					 
					static  bool  read_cols_on_row ( matrix_row_t  current_matrix [ ] ,  uint8_t  current_row ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					{ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    // Store last value of row prior to reading
 
 
					 
					 
					 
					    // Store last value of row prior to reading
 
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -233,31 +222,31 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  ( last_row_value  ! =  current_matrix [ current_row ] ) ; 
 
					 
					 
					 
					    return  ( last_row_value  ! =  current_matrix [ current_row ] ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  select_row ( uint8_t  row ) 
 
					 
					 
					 
					# elif (DIODE_DIRECTION == ROW2COL) 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					static  void  select_col ( uint8_t  col ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					{ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    setPinOutput ( row_pins [ row ] ) ; 
 
					 
					 
					 
					    setPinOutput ( col_pins[ col  ] ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    writePinLow ( row_pins[ row  ] ) ; 
 
					 
					 
					 
					    writePinLow ( col_pins[ col  ] ) ; 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  unselect_ row( uint8_t  row  ) 
 
					 
					 
					 
					static  void  unselect_ col( uint8_t  col  ) 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					{ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    setPinInputHigh ( row_pins[ row  ] ) ; 
 
					 
					 
					 
					    setPinInputHigh ( col_pins[ col  ] ) ; 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  unselect_ row s( void ) 
 
					 
					 
					 
					static  void  unselect_ col s( void ) 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					{ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    for ( uint8_t  x  =  0 ;  x  <  MATRIX_ ROW S;  x + + )  { 
 
					 
					 
					 
					    for ( uint8_t  x  =  0 ;  x  <  MATRIX_ COL S;  x + + )  { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					        setPinInput ( row  _pins[ x ] ) ; 
 
					 
					 
					 
					        setPinInput High( col  _pins[ x ] ) ; 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					    } 
 
					 
					 
					 
					    } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# elif (DIODE_DIRECTION == ROW2COL) 
 
					 
					 
					 
					static  void  init_pins ( void )  { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					  unselect_cols ( ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  init_rows ( void ) 
 
					 
					 
					 
					  for  ( uint8_t  x  =  0 ;  x  <  MATRIX_ROWS ;  x + + )  { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					    setPinInputHigh ( row_pins [ x ] ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    for ( uint8_t  x  =  0 ;  x  <  MATRIX_ROWS ;  x + + )  { 
 
					 
					 
					 
					  } 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					        setPinInputHigh ( row_pins [ x ] ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    } 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  bool  read_rows_on_col ( matrix_row_t  current_matrix [ ] ,  uint8_t  current_col ) 
 
					 
					 
					 
					static  bool  read_rows_on_col ( matrix_row_t  current_matrix [ ] ,  uint8_t  current_col ) 
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -300,22 +289,42 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  matrix_changed ; 
 
					 
					 
					 
					    return  matrix_changed ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  select_col ( uint8_t  col ) 
 
					 
					 
					 
					# endif 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    setPinOutput ( col_pins [ col ] ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    writePinLow ( col_pins [ col ] ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  unselect_col ( uint8_t  col ) 
 
					 
					 
					 
					void  matrix_init ( void )  { 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    setPinInputHigh ( col_pins [ col ] ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					static  void  unselect_cols ( void ) 
 
					 
					 
					 
					    // initialize key pins
 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					{ 
 
					 
					 
					 
					    init_pins ( ) ; 
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    for ( uint8_t  x  =  0 ;  x  <  MATRIX_COLS ;  x + + )  { 
 
					 
					 
					 
					
 
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					        setPinInputHigh ( col_pins [ x ] ) ; 
 
					 
					 
					 
					    // initialize matrix state: all keys off
 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    for  ( uint8_t  i = 0 ;  i  <  MATRIX_ROWS ;  i + + )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        raw_matrix [ i ]  =  0 ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        matrix [ i ]  =  0 ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    } 
 
					 
					 
					 
					    } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    debounce_init ( MATRIX_ROWS ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    matrix_init_quantum ( ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					} 
 
					 
					 
					 
					} 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					uint8_t  matrix_scan ( void ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					{ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  bool  changed  =  false ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					# if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  // Set row, read cols
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  for  ( uint8_t  current_row  =  0 ;  current_row  <  MATRIX_ROWS ;  current_row + + )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    changed  | =  read_cols_on_row ( raw_matrix ,  current_row ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					# elif (DIODE_DIRECTION == ROW2COL) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  // Set col, read rows
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  for  ( uint8_t  current_col  =  0 ;  current_col  <  MATRIX_COLS ;  current_col + + )  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    changed  | =  read_rows_on_col ( raw_matrix ,  current_col ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  } 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					# endif 
 
					 
					 
					 
					# endif 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  debounce ( raw_matrix ,  matrix ,  MATRIX_ROWS ,  changed ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  matrix_scan_quantum ( ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  return  1 ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					}