51单片机流水灯如何通过两个按键启动和停止 ,怎么停止

#include<reg52.h> //包含 reg52.h 这个头文件
#include<intrins.h>
#define led P2 //

sbit k1=P0^0; // 启动按键
sbit k2=P0^1; // 停止按键
void delay1s(void); //延时函数

void liushuideng(); //流水灯的循环

void main()
{
led=~0xff;
k1=1;
while(1)
{
if(k1==0)
{
liushuideng();
}
}
}

void delay1s(void) //误差 -0.000000000227us
{
unsigned char a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}

void liushuideng()
{
char i;
char j=0;
char a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED灯的数组

while(1)
{
if(j<2) //循环的次数
{
for(i=0;i<8;i++) //循环i;i+1
{
led=~a[i]; //LED灯通过遍历数组产生变化
delay1s(); //延时500ms
}
j++; //循环次数累加
}
led=~0xff;
if(k1!=1&&j!=0)
{
j=0;
}
}
}

// 改了一下试试

#include<reg52.h> //包含 reg52.h 这个头文件

#include<intrins.h>

#define led P2 //

char i;

sbit k1=P3^6; // 启动按键

sbit k2=P3^7; // 停止按键

bit  s=0;        //  启停标志

char a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED灯的数组

void delay1s(void); //延时函数

void liushuideng(); //流水灯的循环

void main()

{

led=~0xff;

k1=1;

while(1)

{

if(k1==0)  

{      

s = 1 ;

}

if(k2==0)

s = 0 ;

led=~0xff;

}  

if(s==1)

{

i = i + 1 ;

if(i==8){i=0;}

led=~a[i]; //LED灯通过遍历数组产生变化

delay1s(); //延时500ms

}

}

}

void delay1s(void) //误差 -0.000000000227us

{

unsigned char a,b,c;

for(c=13;c>0;c--)

for(b=247;b>0;b--)

for(a=142;a>0;a--);

_nop_(); //if Keil,require use intrins.h

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-01-22
#include<reg52.h> //包含 reg52.h 这个头文件
#include<intrins.h>
#define led P2 //

sbit k1=P0^0; // 启动按键
sbit k2=P0^1; // 停止按键
void delay1s(void); //延时函数

void liushuideng(); //流水灯的循环

void main()
{
led=~0xff;
k1=1;
while(1)
{
if(k1==0)
{
liushuideng();
if(k2==0)break;
}
}
}

void delay1s(void) //误差 -0.000000000227us
{
unsigned char a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}

void liushuideng()
{
char i;
char j=0;
char a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED灯的数组

while(1)
{
if(j<2) //循环的次数
{
for(i=0;i<8;i++) //循环i;i+1
{
led=~a[i]; //LED灯通过遍历数组产生变化
delay1s(); //延时500ms
if(k2==0)return;
}
j++; //循环次数累加
}
led=~0xff;
if(k1!=1&&j!=0)
{
j=0;
}
}
}

第2个回答  2018-12-27
由于流水灯一个循环时间很长,在此期间按下按键是没有响应的
可以用中断的方法或将按键检测插入到 流水灯的延时过程中
void main()
{
led=~0xff;
k1=1;
while(1)
{
if(k1==0)
{
delayms(10);
if(k1==0) flag=1;
}
if(flag==1)liushuideng();
}
}
流水灯不要死循环,因主程序就 是一个大循环程序
将按键2的检测加入for循环中
for(i=0;i<8;i++) //循环i;i+1
{
led=~a[i]; //LED灯通过遍历数组产生变化
if(k2==0)
{delayms(10);if(k2==0) flag=0;break}
delayms(250); //延时250ms
if(k2==0)
{delayms(10);if(k2==0) flag=0;break}
delayms(250); //延时250ms
}追问

怎么用中断的方式??

第3个回答  2018-12-25
#include "reg51.h" /* 此文件中定义了单片机的一些特殊功能寄存器 */
#include <intrins.h>
typedef unsigned int int16_t; /* 对数据类型进行声明定义 */
typedef unsigned char int8_t;

#define LED P2
/**************端口定义************************************************/
sbit Key_B=P3^3; //外部中断1,HC6800-ES-V2.0板子是独立按键K4键
/*********变量定义******************************************/
bit Start=0;

void IntConfiguration()//外部中断设置子函数
{
IT1=1;
EX1=1;
EA=1;
}

void delay( int16_t i )
{

while ( i-- );

}

void LSD ( )
{
int8_t i=0;
int8_t LED_Last=0;

LED=0xfF;
for(i=0;i<=7;i++)
{
LED=LED<<1;
// LED_Last=LED;

delay(50000);
}
}

void main()
{
IntConfiguration();
while(1)
{
while (Start)
{
LSD ( );
}
LED=0xff;
}
}

void Int1(void) interrupt 2//外部中断1的中断服务函数
{
delay(50000);
Start=~Start;
IE0=0;
}本回答被网友采纳
第4个回答  2018-12-28
楼主 带带我
相似回答