内容:每次按下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;
}
}
}