📄 key.lst
字号:
C51 COMPILER V8.08 KEY 10/02/2007 07:17:26 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN key.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key.C BROWSE DEBUG OBJECTEXTEND
line 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"SCH51.H"
24 #include "MMI.h"
25 #include"Uart.h"
26 #include"LedDisp.h"
27 #include"key.h"
28 #include"LedDispInterface.h"
29
30 //----------------------------------------------------------------------
31 // 定义键盘扫描程序返回数据类型
32 typedef struct
33 {
34 unsigned char ShiftValue; // 存放最后扫描到的引导键键值
35 unsigned char ShiftCnt; // 统计上档键的个数
36 unsigned char FunctionValue; // 存放最后扫描到的功能键键值
37 unsigned char FunctionCnt; // 统计功能键的个数
38 }keyret;
39
40 // 定义以下键值允许连击
41 #define DOUBLE_KEY_1 K_Up
42 #define DOUBLE_KEY_2 'B'
43 // 按键年龄上限
44 #define KEYAGE (2)
45 #define MAXRATE (50) // 重复前的延迟值 600 MS
46 #define MINRATE (20) // 连击速度 240 MS
47
48 //----------------------------------------------------------------------
49 // 私有函数
50 static void KeyPadScan(keyret *pKey);
51
52 unsigned char i = 0;
53
54 //-----------------------------------------------------------------------
55 // 存放上次功能键和引导档的键值(keybuffer[0]存放功能键值)
C51 COMPILER V8.08 KEY 10/02/2007 07:17:26 PAGE 2
56 static unsigned char keybuffer[2]={0, 0};
57 static unsigned char keyagecnt; // 按键年龄计数器
58 static bit Flag_keystate; // 按键状态指示: 为 1 时按键处于去抖动期间
59 static bit Flag_keyesc; // 按键释放标志: 为 0 时已释放
60 static bit Flag_keydone; // 按键任务完成标志: 为 1 时已完成
61 static bit Flag_keyprocess; // 按键有效标志: 为 1 时对按键执行
62
63 /*---------------------------------------------------------*-
64 * 函数名称: KeyPadScan()
65 * 参 数:
66 * 返 回:
67 * 函数功能: 按键扫描
68 *
69 * 说 明: 扫描引导键/功能键键值及个数
70 *
71 * 当前版本: V1.0 * 取代版本:
72 * 作 者: wsl * 修 改:
73 * 版本信息: 2006-12-16 * 修改信息:
74 -*---------------------------------------------------------*/
75 void KeyPadScan(keyret *pKey)
76 {
77 1 if ( 0 == Shift )
78 1 { // 此键为引导键
79 2 (*pKey).ShiftValue = K_Shift;
80 2 (*pKey).ShiftCnt++;
81 2 }
82 1 if ( 0 == Up )
83 1 {
84 2 (*pKey).FunctionValue = K_Up;
85 2 (*pKey).FunctionCnt++;
86 2 }
87 1 if ( 0 == LoopRight )
88 1 {
89 2 (*pKey).FunctionValue = K_LoopRight;
90 2 (*pKey).FunctionCnt++;
91 2 }
92 1 if ( 0 == Enter )
93 1 {
94 2 (*pKey).FunctionValue = K_Enter;
95 2 (*pKey).FunctionCnt++;
96 2 }
97 1 }
98
99 /*---------------------------------------------------------*-
100 * 函数名称: KeyPad()
101 * 参 数:
102 * 返 回:
103 * 函数功能: 按键处理
104 *
105 * 说 明:
106 *
107 * 当前版本: V1.0 * 取代版本:
108 * 作 者: wsl * 修 改:
109 * 版本信息: 2006-12-16 * 修改信息:
110 -*---------------------------------------------------------*/
111 void KeyPad(void)
112 {
113 1 static bit Flag_key_init = 0; // 按键初始化标志,为1时初始化已完成
114 1 keyret keytemp = {0x00, 0x00, 0x00, 0x00};
115 1 // 按键初始化
116 1 if ( !Flag_key_init )
117 1 { // 每次开机按键初始化只运行一次
C51 COMPILER V8.08 KEY 10/02/2007 07:17:26 PAGE 3
118 2 //KEYPAD_PORT = 0xFF;
119 2 Flag_keystate = 1;
120 2 Flag_keyprocess = 0;
121 2 Flag_keydone = 1;
122 2 // 按键初始化完成,将此标志置位
123 2 Flag_key_init = 1;
124 2 }
125 1
126 1 if ( Flag_keydone )
127 1 { // 扫描按键
128 2 KeyPadScan(&keytemp);
129 2 // 若无功能键按下或多于一个功能键及引导键按下,程序将作按键无效处理
130 2 if ( (0x00 == keytemp.FunctionCnt) || (keytemp.FunctionCnt > 0x01) || (keytemp.ShiftCnt > 0x01) )
131 2 {
132 3 keyagecnt = 0; // 按键年龄计数器清"0"
133 3 keybuffer[0] = 0; // 上次功能键缓冲区清"0"
134 3 keybuffer[1] = 0; // 上次引导键缓冲区清"0"
135 3 Flag_keyesc = 0; // 清按键释放标志
136 3 Flag_keystate = 1; // 置位按键状态
137 3 return;
138 3 }
139 2 // 若是上次按键末释放则返回
140 2 if (Flag_keyesc)
141 2 {
142 3 return;
143 3 }
144 2 // 若本次功能键/引导键不同,则用本次键值更新上次键值
145 2 if ( (keybuffer[0] != keytemp.FunctionValue) || (keybuffer[1] != keytemp.ShiftValue) )
146 2 {
147 3 keybuffer[0] = keytemp.FunctionValue;
148 3 keybuffer[1] = keytemp.ShiftValue;
149 3 keyagecnt = 0; // 按键年龄计数器清"0"
150 3 Flag_keystate = 1; // 置位第一次按下标志
151 3 return;
152 3 }
153 2 // 键值和上次相同,按键年龄加1
154 2 keyagecnt++;
155 2 // 是第一次按下吗?
156 2 if (Flag_keystate)
157 2 { // 是第一按下
158 3 if ( keyagecnt == KEYAGE )
159 3 { // 确定按键按下
160 4 Flag_keyprocess = 1; // 对按键解析执行
161 4 Flag_keydone = 0; // 清按键任务完成标志(表当前任务正在执行)
162 4 Flag_keystate = 0; // 清第一次按下标志
163 4 keyagecnt = 0; // 置位按键年龄计数器
164 4 /*键音提示*/
165 4 OpenBuzzer();
166 4 SCH_Add_Task(CloseBuzzer, 10, 0); // 提示音长10毫秒
167 4 // 是功能键还是复合键
168 4 if (0 != keytemp.ShiftCnt)
169 4 { // 是复合键,等待按键释放
170 5 Flag_keyesc = 1; // 置位Flag_keyesc标志,等待按键释放
171 5 return;
172 5 }
173 4 else
174 4 { // 是功能键
175 5 if ( (keytemp.FunctionValue == DOUBLE_KEY_1) || (keytemp.FunctionValue == DOUBLE_KEY_2) )
176 5 { // 该功能键允许连击
177 6 return;
178 6 }
179 5 else
C51 COMPILER V8.08 KEY 10/02/2007 07:17:26 PAGE 4
180 5 { // 不允许连击
181 6 Flag_keyesc = 1; // 置位Flag_keyesc标志,等待按键释放
182 6 return;
183 6 }
184 5 }
185 4 }
186 3 else
187 3 { // 是抖动就返回
188 4 return;
189 4 }
190 3 }
191 2 else
192 2 { // 是连击键.不是第一次按下则判断按键年龄是否等于重复的延缓时间,不等于则返回.
193 3 if (keyagecnt == MAXRATE)
194 3 { // 进入连击状态
195 4 keyagecnt = keyagecnt - MINRATE; // 按键年龄减重复速度
196 4 Flag_keyprocess = 1; // 对按键解析执行
197 4 Flag_keydone = 0; // 清按键任务完成标志(表当前任务正在执行)
198 4 return;
199 4 }
200 3 else
201 3 { // 不等于重复的延缓时间返回
202 4 return;
203 4 }
204 3 }
205 2 }
206 1 }
207
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -