51单片机多种方式点亮LED

时间:2024-10-11 14:51:48

基于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