📄 key.lst
字号:
C51 COMPILER V7.06 KEY 09/14/2012 23:36:51 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN .\obj\key.obj
COMPILER INVOKED BY: D:\Program Files (x86)\keil\C51\BIN\C51.EXE key.c BROWSE DEBUG OBJECTEXTEND PRINT(.\lis\key.lst) OB
-JECT(.\obj\key.obj)
stmt level source
1 //
2 // 名称:
3 // 编写:niechao
4 // 日期:2012.08
5 // 修改:无
6 // 内容:按键操作程序
7 #include<reg52.h>
8 #include"timer0_1ms.h"
9 #include"led.h"
10 //按键端口定义
11 sbit io_set_key = P1^0 ;
12 sbit io_sht_key = P1^1 ;
13 sbit io_add_key = P1^2 ;
14 sbit io_sub_key = P1^3 ;
15
16 //按键初始化 主函数调用
17 void KeyInit(void)
18 {
19 1 io_set_key = 1 ;
20 1 io_sht_key = 1 ;
21 1 io_add_key = 1 ;
22 1 io_sub_key = 1 ;
23 1 }
24
25 //按键键码值
26 #define set_key_value 10
27 #define sht_key_value 20
28 #define add_key_value 30
29 #define sub_key_value 40
30 #define key_null 50
31
32
33
34 unsigned char a=0; //短按状态反馈给led。c
35 unsigned char *Pflag; //短按状态
36 unsigned char b=0; //长按状态反馈给led。c
37 unsigned char *Lflag; //长按状态
38
39
40
41
42 //------------------------------------------------
43 // 判断哪个按键按的
44 //------------------------------------------------
45 unsigned char KeyScan(void)
46 {
47 1 if(io_set_key == 0)return set_key_value ;
48 1 if(io_sht_key == 0)return sht_key_value ;
49 1 if(io_add_key == 0)return add_key_value ;
50 1 if(io_sub_key == 0)return sub_key_value ;
51 1 return key_null ;
52 1 }
53
54
C51 COMPILER V7.06 KEY 09/14/2012 23:36:51 PAGE 2
55 //------------------------------------------------
56 // 长按短按键值返回
57 //------------------------------------------------
58
59 static state(unsigned char *PKeyValue,unsigned char *LKeyValue )
60 //指向短按 指向长按
61 {
62 1 static unsigned char count ;
63 1
64 1 if (KeyScan()!=50 )
65 1
66 1 {
67 2 if (OUT1)
68 2
69 2 {
70 3
71 3 OUT1=0; //系统160MS时标到复位
72 3
73 3 if (KeyScan()!=50 ) //是否有按键按下
74 3
75 3 {
76 4
77 4
78 4 *PKeyValue = 1 ; //返回短按
79 4
80 4 count++;
81 4
82 4 led_show(); //短按复位前先显示
83 4 *PKeyValue = 0 ;
84 4 }
85 3
86 3 if (OUT2 == 1 ) //2S时标到
87 3
88 3 {
89 4
90 4 if (count > 12 ) //2S时标到内大于12次计数为长按
91 4 //不可能有2S按12次的按神?
92 4 {
93 5
94 5 *LKeyValue = 1 ; //返回长按
95 5
96 5 }
97 4
98 4 }
99 3
100 3 }
101 2
102 2 }
103 1
104 1 if ((count >= 0) && (*LKeyValue ==1) ) //每40ms查询当长按按键按下后释放
105 1
106 1 //用于复位短按计数和长按标志
107 1 {
108 2
109 2 if (KeyScan()==50 ) //按键是否释放
110 2
111 2 {
112 3 count = 0 ;
113 3
114 3 *LKeyValue = 0 ;
115 3
116 3 OUT2 = 0 ;
C51 COMPILER V7.06 KEY 09/14/2012 23:36:51 PAGE 3
117 3 }
118 2
119 2 }
120 1
121 1
122 1 }
123
124 //------------------------------------------------
125 // 通过指针间接赋值短按状态 长按状态
126 //------------------------------------------------
127
128 void getkey(void)
129
130 {
131 1
132 1
133 1
134 1 Pflag = &a; //短按状态通过将 短按状态a地址 赋值 给 指针 Pflag
135 1 //在state(unsigned char *PKeyValue,unsigned char *LKeyValue )函数间接修改短按状态a值
136 1 Lflag = &b; //长按状态通过将 长按状态a地址 赋值 给 指针 Lflag
137 1 //在state(unsigned char *PKeyValue,unsigned char *LKeyValue )函数间接修改短按状态b值
138 1 state(Pflag,Lflag);
139 1
140 1
141 1 }
142
143
144
145
146
147
148
149
150
151
152
153
154 //------------------------------------------------
155 // 判断哪个按键按下返回对应码值
156 // 此程序模版是在第二次调用时
157 // 无法复位20MS等时间标志位或复位标志位
158 // 影响使用其他时间标志 后发现可通过多 计时器时间标志求余
159 // 如想得到10Ms 通过现用20MS ( (20MS计数常量 % 2) >0 )结果为真
160 // 就是10ms的计数
161 //------------------------------------------------
162 /*void state(unsigned int *PKeyValue,unsigned int *LKeyValue )
163 //指向短按 指向长按
164 {
165 static unsigned char count ;
166
167 if (KeyScan()!=50 )
168
169 {
170 if (OUT)
171
172 {
173 StateChange(); //系统20MS时标到复位
174
175 if (KeyScan()!=50 ) //是否有按键按下
176
177 {
178 PKeyValue = KEY_STATE_PRESS ; //返回短按
C51 COMPILER V7.06 KEY 09/14/2012 23:36:51 PAGE 4
179
180 if (OUT) //20ms到了是否还有按键按下
181
182 {
183 if (KeyScan()!=50) //是否有按键按下
184
185 {
186 count++;
187 if (count > 40)
188
189 {
190 count = 0;
191
192 LKeyValue = KEY_STATE_LONG; //返回长按
193
194 }
195 }
196 }
197 }
198
199 }
200
201 }
202
203 }
204
205 */
206
207
208
209
210
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 190 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 6
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 + -