📄 key_scan.lst
字号:
240 影响:根据键值将相应的特殊键状态赋值,处理有优先级
241 //void SpeKeyDeal(UCHAR key)
C51 COMPILER V8.02 KEY_SCAN 09/17/2008 10:45:02 PAGE 5
242 *************************************************************/
243
244 void SpeKeyDeal(UCHAR key)
245 {
246 1 switch(key){
247 2 case 0x21: // 有CTRL键切换动作
248 2 if(CtlKeyOn == 1)
249 2 CtlKeyOn = 0;
250 2 else
251 2 CtlKeyOn = 1;
252 2 break;
253 2 case 0x22: // 有ALT键切换动作
254 2 if(AltKeyOn == 1)
255 2 AltKeyOn = 0;
256 2 else
257 2 AltKeyOn = 1;
258 2 break;
259 2 case 0x24: // 有ALPHA键切换动作
260 2 if(AlfaKeyOn == 1)
261 2 AlfaKeyOn = 0;
262 2 else
263 2 AlfaKeyOn = 1;
264 2 break;
265 2 case 0x88: // 有SHIFT键切换动作
266 2 if(ShiftKeyOn == 1)
267 2 ShiftKeyOn = 0;
268 2 else
269 2 ShiftKeyOn = 1;
270 2 break;
271 2 default: // 其他键不做处理
272 2 break;
273 2 }
274 1 }
275
276 /************************************************************
277 键值转换为扫描码处理程序
278 //void PutKbBuff(UCHAR KeyVal)
279 功能:将键值转换为扫描码,及其无效键处理。
280 *************************************************************/
281 /************************************************************
282 -----键值转换为扫描码处理程序-----
283 功能:将键值转换为扫描码,及其无效键处理
284 入口参数:查键值转换表所得扫描码
285 影响:将扫描码填入KeyBuffer[],等待主机查询
286 //void SpeKeyDeal(UCHAR key)
287 *************************************************************/
288
289 void PutKbBuff(UCHAR KeyVal)
290 {
291 1 if((AltKeyOn == 1) || (AlfaKeyOn == 1) || (ShiftKeyOn == 1) || (CtlKeyOn == 1))
292 1 {
293 2 if(AltKeyOn == 1) // ALT组合键
294 2 {
295 3 KeyBuffer[0] = '!';//0x21;//0xb0;
296 3 KeyBuffer[1] = KeyVal;
297 3 }
298 2 else if(AlfaKeyOn == 1) // 字母键
299 2 {
300 3 if(ShiftKeyOn == 1)
301 3 {
302 4 KeyBuffer[0] = '"';//0x22;//0xc0; // 大写
303 4 KeyBuffer[1] = KeyVal;
C51 COMPILER V8.02 KEY_SCAN 09/17/2008 10:45:02 PAGE 6
304 4 }
305 3 else
306 3 {
307 4 KeyBuffer[0] = '#';//0x23;//0xd0; // 小写
308 4 KeyBuffer[1] = KeyVal;
309 4 }
310 3 }
311 2 else if(ShiftKeyOn == 1) // shift组合键
312 2 {
313 3 KeyBuffer[0] = '$';//0x24;//0xe0;
314 3 KeyBuffer[1] = KeyVal;
315 3 }
316 2 else if(CtlKeyOn == 1) // ctrl组合键
317 2 {
318 3 KeyBuffer[0] = '%';//0x25; //0xf0;
319 3 KeyBuffer[1] = KeyVal;
320 3 }
321 2 }
322 1 else
323 1 {
324 2 KeyBuffer[0] = '&';//0x26;//0xa0; // 常规按键
325 2 KeyBuffer[1] = KeyVal;
326 2 }
327 1 }
328
329 /************************************************************
330 -----查表程序-----
331 功能: 通过行列号查找键号
332 参数: 行列号(ex。0x31 表示第3行第1列)
333 //说明:
334 //UCHAR lookup_table(UCHAR matrix)
335 *************************************************************/
336
337 UCHAR lookup_table(UCHAR matrix)
338 {
339 1 UCHAR i;
340 1 UCHAR ret_key;
341 1 for(i = 0; ((i < 44) && (key_table[i][0] != 0xff)); i++)
342 1 {
343 2 if(key_table[i][0] == matrix )
344 2 {
345 3 ret_key = key_table[i][1]; // 找到行列号,转换成键号
346 3 break;
347 3 }
348 2 }
349 1 return ret_key;
350 1 }
351
352 /************************************************************
353 -----键扫描任务-----
354 功能: 主程序调用该任务
355 参数: 行列号(ex。0x31 表示第3行第1列)
356 //说明:
357 //void task_keyscan(void)
358 *************************************************************/
359
360 void task_keyscan(void)
361 {
362 1 UCHAR i;
363 1 UCHAR temp_mat,temp_code;
364 1 temp_mat = 0;
365 1 temp_code = 0;
C51 COMPILER V8.02 KEY_SCAN 09/17/2008 10:45:02 PAGE 7
366 1
367 1 temp_mat = GetKeyMatrix(); //取得键盘阵列号
368 1 if(KbIsValid == 1)
369 1 {
370 2 SpeKeyDeal(temp_mat);
371 2 temp_code = lookup_table(temp_mat); //转换为键号
372 2 PutKbBuff(temp_code);
373 2 KbIrqOut = 0; // 发起中断
374 2 for(i = 0; i < 10; i++);
375 2 KbIrqOut = 1;
376 2 }
377 1 }
378
379 /************************************************************
380 -----键扫描相关变量初始化-----
381 功能: 主程序调用该函数
382 参数:
383 //说明:
384 //void init_keyscan(void)
385 *************************************************************/
386
387 void init_keyscan(void)
388 {
389 1 UCHAR i;
390 1 for(i = 0; i < 2; i++)
391 1 KeyBuffer[i] = 0;
392 1 KbIsPressed = 0;
393 1 AltKeyOn = 0; //=1 表示当前ALT键切换为ON状态,键值转义
394 1 AlfaKeyOn = 0; //=1 表示当前alpha键切换为ON状态,键值转义
395 1 CtlKeyOn = 0; //=1 表示当前ctrl键切换为ON状态,键值转义
396 1 CapsKeyOn = 0; //=1 表示当前Caps键切换为ON状态,键值转义
397 1 ShiftKeyOn = 0; //=1 表示当前Caps键切换为ON状态,键值转义
398 1 KbIsValid = 0; //=1 表示缓冲当前为有效值
399 1 KbBlCtl = 1; //复位时点亮背光
400 1 KeyBlOn_Count = 4; //背光点亮定时4秒
401 1 }
402
403
404 /************************************************************
405 -----行线输出扫描程序-----
406 说明: 根据index,将指定行线驱动低电平,其余为高电平
407
408 //void KEY_ROW_LOW(UCHAR index)
409 *************************************************************/
410
411 void KEY_ROW_LOW(UCHAR index)
412 {
413 1 // UCHAR i;
414 1 UCHAR p1_shift;
415 1 UCHAR p2_shift;
416 1 UCHAR p2_bit7;
417 1 UCHAR temp;
418 1
419 1 p2_bit7 = P2&0x80; // 暂存P2^7电平
420 1 p1_shift = 0x10; // 初始化p1移位初始值
421 1 p2_shift = 0x01; // 初始化p2移位初始值,因为P2.7为LED驱动,所以要保持他的值不变
422 1
423 1 // for(i = 0; i < index; i++)
424 1 // {
425 1 if(index < 4)
426 1 {
427 2 p1_shift = p1_shift << index;
C51 COMPILER V8.02 KEY_SCAN 09/17/2008 10:45:02 PAGE 8
428 2 p1_shift = ~p1_shift;
429 2 P1 = p1_shift;
430 2 P2 = (P2&0x80)|0x7f;
431 2 }
432 1 else //if((i >= 4) && (i < 7))
433 1 {
434 2 temp = index;
435 2 temp = ~(~temp + 4); // 作减4求绝对值运算
436 2 // p2_shift <<= abs(4 - index);
437 2 p2_shift <<= temp;
438 2 P2 = (~p2_shift) | p2_bit7;
439 2 P1 = 0xff;
440 2 }
441 1 // }
442 1 }
443
444
445 void Timer0_ISR (void) interrupt 1
446 {
447 1 TR0 = 0;
448 1 // TMR0 = Tmr0Reload;
449 1 TH0 = Tmr0High;
450 1 TL0 = Tmr0Low;
451 1 if(KeyDelayCount != 0) KeyDelayCount--;
452 1 if(++intcount == 100)
453 1 {
454 2 intcount = 0;
455 2 // if(KeyBlOn_Count != 0) KeyBlOn_Count--;
456 2 // if(KeyBlOn_Count != 0)
457 2 // {
458 2 // KbBlCtl = 1; // 点亮背光
459 2 // }
460 2 // else
461 2 // {
462 2 // KbBlCtl = 0; // 关闭背光
463 2 // }
464 2 // KbBlCtl = ~KbBlCtl;
465 2 AlphaLed = ~AlphaLed;
466 2 }
467 1 TF0 = 0;
468 1 TR0 = 1;
469 1 }
470
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 503 ----
CONSTANT SIZE = 90 ----
XDATA SIZE = 4 ----
PDATA SIZE = ---- ----
DATA SIZE = 10 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -