keypad kutuphanesi, Interruptsiz
Dependents: rtos_uygulamasi guvenlik_sistemi keypad_kullanimi lcd_kullanimi_keypad ... more
Keypad.cpp@0:7da3ab010a87, 2019-05-06 (annotated)
- Committer:
- marvas
- Date:
- Mon May 06 10:27:01 2019 +0000
- Revision:
- 0:7da3ab010a87
keypad kutuphanesi
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
marvas | 0:7da3ab010a87 | 1 | #include "Keypad.h" |
marvas | 0:7da3ab010a87 | 2 | |
marvas | 0:7da3ab010a87 | 3 | Keypad::Keypad( |
marvas | 0:7da3ab010a87 | 4 | PinName kq, PinName kx, PinName ky, PinName kz, |
marvas | 0:7da3ab010a87 | 5 | PinName ka, PinName kb, PinName kc, PinName kd |
marvas | 0:7da3ab010a87 | 6 | ) |
marvas | 0:7da3ab010a87 | 7 | { |
marvas | 0:7da3ab010a87 | 8 | k_in[0] = new DigitalIn (ka, PullUp); |
marvas | 0:7da3ab010a87 | 9 | k_in[1] = new DigitalIn (kb, PullUp); |
marvas | 0:7da3ab010a87 | 10 | k_in[2] = new DigitalIn (kc, PullUp); |
marvas | 0:7da3ab010a87 | 11 | k_in[3] = new DigitalIn (kd, PullUp); |
marvas | 0:7da3ab010a87 | 12 | |
marvas | 0:7da3ab010a87 | 13 | k_out[0] = new DigitalOut (kq); |
marvas | 0:7da3ab010a87 | 14 | k_out[1] = new DigitalOut (kx); |
marvas | 0:7da3ab010a87 | 15 | k_out[2] = new DigitalOut (ky); |
marvas | 0:7da3ab010a87 | 16 | k_out[3] = new DigitalOut (kz); |
marvas | 0:7da3ab010a87 | 17 | |
marvas | 0:7da3ab010a87 | 18 | *k_out[0] = 1; |
marvas | 0:7da3ab010a87 | 19 | *k_out[1] = 1; |
marvas | 0:7da3ab010a87 | 20 | *k_out[2] = 1; |
marvas | 0:7da3ab010a87 | 21 | *k_out[3] = 1; |
marvas | 0:7da3ab010a87 | 22 | |
marvas | 0:7da3ab010a87 | 23 | uint8_t j,i; |
marvas | 0:7da3ab010a87 | 24 | for (j = 0; j < 4; j++){ |
marvas | 0:7da3ab010a87 | 25 | for(i = 0; i < 4; i++){ |
marvas | 0:7da3ab010a87 | 26 | key_transent_cntr[j][i] = CHNG_CNT; |
marvas | 0:7da3ab010a87 | 27 | key_state[j][i] = Off_state; |
marvas | 0:7da3ab010a87 | 28 | } |
marvas | 0:7da3ab010a87 | 29 | } |
marvas | 0:7da3ab010a87 | 30 | for(i = 0; i < BF_SIZE; i++){ |
marvas | 0:7da3ab010a87 | 31 | buf[i] = 0; |
marvas | 0:7da3ab010a87 | 32 | } |
marvas | 0:7da3ab010a87 | 33 | read_addr = 0; |
marvas | 0:7da3ab010a87 | 34 | write_addr = 0; |
marvas | 0:7da3ab010a87 | 35 | tk.attach_us(callback(this, &Keypad::key_scan), 2000); // 2mS |
marvas | 0:7da3ab010a87 | 36 | } |
marvas | 0:7da3ab010a87 | 37 | |
marvas | 0:7da3ab010a87 | 38 | void Keypad::key_scan(void) |
marvas | 0:7da3ab010a87 | 39 | { |
marvas | 0:7da3ab010a87 | 40 | //my_led = 1; |
marvas | 0:7da3ab010a87 | 41 | for (int32_t j = 0; j < 4; j++){ |
marvas | 0:7da3ab010a87 | 42 | *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1; *k_out[3] = 1; |
marvas | 0:7da3ab010a87 | 43 | *k_out[j] = 0; |
marvas | 0:7da3ab010a87 | 44 | wait_us(1); |
marvas | 0:7da3ab010a87 | 45 | for (int32_t i = 0; i < 4; i++){ |
marvas | 0:7da3ab010a87 | 46 | switch (key_state[j][i]){ |
marvas | 0:7da3ab010a87 | 47 | case Off_state: |
marvas | 0:7da3ab010a87 | 48 | //my_led = 1; |
marvas | 0:7da3ab010a87 | 49 | if (*k_in[i] == 0){ // key on |
marvas | 0:7da3ab010a87 | 50 | key_state[j][i] = Off_to_on_transient; |
marvas | 0:7da3ab010a87 | 51 | key_transent_cntr[j][i] = CHNG_CNT; |
marvas | 0:7da3ab010a87 | 52 | } |
marvas | 0:7da3ab010a87 | 53 | break; |
marvas | 0:7da3ab010a87 | 54 | case Off_to_on_transient: |
marvas | 0:7da3ab010a87 | 55 | //my_led = 1; |
marvas | 0:7da3ab010a87 | 56 | if (*k_in[i] == 0){ // key on |
marvas | 0:7da3ab010a87 | 57 | if (--key_transent_cntr[j][i] < -CHNG_CNT){ |
marvas | 0:7da3ab010a87 | 58 | //my_led = 1; |
marvas | 0:7da3ab010a87 | 59 | bf_put(j * 4 + i + 1); // save data into buffer |
marvas | 0:7da3ab010a87 | 60 | key_state[j][i] = On_state; |
marvas | 0:7da3ab010a87 | 61 | } |
marvas | 0:7da3ab010a87 | 62 | } else { // key off |
marvas | 0:7da3ab010a87 | 63 | if (++key_transent_cntr[j][i] > CHNG_CNT){ |
marvas | 0:7da3ab010a87 | 64 | key_state[j][i] = Off_state; |
marvas | 0:7da3ab010a87 | 65 | } |
marvas | 0:7da3ab010a87 | 66 | } |
marvas | 0:7da3ab010a87 | 67 | break; |
marvas | 0:7da3ab010a87 | 68 | case On_state: |
marvas | 0:7da3ab010a87 | 69 | //my_led = 1; |
marvas | 0:7da3ab010a87 | 70 | if (*k_in[i] == 1){ // key off |
marvas | 0:7da3ab010a87 | 71 | key_state[j][i] = On_to_off_transient; |
marvas | 0:7da3ab010a87 | 72 | key_transent_cntr[j][i] = -CHNG_CNT; |
marvas | 0:7da3ab010a87 | 73 | } |
marvas | 0:7da3ab010a87 | 74 | break; |
marvas | 0:7da3ab010a87 | 75 | case On_to_off_transient: |
marvas | 0:7da3ab010a87 | 76 | //my_led = 1; |
marvas | 0:7da3ab010a87 | 77 | if (*k_in[i] == 0){ // key on |
marvas | 0:7da3ab010a87 | 78 | if (--key_transent_cntr[j][i] < -CHNG_CNT){ |
marvas | 0:7da3ab010a87 | 79 | key_state[j][i] = On_state; |
marvas | 0:7da3ab010a87 | 80 | } |
marvas | 0:7da3ab010a87 | 81 | } else { // key off |
marvas | 0:7da3ab010a87 | 82 | if (++key_transent_cntr[j][i] > CHNG_CNT){ |
marvas | 0:7da3ab010a87 | 83 | key_state[j][i] = Off_state; |
marvas | 0:7da3ab010a87 | 84 | } |
marvas | 0:7da3ab010a87 | 85 | } |
marvas | 0:7da3ab010a87 | 86 | break; |
marvas | 0:7da3ab010a87 | 87 | default: // just in case |
marvas | 0:7da3ab010a87 | 88 | key_state[j][i] = Off_state; |
marvas | 0:7da3ab010a87 | 89 | break; |
marvas | 0:7da3ab010a87 | 90 | } |
marvas | 0:7da3ab010a87 | 91 | //my_led = 0; |
marvas | 0:7da3ab010a87 | 92 | } |
marvas | 0:7da3ab010a87 | 93 | } |
marvas | 0:7da3ab010a87 | 94 | *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1; *k_out[3] = 1; |
marvas | 0:7da3ab010a87 | 95 | //my_led = 0; |
marvas | 0:7da3ab010a87 | 96 | } |
marvas | 0:7da3ab010a87 | 97 | |
marvas | 0:7da3ab010a87 | 98 | uint8_t Keypad::read(void) |
marvas | 0:7da3ab010a87 | 99 | { |
marvas | 0:7da3ab010a87 | 100 | return bf_get(); |
marvas | 0:7da3ab010a87 | 101 | } |
marvas | 0:7da3ab010a87 | 102 | |
marvas | 0:7da3ab010a87 | 103 | void Keypad::bf_put(char dt) |
marvas | 0:7da3ab010a87 | 104 | { |
marvas | 0:7da3ab010a87 | 105 | uint8_t next = write_addr + 1; |
marvas | 0:7da3ab010a87 | 106 | if (next == BF_SIZE) { |
marvas | 0:7da3ab010a87 | 107 | next = 0; |
marvas | 0:7da3ab010a87 | 108 | } |
marvas | 0:7da3ab010a87 | 109 | buf[write_addr] = dt; |
marvas | 0:7da3ab010a87 | 110 | write_addr = next; |
marvas | 0:7da3ab010a87 | 111 | } |
marvas | 0:7da3ab010a87 | 112 | |
marvas | 0:7da3ab010a87 | 113 | int8_t Keypad::bf_get (void){ |
marvas | 0:7da3ab010a87 | 114 | if (read_addr == write_addr){ |
marvas | 0:7da3ab010a87 | 115 | return 0; |
marvas | 0:7da3ab010a87 | 116 | } |
marvas | 0:7da3ab010a87 | 117 | uint8_t dt = buf[read_addr]; |
marvas | 0:7da3ab010a87 | 118 | ++read_addr; |
marvas | 0:7da3ab010a87 | 119 | if (read_addr == BF_SIZE){ |
marvas | 0:7da3ab010a87 | 120 | read_addr = 0; |
marvas | 0:7da3ab010a87 | 121 | } |
marvas | 0:7da3ab010a87 | 122 | return dt; |
marvas | 0:7da3ab010a87 | 123 | } |
marvas | 0:7da3ab010a87 | 124 |