标题:
支持不同组IO口按键短按,长按 单片机按键扫描程序KEY.H KEY.C文件下载
[打印本页]
作者:
船长丶
时间:
2022-12-29 11:21
标题:
支持不同组IO口按键短按,长按 单片机按键扫描程序KEY.H KEY.C文件下载
单片机按键扫描程序, 可移植,实用性高且稳定, 本人亲测在多个项目上使用,暂时未发现问题,
支持短按,长按, 最大可支持八个按键, 支持不同组io口按键
如果需要修改按键IO或者增加/减少按键只需简单修改头文件里的几个常量即可
MCU程序如下:
KEY.H
#ifndef KEY_H_
#define KEY_H_
typedef unsigned char u8;
typedef unsigned int u16;
#define C_KEY_NUM (1) //定义按键数量
#define C_KEY_LONG_TIME (100-1) //按键长按时间 立即数*时基
//#define C_KEY_DBLCLICK_EN (0) //双击使能, 1使能 0 关闭
#define C_KEY_DAT_BUF (0xff>>(8- C_KEY_NUM)) //
#define C_PORTA (PORTA)
#define C_PORTB (PORTB)
#define C_PORTC (PORTC)
#define CST_KEY1_BIT (C_PORTB & C_KEY_BIT6) //定义按键地址
#define CST_KEY2_BIT (C_PORTB & C_KEY_BIT_NULL) //定义按键地址
#define CST_KEY3_BIT (C_PORTA & C_KEY_BIT_NULL) //定义按键地址
#define CST_KEY4_BIT (C_PORTB & C_KEY_BIT_NULL) //定义按键地址
#define CST_KEY5_BIT (C_PORTB & C_KEY_BIT_NULL) //定义按键地址
#define CST_KEY6_BIT (C_PORTB & C_KEY_BIT_NULL) //定义按键地址
#define CST_KEY7_BIT (C_PORTB & C_KEY_BIT_NULL) //定义按键地址
#define CST_KEY8_BIT (C_PORTB & C_KEY_BIT_NULL) //定义按键地址
#define C_KEY_BIT_NULL (0X00)
#define C_KEY_BIT0 (0X01)
#define C_KEY_BIT1 (0X02)
#define C_KEY_BIT2 (0X04)
#define C_KEY_BIT3 (0X08)
#define C_KEY_BIT4 (0X10)
#define C_KEY_BIT5 (0X20)
#define C_KEY_BIT6 (0X40)
#define C_KEY_BIT7 (0X80)
enum C_KEY_STATUS_SHORT
{
C_KEY1_STATUS_SHORT = 1,
C_KEY2_STATUS_SHORT,
C_KEY3_STATUS_SHORT,
C_KEY4_STATUS_SHORT,
C_KEY5_STATUS_SHORT,
C_KEY6_STATUS_SHORT,
C_KEY7_STATUS_SHORT,
C_KEY8_STATUS_SHORT
};
enum C_KEY_STATUS_LONG
{
C_KEY1_STATUS_LONG = 0X21,
C_KEY2_STATUS_LONG,
C_KEY3_STATUS_LONG,
C_KEY4_STATUS_LONG,
C_KEY5_STATUS_LONG,
C_KEY6_STATUS_LONG,
C_KEY7_STATUS_LONG,
C_KEY8_STATUS_LONG
};
#define B_KEY_PRESS_BIT (r_key_step_status & 0X01) //按键按下标志
#define B_KEY_WHILE_UP_BIT (r_key_step_status & 0X02) //等待按键抬起标志
#define C_SET_KEY_PRESS_H r_key_step_status |= 0X01 //按键按下标志置1
#define C_SET_KEY_PRESS_L r_key_step_status &= ~0X01 //按键按下标志置0
#define C_SET_KEY_WHILE_UP_H r_key_step_status |= 0X02 //按键等待抬起标志置1
#define C_SET_KEY_WHILE_UP_L r_key_step_status &= ~0X02 //按键等待抬起标志置0
#define clear_r_key_status r_key_status = 0 //清除按键值
volatile u8 r_key_status; // 按键值
volatile u8 r_key_step_status; // 按键步骤状态
volatile u8 r_key_time_cnt; // 长按计时
volatile u8 r_port_temp; // 保存按键按下状态
volatile u8 r_key_dat; // 所有按键映射到这个变量里面,统一管理
void key_scan(void);
#endif
复制代码
KEY.C
#include <sc.h>
#include "user.h"
#include "KEY.h"
void key_scan(void)
{
r_key_dat = 0;
// 映射 IO
#if C_KEY_NUM > 0
if(CST_KEY1_BIT)
{
r_key_dat |= C_KEY_BIT0;
}
#endif
#if C_KEY_NUM > 1
if(CST_KEY2_BIT)
{
r_key_dat |= C_KEY_BIT1;
}
#endif
#if C_KEY_NUM > 2
if(CST_KEY3_BIT)
{
r_key_dat |= C_KEY_BIT2;
}
#endif
#if C_KEY_NUM > 3
if(CST_KEY4_BIT)
{
r_key_dat |= C_KEY_BIT3;
}
#endif
#if C_KEY_NUM > 4
if(CST_KEY5_BIT)
{
r_key_dat |= C_KEY_BIT4;
}
#endif
#if C_KEY_NUM > 5
if(CST_KEY6_BIT)
{
r_key_dat |= C_KEY_BIT5;
}
#endif
#if C_KEY_NUM > 6
if(CST_KEY7_BIT)
{
r_key_dat |= C_KEY_BIT6;
}
#endif
#if C_KEY_NUM > 7
if(CST_KEY8_BIT)
{
r_key_dat |= C_KEY_BIT7;
}
#endif
if(!B_KEY_PRESS_BIT) // 按键没有按下状态
{
if(r_key_dat != C_KEY_DAT_BUF) // 判断按键有没有按下
{
C_SET_KEY_PRESS_H; // 按键按下了
C_SET_KEY_WHILE_UP_L;
r_port_temp = r_key_dat; // 保存当前按键值
r_key_time_cnt = 0; // 清除按键计时
}
}
else
{
r_sleep_cnt = 0; // 按键按下 清除休眠
if(B_KEY_WHILE_UP_BIT) // 等待按键抬起
{
if(r_key_dat == C_KEY_DAT_BUF)
{
r_key_step_status = 0; // 清除所有状态
}
}
else
{
++r_key_time_cnt;
if(r_port_temp == r_key_dat) // 按键一直按
{
if(r_key_time_cnt > C_KEY_LONG_TIME) // 长按
{
r_key_time_cnt = 0;
C_SET_KEY_WHILE_UP_H;
#if C_KEY_NUM > 0
if(!(r_port_temp & C_KEY_BIT0))
{
r_key_status = C_KEY1_STATUS_LONG;
}
#endif
#if C_KEY_NUM > 1
if(!(r_port_temp & C_KEY_BIT1))
{
r_key_status = C_KEY2_STATUS_LONG;
}
#endif
#if C_KEY_NUM > 2
if(!(r_port_temp & C_KEY_BIT2))
{
r_key_status = C_KEY3_STATUS_LONG;
}
#endif
#if C_KEY_NUM > 3
if(!(r_port_temp & C_KEY_BIT3))
{
r_key_status = C_KEY4_STATUS_LONG;
}
#endif
#if C_KEY_NUM > 4
if(!(r_port_temp & C_KEY_BIT4))
{
r_key_status = C_KEY5_STATUS_LONG;
}
#endif
#if C_KEY_NUM > 5
if(!(r_port_temp & C_KEY_BIT5))
{
r_key_status = C_KEY6_STATUS_LONG;
}
#endif
#if C_KEY_NUM > 6
if(!(r_port_temp & C_KEY_BIT6))
{
r_key_status = C_KEY7_STATUS_LONG;
}
#endif
#if C_KEY_NUM > 7
if(!(r_port_temp & C_KEY_BIT7))
{
r_key_status = C_KEY8_STATUS_LONG;
}
#endif
}
}
if(r_key_dat == C_KEY_DAT_BUF) // 按键抬起
{
if(r_key_time_cnt > 1) // 按键按下超过10ms才算按下
{
#if C_KEY_NUM > 0
if(!(r_port_temp & C_KEY_BIT0))
{
r_key_status = C_KEY1_STATUS_SHORT;
}
#endif
#if C_KEY_NUM > 1
if(!(r_port_temp & C_KEY_BIT1))
{
r_key_status = C_KEY2_STATUS_SHORT;
}
#endif
#if C_KEY_NUM > 2
if(!(r_port_temp & C_KEY_BIT2))
{
r_key_status = C_KEY3_STATUS_SHORT;
}
#endif
#if C_KEY_NUM > 3
if(!(r_port_temp & C_KEY_BIT3))
{
r_key_status = C_KEY4_STATUS_SHORT;
}
#endif
#if C_KEY_NUM > 4
if(!(r_port_temp & C_KEY_BIT4))
{
r_key_status = C_KEY5_STATUS_SHORT;
}
#endif
#if C_KEY_NUM > 5
if(!(r_port_temp & C_KEY_BIT5))
{
r_key_status = C_KEY6_STATUS_SHORT;
}
#endif
#if C_KEY_NUM > 6
if(!(r_port_temp & C_KEY_BIT6))
{
r_key_status = C_KEY7_STATUS_SHORT;
}
#endif
#if C_KEY_NUM > 7
if(!(r_port_temp & C_KEY_BIT7))
{
r_key_status = C_KEY7_STATUS_SHORT;
}
#endif
}
r_key_step_status = 0; // 清除所有状态
}
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1