166 lines
9.5 KiB
Plaintext
166 lines
9.5 KiB
Plaintext
C51 COMPILER V9.01 KEYSCAN 02/22/2025 15:36:22 PAGE 1
|
||
|
||
|
||
C51 COMPILER V9.01, COMPILATION OF MODULE KEYSCAN
|
||
OBJECT MODULE PLACED IN .\output\KeyScan.obj
|
||
COMPILER INVOKED BY: D:\Tool\Keil\C51\BIN\C51.EXE code_drv\KeyScan.c LARGE OPTIMIZE(7,SIZE) REGFILE(.\output\MCUCore_Loa
|
||
-d.ORC) BROWSE INTVECTOR(0X1000) INCDIR(.\header_app;.\header_drv;.\code_gasguage;.\code_classb\iec60730_lib\include;.\co
|
||
-de_classb\iec60730_proc\Include;.\code_classb\config) DEBUG OBJECTEXTEND PRINT(.\output\KeyScan.lst) OBJECT(.\output\Key
|
||
-Scan.obj)
|
||
|
||
line level source
|
||
|
||
1 /********************************************************************************
|
||
2 Copyright (C), Sinowealth Electronic. Ltd.
|
||
3 Author: Sino
|
||
4 Version: V0.0
|
||
5 Date: 2020/04/26
|
||
6 History:
|
||
7 V2.0 2020/04/26 Preliminary
|
||
8 ********************************************************************************/
|
||
9 #include "Main.h"
|
||
10
|
||
11
|
||
12 BOOL bKeyFlg;
|
||
13 U16 data uiKeyValidCnt;
|
||
14 U16 data uiKeyInvalidCnt;
|
||
15 U8 data ucKeyValue;
|
||
16 U8 data ucKeyOldValue;
|
||
17 U8 data ucKeyValueBK;
|
||
18
|
||
19 /*************************************************************************************************
|
||
20 * 函数名: ScanKey
|
||
21 * 参 数: 无
|
||
22 * 返回值: 无
|
||
23 * 描 述: 1. 短按时,按键必须弹起后,才能识别为短按按键。
|
||
24 2. 长按和长按持续,按键无需弹起,就能识别为长按按键或长按持续。
|
||
25 3. 按键有优先级,多个按键被同时按下时,仅处理第一个被按下的按键。
|
||
26 4.同一个按键一直被按着,先触发长按,后触发长按持续,长按和长按持续都会被触发。
|
||
27 5. bKeyFlg:当检测到有效按键后,置位1
|
||
28 6. ucKeyValue:高4bit表示按键状态(短按、长按、长按继续、长按结束);低4bit表示键值
|
||
29 7. ucKeyValueBK 保存按键状态:无按键、有按键1、有按键2
|
||
30 8. uiKeyValidCnt 按键按下滤波计数器
|
||
31 9. uiKeyInvalidCnt 按键弹起滤波计数器
|
||
32 *************************************************************************************************/
|
||
33 void KeyScan(void)
|
||
34 {
|
||
35 1 if(!bKeyFlg)
|
||
36 1 {
|
||
37 2 ucKeyValueBK = KEYVAL_NULL; //先默认无按键按下
|
||
38 2
|
||
39 2 #ifdef KEY_NUM1_DEF //1个按键
|
||
if(!KEY_1_IO_RD)
|
||
{
|
||
ucKeyValueBK = KEYVAL_1;
|
||
}
|
||
#endif
|
||
45 2 #ifdef KEY_NUM2_DEF //2个按键
|
||
46 2 if(!KEY_1_IO_RD)
|
||
47 2 {
|
||
48 3 ucKeyValueBK = KEYVAL_1; //按键按下后,获取新键值
|
||
49 3 }
|
||
50 2 else if(!KEY_2_IO_RD)
|
||
51 2 {
|
||
52 3 ucKeyValueBK = KEYVAL_2; //按键按下后,获取新键值
|
||
C51 COMPILER V9.01 KEYSCAN 02/22/2025 15:36:22 PAGE 2
|
||
|
||
53 3 }
|
||
54 2 #endif
|
||
55 2 #ifdef KEY_NUM3_DEF //3个按键
|
||
if(!KEY_1_IO_RD)
|
||
{
|
||
ucKeyValueBK = KEYVAL_1;
|
||
}
|
||
else if(!KEY_2_IO_RD)
|
||
{
|
||
ucKeyValueBK = KEYVAL_2;
|
||
}
|
||
else if(!KEY_3_IO_RD)
|
||
{
|
||
ucKeyValueBK = KEYVAL_3;
|
||
}
|
||
#endif
|
||
69 2 if(ucKeyValueBK != ucKeyOldValue) //ucKeyValueBK中存放了新的键值,如果新键值跟
|
||
-老键值不同,
|
||
70 2 {
|
||
71 3 uiKeyInvalidCnt++; //按键弹起滤波计数器,当按键第一次按下时会清0,
|
||
-当按键弹起时会一直计数
|
||
72 3 if(uiKeyValidCnt >= KEY_S_TIME) //按键按下滤波计数器,当按键被按下后一直计数,<E695B0>
|
||
-醇<><E98687>鸷笸V辜剖<E8BE9C>
|
||
73 3 { //按下又弹起且未触发长按时,如果uiKeyValidCnt >
|
||
-= KEY_S_TIME,则可能是短按
|
||
74 4 if(uiKeyInvalidCnt >= KEY_S_TIME) //按键弹起滤波计数器达到短按消抖时间,则认为是一次
|
||
-按下和弹起都消抖过的有效按键
|
||
75 4 {
|
||
76 5 if(uiKeyValidCnt >= KEY_L_TIME) //在此区分是短按,还是长按结束
|
||
77 5 {
|
||
78 6 ucKeyValue = ucKeyOldValue | KEY_STATE_LE; //按下的时间超过长按时间,认为是长按已经结束了。该状态目
|
||
-前未使用
|
||
79 6 }
|
||
80 5 else
|
||
81 5 {
|
||
82 6 ucKeyValue = ucKeyOldValue | KEY_STATE_S; //按下的时间没有超过长按时间,认为是一次有效的短按按键
|
||
83 6 }
|
||
84 5 bKeyFlg = 1; //短按有效,暂停按键检测,去处理按键事件
|
||
85 5 goto scanend;
|
||
86 5 }
|
||
87 4 // else
|
||
88 4 // {
|
||
89 4 // uiKeyValidCnt++; //该行应该删掉,否则当KEY_S_TIME等于KEY_L_TIME的一<E79A84>
|
||
-爰耙陨鲜保<E9B29C>岚讯贪次笫侗鹞<E4BE97>ぐ唇崾<E59487><E5B4BE>
|
||
90 4 // }
|
||
91 4 }
|
||
92 3 else //每当按键按下的时间连短按消抖时间都不够时,认<EFBC8C>
|
||
-<2D>俏扌О醇<D09E><E98687>匦鲁跏蓟<E8B78F>
|
||
93 3 {
|
||
94 4 goto scanend;
|
||
95 4 }
|
||
96 3 }
|
||
97 2 else //ucKeyValueBK中存放了新的键值,新键值跟老键
|
||
-值相同,说明是同一个按键。
|
||
98 2 {
|
||
99 3 if(ucKeyValueBK != KEYVAL_NULL) //继续处理被按下的按键
|
||
100 3 {
|
||
101 4 uiKeyInvalidCnt = 0; //清弹起计数器
|
||
102 4 uiKeyValidCnt++; //累加按下计数器
|
||
103 4 if(uiKeyValidCnt == KEY_L_TIME) //当按下时间达到长按滤波时间时,认为此按键为长按键
|
||
104 4 {
|
||
105 5 ucKeyValue = ucKeyOldValue | KEY_STATE_L;
|
||
C51 COMPILER V9.01 KEYSCAN 02/22/2025 15:36:22 PAGE 3
|
||
|
||
106 5 bKeyFlg = 1;
|
||
107 5 }
|
||
108 4 else if(uiKeyValidCnt == KEY_LC_TIME) //当按下时间达到长按持续滤波时间时,认为此按键为长
|
||
-按持续
|
||
109 4 {
|
||
110 5 uiKeyValidCnt = KEY_L_TIME;
|
||
111 5 ucKeyValue = ucKeyOldValue | KEY_STATE_LC;
|
||
112 5 bKeyFlg = 1;
|
||
113 5 }
|
||
114 4 }
|
||
115 3 else //新键值是空键值,说明全部按键都释放了
|
||
116 3 {
|
||
117 4 ucKeyValue = KEYVAL_NULL; //全部按键都释放了,需要重新初始化检测寄存器
|
||
118 4 scanend:
|
||
119 4 uiKeyValidCnt = 0;
|
||
120 4 uiKeyInvalidCnt = 0;
|
||
121 4 ucKeyOldValue = ucKeyValueBK;
|
||
122 4 }
|
||
123 3 }
|
||
124 2 }
|
||
125 1 }
|
||
|
||
|
||
MODULE INFORMATION: STATIC OVERLAYABLE
|
||
CODE SIZE = 162 ----
|
||
CONSTANT SIZE = ---- ----
|
||
XDATA SIZE = ---- ----
|
||
PDATA SIZE = ---- ----
|
||
DATA SIZE = 7 ----
|
||
IDATA SIZE = ---- ----
|
||
BIT SIZE = 1 ----
|
||
END OF MODULE INFORMATION.
|
||
|
||
|
||
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|