📄 keyboard.lst
字号:
C51 COMPILER V8.02 KEYBOARD 09/25/2008 19:29:38 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEYBOARD
OBJECT MODULE PLACED IN .\output\bin\keyBoard.obj
COMPILER INVOKED BY: C:\Keil802\C51\BIN\C51.EXE key\keyBoard.c LARGE BROWSE INCDIR(audio\;eeprom\;extendUART\;flash\;gps
-\;inter\;key\;mcu\;menu\;usb\;gprs\;main\;1wire\) DEBUG OBJECTEXTEND PRINT(.\output\keyBoard.lst) OBJECT(.\output\bin\ke
-yBoard.obj)
line level source
1 #include "typedef.h"
2 #include "keyBoard.h"
3 //扫描输入
4 Byte code keyInput[4] = {0x07, 0x0b, 0x0d, 0x0e};
5
6 /**********************以下定义16个按键****************/
7 #define KEY1_1 0xfff7
8 #define KEY1_2 0xfffb
9 #define KEY1_3 0xfffd
10 #define KEY1_4 0xfffe
11 #define KEY2_1 0xff7f
12 #define KEY2_2 0xffbf
13 #define KEY2_3 0xffdf
14 #define KEY2_4 0xffef
15 #define KEY3_1 0xf7ff
16 #define KEY3_2 0xfbff
17 #define KEY3_3 0xfdff
18 #define KEY3_4 0xfeff
19 #define KEY4_1 0x7fff
20 #define KEY4_2 0xbfff
21 #define KEY4_3 0xdfff
22 #define KEY4_4 0xefff
23
24
25 #define KEY1_12 0xfff3
26 #define KEY_NULL 0xffff
27
28 #define KEY_FIRST_ACC 2 /*第一次按键计次*/
29 #define KEY_CONTINUE_ACC 10 /*连续按键间隔计次*/
30 #define KEY_RELEASE_ACC 2 /*按键释放间隔次数*/
31 static char keyCode; /*保存按键码*/
32 extern Uchar volatile xdata D12_Y0;//键盘扫描时的输入地址,用到0-3
33 extern Uint8 xdata D12_Y2;//键盘扫描后的输出地址,用到4-7
34 extern idata Uchar D17CS;//赋值D12_Y0的寄存器
35 extern unsigned char volatile xdata D12_Y1;//原来的xCONTROLBYTE81K
36 extern idata unsigned char D16CS;//D12_Y1的寄存器,原来的xConByte81KValue
37 extern unsigned int backlightcount;
38 /*返回代码见key.h文件定义*/
39 char get_key(void)
40 {
41 1 char tmp;
42 1 key_process();
43 1
44 1 tmp = (Uchar)keyCode;
45 1 keyCode = 0;
46 1
47 1 return tmp;
48 1 }
49
50 /************************************
51 *
52 按键处理流程:
53 1)通过比较上一次的按键值来消除抖动。不相同就清除计次,相同就累加计次。
C51 COMPILER V8.02 KEYBOARD 09/25/2008 19:29:38 PAGE 2
54 2)累加到一定次数认为是按键稳定,发送蜂鸣声,判断按键类型。
55 3)当按键持续一定时间后定时发送蜂鸣声和按键类型。
56 4)按键释放要有一定的时间。即两次连续按键要有一定时间间隔。
57 5)考虑本产品的实际情况,向上和向上按键允许连续,取消和确认只能是单次按键。
58
59 当有效按键后要发送蜂鸣声。
60 通过简单的状态机处理按键的抖动、单次按键、连续按键。
61 keyState有以下几个状态:
62 0:第一次按键状态,消除抖动状态。不相同就清除计次,相同就累加计次,到一定的次数认为是有效按键。
63 1:连续按键状态。
64 2:释放按键状态。
65 *
66 *************************************/
67 //extern void debug_msgNeeded(unsigned int value);
68 void key_process(void)
69 {
70 1 static bit initFlag = 0;
71 1 static Byte keyState;
72 1 static Byte keyAcc;
73 1 static Uint16 keyKeep;
74 1 Byte i;
75 1 Uint16 tmp[4],test;//四行扫描的结果保存的地方
76 1 Uint16 tmpValue;//最终保存结果
77 1
78 1 if( initFlag == 0 )
79 1 {
80 2 initFlag = 1;
81 2 keyState = 0;
82 2 keyAcc = 0;
83 2 keyKeep = KEY_NULL;
84 2 }
85 1
86 1 for (i=0; i<4; i++)
87 1 {
88 2 tmp[i] = 0;
89 2 D17CS &= 0xf0;//低4位清零
90 2 D17CS |= keyInput[i];
91 2 D12_Y0 = D17CS;
92 2 test = D12_Y2;//xCONTROLBYTE82;
93 2 tmp[i] = D12_Y2 &0xf0;//xCONTROLBYTE82 & 0xF0;
94 2 if (0 ==i)
95 2 tmp[i] = tmp[i]>>4;
96 2 else if (i > 1)
97 2 tmp[i] = tmp[i] << (4*(i-1));
98 2 }
99 1
100 1 //确定最终输出值
101 1 tmpValue = 0;
102 1 for (i=0; i<4; i++)
103 1 {
104 2 tmpValue += tmp[i];
105 2 }
106 1 /*通过计次来达到消除抖动的目的*/
107 1 if( tmpValue == keyKeep )
108 1 {
109 2 keyAcc ++;
110 2 }
111 1 else
112 1 {
113 2 keyAcc = 0;
114 2 keyKeep = tmpValue;
115 2 }
C51 COMPILER V8.02 KEYBOARD 09/25/2008 19:29:38 PAGE 3
116 1
117 1 switch(keyState)
118 1 {
119 2 case 0: /*第一次按键状态*/
120 2 if( keyKeep == KEY_NULL )
121 2 {
122 3 keyAcc = 0;
123 3 break;
124 3 }
125 2
126 2 if( keyAcc == KEY_FIRST_ACC )
127 2 {
128 3 keyState = 1;
129 3
130 3 switch( keyKeep )
131 3 {
132 4 case KEY1_1:
133 4 keyCode = KEY_CODE_ENTER;//KEY_CODE_ALT;
134 4 break;
135 4
136 4 case KEY1_2:
137 4 keyCode = KEY_CODE_ESC;//KEY_CODE_NUM9;
138 4 break;
139 4
140 4 case KEY1_3:
141 4 keyCode = KEY_CODE_MENU;//KEY_CODE_NUM5;
142 4 break;
143 4
144 4 case KEY1_4:
145 4 keyCode = KEY_CODE_ALT;//KEY_CODE_NUM1;
146 4 break;
147 4
148 4 case KEY2_1:
149 4 keyCode = KEY_CODE_NUM4;//KEY_CODE_ENTER;
150 4 break;
151 4
152 4 case KEY2_2:
153 4 keyCode = KEY_CODE_NUM3;//KEY_CODE_NUM0;
154 4 break;
155 4
156 4 case KEY2_3:
157 4 keyCode = KEY_CODE_NUM2;//KEY_CODE_NUM6;
158 4 break;
159 4
160 4 case KEY2_4:
161 4 keyCode = KEY_CODE_NUM1;//KEY_CODE_NUM2;
162 4 break;
163 4
164 4 case KEY3_1:
165 4 keyCode = KEY_CODE_NUM8;//KEY_CODE_ESC;
166 4 break;
167 4
168 4 case KEY3_2:
169 4 keyCode = KEY_CODE_NUM7;//KEY_CODE_START;
170 4 break;
171 4
172 4 case KEY3_3:
173 4 keyCode = KEY_CODE_NUM6;//KEY_CODE_NUM7;
174 4 break;
175 4
176 4 case KEY3_4:
177 4 keyCode = KEY_CODE_NUM5;//KEY_CODE_NUM3;
C51 COMPILER V8.02 KEYBOARD 09/25/2008 19:29:38 PAGE 4
178 4 break;
179 4
180 4 case KEY4_1:
181 4 keyCode = KEY_CODE_START;//KEY_CODE_MENU;
182 4 break;
183 4
184 4 case KEY4_2:
185 4 keyCode = KEY_CODE_FUNC;//KEY_CODE_FUNC;
186 4 break;
187 4
188 4 case KEY4_3:
189 4 keyCode = KEY_CODE_NUM0;//KEY_CODE_NUM8;
190 4 break;
191 4
192 4 case KEY4_4:
193 4 keyCode = KEY_CODE_NUM9;//KEY_CODE_NUM4;
194 4 break;
195 4
196 4 case KEY1_12:
197 4 keyCode = KEY_LIGHT_CON;
198 4 break;
199 4
200 4 default:
201 4 keyState = 0;
202 4 keyAcc = 0;
203 4 break;
204 4 }
205 3 }
206 2 break;
207 2
208 2 case 1: /*连续按键状态*/
209 2 if( keyAcc == KEY_CONTINUE_ACC )
210 2 {
211 3 keyAcc = KEY_FIRST_ACC; /*防止计数溢出*/
212 3
213 3 }
214 2 else if( keyAcc == 0 )
215 2 { /*按键有变化*/
216 3 keyState = 2;
217 3 }
218 2
219 2 break;
220 2
221 2 case 2: /*释放按键状态*/
222 2 if( (keyAcc== KEY_RELEASE_ACC) && (keyKeep==KEY_NULL) )
223 2 keyState = 0;
224 2
225 2 break;
226 2
227 2 default:
228 2 keyState = 0;
229 2 break;
230 2 }
231 1
232 1 return;
233 1
234 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 570 ----
CONSTANT SIZE = 4 ----
C51 COMPILER V8.02 KEYBOARD 09/25/2008 19:29:38 PAGE 5
XDATA SIZE = 5 10
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -