查询法按键控制灯
当SW1被按下时,KEY1接通GND表现为低电平,值为0
当SW1未被按下时,KEY1接5V表现为高电平,值为1
查询电路图发现KEY1接在P2.1口
#include "reg52.h"
sbit key1 = P2^1;
sbit led1 = P3^7;
sbit led2 = P3^6;
void main()
{
while(1){
if(key1 == 0){ //当SW1被按下时,KEY1接通GND表现为低电平,值为0
led1=0;
led2=0;
}else{
led1=1;
led2=1;
}
}
}
通过上述代码实现,按下SW1两盏灯亮松开后两盏灯灭的效果。
如果要实现按下SW1灯亮,按下SW1灯灭的效果只需进行简单的修改即可,代码如下:
#include "reg52.h"
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit led1 = P3^7;
sbit led2 = P3^6;
void main()
{
while(1){
if(key1 == 0){ //当SW1被按下时,KEY1接通GND表现为低电平,值为0
led1=0;
led2=0;
}
if(key2 == 0){ //当SW2被按下时,KEY2表现为0
led1=1;
led2=1;
}
}
}
按键的软件消抖
什么叫消抖?
为了防止硬件老化后,导致板子一抖动就点亮灯或者出现按键松动的情况,因此需要对抖动现象就行消除操作,因为抖动发生的速度很快,因此只需要延迟一段时间,进行判断即可,这就是软件消抖
#include "reg52.h"
#include <intrins.h>
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit led1 = P3^7;
sbit led2 = P3^6;
void Delay20ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1){
if(key1 == 0){ //当SW1被按下时,KEY1接通GND表现为低电平,值为0
//第一次被按下,不知道时抖动还是人为的,延迟50ms再判断,实现软件消抖
Delay20ms();
if(key1 == 0){
led1=0;
led2=0;
}
}
if(key2 == 0){ //当SW2被按下时,KEY2表现为0
Delay20ms();
if(key2 == 0){
led1=1;
led2=1;
}
}
}
}
IO口状态翻转
如果想要实现,每按一次按钮使小灯状态发生改变的效果,只需要利用!取反字符进行操作即可:
#include "reg52.h"
#include <intrins.h>
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit led1 = P3^7;
sbit led2 = P3^6;
void Delay20ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
led1 = 1;
led2 = 1;
while(1){
if(key1 == 0){ //当SW1被按下时,KEY1接通GND表现为低电平,值为0
//第一次被按下,不知道时抖动还是人为的,延迟50ms再判断,实现软件消抖
Delay20ms();
if(key1 == 0){
led1 = !led1;
led2 = !led2;
}
}
if(key2 == 0){ //当SW2被按下时,KEY2表现为0
Delay20ms();
if(key2 == 0){
led1 = !led1;
led2 = !led2;
}
}
}
}
此时实现按一次按键灯的状态就会发生变化,且长按会持续间隔20ms闪烁。
在代码量较大的情况下或者对于实时性要求较高的业务流程中,使用标志位来替代0/1会更好,规范化处理:
#include "reg52.h"
#include <intrins.h>
#define OFF_STATUS 1
#define ON_STATUS 0
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit led1 = P3^7;
sbit led2 = P3^6;
void Delay20ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
int ledMark = OFF_STATUS;
led1 = 1;
led2 = 1;
while(1){
if(key1 == 0){ //当SW1被按下时,KEY1接通GND表现为低电平,值为0
//第一次被按下,不知道时抖动还是人为的,延迟50ms再判断,实现软件消抖
Delay20ms();
if(key1 == 0){
ledMark = ON_STATUS;
}
}
if(key2 == 0){ //当SW2被按下时,KEY2表现为0
Delay20ms();
if(key2 == 0){
ledMark = OFF_STATUS;
}
}
if(ledMark == OFF_STATUS){
led1 = 1;
led2 = 1;
}else{
led1 = 0;
led2 = 0;
}
}
}