我为51单片机设计了一个用独立按键控制LED的程序,求大神看看程序有没有什么能够优化的地方。

程序的初始状态为八个LED的最后一个灯闪烁,K1按钮控制LED左移,闪烁,表示可以定义闪烁灯的亮灭,K2按钮控制LED右移,闪烁,表示可以定义闪烁灯的亮灭,k3按钮按下闪... 程序的初始状态为八个LED的最后一个灯闪烁,
K1按钮控制LED左移,闪烁,表示可以定义闪烁灯的亮灭,
K2按钮控制LED右移,闪烁,表示可以定义闪烁灯的亮灭,
k3按钮按下闪烁灯亮起,再次按下闪烁灯熄灭,
k4按钮按下锁定LED灯组的亮灭情况,此时再按k1,k2,k3无反应,再次按下k4,清零,程序重新开始。
#include<reg51.h>
#include<math.h>
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
typedef unsigned char u8;
typedef unsigned int u16;
#define led P2
void delay(u16 i)
{
while(i--);
}//延时函数
void main()
{
u8 x,y,z;
while(1)
{
x=0;
led=255;
y=led;
while(k1==1&&k2==1&&k3==1)
{
led=254;
delay(10000);
led=255;
delay(10000);
}
while(2)
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
y=led;
if(x!=7)
x++;
z=pow(2,x);
while(3)
if((led/z)%2==1)
led=led-z;
else
led=led+z;
delay(10000);
led=y;
delay(10000);
if(!k1||k2==0||k3==0||k4==0)break;
}
}
}
if(k2==0)
{
delay(1000);
if(k2==0)
{
y=led;
if(x!=0)
x--;
z=pow(2,x);
while(4)
{
if((led/z)%2==1)
led=led-z;
else
led=led+z;
delay(10000);
led=y;
delay(10000);
if(!k2||k1==0||k3==0||k4==0)break;
}
}
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
z=pow(2,x);
if((led/z)%2==1)
led=led-z;
else
led=led+z;
y=led;
}
while(!k3||k1==0||k2==0||k4==0);
}
if(k4==0)
{
delay(1000);
if(k4==0)
break;
}
}
while(k4==0)
{
while(k4==1)
{
delay(1000);
while(k4==1)
{
while(k4==0)
{
delay(50000);
while(k4==0)
{
break;break;break;break;break;
}
}
led=y;
continue;
}
}
led=y;
continue;
}
continue;
}
}
展开
 我来答
zhxiufan
2017-12-05 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38387
国家科技进步奖

向TA提问 私信TA
展开全部
#include<reg51.h>
#include<intrins.h>
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
bit flag=0;
typedef unsigned char u8;
typedef unsigned int u16;
#define led P2
void delay(u16 i)
{
while(i--);
}//延时函数
u8 keyscan(void)
{
u8 keyval=0;
if(k1==0)
{
while(k1==0);
keyval=1;
}  
if(k2==0)
{
while(k2==0);
keyval=2;
}  
if(k3==0)
{
while(k3==0);
keyval=3;
flag=~flag;
}  
if(k4==0)
{
while(k4==0);
keyval=4;
}
return(keyval);  

}
main()
{
u8 key1,key2,num=0;
u8 led[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
while(1)
{
key1=keyscan();
if(key1!=0)key2=key1;
switch(key2)
{
case 1:P0=led[num];delay(10000);P0=0xff;delay(10000);num++;num%=8;break;
case 2:P0=led[num];delay(10000);P0=0xff;delay(10000);num--;if(num==0)num=7;break;
case 3:if(flag)P0=led[num];else P0=0xff;break;
case 4:P0=led[num];while((key1=keyscan())!=4);P0=0xff;key1=key2=0;num=0;break;
default:break;
}
}
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
懂事电子设计
2017-12-02 · TA获得超过1940个赞
知道小有建树答主
回答量:3020
采纳率:80%
帮助的人:318万
展开全部
功能实现了吗?
懂事电子设计 Vgz
追问
功能实现了,就是希望程序可以进一步优化。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式