Fix debouncing code.(gh60)
This commit is contained in:
		
							parent
							
								
									093108825b
								
							
						
					
					
						commit
						9dfc611ae1
					
				
					 1 changed files with 27 additions and 28 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 tmk
						tmk