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 IO口的位操作

很多新手在不用STM库函数的情况下,不知道如何多STM8的I/O口进行按位操作,下面把我刚开始用STM8的经验跟大家分享一下! ...
  • qq_23334871
  • qq_23334871
  • 2016年10月01日 22:56
  • 1326

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

声明:本文转载自http://blog.csdn.net/lan120576664/article/details/24203639 /** * @brief Reads the s...
  • peakguy
  • peakguy
  • 2017年06月07日 10:55
  • 1057

stm8 GPIO按键输入

stm8按键输入程序和介绍。
  • zhuming3834
  • zhuming3834
  • 2015年05月08日 08:32
  • 2702

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

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

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

在前几篇文章,GPIO的使用:点亮LED!http://blog.csdn.net/devintt/article/details/50818494 中只讲述了IO口的输出,并没有输入,因为IO作为...
  • DevinTT
  • DevinTT
  • 2016年09月16日 23:44
  • 6419

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

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

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

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

STM8S003F3控制LED

一、概述 不管什么单片机,想要控制LED灯,只能是通过控制单片机芯片的I/O引脚电平的高低来实现。 同样在ST单片机上,I/O引脚可以被软件设置成各种不同的功能,如输入或输出,所以被称为 GPIO (...
  • snyanglq
  • snyanglq
  • 2016年03月07日 11:17
  • 4167

新型的按键扫描程序

新型的按键扫描程序 不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入...
  • yushuihualaopo
  • yushuihualaopo
  • 2011年07月01日 17:04
  • 4774

基于STM8L红外解码按键扫描C程序

  • 2016年06月07日 10:26
  • 2.99MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STM8S---独立按键IO口设置及按下事件问题
举报原因:
原因补充:

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