我写的基于状态机的按键扫描程序,在STM8下测试通过了。
看按键部分的代码好了,其中LCD部分代码还有点乱,主程序只是胡乱写了些测试代码ourdev_429803.zip(文件大小:313K) (原文件名:STMDSO.zip) 按键能不能接在外部中断的IO上面,处理的时候,只要在中断处理程序里面判断状态就可以了. MARK 按键部分处理得不错,很精炼但这种写法,后面的按键事件处理还再细分
因为现在每个按键都会有短按、长按、连_发输出了
【1楼】 ywl0409 老黄牛
按键属于交互部分,没有必要那么实时,放在主循环就可以了
如果这个使用中断,对ADC也不利 【3楼】 dvhome
后面按键再细分处理有什么问题吗?难道要把按键判断和处理放到一起?
另外我这种处理方法需要10ms的定时信号,这个也需要定时中断,也会对ADC不利吧。要不ADC采样时关闭定时中断? 【1楼】 ywl0409 老黄牛
stm8的gpio都能够触发外部中断(少数例外)。但用外部中断如何消抖呢?还有难道把按键功能都做到中断里吗,不把按键功能放到中断里或者要引入消息系统来实现对按键的处理? 【4楼】 ifree64
没有什么问题
我说的不是把按键判断和处理放在一起,这样就混乱了
我说的是,将按键跟事件的处理分离开,每个按键有自己的属性,因为在一般情况下,长按键和连_发键不会在一个按键上复用的。
这个没有什么太大的问题,我只是提出来讨论而已,你根据自己的想法做就好了~~
另外,定时器的问题,系统肯定需要一个标准定时器来一些常规的操作。
不需要把整个按键处理都放在定时器里面,只需要里面设一个标志位就可以了。
按键对实时性不敏感的。快一些或慢一些都无所谓。因此完全可以放在大循环里面。 你的意思时不需要每个建都有长按、连_发,对吗?我这个写法,如果不需要长按、连_发、在按键处理的时候忽略掉就可以了。
我只是再定时器中断里设置了一个10msOK的标志,然后按键处理是放在大循环里做的。 完全可以
其实就是哪里处理的问题,反正都是要做的 能否详细点介绍下原理吗?看了还是不太懂 回楼上,在论坛上搜索状态机,我记得一个网友发了一个帖子,里面搜集了很多状态机的论文,其中一篇广西轻工业的论文就是描述这个按键扫描原理的。 和开发板上那样,用下沿+低电平触发已经很稳定了,不知道这样是否能取消软件去抖? 刚刚看了下程序,其中有一个函数不太懂:
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的端口值? 回11楼,能不能稍微详细讲讲?
回12楼,
这里只是检测了1个键,注释的是以前的代码,没有删掉。 mark 下载下来学习一下! 结构体 没看的太懂 很不错,可做参考
页:
[1]