原理:按键和灯不是我们传统理解的思维,传统按键和灯是在同一个电路中的。而我们单片机编程按键和灯是分开的两个电路,通过单片机作为媒介来处理数据,通过逻辑来实现按键控制灯
怎么知道sw1按键被按下
KEY1
位置和
GND
接通,表现为低电平,值为
0
怎么知道sw1按键没有被按下
KEY1
位置通过上拉电阻到
5V
,表现为高电平,值为
1
key1和key2在单片机中有所对应的引脚,所以地址如下
#include "reg52.h"
#include <intrins.h>
sbit key1 = P2^1;
sbit ledOne = P3^7;
sbit key2 = P2^0;
void Delay50ms() //延时50ms
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
int ledMark = 0; //定义要放第一行
ledOne = 1;
//查询法检测,是否被按下
while(1){
if(key1 == 0)//KEY1位置和GND接通,表现为低电平,值为0
{
//感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次
//软件消除抖动
Delay50ms();//延迟50ms
if(key1 == 0)
{
//灯亮,给一个P3^7低电平
ledMark = 1;
}
}
if(key2 == 0)//KEY2位置和GND接通,表现为低电平,值为0
{
ledMark = 0;//灭
}
if(ledMark == 0)
{
ledOne = 1;
}else{
ledOne = 0;
}
}
}
为了防止按键抖动使其过于灵敏的亮灯,我们使用延时,使按键按的时间延长,这样就不会发生误差
再定义一个ledMark,让处理起来更加便捷