mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-04 07:12:33 +01:00 
			
		
		
		
	Fix debouncing code.(gh60)
This commit is contained in:
		
							parent
							
								
									093108825b
								
							
						
					
					
						commit
						9dfc611ae1
					
				@ -33,11 +33,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
#endif
 | 
			
		||||
static uint8_t debouncing = DEBOUNCE;
 | 
			
		||||
 | 
			
		||||
// matrix state buffer(1:on, 0:off)
 | 
			
		||||
/* matrix state(1:on, 0:off) */
 | 
			
		||||
static uint16_t *matrix;
 | 
			
		||||
static uint16_t *matrix_prev;
 | 
			
		||||
static uint16_t _matrix0[MATRIX_ROWS];
 | 
			
		||||
static uint16_t _matrix1[MATRIX_ROWS];
 | 
			
		||||
static uint16_t *matrix_debouncing;
 | 
			
		||||
static uint16_t matrix0[MATRIX_ROWS];
 | 
			
		||||
static uint16_t matrix1[MATRIX_ROWS];
 | 
			
		||||
static bool is_modified;
 | 
			
		||||
 | 
			
		||||
static uint16_t read_cols(void);
 | 
			
		||||
static void init_cols(void);
 | 
			
		||||
@ -64,38 +65,42 @@ void matrix_init(void)
 | 
			
		||||
    init_cols();
 | 
			
		||||
 | 
			
		||||
    // initialize matrix state: all keys off
 | 
			
		||||
    for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0;
 | 
			
		||||
    for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0;
 | 
			
		||||
    matrix = _matrix0;
 | 
			
		||||
    matrix_prev = _matrix1;
 | 
			
		||||
    matrix = matrix0;
 | 
			
		||||
    matrix_debouncing = matrix1;
 | 
			
		||||
    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
 | 
			
		||||
        matrix[i] = 0;
 | 
			
		||||
        matrix_debouncing[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
    is_modified = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t matrix_scan(void)
 | 
			
		||||
{
 | 
			
		||||
    if (!debouncing) {
 | 
			
		||||
        uint16_t *tmp = matrix_prev;
 | 
			
		||||
        matrix_prev = matrix;
 | 
			
		||||
        matrix = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
 | 
			
		||||
        unselect_rows();
 | 
			
		||||
        //unselect_rows();
 | 
			
		||||
        select_row(i);
 | 
			
		||||
        _delay_us(1);  // without this wait read unstable value.
 | 
			
		||||
        _delay_us(30);  // without this wait read unstable value.
 | 
			
		||||
        uint16_t cols = read_cols();
 | 
			
		||||
        if (matrix[i] != cols) {
 | 
			
		||||
            matrix[i] = cols;
 | 
			
		||||
        if (matrix_debouncing[i] != cols) {
 | 
			
		||||
            matrix_debouncing[i] = cols;
 | 
			
		||||
            if (debouncing) {
 | 
			
		||||
                debug("bounce!: "); debug_hex(debouncing); print("\n");
 | 
			
		||||
                debug("bounce!: "); debug_hex(debouncing); debug("\n");
 | 
			
		||||
            }
 | 
			
		||||
            debouncing = DEBOUNCE;
 | 
			
		||||
            is_modified = false;
 | 
			
		||||
        }
 | 
			
		||||
        unselect_rows();
 | 
			
		||||
    }
 | 
			
		||||
    unselect_rows();
 | 
			
		||||
    //unselect_rows();
 | 
			
		||||
 | 
			
		||||
    if (debouncing) {
 | 
			
		||||
        debouncing--;
 | 
			
		||||
        _delay_ms(1); // improved affect on bouncing
 | 
			
		||||
        _delay_ms(1);
 | 
			
		||||
    } else {
 | 
			
		||||
        uint16_t *tmp = matrix;
 | 
			
		||||
        matrix = matrix_debouncing;
 | 
			
		||||
        matrix_debouncing = tmp;
 | 
			
		||||
        is_modified = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 1;
 | 
			
		||||
@ -103,13 +108,7 @@ uint8_t matrix_scan(void)
 | 
			
		||||
 | 
			
		||||
bool matrix_is_modified(void)
 | 
			
		||||
{
 | 
			
		||||
    if (debouncing) return false;
 | 
			
		||||
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
 | 
			
		||||
        if (matrix[i] != matrix_prev[i]) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
    return is_modified;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user