请大神帮忙如何编写3个条件依次满足才有输出的程序,程序是C语言编写的,用的是STC89C52单片机

程序是这样的,有2个按键,4个LED灯,在第一个按键按下后第一个指示灯亮,第二个按键和第二个按键同时按下时,第一个指示灯和第二个指示灯亮,第二个按键按下时,第一个指示灯和第二个指示灯和第三个指示灯亮,只有在第一个按键按下后将第二个按键接着按下,然后松开第一个按键,第四个LED灯才会亮,这2个按键端口为P1^0,P1^1,4个LED灯的端口:P1^2,P1^3,P1^4,P1^5,不知道这三个条件依次满足的C语言程序怎么写,

第1个回答  2014-01-11
第一个按键按下时,记录一个时间on_time1,送来时,记录下时间off_time1第二个按键按下时,记录下时间on_time2,松开时on_time2;c语言中time.h得到当时的机器的on_time,on_time,比较大小
第2个回答  2014-01-11
看到楼上几位给你的代码,代码效率有点低,不知道能不能满足楼主需求,我顺便花10分钟给你写个程序,这个程序是按照你的需求写的,你可以下载到单片机运行一个看看,有问题可以直接追问,我在线等你的消息!
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
**/
#include "REG52.H"
#include "INTRINS.H"

/*
* 相当于宏定义
*/
typedef unsigned char INT8U;
typedef unsigned int INT16U;

/*
* P1端口LED
*/
sbit LED_Input0 = P1^2;
sbit LED_Input1 = P1^3;
sbit LED_Input2 = P1^4;
sbit LED_Input3 = P1^5;

/*
* P1端口按键
*/
sbit KEY_Input1 = P3^5;
sbit KEY_Input2 = P3^6;

/*
* 延时1ms子函数
*/
void Delay_1ms(unsigned int Cnt)
{
unsigned int x, y;

for(x = Cnt; x > 0; x--)
for(y = 120; y > 0; y--);
}

/*
* 按键检测子函数
*/
void Key_Scon(void)
{
/* 第一个按键按下 */
if(KEY_Input1 == 0)
{
/* 延时去抖动 */
Delay_1ms(5);
/* 在判断一次按键是否按下 */
while(KEY_Input1 == 0)
{
/* LED1 指示灯亮 */
LED_Input0 = 0;
/* 在判断一次按键是否按下 */
if((KEY_Input1 == 0) && (KEY_Input2 == 0))
{
/* LED1、2指示灯亮 */
LED_Input1 = 0;
if(KEY_Input1 == 1);
{
Delay_1ms(1000);
if((KEY_Input1 == 1) && (KEY_Input2 == 1))
{
return;
}
/* LED4指示灯亮 */
LED_Input3 = 0;
/* 等待按键2松手检测 */ //这里是必须的,否则会产生错误
while(KEY_Input2 == 0);
}
}
}
}

/* 第二个按键按下 */
if(KEY_Input2 == 0)
{
/* 延时去抖动 */
Delay_1ms(5);
/* 在判断一次按键是否按下 */
if(KEY_Input2 == 0)
{
/* LED2指示灯亮 */
LED_Input2 = 0;
}
/* 等待按键松手检测 */
while(KEY_Input2 == 0);
return;
}

}

/*

/*
*
*/
int main(void)
{
// 初始化IO
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;

while(1)
{
Key_Scon(); //处理按键程序
}
}
第3个回答  2014-01-11
while(1)
{
if(P10&&(~P11))
{
delay(100ms);
if(P10&&(~P11))
{
P12 = 0;P13 = 1;P14=1;P15=1;
}
}
if(P10&&P11)
{
delay(100ms);
if(P10&&P11)
{
P12 = 1;P13 = 0;P14=1;P15=1;
}
}
if((~P10)&&P11)
{
delay(100ms);
if((~P10)&&P11)
{
P12 = 1;P13 = 1;P14=0;P15=1;
}
}
if(P10&&(~P11))
{
delay(100ms);
if(P10&&P11)
{
delay(300ms);
if(P10&&(~P11))
{
P12 = 1;P13 = 1;P14=1;P15=0;
}
}
}
}
假设P1x==1,按键按下,P1x==0,LED亮,主要问题是延时不好取值,同时性问题也不好处理追问

是呀,问题是这三种按键的状态要依次满足才能使第四个灯发光的,而且顺序倒过来满足的话第四个灯熄灭,就是这个条件的顺序依次满足这个问题不知道怎么写好

追答

4个if语句对应4个灯的亮灭。第四个if语句对应第四个灯的点亮,首先检测键1按下键2未按,满足这个条件后,延时100ms或者更短 时间,检测键1和键2都按下,这说明键1按下后键2又按下,满足这个条件后,接着检测键1未按下键2按下,如果这个条件也满足了,说明 “只有在第一个按键按下后将第二个按键接着按下,然后松开第一个按键“这个条件满足,LED4点亮

第4个回答  2014-01-11
你把问题说清楚或把任务书给我,我给你写追问

已经写得很清楚了的啊,就是单片机的6个端口,两个端口是按键,四个端口是LED灯啊

追答

试试看行不!

追问

程序基本已经实现了功能,不过在led4发光后只有按照第二个按键按下,然后第一个按键和第二个按键同时按下,只有第一个按键按下只有的顺序led4才会熄灭,而且在led4发光后,任意按第一个按键或第二个按键或第一个按键和第二个按键同时按下后对led4没有影响,只不过是对应的led1,led2,led3的改变。

本回答被提问者采纳
相似回答