单片机按键扫描程序, 可移植,实用性高且稳定, 本人亲测在多个项目上使用,暂时未发现问题,
支持短按,长按, 最大可支持八个按键, 支持不同组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
|