pic单片机实现按键按下后松开,灯开始闪烁1s一次,如果按键松开后5s内又按下一次松开后按键灯常亮,如果没有再次按下则灯自动熄灭
时间: 2024-05-05 14:15:01 浏览: 125
电路图 当人用手触摸开关时,照明灯点亮,并持续一段时间后自动熄灭
以下是使用C语言实现的代码:
```c
#include <reg52.h>
sbit KEY = P1^0; // 定义按键输入引脚
sbit LED = P2^0; // 定义LED输出引脚
void Delay1s() // 延时1秒函数
{
unsigned char i, j, k;
for (i = 20; i > 0; i--)
for (j = 200; j > 0; j--)
for (k = 4; k > 0; k--);
}
void main()
{
unsigned char key_press = 0; // 记录按键是否按下
unsigned char led_on = 0; // 记录LED是否常亮
unsigned int key_time = 0; // 记录按键按下的时间
unsigned int led_time = 0; // 记录LED闪烁的时间
while (1)
{
if (KEY == 0) // 检测按键是否按下
{
key_press = 1; // 标记按键按下
key_time = 0; // 重置按键计时器
led_time = 0; // 重置LED计时器
}
else if (key_press == 1) // 检测按键是否松开
{
key_press = 0; // 标记按键松开
if (led_on == 0) // 如果LED没有常亮
led_time = 0; // 重置LED计时器
}
if (key_press == 1 && key_time >= 5000) // 如果按键按下超过5秒
{
led_on = 1; // 标记LED常亮
LED = 1; // 点亮LED
}
else if (led_on == 0) // 如果LED没有常亮
{
if (led_time >= 1000) // 如果LED闪烁时间超过1秒
{
LED = ~LED; // LED取反
led_time = 0; // 重置LED计时器
}
}
Delay1s(); // 延时1秒
key_time++; // 每秒按键计时器加1
led_time++; // 每秒LED计时器加1
}
}
```
该代码中,使用了两个计时器来分别记录按键按下的时间和LED闪烁的时间。当按键按下后,将标记变量 `key_press` 设为1,并重置按键计时器和LED计时器。当按键松开后,将 `key_press` 设为0,并根据LED是否常亮来判断是否需要重置LED计时器。如果按键按下超过5秒,则将标记变量 `led_on` 设为1,并点亮LED。如果LED没有常亮,则每隔1秒闪烁一次。在每次循环结束时,都要进行1秒的延时,同时将按键计时器和LED计时器加1。
阅读全文