轻量级按键识别模块分享 + 求助, 没调通
<h1>轻量级按键识别模块</h1><p>轻量级的按键动作识别软件框架,可以十分方便地获取按键的各种状态,通过配置按键不同模式,完成对应的按键动作识别。</p>
<h4>特点</h4>
<p>轻量级的按键动作识别代码:</p>
<ul>
<li>
<p>移植方便,无需修改,只需要初始化提供读取相关IO状态函数即可</p>
</li>
<li>
<p>丰富的接口实现,通过这些接口能及时处理按键操作,同时可以实现单击、双击、多击、短按和长按等多种要求的功能</p>
</li>
<li>
<p>代码量少,且代码注释丰富,风格统一,便于阅读和使用</p>
<p>原文链接:https://gitee.com/cot_package/cot_key</p>
<p>于是我进行了一下移植,使用的是STC8H4K64TLCD,但是遇到了点问题,还请各位大佬指点。<br />
<img src="data/attachment/forum/202503/13/162148o7fjnjpfvxantn87.png" alt="image.png" title="image.png" />这是我的按键枚举</p>
<p><img src="data/attachment/forum/202503/13/162227zxlzzjxmfxlnk9n7.png" alt="image.png" title="image.png" />这是我的按键初始化<a href="forum.php?mod=attachment&aid=87772" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:cot_key.h</a><a href="forum.php?mod=attachment&aid=87773" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:cot_key.h</a><a href="forum.php?mod=attachment&aid=87774" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:key_manager.h</a><a href="forum.php?mod=attachment&aid=87775" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:key_manager.h</a></p>
<p>现在的问题是只有枚举体里的第一个按键能够正常实现长按功能,后面的键就异常,第二个键按下就就一直在回调不停,第三个键会瞬间回调很多次。找了半天没找出哪里有问题,希望各位大佬帮助!</p>
</li>
</ul>
看看我们这个按键扫描程序
I/O 口章节的实验5的思考:
实验5,I/O口 行列式按键扫描 大型实战,利用主循环次数去抖动
如1个按键要判断为正常按下,而不是抖动,
假定需要该按键保持按下持续保持为低状态时间是 50mS ~ 200mS;
假定1个主循环的运行时间大概 10mS ~ 30mS
则如发现某个按键按下,需要连续 6次主循环都能读到该按键按下
===如发现多个按键按下,则归0,重新开始
调整按键的灵敏度只需要修改,
===【判断按键已按下的时间,即读到为低经历了多少次主循环的次数】
Project9 实验程序 简要说明,详见附件:
1,上电P0口的8个LED闪烁3次当作开机画面,
2,接下来行列按键矩阵扫描,
A, 每扫描到一个键,蜂鸣器发不同的声音,
8个按键对应Do/Re/Mi/Fa/So/La/Si/Do,
B, 同时在电脑端的CDC串口助手中显示“KeyX被按下”
https://www.stcaimcu.com/forum.p ... id=15176&pid=150929
问题已解决,忘记回复了,搜索了一下说是8051单片机内存十分有限,没有软件堆栈,函数调用不通过堆栈来传递形参,而硬件堆栈空间也十分有限,程序里所有的局部变量以及全局变量都是编译的时候固定存储在某个地址的存储空间的,函数调用的时候就不用压栈了,函数的形参通过存储地址或者寄存器来传递。为了省内存空间,BL51/LX51链接器会对用户应用程序进行分析,生成关于函数调用关系的调用树(call tree),有些变量的地址是会覆盖的。
对于回调函数或者其他形式函数指针,调用方式是通过的函数指针调用的,不是直接调用函数本身,即间接调用,对于间接调用的函数,链接器无法识别出调用关系,函数指针他以为是一个简单的变量,因此,间接调用的函数链接器没有识别出他们的调用关系。
那么问题来了,没有调用关系的的函数局部变量可以互相覆盖,可能是回调函数里的变量覆盖了调用他的上一级函数里的变量,可能是覆盖别的函数也不一定,这样程序可能会出错。
其中一种解决方法是用OVERLAY命令对数据覆盖进行调整,如图所示。 顶一下,,不过可惜的是如果用了 NOOVERLAY命令,前面REMOVEUNUSED命令就失效了{:haqian:}
页:
[1]