標(biāo)題:
支持不同組IO口按鍵短按,長按 單片機(jī)按鍵掃描程序KEY.H KEY.C文件下載
[打印本頁]
作者:
船長丶
時間:
2022-12-29 11:21
標(biāo)題:
支持不同組IO口按鍵短按,長按 單片機(jī)按鍵掃描程序KEY.H KEY.C文件下載
單片機(jī)按鍵掃描程序, 可移植,實用性高且穩(wěn)定, 本人親測在多個項目上使用,暫時未發(fā)現(xiàn)問題,
支持短按,長按, 最大可支持八個按鍵, 支持不同組io口按鍵
如果需要修改按鍵IO或者增加/減少按鍵只需簡單修改頭文件里的幾個常量即可
MCU程序如下:
KEY.H
#ifndef KEY_H_
#define KEY_H_
typedef unsigned char u8;
typedef unsigned int u16;
#define C_KEY_NUM (1) //定義按鍵數(shù)量
#define C_KEY_LONG_TIME (100-1) //按鍵長按時間 立即數(shù)*時基
//#define C_KEY_DBLCLICK_EN (0) //雙擊使能, 1使能 0 關(guān)閉
#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) //按鍵按下標(biāo)志
#define B_KEY_WHILE_UP_BIT (r_key_step_status & 0X02) //等待按鍵抬起標(biāo)志
#define C_SET_KEY_PRESS_H r_key_step_status |= 0X01 //按鍵按下標(biāo)志置1
#define C_SET_KEY_PRESS_L r_key_step_status &= ~0X01 //按鍵按下標(biāo)志置0
#define C_SET_KEY_WHILE_UP_H r_key_step_status |= 0X02 //按鍵等待抬起標(biāo)志置1
#define C_SET_KEY_WHILE_UP_L r_key_step_status &= ~0X02 //按鍵等待抬起標(biāo)志置0
#define clear_r_key_status r_key_status = 0 //清除按鍵值
volatile u8 r_key_status; // 按鍵值
volatile u8 r_key_step_status; // 按鍵步驟狀態(tài)
volatile u8 r_key_time_cnt; // 長按計時
volatile u8 r_port_temp; // 保存按鍵按下狀態(tài)
volatile u8 r_key_dat; // 所有按鍵映射到這個變量里面,統(tǒng)一管理
void key_scan(void);
#endif
復(fù)制代碼
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) // 按鍵沒有按下狀態(tài)
{
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; // 保存當(dāng)前按鍵值
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; // 清除所有狀態(tài)
}
}
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; // 清除所有狀態(tài)
}
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1