📄 key.lst
字号:
C51 COMPILER V7.06 KEY 05/31/2009 01:55:41 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN key.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE software\key.C BROWSE DEBUG OBJECTEXTEND PRINT(.\key.lst) OBJECT(key.obj)
stmt level source
1 /*--------------------------------------------------------------------*-
2
3 key.C (V1.00)
4
5
6 -*---------------------------------------------------------------------*/
7 /*
8 * Copyright (c) 2006,wsl
9 * All rights reserved
10 *
11 * 文件名称: key.C
12 * 功能描述:
13 * 其它说明:
14 *
15 * 当前版本: V1.0 * 取代版本:
16 * 作 者: wsl * 修 改:
17 * 版本信息: 2006-12-16 * 修改信息: :
18 */
19 //***********************************************************************
20
21 #include "main.h"
22 #include "Port.h"
23 #include "key.h"
24 #include "OS_Basic_Func.H"
25 #include "DisplayDir.h"
26 #include "Menu.h"
27
28
29
30 //----------------------------------------------------------------------
31 // 定义键盘扫描程序返回数据类型
32 typedef struct{
33 uint8_t FunctionValue; // 存放最后扫描到的功能键键值
34 uint8_t FunctionCnt; // 统计击键个数
35 }Str_KeyRet;
36
37 // 定义以下键值允许连击
38 #define DOUBLE_KEY_1 K_Up
39 #define DOUBLE_KEY_2 'B'
40 // 按键年龄上限
41 #define KEYAGE (2)
42 #define MAXRATE (102) // 重复前的延迟值 1000 MS
43 #define MINRATE (30) // 连击速度 300 MS
44
45 //-----------------------------------------------------------------------
46 static uint8_t FunctionBuffer = 0;
47 static uint8_t KeyAgeCnt; // 按键年龄计数器
48 static bool bKeyState = 1; // 按键状态指示: 为 1 时按键处于去抖动期间
49 static bool bKeyESC; // 按键释放标志: 为 0 时已释放
50 static bool bKeydone = 1; // 按键任务完成标志: 为 1 时已完成
51 static bool bKeyProcess; // 按键有效标志: 为 1 时对按键执行
52
53 // 私有函数
54 static void KeyPadScan(Str_KeyRet *pKey);
55
C51 COMPILER V7.06 KEY 05/31/2009 01:55:41 PAGE 2
56 /*---------------------------------------------------------*-
57 * 函数名称: KeyPad()
58 * 参 数:
59 * 返 回:
60 * 函数功能: 按键处理
61 *
62 * 说 明:
63 *
64 * 当前版本: V1.0 * 取代版本:
65 * 作 者: wsl * 修 改:
66 * 版本信息: 2006-12-16 * 修改信息:
67 -*---------------------------------------------------------*/
68 void KeyPad(void)
69 {
70 1 Str_KeyRet Keytemp = {0x00, 0x00};
71 1
72 1 if ( !bKeydone ) //按键任务没有完成
73 1 return;
74 1
75 1 // 扫描按键
76 1 KeyPadScan(&Keytemp);
77 1
78 1 // 若无键按下或多个键按下,程序将作按键无效处理
79 1 if ( (0x00 == Keytemp.FunctionCnt) || (Keytemp.FunctionCnt > 0x01) )
80 1 {
81 2 KeyAgeCnt = 0; // 按键年龄计数器清"0"
82 2 FunctionBuffer = 0; // 上次功能键缓冲区清"0"
83 2 bKeyESC = 0; // 清按键释放标志
84 2 bKeyState = 1; // 置位按键状态
85 2 return;
86 2 }
87 1
88 1 // 若是上次按键末释放则返回
89 1 if (bKeyESC)
90 1 return;
91 1
92 1
93 1 // 若本次键不同,则用本次键值更新上次键值
94 1 if ( FunctionBuffer != Keytemp.FunctionValue )
95 1 {
96 2 FunctionBuffer = Keytemp.FunctionValue;
97 2 KeyAgeCnt = 0; // 按键年龄计数器清"0"
98 2 bKeyState = 1; // 置位第一次按下标志
99 2 }
100 1
101 1 KeyAgeCnt++; // 键值和上次相同,按键年龄加1
102 1
103 1 if (bKeyState) // 是单击
104 1 {
105 2 if ( KeyAgeCnt == KEYAGE ) // 按键有效?
106 2 { // 确定有效
107 3 bKeyProcess = 1; // 对按键解析执行
108 3 bKeydone = 0; // 清按键任务完成标志(表当前任务正在执行)
109 3 bKeyState = 0; // 清第一次按下标志
110 3 KeyAgeCnt = 0; // 置位按键年龄计数器
111 3
112 3 if ( (Keytemp.FunctionValue == DOUBLE_KEY_1) || (Keytemp.FunctionValue == DOUBLE_KEY_2) )
113 3 {
114 4 bKeyESC = 0; // 该功能键允许连击
115 4 }
116 3 else
117 3 { // 不允许连击
C51 COMPILER V7.06 KEY 05/31/2009 01:55:41 PAGE 3
118 4 bKeyESC = 1; // 置位bKeyESC标志,等待按键释放
119 4 }
120 3 }
121 2 }
122 1 else // 是连击键.判断按键年龄是否等于重复的延缓时间,不等于则返回.
123 1 {
124 2 if (KeyAgeCnt == MAXRATE)
125 2 { // 进入连击状态
126 3 KeyAgeCnt = KeyAgeCnt - MINRATE; // 按键年龄减重复速度
127 3 bKeyProcess = 1; // 对按键解析执行
128 3 bKeydone = 0; // 清按键任务完成标志(表当前任务正在执行)
129 3 }
130 2 }
131 1
132 1 if (bKeyProcess)
133 1 {
134 2 StartBuzzer(); // 开背光,键音
135 2 }
136 1 }
137
138 /*---------------------------------------------------------*-
139 * 函数名称: KeyPadScan()
140 * 参 数:
141 * 返 回:
142 * 函数功能: 按键扫描
143 *
144 * 说 明: 扫描引导键/功能键键值及个数
145 *
146 * 当前版本: V1.0 * 取代版本:
147 * 作 者: wsl * 修 改:
148 * 版本信息: 2006-12-16 * 修改信息:
149 -*---------------------------------------------------------*/
150 void KeyPadScan(Str_KeyRet *pKey)
151 {
152 1 K1 = 1;
153 1 K2 = 1;
154 1 K3 = 1;
155 1 K4 = 1;
156 1 if ( !K1 )
157 1 {
158 2 (*pKey).FunctionValue = K_Set;
159 2 (*pKey).FunctionCnt++;
160 2 }
161 1
162 1 if ( !K2 )
163 1 {
164 2 (*pKey).FunctionValue = K_Enter;
165 2 (*pKey).FunctionCnt++;
166 2 }
167 1
168 1 if ( !K3 )
169 1 {
170 2 (*pKey).FunctionValue = K_Right;
171 2 (*pKey).FunctionCnt++;
172 2 }
173 1
174 1 if ( !K4 )
175 1 {
176 2 (*pKey).FunctionValue = K_Up;
177 2 (*pKey).FunctionCnt++;
178 2 }
179 1
C51 COMPILER V7.06 KEY 05/31/2009 01:55:41 PAGE 4
180 1 }
181
182
183 /*---------------------------------------------------------*-
184 * 函数名称: KeyProcess()
185 * 参 数:
186 * 返 回:
187 * 函数功能: 键值处理
188 *
189 * 说 明:
190 *
191 * 当前版本: V1.0 * 取代版本:
192 * 作 者: wsl * 修 改:
193 * 版本信息: 2006-12-16 * 修改信息:
194 -*---------------------------------------------------------*/
195 void KeyProcess(void)
196 {
197 1 // 若无按键请求则返回
198 1 if ( !bKeyProcess )
199 1 return;
200 1 Menu_Change(FunctionBuffer);
201 1 bKeyProcess = 0; // 清按键有效标志
202 1
203 1 bKeydone = 1; // 置位按键任务完成标志
204 1
205 1
206 1 }
207 /*********************************************************************************************************
-********/
208
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 210 ----
CONSTANT SIZE = 2 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 2
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -