ATY_LIB V2_102_230218
ATY_LIB for general devices or ALGO
 
Loading...
Searching...
No Matches
KEY_ATY.c File Reference

functions of keys for all embedded device More...

#include "KEY_ATY.h"

Go to the source code of this file.

Macros

#define __KEY_ATY_C
 

Functions

void KeyStateMachine (uint8_t keyIndex)
 process key state from IO level
 
float KeyStateMachine_AD (uint8_t keyIndex)
 

Variables

uint8_t KEY_PIN_GROUP [MAX_KEY_NUMBER] = {0x01 << 0, 0x01 << 7, 0x01 << 6}
 
uint8_t KEY_PIN_GROUP_AD [MAX_KEY_NUMBER] = {9, 0, 0}
 
uint8_t lastKeyType [MAX_KEY_NUMBER] = {0}
 
uint8_t keyExportType [MAX_KEY_NUMBER] = {0}
 
uint16_t keyScanCount [MAX_KEY_NUMBER] = {0}
 
uint16_t keyReleaseCount [MAX_KEY_NUMBER] = {0}
 

Detailed Description

functions of keys for all embedded device

Parameters
ProjectDEVICE_GENERAL_ATY_LIB
Author
ATY
Version
  • 1_01_230514 > ATY
    1. Preliminary version, first Release

Definition in file KEY_ATY.c.

Macro Definition Documentation

◆ __KEY_ATY_C

#define __KEY_ATY_C

Definition at line 30 of file KEY_ATY.c.

Function Documentation

◆ KeyStateMachine()

void KeyStateMachine ( uint8_t  keyIndex)

process key state from IO level

Parameters
keyIndexkey IO pin to monitor
Note
SINGLE and DOUBLE type need key release to response

Definition at line 50 of file KEY_ATY.c.

51{
52 // P_SW2 |= 0x80;
53 // P2IM0 = 0xE0;
54 // P2IM1 = 0xE0; // high level IT
55 // P2INTE = 0xE0; // 25,26,27 enable IT
56 // P_SW2 &= ~0x80;
57 // EA = 1; // enable alla IT
58
59 if((KEY_PORT & KEY_PIN_GROUP[keyIndex]) == 0){ // release
60 // key debounce, 20ms miss when state machine put at 1ms cycle
62 // key debounce, 100ms miss when state machine put at 1ms cycle
64 && keyScanCount[keyIndex] < KEY_TYPE_LONG_TIME){
66 keyScanCount[keyIndex] = 0;
67 keyReleaseCount[keyIndex] = 0;
68 }
69 else{
70 // access new key after use last press until last press release
71 if(lastKeyType[keyIndex] == KEY_TYPE_ACCESS_NEW)
72 lastKeyType[keyIndex] = 0;
74 keyScanCount[keyIndex] = 0;
75 }
76 }
77 if(keyReleaseCount[keyIndex] < KEY_RELEASE_DEBOUNCE_TIME * 2) // 2 margin
78 keyReleaseCount[keyIndex]++;
79 }
80 else{
81 if(keyScanCount[keyIndex] < KEY_TYPE_VLONG_TIME * 1.2) // 1.2 margin
82 keyScanCount[keyIndex]++;
83 // 1000ms long press
84 if(keyScanCount[keyIndex] >= KEY_TYPE_LONG_TIME
85 && keyScanCount[keyIndex] < KEY_TYPE_VLONG_TIME){
86 keyExportType[keyIndex] = KEY_TYPE_LONG;
87 }
88 // 2000ms very long press
89 else if(keyScanCount[keyIndex] >= KEY_TYPE_VLONG_TIME){
90 keyExportType[keyIndex] = KEY_TYPE_VLONG;
91 }
92 }
93
94 if(keyExportType[keyIndex] != KEY_TYPE_RELASE
95 && lastKeyType[keyIndex] == 0){
96 lastKeyType[keyIndex] = keyExportType[keyIndex];
97 }
98}
uint8_t lastKeyType[MAX_KEY_NUMBER]
Definition: KEY_ATY.c:40
uint8_t KEY_PIN_GROUP[MAX_KEY_NUMBER]
Definition: KEY_ATY.c:35
uint16_t keyScanCount[MAX_KEY_NUMBER]
Definition: KEY_ATY.c:42
uint16_t keyReleaseCount[MAX_KEY_NUMBER]
Definition: KEY_ATY.c:43
uint8_t keyExportType[MAX_KEY_NUMBER]
Definition: KEY_ATY.c:41
#define KEY_TYPE_VLONG_TIME
Definition: KEY_ATY.h:60
#define KEY_TYPE_VLONG
Definition: KEY_ATY.h:55
#define KEY_TYPE_SINGLE
Definition: KEY_ATY.h:53
#define KEY_PORT
Definition: KEY_ATY.h:44
#define KEY_TYPE_ACCESS_NEW
Definition: KEY_ATY.h:56
#define KEY_TYPE_LONG_TIME
Definition: KEY_ATY.h:59
#define KEY_TYPE_RELASE
Definition: KEY_ATY.h:52
#define KEY_PRESS_DEBOUNCE_TIME
Definition: KEY_ATY.h:58
#define KEY_RELEASE_DEBOUNCE_TIME
Definition: KEY_ATY.h:57
#define KEY_TYPE_LONG
Definition: KEY_ATY.h:54

◆ KeyStateMachine_AD()

float KeyStateMachine_AD ( uint8_t  keyIndex)

Definition at line 101 of file KEY_ATY.c.

102{
103 float tempData = ADC_Get(KEY_PIN_GROUP_AD[keyIndex]);
104 if(tempData < KEY_AD_Threshold){ // release
105 // key debounce, 20ms miss when state machine put at 1ms cycle
107 // key debounce, 100ms miss when state machine put at 1ms cycle
109 && keyScanCount[keyIndex] < KEY_TYPE_LONG_TIME){
110 keyExportType[keyIndex] = KEY_TYPE_SINGLE;
111 keyScanCount[keyIndex] = 0;
112 keyReleaseCount[keyIndex] = 0;
113 }
114 else{
115 // access new key after use last press until last press release
116 if(lastKeyType[keyIndex] == KEY_TYPE_ACCESS_NEW)
117 lastKeyType[keyIndex] = 0;
118 keyExportType[keyIndex] = KEY_TYPE_RELASE;
119 keyScanCount[keyIndex] = 0;
120 }
121 }
122 if(keyReleaseCount[keyIndex] < KEY_RELEASE_DEBOUNCE_TIME * 2) // 2 margin
123 keyReleaseCount[keyIndex]++;
124 }
125 else{
126 if(keyScanCount[keyIndex] < KEY_TYPE_VLONG_TIME * 1.2) // 1.2 margin
127 keyScanCount[keyIndex]++;
128 // 1000ms long press
129 if(keyScanCount[keyIndex] >= KEY_TYPE_LONG_TIME
130 && keyScanCount[keyIndex] < KEY_TYPE_VLONG_TIME){
131 keyExportType[keyIndex] = KEY_TYPE_LONG;
132 }
133 // 2000ms very long press
134 else if(keyScanCount[keyIndex] >= KEY_TYPE_VLONG_TIME){
135 keyExportType[keyIndex] = KEY_TYPE_VLONG;
136 }
137 }
138
139 if(keyExportType[keyIndex] != KEY_TYPE_RELASE
140 && lastKeyType[keyIndex] == 0){
141 lastKeyType[keyIndex] = keyExportType[keyIndex];
142 }
143 return tempData;
144}
uint16_t ADC_Get(uint8_t channel)
uint8_t KEY_PIN_GROUP_AD[MAX_KEY_NUMBER]
Definition: KEY_ATY.c:36
#define KEY_AD_Threshold
Definition: KEY_ATY.h:45

Variable Documentation

◆ KEY_PIN_GROUP

uint8_t KEY_PIN_GROUP[MAX_KEY_NUMBER] = {0x01 << 0, 0x01 << 7, 0x01 << 6}

Definition at line 35 of file KEY_ATY.c.

◆ KEY_PIN_GROUP_AD

uint8_t KEY_PIN_GROUP_AD[MAX_KEY_NUMBER] = {9, 0, 0}

Definition at line 36 of file KEY_ATY.c.

◆ keyExportType

uint8_t keyExportType[MAX_KEY_NUMBER] = {0}

Definition at line 41 of file KEY_ATY.c.

◆ keyReleaseCount

uint16_t keyReleaseCount[MAX_KEY_NUMBER] = {0}

Definition at line 43 of file KEY_ATY.c.

◆ keyScanCount

uint16_t keyScanCount[MAX_KEY_NUMBER] = {0}

Definition at line 42 of file KEY_ATY.c.

◆ lastKeyType

uint8_t lastKeyType[MAX_KEY_NUMBER] = {0}

Definition at line 40 of file KEY_ATY.c.