📄 keyscan.lst
字号:
C51 COMPILER V7.09 KEYSCAN 02/09/2009 16:04:55 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE KEYSCAN
OBJECT MODULE PLACED IN KeyScan.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE KeyScan.C OPTIMIZE(2,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 /***************************************************************************************************
2 **
3 ** 按键查询扫描软件子程序
4 ** 该程序采用在定时器中每间隔10ms扫描一次按键状态,并且通过特定在按键“年份”计数器把每次的次数记录
5 ** 下来,然后在GetKey_Value中进行相应的处理,进而得到相应的键值。
6 ** 内存占用:2个字节的按键状态KeyDownF_Flag、KeyDownM_Flag
7 n个按键的字节个“年份”计数器KeyYearCnt[KeyMaxNum]
8 ** 适用范围:该子程序使用于按键接在同一个端口上,并且是连续的情况
9 ** 返回键值:返回的按键的键值和按键连接的端口相对应
10 **----------------------------------------------------------------------------------------------------
11 ** 作 者 : 严俊生
12 ** 日 期 : 2007-07-06
13 ** 版本号 :V1.0
14 **----------------------------------------------------------------------------------------------------
15 ** 修改人 :
16 ** 日 期 :
17 ** 版本号 :
18 **
19 ****************************************************************************************************/
20 #include "KeyScan.H"
21
22
23 #define Key_Scan_EN 1
24 #define KeyDown_Value_EN 1
25
26 static _KeyScanStatus KeyScanStatus;
27
28 /*******************************************************************************************************
29 ** 名 称:Key_Scan
30 ** 功 能:本程序是采用查询的方式来扫描按键的,此处是假定KEY键全部接在P0口上的,在使用的时候要根据
31 实际的情况更改。由于此程序是在定时器0#中断中被调用,所以此处把它定义为可重入函数
32 ** 入口参数:PinValue 按键实际连接的物理端口
33 ** 出口参数:无
34 ** 注 意:该程序执行时间的长短与所需要扫描的按键数目有关系;
35 如果在强实时系统上,可以把该定时器0#中断设为最低优先级;需要强实时的处理在更高的优先级
36 中断中进行。
37 **----------------------------------------------------------------------------------------------------
38 ** 作 者 : 严俊生
39 ** 日 期 : 2007-07-06
40 **----------------------------------------------------------------------------------------------------
41 ** 修改人 :
42 ** 日 期 :
43 *******************************************************************************************************/
44 #if Key_Scan_EN
45 void Key_Scan(unsigned char PinValue) reentrant
46 { unsigned char i,keycurval;
47 1 // 暂定为P0口接按键
48 1 keycurval = PinValue;
49 1 /*============================= 按键扫描处理程序 ==============================*/
50 1 for(i=0;i<KeyMaxNum;i++)
51 1 {
52 2 if(keycurval&0x01)
53 2 {
54 3 KeyScanStatus.KeyYearCnt[i] = 0; // 按键“年份”计数器清0
55 3 KeyScanStatus.KeyDownF_Flag &= ( ~(1<<i) ); // 清零单次按键状态
C51 COMPILER V7.09 KEYSCAN 02/09/2009 16:04:55 PAGE 2
56 3 KeyScanStatus.KeyDownM_Flag &= ( ~(1<<i) ); // 清零多次按键状态
57 3 }
58 2 else KeyScanStatus.KeyYearCnt[i]++; // 按键“年份”计数器加1
59 2 keycurval = keycurval>>1;
60 2 }
61 1 }
62 #endif
63
64 /*******************************************************************************************************
65 ** 名 称:GetKey_Value
66 ** 功 能:本程序根据扫描的结果来判断按键的状态,是第一次按键,还是连击
67 ** 入口参数:无
68 ** 出口参数:返回按键的键号,支持多个按键同时按下
69 **----------------------------------------------------------------------------------------------------
70 ** 作 者 : 严俊生
71 ** 日 期 : 2007-07-06
72 **----------------------------------------------------------------------------------------------------
73 ** 修改人 :
74 ** 日 期 :
75 *******************************************************************************************************/
76 #if KeyDown_Value_EN
77 unsigned char GetKey_Value(void)
78 { unsigned char i, mm, nn=0, keydownstatus = 0;
79 1 for(i=0;i<KeyMaxNum;i++)
80 1 {
81 2 if( ( (KeyScanStatus.KeyYearCnt[i] > KeyDelayTime)&&((KeyScanStatus.KeyDownF_Flag&(1<<i))==0) )
- ||
82 2 ( (KeyScanStatus.KeyYearCnt[i] > KeyMaxTime) && ((KeyScanStatus.KeyDownM_Flag&(1<<i))==0) ) ||
-
83 2 ( (KeyScanStatus.KeyYearCnt[i] > KeyMinTime) &&(KeyScanStatus.KeyDownM_Flag&(1<<i)) )
- )
84 2 {
85 3 keydownstatus |= (1<<i);
86 3 // 第一次进入按键按下的状态
87 3 if( (KeyScanStatus.KeyYearCnt[i]>KeyDelayTime)&&((KeyScanStatus.KeyDownF_Flag&(1<<i))==0) )
88 3 {
89 4 KeyScanStatus.KeyYearCnt[i] = 0;
90 4 KeyScanStatus.KeyDownF_Flag |= (1<<i);
91 4 continue; // 退出本次循环
92 4 }
93 3 // 多次进入按键按下的状态
94 3 if( (KeyScanStatus.KeyYearCnt[i]>KeyMaxTime)&&((KeyScanStatus.KeyDownM_Flag&(1<<i))==0) )
95 3 {
96 4 KeyScanStatus.KeyYearCnt[i] = 0;
97 4 KeyScanStatus.KeyDownM_Flag |= (1<<i);
98 4 continue; // 退出本次循环
99 4 }
100 3 // 已经连击时候的处理
101 3 KeyScanStatus.KeyYearCnt[i] = 0;
102 3 }
103 2 }
104 1 // 进行多个按键的判断,如果已经有多个按键处于按下状态,则返回多个按键的键号
105 1 mm = KeyScanStatus.KeyDownF_Flag;
106 1 for(i=0;i<KeyMaxNum;i++)
107 1 {
108 2 if(mm&0x01) nn++;
109 2 mm = (mm>>1);
110 2 }
111 1 if(nn>1) return KeyScanStatus.KeyDownF_Flag;
112 1 else return keydownstatus;
113 1 }
114 #endif
C51 COMPILER V7.09 KEYSCAN 02/09/2009 16:04:55 PAGE 3
115
116 /********************************* End *************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 523 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 4
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 + -