程序不知那里出错,试了一天都不知为什么会这样,麻烦大家帮忙看下,多谢!我用的是 STC89C52RC 单片机
case 1: //按下"A开关"
{
losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000);
asign=0; //延时一秒后,LED灯灭
delay(1000);
lsign=1; //端口B 得DC12V
};break;
按下"A开关",时,程序执行到asign=1 前面正常,但后面就对了,不断的开灯,关灯,开灯,LED灯一直是一闪一闪的,而且lsign=1这句根本没有执行到,因为我量了端口B 没有得到DC12V
下面是整个程序:
-------------------------------------------------------------------------------------------------
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit okey=P2^0; //A开关
sbit ikey=P2^1; //B开关
sbit losign=P1^0; //端口A DC12V
sbit asign=P1^1; //LED灯
sbit lsign=P1^2; //端口B DC12V
uchar K;
void delay(unsigned int xx) //晶振=11.0592Mhz, 基数0.001秒
{
unsigned char a,b;
unsigned int c;
for(c=xx;c>0;c--)
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
void keyscan() //按键扫描
{
if(okey==0) //"A开关"是否被按下
{
delay(10);
//延时去抖大概8us
if(okey==0) //通过延时之后再次判断是否"A开关"被按下
{
while(!okey); //松手检测(如果松手就开始执行下面的语句)
K=1;
}
}
if(ikey==0) //"B开关"是否被按下
{
delay(10); //延时去抖大概8us
if(ikey==0) //通过延时之后再次判断是否"B开关"被按下
{
while(!ikey); //松手检测(如果松手就开始执行下面的语句)
K=2;
}
}
}
void main()
{
losign=1; //端口A初始化,有DC12V
while(1)
{
keyscan();
switch(K)
{
case 1: //按下"A开关"
{
losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000);
asign=0; //延时一秒后,LED灯灭
lsign=1; //端口B 得DC12V
};break;
case 2: //按下"B开关"
{
losign=0; //取消端口A DC12V
delay(50); //延时0.05秒
asign=1; //LED灯亮
delay(1000); //延时1秒
lsign=0; //取消端口B DC12V
fsign=0; //取消端口C DC12V
};break;
}
}
} |