amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 17

我写的基于状态机的按键扫描程序,在STM8下测试通过了。

[复制链接]
(353041083)
发表于 2009-3-29 23:59:41 | 显示全部楼层 |阅读模式
看按键部分的代码好了,其中LCD部分代码还有点乱,主程序只是胡乱写了些测试代码ourdev_429803.zip(文件大小:313K) (原文件名:STMDSO.zip)
(353003021)
发表于 2009-3-30 10:34:03 | 显示全部楼层
按键能不能接在外部中断的IO上面,处理的时候,只要在中断处理程序里面判断状态就可以了.
(353001435)
发表于 2009-3-30 11:00:29 | 显示全部楼层
MARK
(352996990)
发表于 2009-3-30 12:14:34 | 显示全部楼层
按键部分处理得不错,很精炼

但这种写法,后面的按键事件处理还再细分

因为现在每个按键都会有短按、长按、连_发输出了

【1楼】 ywl0409 老黄牛
按键属于交互部分,没有必要那么实时,放在主循环就可以了

如果这个使用中断,对ADC也不利
(352993948)
 楼主| 发表于 2009-3-30 13:05:16 | 显示全部楼层
【3楼】 dvhome
后面按键再细分处理有什么问题吗?难道要把按键判断和处理放到一起?

另外我这种处理方法需要10ms的定时信号,这个也需要定时中断,也会对ADC不利吧。要不ADC采样时关闭定时中断?
(352993489)
 楼主| 发表于 2009-3-30 13:12:55 | 显示全部楼层
【1楼】 ywl0409 老黄牛
stm8的gpio都能够触发外部中断(少数例外)。但用外部中断如何消抖呢?还有难道把按键功能都做到中断里吗,不把按键功能放到中断里或者要引入消息系统来实现对按键的处理?
(352992470)
发表于 2009-3-30 13:29:54 | 显示全部楼层
【4楼】 ifree64

没有什么问题

我说的不是把按键判断和处理放在一起,这样就混乱了

我说的是,将按键跟事件的处理分离开,每个按键有自己的属性,因为在一般情况下,长按键和连_发键不会在一个按键上复用的。

这个没有什么太大的问题,我只是提出来讨论而已,你根据自己的想法做就好了~~

另外,定时器的问题,系统肯定需要一个标准定时器来一些常规的操作。

不需要把整个按键处理都放在定时器里面,只需要里面设一个标志位就可以了。

按键对实时性不敏感的。快一些或慢一些都无所谓。因此完全可以放在大循环里面。
(352975252)
 楼主| 发表于 2009-3-30 18:16:52 | 显示全部楼层
你的意思时不需要每个建都有长按、连_发,对吗?我这个写法,如果不需要长按、连_发、在按键处理的时候忽略掉就可以了。

我只是再定时器中断里设置了一个10msOK的标志,然后按键处理是放在大循环里做的。
(352912655)
发表于 2009-3-31 11:40:09 | 显示全部楼层
完全可以

其实就是哪里处理的问题,反正都是要做的
(349786586)
发表于 2009-5-6 16:01:18 | 显示全部楼层
能否详细点介绍下原理吗?看了还是不太懂
(349782201)
发表于 2009-5-6 17:14:23 | 显示全部楼层
回楼上,在论坛上搜索状态机,我记得一个网友发了一个帖子,里面搜集了很多状态机的论文,其中一篇广西轻工业的论文就是描述这个按键扫描原理的。
(349780977)
发表于 2009-5-6 17:34:47 | 显示全部楼层
和开发板上那样,用下沿+低电平触发已经很稳定了,不知道这样是否能取消软件去抖?
(349774342)
发表于 2009-5-6 19:25:22 | 显示全部楼层
刚刚看了下程序,其中有一个函数不太懂:
static u8 KEY_Read(void)
{
   
    u8 KCode = 0;
/*        u8 KMask;
    // 读引脚状态,取反后1表示键按下
    KMask = GPIO_ReadInputData(KEY_PORT) ^ 0xFF;
       

        // KEY_PORT上接8个独立式按键,从低到高编号为1~8
        while(KMask != 0)
        {
                KMask >>= 1;
                KCode++;
        }
*/
    if( GPIO_ReadInputPin(KEY_PORT, KEY_PIN) == RESET )
        KCode = 1;
        return KCode;
}
以上程序KCode怎样返回一个8bit的端口值?
(349642159)
 楼主| 发表于 2009-5-8 08:08:25 | 显示全部楼层
回11楼,能不能稍微详细讲讲?

回12楼,
这里只是检测了1个键,注释的是以前的代码,没有删掉。
(343376757)
发表于 2009-7-19 20:31:47 | 显示全部楼层
mark
(343334389)
发表于 2009-7-20 08:17:55 | 显示全部楼层
下载下来学习一下!
(170665121)
发表于 2015-1-8 19:59:03 | 显示全部楼层
结构体 没看的太懂
(92151504)
发表于 2017-7-5 13:19:20 | 显示全部楼层
很不错,可做参考
回帖提示: 尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-6-6 02:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表