51单片机按键状态判断:LED1亮灭与延时控制逻辑
以下是基于51单片机的代码实现:
#include <reg51.h>
#define KEY P1 // 定义按键输入口
#define LED P2 // 定义LED输出口
void delay(unsigned int time) // 延时函数
{
unsigned int i, j;
for (i = time; i > 0; i--)
for (j = 110; j > 0; j--);
}
void main()
{
unsigned char state = 0; // 状态变量,初始状态为0
unsigned char key_state = 0; // 按键状态变量,初始状态为0
unsigned int time_count = 0; // 时间计数器,单位为秒,初始状态为0
while (1)
{
key_state = KEY; // 读取按键状态
switch (state)
{
case 0: // 初始状态
if (key_state == 0x01) // 按键1按下
{
LED = 0xFE; // LED1亮
state = 1; // 进入状态1
}
break;
case 1: // 状态1
if (key_state == 0x00) // 按键1松开
{
LED = 0xFF; // LED1灭
state = 2; // 进入状态2
}
break;
case 2: // 状态2
if (time_count >= 60) // 超过1分钟
{
LED = 0xFF; // LED2灭
state = 0; // 返回初始状态
time_count = 0; // 时间计数器清零
}
else // 未超过1分钟
{
LED = 0xFD; // LED2亮
delay(30000); // 延时30秒
LED = 0xFF; // LED2灭
state = 3; // 进入状态3
}
break;
case 3: // 状态3
if (key_state == 0x02) // 按键2按下
{
state = 4; // 进入状态4
}
else // 按键2未按下
{
time_count++; // 时间计数器加1
}
break;
case 4: // 状态4
LED = 0xFF; // LED2灭
state = 0; // 返回初始状态
break;
}
}
}
免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。