📄 key2.lst
字号:
C51 COMPILER V8.08 KEY2 11/04/2008 09:03:15 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE KEY2
OBJECT MODULE PLACED IN key2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key2.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //////////////////////////////////////////////////////
2
3
4 ///注意分时调度机制
5
6 //矩阵第一列4个键:单机和连击 P3^4接地
7 //独立键盘第2个键:短击和长击
8 //独立键盘第3个键:单击和双击
9
10 ///////////////////////////////
11
12
13 #include<reg52.h>
14
15 #define uchar unsigned char
16 #define uint unsigned int
17
18 sbit dula=P2^6;
19 sbit wela=P2^7;
20
21 uchar flag8ms;
22 bit a;
23 uchar keyzhi;
24 uchar key0;
25 uchar beifenkey;
26 uchar shumaguan=0;
27 uchar yanshi=20;
28 uchar changjiyanshi=30;
29 uchar shuangjiyanshi=30;
30 bit shuangjiflag,shuangjiflag1;
31 uchar aa=0;
32 uchar count=0;
33
34 uchar code table[]={ //数码管
35 0x3f,0x06,0x5b,0x4f,
36 0x66,0x6d,0x7d,0x07,
37 0x7f,0x6f,0x77,0x7c,
38 0x39,0x5e,0x79,0x71};
39
40 void delay(uint z)
41 {
42 1 uint x,y;
43 1 for(x=z;x>0;x--)
44 1 for(y=110;y>0;y--);
45 1 }
46
47 void fun1();
48 void fun2();
49 void funduanji();
50 void funchangji();
51 uchar getkey() ;
52 void key();
53 void display(uchar shi,uchar ge);
54
55
C51 COMPILER V8.08 KEY2 11/04/2008 09:03:15 PAGE 2
56 void init()
57 {
58 1 P1=0xff;
59 1 P3=0xef;
60 1 TMOD=0x11;
61 1 TH0=(65536-8000)/256;
62 1 TL0=(65536-8000)%256;
63 1
64 1 EA=1;
65 1 ET0=1;
66 1 TR1=1;
67 1 TR0=1;
68 1 }
69
70 void main()
71 {
72 1 init();
73 1 while(1)
74 1 {
75 2 display(shumaguan/16,shumaguan%16); //不能写在key()里面
76 2 key();
77 2
78 2 }
79 1 }
80
81 uchar getkey() //取键值
82 {
83 1 key0=P3;
84 1
85 1 switch(~key0) //取反了
86 1 {
87 2 case 0x11:
88 2 keyzhi=1;
89 2 break;
90 2 case 0x12:
91 2 keyzhi=2;
92 2 break;
93 2 case 0x14:
94 2 keyzhi=3;
95 2 break;
96 2 case 0x18:
97 2 keyzhi=4;
98 2 break;
99 2 case 0x30:
100 2 keyzhi=5;
101 2 break;
102 2 case 0x50:
103 2 keyzhi=6;
104 2 break;
105 2 default:
106 2 keyzhi=0;
107 2 break;
108 2 }
109 1 return keyzhi ;
110 1 }
111
112 void key()
113 {
114 1 if(flag8ms==1) //分时调度机制
115 1 {
116 2 flag8ms=0;
117 2 if(getkey())
C51 COMPILER V8.08 KEY2 11/04/2008 09:03:15 PAGE 3
118 2 {
119 3 if(beifenkey==getkey()) //通过备份值检验来完成消抖
120 3 {
121 4 switch(beifenkey)
122 4 {
123 5 case 5: //短击与长击
124 5 if(changjiyanshi!=0) //为了完成长击后使changjiyanshi保持0
125 5 {
126 6 changjiyanshi--;
127 6 if(changjiyanshi==0)
128 6 {
129 7 funchangji();
130 7 }
131 6 }
132 5 break;
133 5 case 6: //单击与双击 注意 shuangjiflag shuangjiflag1 aa count 的重置
134 5
135 5 if(shuangjiflag1==1) //shuangjiflag1第一次按下抬起后标志
136 5 {
137 6 shuangjiflag=0;
138 6 aa=1;
139 6 }
140 5 else shuangjiflag=1;
141 5
142 5
143 5
144 5 default:
145 5 yanshi-- ; //连击的延时计时
146 5 if(!yanshi)
147 5 {
148 6 fun1();
149 6 fun2();
150 6 yanshi=20;
151 6 }
152 5 break;
153 5 }
154 4
155 4 }
156 3 else
157 3 { //勿忘更新备份
158 4 beifenkey=getkey();
159 4 }
160 3
161 3 }
162 2 else
163 2 {
164 3 if(beifenkey==5)
165 3 { //确定短击
166 4 beifenkey=0;
167 4 if(1<changjiyanshi<24)
168 4 {
169 5 changjiyanshi=25;
170 5 funduanji();
171 5 }
172 4 }
173 3 if(beifenkey==6)
174 3 {
175 4 if(shuangjiflag==1) //第一次按下后标志
176 4 {
177 5 shuangjiflag=0;
178 5 shuangjiflag1=1;
179 5 aa=0;
C51 COMPILER V8.08 KEY2 11/04/2008 09:03:15 PAGE 4
180 5 TH1=(65536-10000)/256;
181 5 TL1=(65536-10000)%256;
182 5 ET1=1;
183 5 }
184 4 }
185 3
186 3 }
187 2
188 2 }
189 1 }
190
191 void funchangji()
192 {
193 1 P1=0x00;
194 1 shumaguan=-1;
195 1 }
196 void funduanji()
197 {
198 1 P1--;
199 1 shumaguan++;
200 1 }
201
202 void fun1()
203 {
204 1 switch(beifenkey)
205 1 {
206 2 case 1:
207 2 P1--;
208 2 break;
209 2 case 2:
210 2 P1++;
211 2 break;
212 2 case 3:
213 2 P1=~P1;
214 2 break;
215 2 case 4:
216 2 if(P1==0xff)
217 2 {
218 3 P1=0;
219 3 }
220 2 else P1=0xff;
221 2 break;
222 2 }
223 1 }
224
225 void fun2()
226 {
227 1 switch(beifenkey)
228 1 {
229 2 case 1:
230 2 shumaguan++;
231 2 break;
232 2 case 2:
233 2 shumaguan--;
234 2 break;
235 2 case 3:
236 2 shumaguan=256-shumaguan;
237 2 break;
238 2 case 4:
239 2 if(shumaguan==0)
240 2 {
241 3 shumaguan=0xff;
C51 COMPILER V8.08 KEY2 11/04/2008 09:03:15 PAGE 5
242 3 }
243 2 else shumaguan=0;
244 2 break;
245 2 }
246 1
247 1 }
248 void display(uchar shi,uchar ge)
249 {
250 1 dula=1;
251 1 P0=table[shi];
252 1 dula=0;
253 1 P0=0xff;
254 1 wela=1;
255 1 P0=0xfe;
256 1 wela=0;
257 1 delay(1);
258 1
259 1 dula=1;
260 1 P0=table[ge];
261 1 dula=0;
262 1 P0=0xff;
263 1 wela=1;
264 1 P0=0xfd;
265 1 wela=0;
266 1 delay(1);
267 1 }
268
269 void timer0() interrupt 1
270 {
271 1 TH0=(65536-8000)/256;
272 1 TL0=(65536-8000)%256;
273 1 flag8ms=1;
274 1 }
275 void timer1() interrupt 3
276 {
277 1 TH1=(65536-10000)/256;
278 1 TL1=(65536-10000)%256;
279 1 count++;
280 1 if(count==80)
281 1 {
282 2 count=0;
283 2 shuangjiflag1=0; //否则不能进行下一次按键动作
284 2 ET1=0;
285 2 if(aa==1)
286 2 {
287 3 P1--;
288 3 }
289 2 else if(aa==0)
290 2 {
291 3 P1++;
292 3 }
293 2 aa=0;
294 2 }
295 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 485 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 ----
C51 COMPILER V8.08 KEY2 11/04/2008 09:03:15 PAGE 6
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -