单片机IO中断方式的短按与长按功能

#include 

// 定义按键连接的引脚
sbit KEY = P1^0;  

// 定义短按和长按的时间阈值(单位:毫秒)
#define SHORT_PRESS_TIME 200
#define LONG_PRESS_TIME 1000

// 定义标志位
bit press_flag = 0;
bit long_press_flag = 0;
unsigned int press_time = 0;

// 中断服务程序,用于处理按键按下的事件
void external_interrupt0() interrupt 0 {
    if (KEY == 0) {  // 检测到按键按下
        press_flag = 1;
        press_time = 0;  // 重置按下时间
        while (KEY == 0) {  // 等待按键释放
            if (press_time < LONG_PRESS_TIME) {
                // 增加按下时间计数
                press_time++;
                // 这里可以根据系统时钟调整延时,假设系统时钟为 1 毫秒
                for (int i = 0; i < 123; i++);
            } else {
                long_press_flag = 1;  // 达到长按时间阈值,标记为长按
                break;
            }
        }
        if (press_time < LONG_PRESS_TIME && press_flag) {
            // 未达到长按时间阈值,标记为短按
            // 执行短按操作,这里可以调用相应的短按处理函数
            shortPressFunction(); 
        }
        if (long_press_flag) {
            // 执行长按操作,这里可以调用相应的长按处理函数
            longPressFunction(); 
        }
        press_flag = 0;
        long_press_flag = 0;
    }
}

// 短按处理函数
void shortPressFunction() {
    // 这里添加短按操作的代码,例如点亮一个 LED 灯
    P2 = 0x01; 
}

// 长按处理函数
void longPressFunction() {
    // 这里添加长按操作的代码,例如闪烁一个 LED 灯
    for (int i = 0; i < 5; i++) {
        P2 = 0x00;
        for (int j = 0; j < 50000; j++);
        P2 = 0x01;
        for (int j = 0; j < 50000; j++);
    }
}

void main() {
    // 配置外部中断 0
    IT0 = 1;  // 下降沿触发
    EX0 = 1;  // 允许外部中断 0
    EA = 1;  // 允许总中断

    while (1) {
        // 主循环可以执行其他任务
    }
}

代码解释:
#include :包含 8051 系列单片机的头文件,提供了对特殊功能寄存器和端口的定义。
sbit KEY = P1^0;:将 P1 口的第 0 位定义为 KEY 引脚,用于连接按键。
#define SHORT_PRESS_TIME 200 和 #define LONG_PRESS_TIME 1000:定义短按和长按的时间阈值,单位为毫秒。
bit press_flag = 0; 和 bit long_press_flag = 0;:定义标志位,用于标记按键按下和长按状态。
unsigned int press_time = 0;:用于记录按键按下的持续时间。
void external_interrupt0() interrupt 0:外部中断 0 的服务程序,当按键按下时触发。
if (KEY == 0):检测按键是否按下。
while (KEY == 0):等待按键释放,同时根据 press_time 来判断是短按还是长按。
for (int i = 0; i < 123; i++);:简单的延时,用于粗略计算时间,可根据系统时钟进行调整。
shortPressFunction() 和 longPressFunction():分别为短按和长按的处理函数,可根据实际需求编写相应的操作。
void main():主函数,配置外部中断 0 的触发方式和使能,并开启总中断。
IT0 = 1;:设置外部中断 0 为下降沿触发。
EX0 = 1;:允许外部中断 0。
EA = 1;:允许总中断。


使用说明:
将上述代码编译并烧录到 8051 系列单片机中。
确保按键连接到 P1^0 引脚。
当按键按下时,会触发外部中断 0,进入中断服务程序 external_interrupt0。
程序会根据按键按下的持续时间来判断是短按还是长按,并调用相应的处理函数。
短按处理函数 shortPressFunction 中,将 P2 口的第 0 位置为高电平(点亮一个 LED 灯),可根据实际硬件修改。
长按处理函数 longPressFunction 中,会让 P2 口的第 0 位闪烁 5 次,可根据实际硬件修改。
请注意,上述代码中的延时使用的是简单的循环计数,其精度可能会受到系统时钟和编译器优化的影响。在实际应用中,可能需要使用定时器中断来实现更精确的延时,以提高按键检测的准确性。同时,不同的单片机可能有不同的寄存器和中断向量定义,需要根据具体的单片机型号进行相应的调整。

你可能感兴趣的:(单片机,嵌入式硬件)