keypad kutuphanesi, Interruptsiz
Dependents: rtos_uygulamasi guvenlik_sistemi keypad_kullanimi lcd_kullanimi_keypad ... more
Keypad.cpp
- Committer:
- marvas
- Date:
- 2019-05-06
- Revision:
- 0:7da3ab010a87
File content as of revision 0:7da3ab010a87:
#include "Keypad.h" Keypad::Keypad( PinName kq, PinName kx, PinName ky, PinName kz, PinName ka, PinName kb, PinName kc, PinName kd ) { k_in[0] = new DigitalIn (ka, PullUp); k_in[1] = new DigitalIn (kb, PullUp); k_in[2] = new DigitalIn (kc, PullUp); k_in[3] = new DigitalIn (kd, PullUp); k_out[0] = new DigitalOut (kq); k_out[1] = new DigitalOut (kx); k_out[2] = new DigitalOut (ky); k_out[3] = new DigitalOut (kz); *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1; *k_out[3] = 1; uint8_t j,i; for (j = 0; j < 4; j++){ for(i = 0; i < 4; i++){ key_transent_cntr[j][i] = CHNG_CNT; key_state[j][i] = Off_state; } } for(i = 0; i < BF_SIZE; i++){ buf[i] = 0; } read_addr = 0; write_addr = 0; tk.attach_us(callback(this, &Keypad::key_scan), 2000); // 2mS } void Keypad::key_scan(void) { //my_led = 1; for (int32_t j = 0; j < 4; j++){ *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1; *k_out[3] = 1; *k_out[j] = 0; wait_us(1); for (int32_t i = 0; i < 4; i++){ switch (key_state[j][i]){ case Off_state: //my_led = 1; if (*k_in[i] == 0){ // key on key_state[j][i] = Off_to_on_transient; key_transent_cntr[j][i] = CHNG_CNT; } break; case Off_to_on_transient: //my_led = 1; if (*k_in[i] == 0){ // key on if (--key_transent_cntr[j][i] < -CHNG_CNT){ //my_led = 1; bf_put(j * 4 + i + 1); // save data into buffer key_state[j][i] = On_state; } } else { // key off if (++key_transent_cntr[j][i] > CHNG_CNT){ key_state[j][i] = Off_state; } } break; case On_state: //my_led = 1; if (*k_in[i] == 1){ // key off key_state[j][i] = On_to_off_transient; key_transent_cntr[j][i] = -CHNG_CNT; } break; case On_to_off_transient: //my_led = 1; if (*k_in[i] == 0){ // key on if (--key_transent_cntr[j][i] < -CHNG_CNT){ key_state[j][i] = On_state; } } else { // key off if (++key_transent_cntr[j][i] > CHNG_CNT){ key_state[j][i] = Off_state; } } break; default: // just in case key_state[j][i] = Off_state; break; } //my_led = 0; } } *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1; *k_out[3] = 1; //my_led = 0; } uint8_t Keypad::read(void) { return bf_get(); } void Keypad::bf_put(char dt) { uint8_t next = write_addr + 1; if (next == BF_SIZE) { next = 0; } buf[write_addr] = dt; write_addr = next; } int8_t Keypad::bf_get (void){ if (read_addr == write_addr){ return 0; } uint8_t dt = buf[read_addr]; ++read_addr; if (read_addr == BF_SIZE){ read_addr = 0; } return dt; }