在调试过程中发现,K5触发了流水灯就进入了死循环,无法进行其他操作。
初步
//================================================
//■LED综合功能演示
//------------------------------------------------
//by庆爷 20140906
//使用端口:P0接LED , P1接独立按键
//按键功能说明:
//K1:左端亮 K2:右端亮 K3:灯整体左移 K4:灯整体右移
//K5:流水灯 K6:预置1(10101010) K7:预置2(空)K8:复位(全亮后全灭)
//================================================
//-----------------------------------
//●头文件
//-----------------------------------
#include
//-----------------------------------
//●全局变量,宏定义,函数初定义
//-----------------------------------
#define led P0
unsigned int i;
sbit K1 = P1^0;
sbit K2 = P1^1;
sbit K3 = P1^2;
sbit K4 = P1^3;
sbit K5 = P1^4;
sbit K6 = P1^5;
sbit K7 = P1^6;
sbit K8 = P1^7;
void delay10ms(void);
void delay100ms(void);
void K1_Left(void);
void K2_Right(void);
void K3_LeftMove(void);
void K4_RightMove(void);
void K5_Water(void);
void K6_default1(void);
void K7_default2(void);
void K8_RESET(void);
//-----------------------------------
//●主函数
//-----------------------------------
void main(void)
{
led = 0xaa;
while(1)
{
K1_Left(); //当K1按下时左端LED亮
K2_Right(); //当K2按下时右端LED亮
K3_LeftMove(); //当K3按下时整体左移
K4_RightMove(); //当K4按下时整体右移
K5_Water(); //当K5按下时进行流水灯
K6_default1(); //当K6按下时进行预置1(10101010)
K7_default2(); //当K7按下时进行预置2(空)
K8_RESET(); //当K8按下时进行复位
}
}
//-----------------------------------
//●K1左端亮
//-----------------------------------
void K1_Left(void)
{
if(K1 == 0)
{
delay10ms();
if(K1 == 0)
led = 0x80;
}
}
//-----------------------------------
//●K2右端亮
//-----------------------------------
void K2_Right(void)
{
if(K2 == 0)
{
delay10ms();
if(K2 == 0)
led = 0x01;
}
}
//-----------------------------------
//●K3灯整体左移
//-----------------------------------
void K3_LeftMove(void)
{
if(K3 == 0)
{
delay10ms();
if(K3 == 0 && led != 0x80)
{
led = led << 1;
while(K3 == 0 && i <50)
{
delay10ms();
i++;
}
i = 0;
}
else if(led == 0x80)
led =0x01;
}
}
//-----------------------------------
//●K4灯整体右移
//-----------------------------------
void K4_RightMove(void)
{
if(K4 == 0)
{
delay10ms();
if(K4 == 0 && led != 0x01)
{
led = led >> 1;
while(K4 == 0 && i <50)
{
delay10ms();
i++;
}
i = 0;
}
else if(led == 0x01)
led = 0x80;
}
}
//-----------------------------------
//●K5流水灯
//-----------------------------------
void K5_Water(void)
{
if(K5 == 0)
{
delay10ms();
if(K5 == 0)
{
led = 0x80;
while(1)
{
delay100ms();
if(led == 0x01)
{
led = 0x80;
delay100ms();
}
led = led >> 1;
}
}
else if(led == 0x01)
led =0x80;
}
}
//-----------------------------------
//●K6预置1(10101010)
//-----------------------------------
void K6_default1(void)
{
if(K6 == 0)
{
delay10ms();
if(K6 == 0)
led = 0xaa;
while(K6 == 0 && i <50)
{
delay10ms();
i++;
}
i = 0;
}
}
//-----------------------------------
//●K7预置2(空)
//-----------------------------------
void K7_default2(void)
{
if(K7 == 0)
{
delay10ms();
if(K7 == 0);
//空
while(K7 == 0 && i <50)
{
delay10ms();
i++;
}
i = 0;
}
}
//-----------------------------------
//●K8复位(全亮后全灭)
//-----------------------------------
void K8_RESET(void)
{
if(K8 == 0)
{
delay10ms();
if(K8 == 0)
{
led = 0xff;//1111 1111
delay100ms();
led = 0x00;//0000 0001
}
}
}
//-----------------------------------
//●10ms延时函数
//-----------------------------------
void delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
//-----------------------------------
//●100ms延时函数
//-----------------------------------
void delay100ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}