标题:
多个按键控制流水灯切换程序
[打印本页]
作者:
heicad
时间:
2016-3-11 23:22
标题:
多个按键控制流水灯切换程序
本帖最后由 heicad 于 2016-3-11 23:25 编辑
有四种流水模式,想通过四个按钮分别控制,并使用外部打断来立即切换程序,怎么都写不了,每次都是要通过按复位再安按钮来切换程序,用了switch语句还是不行,求大神解答,
电路图的按键位置错了,本来想法是用外部打断k1切换程序,按一下是流水灯加数码管闪动,再按一次立即切换呼吸灯,在按一下立即切换拖尾灯,现在就想换个立即切换的,分别定义k1,k2,k3按一下就立即切换,我写的程序不能立即切换,求大神解答一下,谢谢啦
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define led P1
uchar abit=16;
uchar atimer0_n;
uchar code abit8[9]={1,2,4,8,16,32,64,128,0};
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
uchar nn;
char a,b,c,d,e,f,g,h;
sbit k1=P2^3;
sbit k2=P2^2;
sbit k3=P2^1;
void led1();
void led2();
void led3();
void Delay10ms(unsigned int);
void delay(int x)
{ int i;
for(i=x;i>0;i--);
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void main()
{while(1)
{
if(k1==0)led1();
if(k2==0)led2();
if(k3==0)led3();
}
}
void led1()
{
unsigned int i;
led=0xfe;
P0=table[i];
Delay10ms(50);
while(1)
{
for(i=0;i<7;i++)
{
led=_crol_(led,1);
P0=table[i+1];
Delay10ms(50);
}
for(i=7;i>0;i--)
{
led=_cror_(led,1);
P0=table[i-1];
Delay10ms(50);
}
}
}
void led2()
{
int x,cycle=370;
while(1)
{
for(x=0x00;x<cycle;x++)
{
P1=0;
delay(x-50);
P1=0xff;
delay(cycle-x);
}
for(x=cycle;x>0;x--)
{
P1=0;
delay(x-50);
P1=0xff;
delay(cycle-x);
}
}
}
void led3()
{ TMOD = 0x11;
TL0 = 0x00; //2.5ms
TH0 = 0xF7;
TF0 = 0;
TR0 = 1;
EA=1;ET0=1;
while(1)
{
a=abit;
if(a>7||a<0)
a=8;
b=abit-1;
if(b>7||b<0)
b=8;
c=abit-2;
if(c>7||c<0)
c=8;
d=abit-3;
if(d>7||d<0)
d=8;
e=abit-4;
if(e>7||e<0)
e=8;
f=abit-5;
if(f>7||f<0)
f=8;
g=abit-6;
if(g>7||g<0)
g=8;
h=abit-7;
if(h>7||h<0)
h=8;
atimer0_n++;
if(atimer0_n==520)
atimer0_n=0;
if(atimer0_n<5)
P1=0xff-abit8[a];
if(atimer0_n<40)
P1=0xff-abit8[b];
if(atimer0_n<150)
P1=0xff-abit8[c];
if(atimer0_n<255)
P1=0xff-abit8[d];
if(atimer0_n<300)
P1=0xff-abit8[e];
if(atimer0_n<380)
P1=0xff-abit8[f];
if(atimer0_n<460)
P1=0xff-abit8[g];
if(atimer0_n<520)
P1=0xff-abit8[h];
}
}
atimer0 () interrupt 1
{
TL0 = 0x00; //50ms
TH0 = 0x4C;
nn++;
if(nn==1)
{
nn=0;abit--;
if(abit==0)
abit=32;
}
}
复制代码
就是这几个程序,现在先把第一个流水灯的延时换成定时器延时,怎么改想立即切换
作者:
heicad
时间:
2016-3-11 23:22
子函数void led1();
void led2();
void led3();里有while(1)语句出不来---死循环。
要想用中断的话只有两个外部中断,不用中断也可以实现的。设置四个标记变量代表四个按键的情况,再扫描显示OK!!
作者:
heicad
时间:
2016-3-11 23:22
楼上教你了,每一个子程序的while(1)出不来,你的主函数只执行了void led1();。后面的都执行不到
作者:
heicad
时间:
2016-3-11 23:23
在循环体里加如按键条件 先back 在执行
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1