STM8S---独立按键IO口设置及按下事件问题

原创 2015年07月07日 19:39:32

1 GPIO设置

                STM8 I/O 口引脚配置表

Px_DDR Px_CR1 Px_CR2 I/O 方式 引脚状态
0 0 0 输入 悬浮输入
0 0 1 输入 上拉输入
0 1 0 输入 中断悬浮输入
0 1 1 输入 中断上拉输入
1 0 0 输出 开漏输出
1 1 0 输出 推挽输出
1 x 1 输出 输出(最快速度为10MHZ)

对STM8S的IO配置,我们只需要操作五个寄存器就行了:

  • 输出数据寄存器 (ODR)
  • 输入数据寄存器 (IDR)
  • 数据方向寄存器 (DDR)
  • 控制寄存器1(CR1)
  • 控制寄存器2(CR2)

2 按键检测

  在做独立按键检测的时候,设置成上拉输入不能实现功能,设置成中断悬浮输入就可以了。
  两次短按键之间的时间间隔大约在300ms~600ms之间。一次短按键按下的时间大约在14ms~26ms之间;

2.1 连续按键检测(短按+长按)

定时器TIM1 + 按键 = 连续按键检测(短按键+长按键)
两个标记:

  • 短按+长按—flag0
  • 短按后时间在规定范围之内—flag1

如果两个标记都满足,则开/关电源;每次按键都启动按键计时;

当两次按键的时间间隔在300ms~600ms之间的时候,怎么得到第一次(短按)和第二次(长按)按键之间的时间呢?
  如果判断了是短按,则开启计时,同时将第一次短按flag置一,超过600ms停止计时并清零,等待第二次的按键;有了第二次的按键之后,在短按置一flag条件中中断计时,判断是否在规定范围之内的时间间隔,是则将flag1置一;并接下来判断该按键是长按还是短按,如果是长按,则将flag0置一,满足flag0、flag1均置一,则是连续按键。

3 关键代码

/*
return = 
    0   :   No Key Press
    1   :   Single Key Press
    2   :   将长按作为一次单独按键,并执行Single Key Press功能   
    3   :   Double Key Press
*/
unsigned int Key_Scan(void)
{
    unsigned int count = 0;

    if(0 == KEY)
    {
        Delay(2);
        if(0 == KEY)
        {
            if(1 == keytimesFlag)
            {
                afterOnceShortPressFlag = 0;
                if((afterOnceShortPressCount <=30) 
                    && (afterOnceShortPressCount > 15))
                {
                    isSetTimeFlag = 1;
                }
                else isSetTimeFlag = 0;
            }
            keyFlag = 1;
            while(!KEY);
            keyFlag = 0;
            count = keyCount;
            keyCount = 0;
        }
        else
        {
            count = 0;
        }
    }

    if(count >= 200)
    {
        if(1 == isSetTimeFlag)
        {
            isSetTimeFlag = 0;
            keytimesFlag = 0;
            return 3;
        }
        else 
        {
            keytimesFlag = 0;
            return 2;           
        }
    }
    else if(count >= 4)
    {
        afterOnceShortPressFlag = 1;
        afterOnceShortPressCount = 0;
        keytimesFlag = 1;
        return 1;
    }
    else return 0;
}

在定时周期为10ms的定时器中断函数里:

@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{   
    TIM1_SR1 &=~(0x01);    
    if(1 == keyFlag)
    {
        ++keyCount;
    }
    else ;
    if(1 == afterOnceShortPressFlag)
    {
        ++afterOnceShortPressCount;
        if(afterOnceShortPressCount > 80)
        {
            afterOnceShortPressFlag = 0;
            afterOnceShortPressCount = 0;
            keytimesFlag = 0;
        }
    }
    else ;
}

  另参见使用外部中断长按键识别:使用外部中断识别长按键

版权声明:本文为博主[原创]文章,未经博主允许可以转载,注明博客出处:[http://blog.csdn.net/FreeApe]

stm8 GPIO按键输入

stm8按键输入程序和介绍。

MCU实战经验:多种的按键处理

之前的一个项目按键比较多,面板上面有按键,遥控器,处理的稍微复杂一点,MCU使用的是STM8S005K6. 关于按键部分的处理,现在拿处理来和大家分享一下,说的不对的地方还请各位大侠请教,大家共同进步...
  • kevinhg
  • kevinhg
  • 2015年08月25日 00:04
  • 4752

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

STM8S---外部中断应用之长按键识别

STM8常用中断指令 开总中断 _asm(“rim”); 禁止中断 _asm(“sim”); 进入停机模式 _asm(“halt”); 中断返回 _asm(“iret”); 等待中断 _as...
  • FreeApe
  • FreeApe
  • 2015年07月21日 18:32
  • 4476

STM8学习笔记----按键中断

今天学习按键中断。 根据青风STM8开发板,编写key_exti.h头文件如下: #ifndef  __KEY_EXTI_H #define  __KEY_EXTI_H #includ...
  • lwenqu
  • lwenqu
  • 2017年08月27日 16:09
  • 194

STM8S学习GPIO操作

STM8S的GPIO主要功能: ● 端口的各个位可以被单独配置 ● 可选择的输入模式:浮动输入和带上拉输入 ● 可选择的输出模式:推挽式输出和开漏输出 ● 数据输入和输出采用独立的寄存器 ● 外部中...

stm8s开发(二) GPIO的使用:点亮LED!

通用输入输出口(GPIO)是我们使用单片机最基本的,主要功能: ● 端口的各个位可以被单独配置 ● 可选择的输入模式:浮动输入和带上拉输入 ● 可选择的输出模式:推挽式输出和开漏输出 ● 外部中断可...
  • DevinTT
  • DevinTT
  • 2016年09月11日 23:47
  • 3300

STM8S003F使用IO口模拟串口(三)使用中断方式发送和接收数据

在前两篇文章中我们介绍了IO口模拟串口发送数据和接收数据,前两种方法都是使用定时器来进行发送和接收,没有用到中断,优点是逻辑简单,但是缺点很明显,只能进行单个字节的发送和接收,而且不能同时工作。因此在...

STM8S003F使用IO口模拟串口(四)正真意义上的模拟串口

在前三篇文章中由简到烦的介绍了模拟串口的设计规则,但是在前三篇文章中所实现的方法并不能满足我们在实际工程中的使用。在这篇文章中,我将详细的描述模拟串口的实现,并提供相关代码来供大家参考。 1、原理 为...

STM8S003F使用IO口模拟串口(二)接收数据

在上一篇文章中我们介绍了IO口模拟串口数据的发送,这一篇文章我们介绍IO口模拟串口数据的发送。同样的,我们没有使用库函数和中断,我们使用简单的定时来完成数据的接收。 1、IO口模拟串口接收数据的原理 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STM8S---独立按键IO口设置及按下事件问题
举报原因:
原因补充:

(最多只允许输入30个字)