找回密码
 注册会员
搜索附件  

LED.zip

 

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重新编辑 ]


QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-25 04:55 , Processed in 0.040807 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部