本帖最后由 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;
- }
-
- }
復制代碼
就是這幾個程序,現在先把第一個流水燈的延時換成定時器延時,怎么改想立即切換
|