51单片机:按三个键开始流水灯,为什么单独按不行,必须三个键同时按?
#include
#define uchar unsigned char
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
uchar led1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar led2[]={0xe7,0xdb,0xbd,0x7e};
bit flag;
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
void prog1(void)
{
uchar i;
while(flag)
{
P0=led1[i];
i++;
i%=8;
delay(200);
}
}
void prog2(void)
{
uchar i;
while(flag)
{
P0=led2[i];
i++;
i%=4;
delay(200);
}
}
viud prog3{void)
{
uchar i=7;
while(flag)
{
P0=led1[i];
i--;
if(i>7)i=7;
delay(200);
}
}
main()
{
flag=0;
while(1)
{
if(key1==0)
{
flag=0;
while(key1==0);
flag=1;
}
if(key2==0)
{
flag=0;
while(key2==0);
flag=1;
}
if(key3==0)
{
flag=0;
while(key3==0);
flag=1;
}
}
}
void main()
{
int i=0; //设置参考变量
//初始化
p1.0=1;
p1.1=0;
p1.2=0;
//进入按键操作
while(1)
{
if(p2.2==0)
{
i++;
if(i==1)
{
p1.0=0;
p1.1=1;
p1.2=0;
delay();//延时,由于不知道你用的单片机型号,这个需要你自己设定了。
}
if(i==2)
{
p1.2=1;
p1.0=0;
p1.1=0;
delay();//延时,由于不知道你用的单片机型号,这个需要你自己设定了。
}
if(i==3)
{
p1.0=1;
p1.1=0;
p1.2=0;
delay();//延时,由于不知道你用的单片机型号,这个需要你自己设定了。
i=0;//参考变量归0
}
}
}
}
只有三个按键同时按下(a、b、c同时为1)k才等于1
程序才能进入while(k)中。
void main(void)
{
uchar i,k,a,b,c;
uchar code xxx[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
if(P14==0)
{a=1;}
if(P15==0)
{b=1;}
if(P16==0)
{c=1;}
// k=a&b&c;
k=a|b|c; //改成这样就可以了
while(k)
{
for(i=0;i<8;i++)
{
P2=xxx[i];
delay(9000);
}
}
}
答:只有三个按键同时按下(a、b、c同时为1)k才等于1 程序才能进入while(k)中。
答:while(key3==0);flag=1;} } }
答:编程的世界,每一步都充满了惊喜。不要被看似复杂的代码吓倒,51单片机按键控制流水灯的程序编写,就像一场与机器的对话,耐心与理解是你的魔法棒。跟随教程,亲自动手实践,你将发现,这个看似简单的任务,其实蕴含着无尽的乐趣和挑战。快来开启你的单片机之旅,让流水灯的闪烁照亮你的创新之路吧!
答:return(0);//返回0,表示没有按键按下
答:include<reg51.h>#include<intrins.h>#define uchar unsigned charuchar keyval,led,led1;sbit key=P3^2;void ext0() interrupt 0{while(key==0);keyval++;keyval%=3;}void delay(uchar a){uchar i;while(a--)for(i=0;i<120;i++);}main(){led=0xfe;led1=0x55;while(1) { ...
答:include<reg51.h>#include<intrins.h>#define uchar unsigned charuchar led,tm,key;sbit K=P1^0;void t0isr() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tm++;if(tm>=10) { tm=0; switch(key) { case 0:led=_crol_(led,1);P0=led;break; cas...
答:sbit led5 = P2^4;sbit led6 = P2^5;sbit led7 = P2^6;sbit led8 = P2^7;void main(){ int i,j;//点亮第一个灯 led1 = 1;led2 = 0;led3 = 0;led4 = 0;led5 = 0;led6 = 0;led7 = 0;led8 = 0;//延时1秒 for(i = 0;i < 110; ++i){ for(j = 0; j ...
答:我这有两个以前写好的数码管显示程序及左右流水灯程序,但是是分开的,你自己再修改下吧,把两个合到一起,再加入按键就可。include<reg52.h> define uchar unsigned char define uint unsigned int uchar num;uchar code table[]={ 0xC0,0XF9,0X24,0X30,0X19,//0,1,2,3,4 0X12,0X02,...
答:while(!PIN_ROTARY_A) //BMA为低电平时 { Current_BMB_status = PIN_ROTARY_B;flag = 1; //标志位置为1说明编码开关被旋转了 } if(flag == 1){ flag = 0; //时刻要注意这一点!给标志位清零 if((Last_BMB_status == 0)&&(Current_BMB_status == 1)) //BMB上升沿表示正转 { ...
答:流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:ORG 0000H;复位启动AJMP START;ORG 001BH;T1中断AJMP T1INT;;定义变量===YSJSEQU 30H;延时计数器LEDEQU 31H;LED控制缓冲器 ;主程序===START:MOV LED,#0FEH;初始化数据MOV YSJS,#0;MOV TMOD,#10H;定时器1工作于方式1,16位定时...