標題:
多個按鍵控制流水燈切換程序
[打印本頁]
作者:
heicad
時間:
2016-3-11 23:22
標題:
多個按鍵控制流水燈切換程序
本帖最后由 heicad 于 2016-3-11 23:25 編輯
有四種流水模式,想通過四個按鈕分別控制,并使用外部打斷來立即切換程序,怎么都寫不了,每次都是要通過按復位再安按鈕來切換程序,用了switch語句還是不行,求大神解答,
電路圖的按鍵位置錯了,本來想法是用外部打斷k1切換程序,按一下是流水燈加數(shù)碼管閃動,再按一次立即切換呼吸燈,在按一下立即切換拖尾燈,現(xiàn)在就想換個立即切換的,分別定義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;
}
}
復制代碼
就是這幾個程序,現(xiàn)在先把第一個流水燈的延時換成定時器延時,怎么改想立即切換
作者:
heicad
時間:
2016-3-11 23:22
子函數(shù)void led1();
void led2();
void led3();里有while(1)語句出不來---死循環(huán)。
要想用中斷的話只有兩個外部中斷,不用中斷也可以實現(xiàn)的。設(shè)置四個標記變量代表四個按鍵的情況,再掃描顯示OK。
作者:
heicad
時間:
2016-3-11 23:22
樓上教你了,每一個子程序的while(1)出不來,你的主函數(shù)只執(zhí)行了void led1();。后面的都執(zhí)行不到
作者:
heicad
時間:
2016-3-11 23:23
在循環(huán)體里加如按鍵條件 先back 在執(zhí)行
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1