ZDBMS/output/KeyScan.lst

166 lines
9.5 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

C51 COMPILER V9.01 KEYSCAN 02/11/2025 15:43:04 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/11/2025 15:43:04 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>鸷笸辜剖<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/11/2025 15:43:04 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)