單片機按鍵掃描程序, 可移植,實用性高且穩定, 本人親測在多個項目上使用,暫時未發現問題,
支持短按,長按, 最大可支持八個按鍵, 支持不同組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
|