📄 keycontrol.lst
字号:
194 6 {
195 7 task++; //按键状态转入重复的延缓阶段
196 7 keycnt = 0; //按键年龄清零
197 7 }
198 6 }
199 5 break;
200 5 case 1: //重复的延缓阶段
201 5 if(keycnt == MaxRate) //按键年龄等于重复的延缓时间
202 5 {
203 6 enflash = 0; //不允许闪烁
204 6
205 6 keyprocess = 1; //进行键值处理
206 6 keycnt = 0; //按键年龄清零
207 6 task++; //按键状态转入重复阶段
208 6 }
209 5 break;
210 5 case 2: //重复阶段
211 5 if(keycnt == MinRate) //重复时间到
212 5 {
213 6 enflash = 0; //不允许闪烁
214 6 keyprocess=1; //进行按键值处理
215 6 keycnt=0; //按键年龄清零
216 6 }
217 5 break;
218 5 }
219 4 }
220 3 }
221 2 }
222 1 }
223 /***********************************************************************************
224 *函数原型:void key_handler()
225 *功能:按键1处理
226 *说明:正常工作模式下,按下按键1即进入设定状态,此时第一个数码管闪烁,同时对应LED1的指示灯亮。
227 * 设定模式下,按下按键1,在LED1和LED4之间循环切换选择被选中的数码管闪烁,相应的指示灯亮
228 ************************************************************************************/
229 void key1_handler()
230 {
231 1 if(!keymark) //进入设定状态
232 1 {
233 2 led_buf[0] = 0xFE; //点亮第一个LED
234 2 pb=&led_buf[1]; //pb指向第一个数码管
235 2 blink=0x08; //第一位数码管闪烁
236 2 keymark=1;
C51 COMPILER V8.06 KEYCONTROL 11/26/2007 23:22:43 PAGE 5
237 2 enflash=1; //允许闪烁
238 2 }
239 1 else
240 1 {
241 2 pb++; //指向下一个数码管
242 2 blink>>=1; //该数码管闪烁
243 2 led_buf[0]=_crol_(led_buf[0],2); //调整指示灯
244 2 if(pb>=(uchar*)(led_buf+5))
245 2 {
246 3 pb=&led_buf[1];
247 3 blink=0x08; //第一个数码管闪烁
248 3 }
249 2 }
250 1 }
251 /***********************************************************************************
252 *函数原型:void key2_handler()
253 *功能:按键2处理
254 *说明:设定状态下,每执行一次选中的数码管的显示数值加1,
255 * 常按数值以一定速度连续递增,当数值大于9时又回到0;
256 * 正常状态下,按该键无效
257 ************************************************************************************/
258 void key2_handler()
259 {
260 1 if(keymark)
261 1 {
262 2 *pb+=1;
263 2 if(*pb==0x0A)
264 2 *pb=0x00;
265 2 }
266 1 }
267 /***********************************************************************************
268 *函数原型:void key3_handler()
269 *功能:按键3处理
270 *说明:设定状态下,每执行一次选中的数码管的显示数值减1,
271 常按数值以一定速度连续递减,当数值等于0时又回到9;
272 正常状态下,按该键无效
273 ************************************************************************************/
274 void key3_handler()
275 {
276 1 if(keymark)
277 1 {
278 2 if(*pb==0) *pb=9;
279 2 else *pb-=1;
280 2 }
281 1 }
282 /***********************************************************************************
283 *函数原型:void key4_handler()
284 *功能:按键4处理
285 *说明:该键为确定键,按下后熄灭指示灯,不闪烁,进入工作状态
286 ************************************************************************************/
287 void key4_handler()
288 {
289 1 blink=0x00;
290 1 led_buf[0]=0xFF;
291 1 keymark=0;
292 1 }
293 /***********************************************************************************
294 *函数原型:void keymix_handler()
295 *功能:复合键(上档键5+功能键8)处理
296 *说明:执行复位功能。4个数码管全显0,不闪烁。8个指示灯全灭,进入正常工作方式
297 ************************************************************************************/
298 void keymix_handler()
C51 COMPILER V8.06 KEYCONTROL 11/26/2007 23:22:43 PAGE 6
299 {
300 1 led_buf[0]=0xFF;
301 1 led_buf[1]=0x00;
302 1 led_buf[2]=0x00;
303 1 led_buf[3]=0x00;
304 1 led_buf[4]=0x00;
305 1 keymark=0;
306 1 blink=0x00;
307 1 }
308 /***********************************************************************************
309 *函数原型:void key_processing()
310 *功能:键值处理
311 *说明:根据键值执行相应按键功能
312 *参数:keyprocess keypre[1] keypre[0]
313 ************************************************************************************/
314 void key_processing()
315 {
316 1 if(keyprocess) //keyprocess为1时,函数实体才被执行
317 1 {
318 2 keydone=0;
319 2 keyprocess=0;
320 2 switch(keypre[1])
321 2 {
322 3 case 0x00:
323 3 switch(keypre[0])
324 3 {
325 4 case 0x01:key1_handler();break;
326 4 case 0x02:key2_handler();break;
327 4 case 0x03:key3_handler();break;
328 4 case 0x04:key4_handler();break;
329 4 }
330 3 break;
331 3 case 0x05:
332 3 if(keypre[0]==8)
333 3 keymix_handler();
334 3 break;
335 3 }
336 2 keydone = 1;
337 2 }
338 1 }
339 /***********************************************************************************
340 *函数原型:void timer0() interrupt 1
341 *功能:定时器0中断服务程序
342 *说明:键盘和LED一起构成1/6扫描,每6次中断进行一次键盘处理
343 ************************************************************************************/
344 void timer0() interrupt 1
345 {
346 1 TH0=V_TH0;
347 1 TL0=V_TL0; //时间常数重载
348 1 if(state<=4)
349 1 {
350 2 lflash();
351 2 display(state);
352 2 state++;
353 2 }
354 1 else
355 1 {
356 2 key();
357 2 state=0;
358 2 }
359 1 }
360 /***********************************************************************************
C51 COMPILER V8.06 KEYCONTROL 11/26/2007 23:22:43 PAGE 7
361 *函数原型:void main()
362 *功能:主程序,执行初始化操作,循环等待按键事件
363 *说明:无
364 ************************************************************************************/
365 void main()
366 {
367 1 TMOD=V_TMOD;
368 1 TH0=V_TH0;
369 1 TL0=V_TL0; //定时器T0初始化
370 1 TR0=1;
371 1 ET0=1;
372 1 EA=1;
373 1 task=0x00;
374 1 state=0x00; //标量和变量初始化
375 1 keyprocess=0;
376 1 keydone=1;
377 1 ledtime=ledshow;
378 1 ledtask=0;
379 1 keymark=0;
380 1 while(1)
381 1 {
382 2 key_processing();
383 2 }
384 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 731 ----
CONSTANT SIZE = 28 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 15 5
IDATA SIZE = ---- ----
BIT SIZE = 6 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -