找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: Similarv
收起左侧

请工程化,定制化你的单片机代码

    [复制链接]
回帖奖励 40 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
ID:668298 发表于 2020-1-3 08:37 | 显示全部楼层
讲的真好,从实用角度出发,给出解决方案。
回复

使用道具 举报

ID:682611 发表于 2020-1-7 08:50 | 显示全部楼层
说到的东西非常有用
回复

使用道具 举报

ID:553941 发表于 2020-1-7 14:29 | 显示全部楼层
Similarv 发表于 2019-6-20 13:30
用静态变量去统计按键的时间,随后对此时间进行裁决。
延时只会让你的程序卡在那里一段时间,动弹不得。

如果我只需要执行一次按键之后的程序,为了避免按键长按导致的重复运行,就用一个变量,在每次进入中断检测到这个按键按下的时候加一,然后判断这个变量的值,必须在要求的范围内才执行,这样是不是就能解决按键消抖和长按的问题了
回复

使用道具 举报

ID:195830 发表于 2020-1-7 15:01 | 显示全部楼层
绝世好帖!
回复

使用道具 举报

ID:283883 发表于 2020-1-7 18:48 | 显示全部楼层
很好,谢谢分享
回复

使用道具 举报

ID:636210 发表于 2020-1-8 08:57 | 显示全部楼层
很牛的分析
回复

使用道具 举报

ID:323102 发表于 2020-1-8 14:50 | 显示全部楼层
可不可以把文档资料发上来?
回复

使用道具 举报

ID:682588 发表于 2020-1-9 15:49 | 显示全部楼层
在按键处理过程中,使用状态机控制可以释放CPU的资源
回复

使用道具 举报

ID:108573 发表于 2020-1-11 10:04 | 显示全部楼层
绝世好贴,就是不知道PDF文档发在哪了?
回复

使用道具 举报

ID:590770 发表于 2020-1-11 18:07 | 显示全部楼层
这个得顶啊,老铁
回复

使用道具 举报

ID:488782 发表于 2020-1-11 23:53 | 显示全部楼层
豁然开朗啊
回复

使用道具 举报

ID:77675 发表于 2020-1-12 21:05 | 显示全部楼层
有种使人豁然开郎的感觉,正规化流程。
回复

使用道具 举报

ID:59168 发表于 2020-1-12 23:40 | 显示全部楼层

专家讲解,学习了。
回复

使用道具 举报

ID:599678 发表于 2020-1-13 09:20 | 显示全部楼层
这种针对代码量小的项目实时性没有问题。但代码量大的整个程序架构就会显得臃肿,也需针对同一个事情,在主函数中不同时基处都要处理。比较好的做法是把定时器做成指针回调,需要一个定时器,就定义一个变量,通过注册函数把地址给底层函数,应用层看只是申明一个变量,并且通过注册函数给个地址,底层看只是检测到该地址有效,然后定时加1加到最大(不溢出)。两层分开各自管理方便维护。
回复

使用道具 举报

ID:130230 发表于 2020-1-13 09:34 | 显示全部楼层
先别照抄别人的,给个思路。定时器中断+flg+状态机实现一个阻塞式的时间片程序结构。。。自己试一下不难的在看这篇文章。
回复

使用道具 举报

ID:476527 发表于 2020-1-13 16:52 | 显示全部楼层
本帖最后由 Similarv 于 2020-1-13 18:07 编辑
13303022280 发表于 2020-1-7 14:29
如果我只需要执行一次按键之后的程序,为了避免按键长按导致的重复运行,就用一个变量,在每次进入中断检 ...

你的做法当然也没有问题,不过我是这么做的:
按键就只是做按键检测,并且设置相应的“按键已触发”标志(bit变量);至于按键的功能则是在别处比如状态机中去执行。
例子:当按键按下之后开/关灯

key.c 文件:
bit key_flag_light;  //当按键触发时为1,否则为0, 此变量是给状态机使用的
static bit key_press_light; //当按键按下时为1,未按下为0,此变量仅在key.c内使用。
函数1-keyScan()  -- 功能:检测按键是否按下,若按键按下则将key_press_light置一,否则清零。
函数2-keyDeal()   -- 功能:使用某静态变量统计key_press_light的时间;当key_press_light从1变为0的时候,检查静态变量的值是否大于消抖值,若大于消抖时间则将key_flag_light设置为1;

state.c文件
函数1-StateMachine() -- 功能:当key_flag_light==1时,取反led_flag_out的值,随后将key_flag_light设置为0.

led.c文件
bit led_flag_out; //当该值==1,开灯;当该值==0;关灯
函数1-ledOutput() -- 功能:根据led_flag_out的取值开灯或者关灯

main.c文件
在10ms或者20ms的时基中依次调用
keyScan();
keyDeal();
StateMachine();
在100ms的时基中调用
ledOutput();

/******/
稍微修改一下,刚刚没有认真审题,你需要做长按的判定,我这个架构是基于短按的。
修改的地方位于keyDeal()部分,
短按 —— 是等待按键松开时裁决静态变量的计时值。
长按 —— 则是直接在静态变量等于‘长按时间点’的时刻将key_flag_light置一即可。key_flag_light==1的时候,状态机自然会处理长按事件,此后keyDeal()里的静态变量会在按键继续按着的时候继续加,但其值已经‘大于’‘长按时间点’了,所以key_flag_light不会被重复置一,当按键释放之后,此静态变量清零,一切重新开始。


回复

使用道具 举报

ID:476527 发表于 2020-1-13 17:46 | 显示全部楼层
hubj627 发表于 2020-1-13 09:20
这种针对代码量小的项目实时性没有问题。但代码量大的整个程序架构就会显得臃肿,也需针对同一个事情,在主 ...

进阶教程尚待坛友们自己修行,鄙人不才,只能带路到这了
回复

使用道具 举报

ID:108573 发表于 2020-1-13 22:21 | 显示全部楼层
Similarv 发表于 2020-1-13 17:46
进阶教程尚待坛友们自己修行,鄙人不才,只能带路到这了

楼主是否在其他帖子发布了PDF及源码?想下载先来,没事多看看,望回复
回复

使用道具 举报

ID:476527 发表于 2020-1-14 09:11 | 显示全部楼层
神出没 发表于 2020-1-13 22:21
楼主是否在其他帖子发布了PDF及源码?想下载先来,没事多看看,望回复

暂时还没有别的文章,此文独此一份,有没有盗贴我就不清楚了
回复

使用道具 举报

ID:685918 发表于 2020-1-14 09:47 | 显示全部楼层
多谢楼主分享
回复

使用道具 举报

ID:59151 发表于 2020-1-18 00:24 | 显示全部楼层
很好的文章,不止内容好,就连写的文章都是那么文理清晰,有可能文章写得好的人写单片机代码都是特别清晰的,因为作者的思路太棒了
回复

使用道具 举报

ID:661513 发表于 2020-1-21 16:33 来自手机 | 显示全部楼层
写的真好,对定时器有了更深的理解
回复

使用道具 举报

ID:615823 发表于 2020-1-23 17:56 | 显示全部楼层

学习了 非常好 期待后续
回复

使用道具 举报

ID:544092 发表于 2020-1-26 12:06 | 显示全部楼层
shenyuqiu 发表于 2019-8-10 10:38
楼主这文章比那些所谓的教科书好多了,那些教科书按键消抖动不动就是delay(20ms),真是误人子弟,真正出来 ...

回想一下自己在刚开始学的时候是什么样子,你是明白了单片机编程,回头说教科书烂。教科书是面向初学者的,目的是引人入门。初学者,你给他讲状态机编程,他能搞明白?搞不明白不说,反而会打击学习兴趣。这些东西在初学的时候都不重要,重点关注单片机本身的基本功能和应用,等有一定的知识和经验之后,在来学这些也不迟。
回复

使用道具 举报

ID:117930 发表于 2020-1-27 00:33 | 显示全部楼层
对于我等初学者来说 确实有很大的启示  谢谢
回复

使用道具 举报

ID:68468 发表于 2020-1-28 23:09 | 显示全部楼层
好贴,顶楼主!
回复

使用道具 举报

ID:494559 发表于 2020-1-30 12:44 | 显示全部楼层

很好的文章,请继续。感谢!
回复

使用道具 举报

ID:76606 发表于 2020-3-13 22:34 | 显示全部楼层
好文章 要分享
回复

使用道具 举报

ID:413383 发表于 2020-3-14 00:18 | 显示全部楼层
不错的文章,希望有后续
回复

使用道具 举报

ID:692599 发表于 2020-3-14 10:50 | 显示全部楼层
很不错的文章,楼主的这个按键程序应该是按键弹起后才响应的吧
回复

使用道具 举报

ID:542948 发表于 2020-3-14 16:53 | 显示全部楼层

看完受益匪浅,希望有后续
回复

使用道具 举报

ID:258004 发表于 2020-3-14 19:51 | 显示全部楼层
学习了。留个记号。触类旁通。其他语言也同样。
回复

使用道具 举报

ID:695749 发表于 2020-3-14 22:48 | 显示全部楼层
理念在不断的突破,再次学习,受益中,谢谢分享!
回复

使用道具 举报

ID:585390 发表于 2020-3-16 17:02 | 显示全部楼层
点赞,谢谢分享,学习一下
回复

使用道具 举报

ID:709387 发表于 2020-3-16 17:58 | 显示全部楼层
感谢感谢    学习了
回复

使用道具 举报

ID:709685 发表于 2020-3-16 20:28 | 显示全部楼层
作为新手的我想了解更多。
回复

使用道具 举报

ID:707109 发表于 2020-3-16 21:11 | 显示全部楼层
非常喜欢,希望有后续
回复

使用道具 举报

ID:21545 发表于 2020-3-16 21:43 | 显示全部楼层
学习了,谢谢!!!
回复

使用道具 举报

ID:705241 发表于 2020-8-20 17:27 | 显示全部楼层
讲的好,有收获啊
回复

使用道具 举报

ID:813486 发表于 2020-8-22 10:27 | 显示全部楼层
受益匪浅
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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