单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
上一页
5/13
下一页
楼主: Similarv
打印上一主题下一主题

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

  [复制链接]
回帖奖励40 黑币
回复本帖可获得 2 黑币奖励! 每人限 1 次
161#
ID:668298发表于 2020-1-3 08:37|只看该作者
讲的真好,从实用角度出发,给出解决方案。
162#
ID:682611发表于 2020-1-7 08:50|只看该作者
说到的东西非常有用
163#
ID:553941发表于 2020-1-7 14:29|只看该作者
Similarv 发表于 2019-6-20 13:30
用静态变量去统计按键的时间,随后对此时间进行裁决。
延时只会让你的程序卡在那里一段时间,动弹不得。

如果我只需要执行一次按键之后的程序,为了避免按键长按导致的重复运行,就用一个变量,在每次进入中断检测到这个按键按下的时候加一,然后判断这个变量的值,必须在要求的范围内才执行,这样是不是就能解决按键消抖和长按的问题了
164#
ID:195830发表于 2020-1-7 15:01|只看该作者
绝世好帖!
165#
ID:283883发表于 2020-1-7 18:48|只看该作者
很好,谢谢分享
166#
ID:636210发表于 2020-1-8 08:57|只看该作者
很牛的分析
167#
ID:323102发表于 2020-1-8 14:50|只看该作者
可不可以把文档资料发上来?
168#
ID:682588发表于 2020-1-9 15:49|只看该作者
在按键处理过程中,使用状态机控制可以释放CPU的资源
169#
ID:108573发表于 2020-1-11 10:04|只看该作者
绝世好贴,就是不知道PDF文档发在哪了?
170#
ID:590770发表于 2020-1-11 18:07|只看该作者
这个得顶啊,老铁
171#
ID:488782发表于 2020-1-11 23:53|只看该作者
豁然开朗啊
172#
ID:77675发表于 2020-1-12 21:05|只看该作者
有种使人豁然开郎的感觉,正规化流程。
173#
ID:59168发表于 2020-1-12 23:40|只看该作者

专家讲解,学习了。
174#
ID:599678发表于 2020-1-13 09:20|只看该作者
这种针对代码量小的项目实时性没有问题。但代码量大的整个程序架构就会显得臃肿,也需针对同一个事情,在主函数中不同时基处都要处理。比较好的做法是把定时器做成指针回调,需要一个定时器,就定义一个变量,通过注册函数把地址给底层函数,应用层看只是申明一个变量,并且通过注册函数给个地址,底层看只是检测到该地址有效,然后定时加1加到最大(不溢出)。两层分开各自管理方便维护。
175#
ID:130230发表于 2020-1-13 09:34|只看该作者
先别照抄别人的,给个思路。定时器中断+flg+状态机实现一个阻塞式的时间片程序结构。。。自己试一下不难的在看这篇文章。
176#
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不会被重复置一,当按键释放之后,此静态变量清零,一切重新开始。


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

进阶教程尚待坛友们自己修行,鄙人不才,只能带路到这了
178#
ID:108573发表于 2020-1-13 22:21|只看该作者
Similarv 发表于 2020-1-13 17:46
进阶教程尚待坛友们自己修行,鄙人不才,只能带路到这了

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

暂时还没有别的文章,此文独此一份,有没有盗贴我就不清楚了
180#
ID:685918发表于 2020-1-14 09:47|只看该作者
多谢楼主分享
181#
ID:59151发表于 2020-1-18 00:24|只看该作者
很好的文章,不止内容好,就连写的文章都是那么文理清晰,有可能文章写得好的人写单片机代码都是特别清晰的,因为作者的思路太棒了
182#
ID:661513发表于 2020-1-21 16:33来自手机|只看该作者
写的真好,对定时器有了更深的理解
183#
ID:615823发表于 2020-1-23 17:56|只看该作者

学习了 非常好 期待后续
184#
ID:544092发表于 2020-1-26 12:06|只看该作者
shenyuqiu 发表于 2019-8-10 10:38
楼主这文章比那些所谓的教科书好多了,那些教科书按键消抖动不动就是delay(20ms),真是误人子弟,真正出来 ...

回想一下自己在刚开始学的时候是什么样子,你是明白了单片机编程,回头说教科书烂。教科书是面向初学者的,目的是引人入门。初学者,你给他讲状态机编程,他能搞明白?搞不明白不说,反而会打击学习兴趣。这些东西在初学的时候都不重要,重点关注单片机本身的基本功能和应用,等有一定的知识和经验之后,在来学这些也不迟。
185#
ID:117930发表于 2020-1-27 00:33|只看该作者
对于我等初学者来说 确实有很大的启示  谢谢
186#
ID:68468发表于 2020-1-28 23:09|只看该作者
好贴,顶楼主!
187#
ID:494559发表于 2020-1-30 12:44|只看该作者

很好的文章,请继续。感谢!
188#
ID:76606发表于 2020-3-13 22:34|只看该作者
好文章 要分享
189#
ID:413383发表于 2020-3-14 00:18|只看该作者
不错的文章,希望有后续
190#
ID:692599发表于 2020-3-14 10:50|只看该作者
很不错的文章,楼主的这个按键程序应该是按键弹起后才响应的吧
191#
ID:542948发表于 2020-3-14 16:53|只看该作者

看完受益匪浅,希望有后续
192#
ID:258004发表于 2020-3-14 19:51|只看该作者
学习了。留个记号。触类旁通。其他语言也同样。
193#
ID:695749发表于 2020-3-14 22:48|只看该作者
理念在不断的突破,再次学习,受益中,谢谢分享!
194#
ID:585390发表于 2020-3-16 17:02|只看该作者
点赞,谢谢分享,学习一下
195#
ID:709387发表于 2020-3-16 17:58|只看该作者
感谢感谢   学习了
196#
ID:709685发表于 2020-3-16 20:28|只看该作者
作为新手的我想了解更多。
197#
ID:707109发表于 2020-3-16 21:11|只看该作者
非常喜欢,希望有后续
198#
ID:21545发表于 2020-3-16 21:43|只看该作者
学习了,谢谢!!!
199#
ID:705241发表于 2020-8-20 17:27|只看该作者
讲的好,有收获啊
200#
ID:813486发表于 2020-8-22 10:27|只看该作者
受益匪浅

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

Powered by 单片机教程网