|
//☆☆☆☆☆☆張小強☆☆☆☆☆
//日期:2014/12/27/21:00-22:30
//版本:V0.1
//僅供參考
#include<stm8s105k4.h>
#include"key.h"
/////////////////8位輸入IO定義
#define KEYIO_01 0x01
#define KEYIO_02 0x02
#define KEYIO_04 0x04
#define KEYIO_08 0x08
#define KEYIO_10 0x10
#define KEYIO_20 0x20
#define KEYIO_40 0x40
#define KEYIO_80 0x80
//按鍵首次按下最小有效時間 連續(xù)按下觸發(fā)最小有效時間 連續(xù)按下狀態(tài)下最小反應(yīng)時間
#define keysonetime 2 //首次進入的最小時間段
#define keysltime 50 //進入長按狀態(tài)的最小時間段
#define keyslrtime 10 //長按狀態(tài)下反應(yīng)速度
#define keyshtime 10 //松開的最小保持時間
/////////PD口所用到的IO 1 2 3 4
#define KEYIO_PC (KEYIO_02|KEYIO_04|KEYIO_08|KEYIO_10)
/////////PC口所用到的IO 0 2
#define KEYIO_PD (KEYIO_01|KEYIO_04)
#define KEY_PC PC_IDR & KEYIO_PC //過濾沒有選擇的端口
#define KEY_PD PD_IDR & KEYIO_PD
//識別的按鍵有效次數(shù)
unsigned char key1num=0;
//按鍵確定有效標(biāo)志位
_Bool key1flag=0;
//按鍵首次觸發(fā)時間
unsigned char key1time=0;
//按鍵松開狀態(tài)保持時間
unsigned char key1timeh=0;
//按鍵連續(xù)觸發(fā)時間條件
unsigned char key1Ltime=0;
//按鍵處于連續(xù)觸發(fā)時反應(yīng)時間
unsigned char key1rtime=0;
//按鍵允許檢測標(biāo)志位 1 允許檢測 0 不允許檢測 每次檢測后自動置0
_Bool keystartflag=0,keysenable=0; //根據(jù)按鍵靈敏度需要特定時間內(nèi)置1將啟動按鍵檢測
/*
* KEYGPIO_Config () 可外部調(diào)用
* 初始化板級按鍵端口
* 無返回值
*/
void KEYGPIO_Config(void)//端口配置
{
PC_ODR&=~KEYIO_PC;
PC_DDR&=~KEYIO_PC;
PC_CR2&=~KEYIO_PC;
PC_CR1|=KEYIO_PC;
PD_ODR&=~KEYIO_PD;
PD_DDR&=~KEYIO_PD;
PD_CR1&=~KEYIO_PD;
PD_CR1|=KEYIO_PD;
}
//下文給出一個按鍵的源碼供參考,包含短按 長按 松開以上都會觸發(fā)事件發(fā)生
/*
*按鍵檢測函數(shù) 在循環(huán)中調(diào)用
*根據(jù)keystartflag確定函數(shù)是否執(zhí)行
*
*/
void keysstart(void)
{
if(keystartflag)
{
//端口c
if((KEY_PC&KEYIO_02)==0x00)//是否有檢測到低電平
{
if(key1flag==0) //是否已經(jīng)檢測到當(dāng)前的低電平
{
key1time++; //記錄狀態(tài)保持時間
if(key1time>keysonetime)//是否達到首次按下的最小有效時間
{
key1flag=1; //更新標(biāo)志位
key1time=0; //清楚記錄的保持時間
key1num++; //按鍵事件++
key1timeh=keyshtime; //將按鍵松開保持時間賦值
key1Ltime=0; //長按保持時間累積清零
}
}
if((key1Ltime<keysltime))key1Ltime++; //是否低于長按檢測條件
else //進入長按狀態(tài)
{
key1rtime++; //長按反應(yīng)時間累積
if(key1rtime>keyslrtime) //是否到達長按反應(yīng)時間的最小值
{
key1rtime=0; //清楚記錄時間
key1num++; //按鍵事件++
}
}
}
else if(key1timeh>0)//是否已經(jīng)進入松開狀態(tài)并保持設(shè)置時間
{
key1timeh--; //記錄本狀態(tài)保持時間
key1Ltime=0; //清除按下狀態(tài)保持時間的記錄值
key1time=0;
if(key1timeh==0)//到達松開狀態(tài)下的最小保持時間
{
key1flag=0; //允許下次按鍵的按下
key1rtime=0;//清除長按下狀態(tài)保持時間的記錄值
key1num++;
}
}
keystartflag=0;
}
}
/*
*讀取當(dāng)前按鍵的事件數(shù)
*指針是外部調(diào)用函數(shù)的應(yīng)用變量
*調(diào)用后事件值自動清零
*/
void readkeysstatus(unsigned char *key1ststus)
{
*key1ststus=key1num;
key1num=0;
}
/*
*使用按鍵外設(shè),并初始化
*使能后開始按鍵檢測工作
*
*/
void usekeys(void)
{
keysenable=1;
key1num=0;
}
|
|