找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2520|回复: 1
打印 上一主题 下一主题
收起左侧

我的风格,板级驱动,定期更新

[复制链接]
跳转到指定楼层
楼主
ID:71922 发表于 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;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:19715 发表于 2015-1-10 11:09 | 只看该作者
谢谢楼主共享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表