基于51单片机四个按键四种方式电亮LED灯,示例中的为代码的主要部分,是实现功能的代码。delay表示延时,是自定义的函数,最终代码可直接运行。
51单片机多种方式点亮LED
- 方式1 全亮和全熄
- 方式2 依次电亮
- 方式3 从上到下,再下到上一次电亮
- 方式4 两边向中间电亮
- 补充说明及按键控制思路
- 最终代码
方式1 全亮和全熄
对于八个LED控制高低电平,可以一次性使用P1=0x**
低电平0则亮,1则熄。
8个LED对应的不同的电平,就比如控制全熄,那么对于的八位二进制数1111 1111
转为16进制则为ff,那么P1=0xff即为8个LED全熄,每个LED对应各自位的二进制数,比如最两边的不亮,1000 0001,转16进制,同理输入即可
P1=~P1即为取反,1变0,0变1, 比如,1000 0001就成了0111 1110
while(1)
{
delay(500);
P1 =0x00;
delay(500);
P1 = ~P1;
}
方式2 依次电亮
我们依然可以用之前的16进制输入。不同的是,如果继续直接赋值,对应8个LED,加上每次的延时,意味着程序十几句话,更重要的是后续的打断不方便,因此采用移位的操作,A<<m,表示数据A向左移动m位,空余的位置补0,同时取一定的位数,我们单片机八位二进制,所以只会去取八位:
比如
A=0000 0001 m=2时 移位后 A=0000 0100,原来在第一位的1会到第三位,同时空缺的补0
A=0100 0001 m=2时 移位后 A=0000 0100,最前边的1在移位后超出,不会取到它
同时当移动完
while(1)
{
led = 0xfe;
P1 = led;
for(j=1;j<8;j++)
{
delay(500);
led=led<<1;
P1 = led;
}
delay(1000);
led = 0xff;
j = 1;
P1 = led;
delay(500);
}
方式3 从上到下,再下到上一次电亮
跟第二个同理
这里的 crol 与cror就是我们上一步说的移位类似,表示循环移位,crol 左移,cror右移,区别在于超出位数的部分会自动跑到最开始的位置,比如第八位循环移位一次,那么经过循环就该到第一位,可以当做他们是圈一样的循环。
比如
A=0100 0001 m=2时 移位后 A=0000 0101
需要头文件#include<>
也可以跟我们上一步同样的操作实现
while(1)
{
P1 = 0xfe;
for(m=1;m<8;m++)
{
led = 0xfe;
delay(500);
led = _crol_(led,m);
P1 = led;
}
for(n=1;n<8;n++)
{
led = 0x7f;
delay(500);
led