打印
[STM8]

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

[复制链接]
982|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
正版长小强|  楼主 | 2014-12-27 23:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//☆☆☆☆☆☆张小强☆☆☆☆☆
//日期: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;
}

沙发
mmuuss586| | 2014-12-28 18:29 | 只看该作者

定期更新又怎么样呢?

使用特权

评论回复
板凳
kfliuyan| | 2014-12-28 19:11 | 只看该作者
支持一下

使用特权

评论回复
地板
子翁| | 2014-12-29 11:10 | 只看该作者
是定期更新这个驱动代码?

使用特权

评论回复
5
小浣熊| | 2014-12-29 17:46 | 只看该作者
这个是实现什么功能啊??

使用特权

评论回复
6
白丁野老| | 2014-12-30 21:06 | 只看该作者
学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

194

帖子

4

粉丝