独立按键
# 二、独立按键
# 1、原理图
- 因为独立按键的一端都接的是GND,而引脚默认为高电平,那么按下独立按键后,就会将P3_0~P3_3置为0,所以,我们可以通过判断P3_0~P3_3的值来进行一些操作,以达成使用独立按键控制的效果。
# 2、按键的消抖
- 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
# 3、独立按键控制LED状态
#include <REGX52.H>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms){
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1){
if(P3_1==0){
Delay(20);
while(P3_1==0); //判断按键是否松开,未松开者查询循环
Delay(20);
P2_0=~P2_0; //取反
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 4、独立按键控制LED显示二进制
void main(){
unsigned char LEDNum=0;
while(1){
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
P2默认就是0xFF,所以这里要定义一个变量,来进行++操作,再取反,因为
1111 1111 再加一就变成 1 0000 0000 了,这时P2反而变成了0x00.
另一种简单的写法:
void main(){ while(1){ if(P3_1==0){ Delay(20); while(P3_1==0); Delay(20); P2--; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
# 5、独立按键控制LED移位
#include <REGX52.H>
void Delay(unsigned int xms);
unsigned char LEDNum;
//定义在函数外部为全局变量,默认值为0
//如果定义在函数内部就是局部变量,不赋值的话,值不确定
void main()
{
P2=~0x01; //直接点亮LED1
while(1)
{
if(P3_1==0) //按Kl键移动
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8) //判断是否到第八位,是就重新开始
LEDNum=0;
P2=~(0x01<<LEDNum); //LED根据LEDNum移位取反
}
if(P3_0==0) //按K2键移动
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0) //判断是否在第1个LED,是就从LED8开始
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum); //LED根据LEDNum移位取反
}
}
}
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
编辑 (opens new window)
上次更新: 2023/09/13, 12:29:52