自学中遇到的LED电灯问题,求点化!
时间:10-02
整理:3721RD
点击:
本人是单片机菜鸟——
这是本人正在学习单片机当中,自己编写的LED灯按钮程序;
希望能够每按下按钮,LED等就能左移一位;
按钮长按没有效果;
松手后,再按,LED灯再左移一位。
程序如下;
编译生成hex后,按一下确实左移一位;
不过再怎么按都不再有变化;
百思不得其解;
求各位大大点化~~!
#include<reg51.h>
#define led P2
sbit k1=P0^0;(按键K1与P0^0连接)
void delay10ms()
{
unsigned char a,b,c;
for(a=1;a>0;a--)
for(b=38;b>0;b--)
for(c=130;c>0;c--);
}
void main(void)
{
unsigned int u,i,j;
j=0x01;
u=0x01;
i=1;
led=j;
while(1)
{
if(k1==0)
{
delay10ms();
if(k1==0)
{
led=j+u;
delay10ms();
while(i>3)
{
if(k1==0)
{
i--;
}
if(k1==1)
{
u=u+0x01;
i=i+3;
}
}
}
}
}
}
你的这段程序LED初值为j(j=1),后续在while(1)循环中给LED赋值的语句只有LED=j+u (j+u=2),而此时唯一会改变j或u的数值的语句在while(i>3)循环内,在进入while(i>3)循环前,没有任何地方语句会将i的值改变到 >3;
所以,while(i>3)循环永远都不会执行;
所以,j 和 u 的值在永远都不会改变;
所以,只要K1按下,LED输出永远都是 j+u=2;
所以,看上去LED移动了一位,然后就再也不动了;
你程序里有个错误,while(i大于3);i刚开始初始化时1;所以程序一直停留在第一次while循环中。而且你的j和u一直没变。所以灯一直不变。
想知道你有多少个led灯,为什么这么写
这个小难题用软件仿真看看寄存器里的数据就知道问题出在哪里了。
