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

发布者:cloudy德德最新更新时间:2016-06-02 来源: eefocus关键字:STM8S  独立按键  IO口设置 手机看文章 扫描二维码
随时随地手机看文章
  • GPIO设置
  • 按键检测
    • 1 连续按键检测短按
  • 关键代码

 

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 ;
}

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

关键字:STM8S  独立按键  IO口设置 引用地址:STM8S独立按键IO口设置及按下事件问题

上一篇:基于STR710的红绿灯动态调整系统
下一篇:msp430如何设置IO口上拉还是下拉

推荐阅读最新更新时间:2024-03-16 14:55

三分钟看懂stm8s单片机实现多通道转换
今天在使用stm8s单片机的AD功能,单片机上有AN0到AN9十个通道。想只用其中的三路AN5到AN7。 //ADC初始化 void ADC_Init(void) { ADC_CR1 = 0x50; ADC_CR2 = 0x38; ADC_TDRL = 0xE0;//禁止施密特触发 } unsigned int Read_ADC_Temp(unsigned channel) { unsigned int i,ADtemp; ADC_Init(); //ADC_CSR = 0x00; ADC_CSR = channel; ADC_CR1 = 0x01;// CR1寄存器的最低位置1,使能ADC转换 for(i = 0;i 《 3
[单片机]
三分钟看懂<font color='red'>stm8s</font>单片机实现多通道转换
小白自学c51笔记之独立按键
先上个单片机开发板上独立按键的图(我的有四个): 上述按键中23之间,14之间(即引脚之间距离长的)本来就是连通的,按下按键后1和2,3和4连通,如果想让按键连接两支路则可把两支路分别连到1,2或分别连到3,4(我觉得连到任两引脚都可)。 开发板原理图上独立按键模块: GND为接地即低电压,如果按键k1按下则接通相当于一条导线,那么对应的P3^1也为低电压。 抖动现象:一般持续时间为5ms~10ms 按下按键后 在程序中判断P3^1或其他三个口电压是否为低电压,即0时由于存在抖动,可能造成错误,所以要消除抖动。 为了消除抖动现象,有两种方法,一是硬件消抖,二是软件消抖。本质都是延时(这个本质是我自己方便理
[单片机]
小白自学c51笔记之<font color='red'>独立</font><font color='red'>按键</font>
STM8S如何实现Atomthreads最低功耗
Atomthreads像众多操作系统一样,在没有任务调度是会调用idle。(by cpuwolf) sta TI c void atomIdleThread (uint32_t param) { /* Compiler warning */ param = param; /* Loop forever */ while (1) { /** todo Provide user idle hooks*/ } } atomthreads中atomIdleThread()是以线程的形式存在,也就是最低优先级线程。作者默认没有填写这个函数。 uint8_t atomOSInit (void *idl
[单片机]
<font color='red'>STM8S</font>如何实现Atomthreads最低功耗
stm8s开发(八) IIC的使用:IIC主机通信!
  前面讲过两个常用的串口,UART和SPI,这次这次讲解一下另一个常用的串口:IIC(I2C)通信   科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。   通信过程:   主模式时,IIC接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。起始条件和停止条件都是在主模式下由软件控制产生。   从模式时,IIC接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能够控制开启或禁止广播呼叫地址的识别。   数据和地址按8位/字节进行传输,高位在前。跟在
[单片机]
<font color='red'>stm8s</font>开发(八) IIC的使用:IIC主机通信!
正点原子关于STM8S精确延时函数
已经写完了STM8S的系统文件(同stm32一样,包括sys.c,delay.c和uart.c三个文件) 这里先分享delay.c和delay.h. 本来想仿效STM32用一个定时器来做,无奈STM8S提供的是一个8位定时器,真是食之无味了... 算来算去,用这个8位的定时器横竖都不好做延时,用16位的定时器嘛又怕浪费.真不知道st的人怎么想的. 这个8位的基本定时器,连ucosii的滴答时钟都不好提供...(24Mhz下,最大只能1.3ms左右中断一次,16Mhz则是2ms左右) 难不成多次中断,触发一次任务切换? 所以,表示蛋疼的很,无奈只能想用汇编的方式来实现精确延时了. 研究了几天,终于小有成就.汇编写了一个us级
[单片机]
51单片机累计定时中断次数实现独立按键
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: Independent-KEY ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200506 ---- @ModifiedTime: 20200506 ----
[单片机]
51单片机累计定时中断次数实现<font color='red'>独立</font><font color='red'>按键</font>
51实验9:独立按键控制led的亮灭,按一次亮,按一次灭
#include reg52.h typedef unsigned int u16; typedef unsigned char u8; sbit led=P2^0; sbit K1=P3^1; void delay(u16 i) { while(i--); } void keypros() { if(K1==0) { delay(1000); if(K1==0) { led=~led; } while(!K1); } } void main() { while(1) { keypros(); } }
[单片机]
AVR128的程序——独立按键控制数码管0~99递增
#include iom128v.h #define uchar unsigned char #define uint unsigned int void Delayus(uint US); void Delayms(uint MS); void display(uchar FirstBit,uchar Num); uchar TempData ; uchar WeiMa = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; uchar led_discode ={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved