前提:与昨天不同的是,昨天是通过将程序输入给CPU从而直接控制LED灯,今天将通过控制程序控制独立按键进而通过独立按键控制LED灯
原理图如下:
GND:负极 (说明应该给予高电位才能通电)KEY:独立按键名称(一个LED灯对应一个按键)
昨天使用一根杜邦线(两端分别连接D1和P0-0)
今天是使用两条杜邦线,一根还是像昨天那样,另外一根用来连接独立按键KEY1和P3_7
(io口可任意选择)
1、按下按键KEY1则LED灯亮,松开即灭,程序如下:
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_7 == 1) //如果按下按键key1
{
P0_0 = 1; //则给予高电位,电路完整,LED亮
}
else //否则,如果没有按下按键Key1
{
P0_0 = 0; //则给予低电位,电路两端均为低电位,无法通电,LED灭
}
}
}
2、按下KEY1则LED灯一直亮,再按下按键则LED灯灭
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_0 == 0) //如果按下按键
{
Delay(20); //延时20ms(按下消抖)
while(P3_0 ==0); //20ms之后如果依然按下;则一直进行空循环,不执行接下来的程序
Delay(20); //20ms之后如果按键松开,则执行延时20ms(松开消抖)
P0_0=~P0_0; //按位取反(如果第一次按下是亮那么第二次按下就是灭)
}
}
}
简单来说就是:按下按键➡️按下消抖➡️松开➡️松开消抖➡️执行开灯/关灯
如果想要实现一个按键控制一个LED灯,只需要在循环里面增加程序即可(以此类推):
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_0 == 0)
{
Delay(20);
while(P3_0 ==0);
Delay(20);
P0_0=~P0_0;
}
if(P3_1 == 0)
{
Delay(20);
while(P3_1 ==0);
Delay(20);
P0_1=~P0_1;
}
}
}
了解一下按键抖动:
简单来说,主要是由于按键使用的弹性开关在闭合和断开过程中存在弹性作用导致的短暂不稳定现象。这种抖动可能会导致CPU将按键的微小动作错误地处理成多次按键输入。所以为了正确识别按键,需要在单片机中进行按键消抖处理。
3、独立按键控制LED灯显示二进制:
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{ i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LEDNUM=0;
while(1)
{
if(P3_0 == 0) //如果按下按钮
{
Delay(20);
while(P3_0==0);
Delay(20);
LEDNUM++; //LEDNUM加1(按下第一次是1,二进制表示为0000 0001,第二次是2...以此类推
P0=~LEDNUM; //按位取反之后为1111 1110,也就是第一个灯亮
}
}
}
参考图表:
4、独立按键控制LED灯位移(相当于按键式的流水灯):
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{ i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned int LEDNUM = 0;
while(1)
{
if(P3_0 == 0)
{
Delay(20);
while(P3_0 == 0);
Delay(20);
if(LEDNUM>=8)
{
LEDNUM=0;
}
P0 =~(0x01<<LEDNUM); //按下第一次,LEDNUM=,左移0位,为0000 0001,取反之后为1111
1110,第一个灯亮。按下第二次,LEDNUM = 1,左移一位,为0000
0010,取反之后为1111 1101,第二个灯亮,以此类推)
LEDNUM++;
}
}
}