独立按键控制LED灯
开发板,独立按键,LED模块,单片机核心如下:
独立按键通过通过控制单片机核心引脚的电平(没按下时是高电平,对应LED短脚处是高电平,此时电流不通过,LED是灭的),进而控制LED亮灭。
控制LED灯涉及到的位运算:
涉及到的C语言语句:
代码示例1:
#include <regx52.h>
void main()
{
while (1)
{
if (P3_1==0)
{
P2_0=0;
}
else
{
P2_0=1;
}
}
}
现象:按下独立按键K1,D1灯亮,松开K1,LED灯灭。
按键的抖动
通过延时消除抖动的影响:
现在需要生成延时的函数,步骤如下:
- 打开STC-ISP
- 右上角找到“软件延时计算器”
- 修改系统频率为12.000 MHz
- 定时长度改为1毫秒
- 指令集改为STC-Y1(适应于AT89C52系列的51单片机)
- 最后复制代码
代码如下:
void Delay1ms(void) //@12.000MHz
{
unsigned char data i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
解释:整个函数的作用是通过嵌套循环的方式,在一定的时钟频率下,产生一定的延时,具体的延时时间与时钟频率以及内层和外层循环计数器的初始值有关。根据代码中给出的时钟频率是12.000MHz,该函数大约可以产生1毫秒左右的延时。
代码示例2:
#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(){
while(1)
{
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);
P2_0=~P2_0;
}
}
}
现象:按一下按键K1,D1灯亮,再按一下D1灯灭。
解释:
该段代码的作用是实现一个循环的逻辑控制程序,当P3_1引脚为低电平时,延时20毫秒,然后切换P2_0引脚的状态。
具体来说:
- 首先,定义了一个延时函数Delay(unsigned int xms),用来实现延时xms毫秒的功能。
- 在main函数中,通过一个无限循环来对程序进行控制。
- 当P3_1引脚为低电平时,延时20毫秒,然后进入一个while循环,直到P3_1引脚不再低电平,再次延时20毫秒。
- 然后,通过对P2_0引脚进行逻辑取反操作,来切换P2_0引脚的状态。
- 最后,进入下一次循环,继续判断P3_1引脚的状态并执行相应的操作。
简而言之,该代码就是在不断地检测P3_1引脚的状态,当该引脚为低电平时,切换P2_0引脚的状态,并延时一段时间。
代码示例3:
#include <regx52.h>
void Delay(unsigned int xms){
unsigned char i,j;
while(xms--){
i = 2;j= 239;
do
{
while(--j);
}while(--i);
}
}
void main(){
unsigned char LEDNum = 0;
while(1){
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);LEDNum++;
P2=~LEDNum;
}
}
}
现象:按按键后,以二进制的样子亮灯。
解释:这段代码的作用是通过机械按键控制LED灯的亮灭。代码中使用了单片机的IO口来控制LED灯的亮灭,其中P3_1口连接的是机械按键的引脚,P2口连接的是LED灯的引脚。代码首先定义了一个延时函数Delay,用于产生一定的延时效果。然后在主函数中,程序进入一个无限循环,不断检测机械按键的状态。当按键按下时,先进行一段20ms的延时,在此期间,如果按键仍然按下,代码会不断进行延时(也就是防止按键抖动)。当按键释放后,再进行一段20ms的延时,然后LEDNum加1,表示LED灯的状态需要切换。最后,通过将LEDNum取反得到LED灯的亮灭状态,将其赋值给P2口,实现了通过机械按键控制LED灯的亮灭。
代码示例:
#include <regx52.h>
void Delay(unsigned int xms){
unsigned char i,j;
while(xms--){
i = 2;j= 239;
do
{
while(--j);
}while(--i);
}
}
unsigned char LEDNum;
void main(){
while(1){
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum);
}
}
}
现象:按键控制LED灯移位
解释:
这段代码的作用是通过按键控制LED灯的亮起,并且可以进行移位操作。
具体的代码解释如下:
- `Delay`函数是延时函数,它通过控制循环的次数来实现延时功能。
- `LEDNum`是一个无符号字符型变量,用于记录LED灯的状态。
- `main`函数是程序的主函数。
- `while(1)`表示一个无限循环,程序会不断执行这个循环。
- `if(P3_1==0)`是一个条件判断语句,判断P3_1引脚是否为低电平。
- 如果条件成立,即按键被按下,则执行相应的操作。
- `Delay(20)`是为了消除按键的抖动,延时20毫秒。
- `while(P3_1==0);`是一个空循环,等待按键释放,P3_1引脚为高电平。
- `Delay(20)`再次延时20毫秒。
- `LEDNum++`是LEDNum自增操作,即LEDNum的值加1。
- 如果LEDNum的值超过了8,则将其重置为0。
- `P2=~(0x01<<LEDNum);`是将LEDNum移位并取反,然后将结果赋值给P2寄存器,从而控制LED灯的亮灭。
整体来说,这段代码通过按键控制LED灯的亮起,并且通过移位操作实现LED灯的移动效果。
代码示例:
#include <regx52.h>
void Delay(unsigned int xms){
unsigned char i,j;
while(xms--){
i = 2;j= 239;
do
{
while(--j);
}while(--i);
}
}
unsigned char LEDNum;
void main(){
while(1){
if(P3_1==0){
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum);
}
if(P3_0==0){
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0)
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);
}
}
}
现象:通过按键K1,LED灯向右移动;按键L2,LED灯向左移