你的程序我帮你仿真检查了一下,发现K1,K2,K4的模块编得很好,没有问题,点击K1能依次点亮LED,点击K2依次熄灭LED,点击K4能整体点亮熄灭LED,只有K3模块有点小问题,点击K3,LED能依次点亮,但全部点亮LED后就死在这个全亮状态。
主要问题是你用了while(1){...}while(k3==0);这是个死循环,虽然K3释放能跳出while(k==0),但while(1)跳不出,所以死在这,将\\while(1)注释掉就可解决死循环的问题,但是还存在LED全亮后没办法通过K2依次熄灭的问题,原因是点击k3后,LED依次点亮,这时虽然LED全亮,但这时flag值为0,所以无法通过k2减值flag来依次熄灭LED,所以要对flag=9赋值,就能通过k2依次息灭LED。
下面是修改后的程序:
#include<reg52.h> //52系列单片机头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;
sbit led6=P2^5;
sbit led7=P2^6;
sbit led8=P2^7;
sbit led9=P0^7;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
sbit key4=P3^4;
uchar flag;
/*************************延时函数*****************************/
void delay1ms(uint y){uint j;while(y--)for(j=0;j<120;j++);}
/*************************子函数******************************/
void keyscan()
{if(key1==0)//确认按键是否被按下
{delay1ms(5);//延时消抖动
if(key1==0)//消抖后在判断按键是否按下
{if(flag<10)flag++;
switch(flag)
{case 1:led1=0;break;
case 2:led2=0;break;
case 3:led3=0;break;
case 4:led4=0;break;
case 5:led5=0;break;
case 6:led6=0;break;
case 7:led7=0;break;
case 8:led8=0;break;
case 9:led9=0;break;
}while(!key1); //等待按键释放
}
}
if(key2==0)//确认按键是否被按下
{delay1ms(5);//延时消抖动
if(key2==0)//消抖后在判断按键是否按下
{if(flag>0)flag--;
switch(flag){case 0:led1=1;break;
case 1:led2=1;break;
case 2:led3=1;break;
case 3:led4=1;break;
case 4:led5=1;break;
case 5:led6=1;break;
case 6:led7=1;break;
case 7:led8=1;break;
case 8:led9=1;break;
}while(!key2);//等待按键释放
}
}
if(key4==0){delay1ms(5);
if(key4==0){P2=~P2;
P0=~P0;
while(key4==0);
}
}
if(key3==0){delay1ms(5);
if(key3==0)
{//while(1)
{led1=0;delay1ms(500);
led2=0;delay1ms(500);
led3=0;delay1ms(500);
led4=0;delay1ms(500);
led5=0;delay1ms(500);
led6=0;delay1ms(500);
led7=0;delay1ms(500);
led8=0;delay1ms(500);
led9=0;delay1ms(500);
flag=9;
}while(key3==0);
}
}
}
/*************************主函数******************************/
void main()
{while(1){keyscan();}
}
下面是proteus仿真时的情形:
附件有程序的proteus设计文件。
askc1.zip
(27.09 KB, 下载次数: 7)
|