紧接着上一篇教程文章,本篇主要介绍独立按键搭配LED的相关使用
2.1独立按键控制LED亮灭
点开头文件<REGX52.H>,里面有位定义
上电之后,单片机所有的I/O口默认为高电平,当按键按下时,为低电平,即为0
因此,可以结合C语言的if-else语句来实现按键控制LED亮灭
代码如下:
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0)
{
P2_0=0;
}
else
{
P2_0=1;
}
}
}
效果如下:
独立按键控制LED亮灭
2.2独立按键控制LED状态
注意按键的抖动
解决方法
参考单片机入门资料,按键消抖方式,按键怎么消抖_单片机按键消抖-CSDN博客
(1)硬件方面,不采取
(2)软件方法,推荐,直接delay,延时个几十毫秒
代码如下:
#include <REGX52.H>
void Delay(unsigned int xms)
{
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;
}
}
}
效果如下:
独立按键控制LED状态
2.3独立按键控制LED显示二进制
代码如下:
第一种
#include <REGX52.H>
void Delay(unsigned int xms)//延时函数
{
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=~(~P2+1);//上电默认为1111 1111
//取反为0000 0000
//加1 0000 0001
//取反 1111 1110
//以此内推
}
}
}
第二种
#include <REGX52.H>
void Delay(unsigned int xms)//延时函数
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LEDNum=0;//char的类型大小为1个字节,
//一个字节八个位,0000 0000
while(1)
{
if(P3_1==0)
{
Delay(20);//按键消抖
while(P3_1==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
效果如下:
独立按键控制LED显示二进制
2.4独立按键控制LED移位
代码如下:
#include <REGX52.H>
unsigned char LEDNum;//全局变量,上电之后,默认为0
void Delay(unsigned int xms)//延时函数
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main()
{
P2_0=0;//初始化,D1亮
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
{
LEDNum=0;
}
P2=~(0x01<<LEDNum);//<<为循环左移
//LEDNum表示左移几位
//0000 0001左移一位=为0000 0010,D2亮,以此类推
}
}
}
高级的,第一个按键右移,第二个按键左移
#include <REGX52.H>
unsigned char LEDNum;//全局变量,上电之后,默认为0
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main()
{
P2_0=0;//初始化,D1亮
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
{
LEDNum=0;
}
P2=~(0x01<<LEDNum);//<<为循环左移
//LEDNum表示左移几位
//0000 0001左移一位=为0000 0010,D2亮,以此类推
}
if(P3_0==0)//K2右移
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0)//不为负数
{
LEDNum=7;
}
else
{
LEDNum--;
}
P2=~(0x01<<LEDNum);//从0000 0001左移个LEDNum
//相当于在前面左移的基础上右移一位,细细体会
//在烧录中,就体现为左移,因为LED第一位在最左边
}
}
}
效果如下:
独立按键控制LED移位