51单片机流水灯如何通过两个按键启动和停止 ,怎么停止
发布网友
发布时间:2022-04-23 05:39
我来回答
共5个回答
热心网友
时间:2023-10-16 21:25
// 改了一下试试
#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
}
热心网友
时间:2023-10-16 21:26
#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;
}
}
}
热心网友
时间:2023-10-16 21:26
由于流水灯一个循环时间很长,在此期间按下按键是没有响应的
可以用中断的方法或将按键检测插入到 流水灯的延时过程中
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
}追问怎么用中断的方式??
热心网友
时间:2023-10-16 21:27
#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;
}
热心网友
时间:2023-10-16 21:27
楼主 带带我