实现流水灯的方式有很多种(中断,定时器,延时等等),看用哪种方式,最简单的是延时做流水灯,那么在死循环里面增加按键检测,判断出有按键按下来时,再进入死循环,程序不往下走就可以暂停,再按跌出死循环。
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
uint Flag1=0; 按键标志位bai
uint Flag2=0;
while(1)
{
Flag1 = keyscan();
if(Flag1==1)(Flag2=~Flag2); //如果一旦检测到一次按键扫描就把标志位2 打开;再次就关闭;
if(Flag2==1)// 如果标志位打开就开始流水灯
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp<<=1;
}
}
扩展资料:
单片机编程就是硬件是单片机,基于单片机进行的程序开发,在有周围外设支持的情况下,用软件来控制的部分通过单片机编程来实现。单片机能识别的语言是硬件语言即汇编,因此编程就是围绕汇编来实现,有直接用汇编程序来编写的,但是较难调试的编写,特别是一上规模就更不易实现,因此常用高级语言来写然后通过编译器转化成汇编。
参考资料来源:百度百科-单片机C语言编程
#include <REG51.h> //51头文件
#define DY_PORT P1 //设置LED连接的I/O组
#define DY_SPEED 100 //设置每一个明亮级的停留时间(值域:0~65535)
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
void delay (unsigned int a) // 1ms延时程序
{
unsigned int i;
while( --a != 0)
{
for(i = 0; i < 600; i++);
}
}
void main(void)
{
unsigned int i;
unsigned int temp;
while(1)
{
if(~k1)
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
DY_PORT=~temp;
delay(DY_SPEED); //调用延时函数
temp<<=1;
}
}
if(~k2)
{
temp=0x80;
for(i=0;i<8;i++) //8个流水灯反向逐个闪动
{
DY_PORT=~temp;
delay(DY_SPEED); //调用延时函数
temp>>=1;
}
}
if(~k3)
{
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮
{
DY_PORT=temp;
delay(DY_SPEED); //调用延时函数
temp<<=1;
}
}
if(~k4)
{
temp=0x7F;
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮
{
DY_PORT=temp;
delay(DY_SPEED); //调用延时函数
temp>>=1;
}
}
}
}
我想要的是比如说流水灯在走 我按了下按键 流水灯就在那停住了 打个比方刚好亮到第二个 然后我在按下按键 从第二个开始 哪里暂停哪里继续 一个按键就够了 请在帮帮忙。
要完全符合自己的要求,需要自己修改,自己做才能有提高。