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]

相关文章推荐

STM8S库文件判断指定IO输入引脚电平GPIO_ReadInputPin有问题

/** * @brief Reads the specified GPIO input data pin. * @param GPIOx : Select the GPIO periphe...

STM8S IO外部中断

在用STM8S中断时,必须先初始化好IO口的中断属性,然后再开总中断.否则会出现反复进入中断响应的怪现象.!!

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

STM8常用中断指令 开总中断 _asm(“rim”); 禁止中断 _asm(“sim”); 进入停机模式 _asm(“halt”); 中断返回 _asm(“iret”); 等待中断 _as...

STM8的中断系统以及外部中断详解

STM8具有最多32的中断系统,在中断的处理上类似于cortexm系列的芯片,首先是每个中断的向量都是固化在系统内部的,用户需要向相应的中断向量flash位置写入中断处理函数,其二,每个中断向量都具有...

STM8 外部中断

硬件平台:stm8s103 编译环境:IAR for stm8#include #include // 设置PD4中断向量及中断函数 #pragma vector = 8 __interru...
  • zpzyf
  • zpzyf
  • 2016-08-14 22:26
  • 1204

stm8s开发(六) EXIT的使用:做一个外部中断的按钮!

在前几篇文章,GPIO的使用:点亮LED!http://blog.csdn.net/devintt/article/details/50818494 中只讲述了IO口的输出,并没有输入,因为IO作为...

stm8 GPIO按键输入

stm8按键输入程序和介绍。

#646 – 在按键按下事件处理程序中判断按键开关状态(Detecting a Key’s Toggle State in a Keypress Handler)

在键盘上,有些键是可以切换状态的开关键,一些常用的开关键为:Caps Lock(大小写开关键), Scroll Lock(滚动锁定键) 和Num Lock(数字键盘开关键)。注意,通常情况下Shift...

STM8S_008_WDG独立看门狗和窗口看门狗

相关标题:STM8S看门狗、IWDG、WWDGⅠ、写在前面STM8S看门狗WDG分为两类:IWDG:Independent WatchDog独立看门狗WWDG:Window WatchDog窗口看门狗...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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