LED程序有點問題,幫忙看看:各位大蝦,我的程序要求是這樣的,撥K4地址碼時程序自走,撥地址碼K5時程序進入聲控(中斷INT0),低電平觸發。所以,我用函數調用來設計,子程序在主程序時,自走,也可以讓子程序循環多次。當K4斷開時,馬上停止。當K5按下時,進入中斷,子程序在中斷時能實現單步走,一有低電平,就走一步。K5斷開時,退出中斷。
程序和附件,我已經上傳了,希望能給我點指點,盡快,在等,謝謝!
QQ:306048732
我發了好多帖子,都沒人回答一下的,希望各位大俠別再讓我失望了!
#define uchar unsigned char //定宏義
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一個52標準內核的頭文件
/********************************
* IO口定義 *
********************************/
sbit K0=P1^0; //R通道
sbit K1=P1^1; //G通道
sbit K2=P1^2; //B通道
sbit K3=P1^3; //W通道
sbit K4=P1^4; // AUTO RUN 模式
sbit K5=P1^5; // MUSIC 模式
sbit K6=P1^6; // DXM 控制模式
sbit K7=P1^7; // ALL LIGHT
sbit K8=P3^2;
/********************************
* 子函數定義 *
********************************/
void delay_ms(uint);
void INTR0();
void ZT_0();
void ZT_1();
void ZT_2();
void ZT_3();
void ZT_4();
void ZT_5();
void ZT_6();
void ZT_7();
void ZT_8();
void ZT_9();
void ZT_10();
void ZT_11();
void ZT_12();
void ZT_13();
void ZT_14();
void ZT_15();
void ZT_16();
/********************************
* 參數定義 *
********************************/
uint a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,
aa=0,bb=0,cc=0,dd=0,ee=0,ff=0,gg=0,hh=0;
/********************************
* 主函數 *
********************************/
void main(void)
{
P0=0x00,P2=0x00; //端口初始化
while(1)
{
if (K4==0) //判斷K4是否按下
{
delay_ms(100);
// ZT_0();if(a<33)continue;
// ZT_1();if(b<41)continue;
ZT_2();if(c<9)continue; //我想讓這個子程序在這里循環3次,怎么修改呢。
ZT_7();if(h<16)continue;
ZT_3();if(d<8)continue;
ZT_16();if(s<9)continue;
ZT_6();if(g<11)continue;
ZT_8();if(k<5)continue;
ZT_15();if(r<8)continue;
ZT_4();if(e<5)continue;
ZT_14();if(q<16)continue;
ZT_5();if(f<5)continue;
ZT_9();
ZT_10();
ZT_11();
ZT_12();
ZT_13();
if(K4==1)
break;
}
else if(K5==0) //判斷K5是否按下
{
delay_ms(100);
IT0=1; //設定中斷觸發方式
EX0=1; //開啟外部中斷1(INT1)
EA=1; //打開總中斷
INTR0();
if(K5==1)
break;
}
else if(K0==0) //判斷K0是否按下
{
delay_ms(100);
P0=0x22;P2=0x44; //R 亮
if(K0==1)
break;
}
else if(K1==0) //判斷K1是否按下
{
delay_ms(100);
P0=0x44;P2=0x22; //G 亮
if(K1==1)
break;
}
else if(K2==0) //判斷K2是否按下
{
delay_ms(100);
P0=0x88;P2=0x11; //B 亮
if(K2==1)
break;
}
else if(K3==0) //判斷K3是否按下
{
delay_ms(100);
P0=0x11;P2=0x88; //W 亮
if(K3==1)
break;
}
else if(K6==0)
{
delay_ms(100);
P0=0xff;P2=0xff;delay_ms(200); //頻閃
P0=0x00;P2=0x00;delay_ms(100);
if(K6==1)
break;
}
else {P0=0x00;P2=0x00;}
}
}
/************************************
* 中斷服務子程序 *
************************************/
void INTR0() interrupt 0
{ uchar i;
// PX1=1;
EX0=0;
while(1)
{
if(!K8)
{
while(!K8);
switch(i)
{
case 0:
ZT_0();if(a<33)
continue;
break;
case 1:
ZT_1();if(b<45)
continue;
break;
case 2:
ZT_2();if(c<8)
continue;
break;
case 3:
ZT_16();if(s<9)
continue;
break;
case 4:
ZT_8();if(k<10)
continue;
break;
case 5:
ZT_7();if(h<16)
continue;
break;
}
i++;
if(K5==1)break;
if(i==5)i=0;
EX0=1;
} break;
}
}
void delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=100;j>0;j--);
}
[ 此帖被czc568在2010-06-06 09:45重新編輯 ]