//☆☆☆☆☆☆张小强☆☆☆☆☆
//日期: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
//按键首次按下最小有效时间 连续按下触发最小有效时间 连续按下状态下最小反应时间
#define keysonetime 2 //首次进入的最小时间段
#define keysltime 50 //进入长按状态的最小时间段
#define keyslrtime 10 //长按状态下反应速度
#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
//识别的按键有效次数
unsigned char key1num=0;
//按键确定有效标志位
_Bool key1flag=0;
//按键首次触发时间
unsigned char key1time=0;
//按键松开状态保持时间
unsigned char key1timeh=0;
//按键连续触发时间条件
unsigned char key1Ltime=0;
//按键处于连续触发时反应时间
unsigned char key1rtime=0;
//按键允许检测标志位 1 允许检测 0 不允许检测 每次检测后自动置0
_Bool keystartflag=0,keysenable=0; //根据按键灵敏度需要特定时间内置1将启动按键检测
/*
* KEYGPIO_Config () 可外部调用
* 初始化板级按键端口
* 无返回值
*/
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;
}
//下文给出一个按键的源码供参考,包含短按 长按 松开以上都会触发事件发生
/*
*按键检测函数 在循环中调用
*根据keystartflag确定函数是否执行
*
*/
void keysstart(void)
{
if(keystartflag)
{
//端口c
if((KEY_PC&KEYIO_02)==0x00)//是否有检测到低电平
{
if(key1flag==0) //是否已经检测到当前的低电平
{
key1time++; //记录状态保持时间
if(key1time>keysonetime)//是否达到首次按下的最小有效时间
{
key1flag=1; //更新标志位
key1time=0; //清楚记录的保持时间
key1num++; //按键事件++
key1timeh=keyshtime; //将按键松开保持时间赋值
key1Ltime=0; //长按保持时间累积清零
}
}
if((key1Ltime<keysltime))key1Ltime++; //是否低于长按检测条件
else //进入长按状态
{
key1rtime++; //长按反应时间累积
if(key1rtime>keyslrtime) //是否到达长按反应时间的最小值
{
key1rtime=0; //清楚记录时间
key1num++; //按键事件++
}
}
}
else if(key1timeh>0)//是否已经进入松开状态并保持设置时间
{
key1timeh--; //记录本状态保持时间
key1Ltime=0; //清除按下状态保持时间的记录值
key1time=0;
if(key1timeh==0)//到达松开状态下的最小保持时间
{
key1flag=0; //允许下次按键的按下
key1rtime=0;//清除长按下状态保持时间的记录值
key1num++;
}
}
keystartflag=0;
}
}
/*
*读取当前按键的事件数
*指针是外部调用函数的应用变量
*调用后事件值自动清零
*/
void readkeysstatus(unsigned char *key1ststus)
{
*key1ststus=key1num;
key1num=0;
}
/*
*使用按键外设,并初始化
*使能后开始按键检测工作
*
*/
void usekeys(void)
{
keysenable=1;
key1num=0;
}
|