搜索
bottom↓
回复: 17
打印 上一主题 下一主题

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

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2009-3-29 23:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看按键部分的代码好了,其中LCD部分代码还有点乱,主程序只是胡乱写了些测试代码ourdev_429803.zip(文件大小:313K) (原文件名:STMDSO.zip)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

2
发表于 2009-3-30 10:34:03 | 只看该作者
按键能不能接在外部中断的IO上面,处理的时候,只要在中断处理程序里面判断状态就可以了.

出0入0汤圆

3
发表于 2009-3-30 11:00:29 | 只看该作者
MARK

出0入0汤圆

4
发表于 2009-3-30 12:14:34 | 只看该作者
按键部分处理得不错,很精炼

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

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

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

如果这个使用中断,对ADC也不利

出0入0汤圆

5
 楼主| 发表于 2009-3-30 13:05:16 | 只看该作者
【3楼】 dvhome
后面按键再细分处理有什么问题吗?难道要把按键判断和处理放到一起?

另外我这种处理方法需要10ms的定时信号,这个也需要定时中断,也会对ADC不利吧。要不ADC采样时关闭定时中断?

出0入0汤圆

6
 楼主| 发表于 2009-3-30 13:12:55 | 只看该作者
【1楼】 ywl0409 老黄牛
stm8的gpio都能够触发外部中断(少数例外)。但用外部中断如何消抖呢?还有难道把按键功能都做到中断里吗,不把按键功能放到中断里或者要引入消息系统来实现对按键的处理?

出0入0汤圆

7
发表于 2009-3-30 13:29:54 | 只看该作者
【4楼】 ifree64

没有什么问题

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

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

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

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

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

按键对实时性不敏感的。快一些或慢一些都无所谓。因此完全可以放在大循环里面。

出0入0汤圆

8
 楼主| 发表于 2009-3-30 18:16:52 | 只看该作者
你的意思时不需要每个建都有长按、连_发,对吗?我这个写法,如果不需要长按、连_发、在按键处理的时候忽略掉就可以了。

我只是再定时器中断里设置了一个10msOK的标志,然后按键处理是放在大循环里做的。

出0入0汤圆

9
发表于 2009-3-31 11:40:09 | 只看该作者
完全可以

其实就是哪里处理的问题,反正都是要做的

出0入0汤圆

10
发表于 2009-5-6 16:01:18 | 只看该作者
能否详细点介绍下原理吗?看了还是不太懂

出0入0汤圆

11
发表于 2009-5-6 17:14:23 | 只看该作者
回楼上,在论坛上搜索状态机,我记得一个网友发了一个帖子,里面搜集了很多状态机的论文,其中一篇广西轻工业的论文就是描述这个按键扫描原理的。

出0入0汤圆

12
发表于 2009-5-6 17:34:47 | 只看该作者
和开发板上那样,用下沿+低电平触发已经很稳定了,不知道这样是否能取消软件去抖?

出0入0汤圆

13
发表于 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的端口值?

出0入0汤圆

14
 楼主| 发表于 2009-5-8 08:08:25 | 只看该作者
回11楼,能不能稍微详细讲讲?

回12楼,
这里只是检测了1个键,注释的是以前的代码,没有删掉。

出0入0汤圆

15
发表于 2009-7-19 20:31:47 | 只看该作者
mark

出0入0汤圆

16
发表于 2009-7-20 08:17:55 | 只看该作者
下载下来学习一下!

出0入0汤圆

17
发表于 2015-1-8 19:59:03 | 只看该作者
结构体 没看的太懂

出0入0汤圆

18
发表于 2017-7-5 13:19:20 | 只看该作者
很不错,可做参考
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 15:39

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

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