目录
1.按键简介
2.独立按键控制LED亮灭
3.独立按键控制LED移位
1.按键简介
在生活中,我们常常会见到各种按键,我们的开发板上也有按键,就在左下角有四个按键,我们把它们叫做独立按键。
独立按键的原理比较简单,大概就是按下独立按键,按键就会把电路连通,松开按键,又会恢复原样。
按键的内部结构是一个有弹性的金属片,按下会连接电路,松开之后又会恢复原样,所以电路又会断开。在单片机中,我们的按键对应的GPIO管口是下面这样的:
你会发现这里其实有一点不太一样的东西,就是K1和K2对应的GPIO口好像有点不太一样,是反过来的,这个,具体的原因我们不得而知,但是我们使用的时候需要记住我们两个按键对应控制的端口是不一样的就行了。
这里这里我们按下K1,电路连接,P31管脚就会接收到低电平信号,也就是P31会由默认的高电平1变成0,所以我们使用的时候只需要判断端口的值是1还是0就行了。
其次,金属按键还有一个性质——按下抖动
这也是一个按键的弊端,按键按下和松开时的抖动会导致控制的变化,比如我们定义按下按键灯就亮,那么存在抖动的情况下,我们的灯可以在前面的这段抖动的时间里面不断变化,也就是暗亮交替闪烁之后再保持稳定,所以,按键中一大重要的操作就是按键消抖。
2.独立按键控制LED亮灭
这里,我们使用KEY1来控制LED1的亮灭,按键1对应的端口是P31,LED1对应的端口是P20,我们先考虑一下如何使用按键。
首先我们使用按键就要检测按键的按下,按键按下的时候把LED1的状态更改,这样就好了,单在细节方面还需要补充,比如我们的按键需要消抖防止出现因为按键抖动导致的差错,所以我们需要在检测到按键按下之后暂停20ms进行消抖处理,在按键松开之后再进行消抖处理,这样就免除了按键抖动对我们操作的干扰了。
其次,按键按下之后松开之前,会一直处于按下的状态,也就是说,我们如果在这里设置LED变为!LED(即LED由1变0,由0变1),这样的话,我们在按下按键之后松开之前会一直进行判断KEY,而且每次都会成功然后变化LED状态,这并不是我们想要的。所以我们就要使用while循环把按键处于按下状态锁定起来,循环内部不使用任何操作,也就是写一个while(KEY==0);这样我们就可以让按键按下的时候始终处于这个循环里,按键松开之后再执行相应操作。
然后我们就可以实现我们的代码了:
#include <REGX52.H>
#include <INTRINS.H>sbit KEY1 = P3^1;
sbit LED1 = P2^0;void Delay(unsigned int xms) //@11.0592MHz
{while(xms--){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}void main()
{LED1 = 1;while(1){if(KEY1 == 0){Delay(20);//消抖while(KEY1 == 0);//检测按键松开Delay(20);//消抖LED1 = !LED1;//变化状态}}
}
这里我们的代码中使用了 sbit KEY1 = P3^1; 和 sbit LED1 = P2^0;这两句代码定义端口,其实我们也可以直接对两个端口赋值,但是我们的格式就要变了,比如我们使用P3_1和P2_0而不是P3^1和P2^0,因为这两种表示方式在51里是不一样的。
3.独立按键控制LED移位
这里模仿LED流水灯的效果,我们使用按键检测来让LED移位,思路是KEY1控制左移,KEY2控制右移,初始LED默认在LED1的位置处于亮的状态。
这样我们就可以实现代码了:
我们需要控制整个LED串,所以就选择对P2端口直接赋值,初始值需要是只有LED1亮,那么输入的数据就要是1111 1110,也就是初始化P2为0xFE,然后就是LED的左右移动,使用_crol_()和_cror_()函数即可,按键的消抖和KEY1(P31)与KEY2(P30)对应的端口也要注意一下,并且数据输入的是反过来的数据,所以我们的左移右移操作也要相反,即KEY1使用右移函数实现LED左移,KEY2使用左移函数实现LED右移,这样就可以完成我们的操作:
#include <REGX52.H>
#include <INTRINS.H>sbit KEY1 = P3^1;
sbit KEY2 = P3^0;void Delay(unsigned int xms) //@11.0592MHz
{while(xms--){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}void main()
{P2 = 0xFE;while(1){if(KEY1 == 0){Delay(20);while(KEY1 == 0);Delay(20);P2 = _cror_(P2,1);}if(KEY2 == 0){Delay(20);while(KEY2 == 0);Delay(20);P2 = _crol_(P2,1);}}
}
然后上电测试,就完成了独立按键部分的内容