keypad kutuphanesi, Interruptsiz

Dependents:   rtos_uygulamasi guvenlik_sistemi keypad_kullanimi lcd_kullanimi_keypad ... more

Committer:
marvas
Date:
Mon May 06 10:27:01 2019 +0000
Revision:
0:7da3ab010a87
keypad kutuphanesi

Who changed what in which revision?

UserRevisionLine numberNew 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