Keil编程:51单片机键盘控制LED

打开单片机开关时,按照01010101点亮。按下按键1,实现流水灯功能;按下按键2,按01,23,45,67,01,23,,循环点亮;按下按键3,实现呼吸灯功能。想问一下程序该怎么编?
不要用汇编语言

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar led1,led2;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
void delay(int a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
main()
{
unsigned int i;
led1=0xfe;
led2=0xfc;
while(1)
{
P0=0x55;
if(key1==0)
{
P0=led1;
led1=_crol_(led1,1);
delay(200);
}
if(key2==0)
{
P0=led2;
led1=_crol_(led1,2);
delay(200);
}
if(key3==0)
{
for(i=1;i<500;i++)
{
P0=0xff;
delay(i);
P0=0x00;
delay(500-i);
}
for(i=1;i<500;i++)
{
P0=0x00;
delay(i);
P0=0xff;
delay(500-i);
}
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-11-19
刚开始 输出0X55 或0xAA即可
然后判断按键是否按下
单灯流水 for(i=0;i<8;i++)
{ P1=0x01>>i;delayms(200);}
双灯流水
for(i=0;i<8;i+=2)
{ P1=0x03>>i;delayms(500);}
呼吸灯不知怎样呼吸,假如一个灯渐亮渐暗程序如下:
for(i=0;i<100;i++)
{ LED=0;delay100us(i);LED=1;delay100us(100-i);}
假设LED=0是点亮,那么上面就逐渐变亮过程
一亮一灭是10ms 250次就是2·5S
逐渐变暗过程和上面一样,只不过把LED=0 LED=1相互颠倒一下就是了追问

谢谢回答。
这些每个模块的编程都有,关键是不会和按键联系起来,例如按键1实现什么功能,按键2又实现什么功能,就想问问这些按键该怎么编程呢?
之前简单编了一下,发现按键1按下后,就陷入流水灯死循环,按键2就无反应了,想问问这该怎么解决,需要具体的编程,谢谢

追答

if(key1==0){消抖;flag=1;}//按键是非自锁的,用flag暂存后就实现了自锁,按一次丢手 flag值被保存,如果没有其它按键按下,则flag值不变
if(key2==0){消抖;flag=2;}
if(key3==0){消抖;flag=3;}
if(flag==1){单灯流水}//一次执行一次流水循环;不是死循环,但程序总体是大循环
因此如果没有其它按键按下,一直执行它,而不是仅仅一次
if(flag==2){双灯流水}
if(flag==3){呼吸灯}
呼吸灯呼吸一次时间长,期间对按键没有反应;可以在呼吸程序中间加Key1 key2判断
如果按下按键,flag值同样可以改变,并用break跳出循环
而流水灯流水一次时间短,按键多按一会就检测到了,如果嫌其反应慢,也可以像呼吸灯一样,中间加按键检测

追问

好的,我试试

本回答被提问者采纳
相似回答