标题: 我的风格,板级驱动,定期更新 [打印本页]

作者: liuyuxi    时间: 2015-1-10 02:34
标题: 我的风格,板级驱动,定期更新
//☆☆☆☆☆☆张小强☆☆☆☆☆
//日期: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;
}



作者: 明白    时间: 2015-1-10 11:09
谢谢楼主共享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1