K1-K4分组控制LED

内容:每次按下K1时递增点亮--只LED,全亮时再次按下则再次循环开始,K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED

按键原理图:

LED原理图:

  代码如下:

#include <reg52.h>

typedef unsigned int u16;	
typedef unsigned char u8;

sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;

#define k1_PRESS	1
#define k2_PRESS	2
#define k3_PRESS	3
#define k4_PRESS	4
#define k_UNPRESS	0

void delay_10us(u16 us)
{
	while(us--);	
}

u8 KEY(u8 mode)
{
	static u8 key = 1;
	if(mode)
		key = 1;
	if(key==1 && (k1==0 || k2==0 || k3==0 || k4==0))
	{
		delay_10us(1000);//消抖
		key=0;
		if(k1 == 0)
			return k1_PRESS;
		else if(k2 == 0)
			return k2_PRESS;
		else if(k3 == 0)
			return k3_PRESS;
		else if(k4 == 0)
			return k4_PRESS;	
	}
	else if(k1==1 && k2==1 && k3==1 && k4==1)	//无按键按下
	{
		key = 1;			
	}
	return k_UNPRESS;		
}

void main()
{
	u8  key = 0;
	u16 t = 0xfe;
	while(1)
	{
		key = KEY(0);
		if(key == 1)//switch好像不太行
		{
			P2 = t;
			t = t << 1;//t = t << 1后LED里的结果为1111 1100左移后的一位里填入了0
			if(P2 == 0x00)
				t = 0xfe;
		}
		if(key == 2)
		{
			P2 = 0xf0;
			t = 0xfe;
		}
		if(key == 3)
		{
			P2 = 0x0f;
			t = 0xfe;
		}
		if(key == 4)
		{
			P2 = 0xff;
			t = 0xfe;
		}
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiaoen_Lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值