单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: Similarv
收起左侧

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

  [复制链接]
回帖奖励 40 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
wifingtta 发表于 2020-1-3 08:16 | 显示全部楼层
单片机必须把程序工程化,框架化才能进一步提高。
回复

使用道具 举报

环境2019 发表于 2020-1-3 08:37 | 显示全部楼层
讲的真好,从实用角度出发,给出解决方案。
回复

使用道具 举报

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

使用道具 举报

13303022280 发表于 2020-1-7 14:29 | 显示全部楼层
Similarv 发表于 2019-6-20 13:30
789.gg_【官方首页】-新葡京澳门用静态变量去统计按键的时间,随后对此时间进行裁决。
延时只会让你的程序卡在那里一段时间,动弹不得。

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

51黑游客登陆 发表于 2020-1-11 18:07 | 显示全部楼层
这个得顶啊,老铁
回复

使用道具 举报

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

使用道具 举报

lipen2008 发表于 2020-1-12 21:05 | 显示全部楼层
789.gg_【官方首页】-新葡京澳门有种使人豁然开郎的感觉,正规化流程。
回复

使用道具 举报

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

专家讲解,学习了。
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

你的做法当然也没有问题,不过我是这么做的:
789.gg_【官方首页】-新葡京澳门按键就只是做按键检测,并且设置相应的“按键已触发”标志(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不会被重复置一,当按键释放之后,此静态变量清零,一切重新开始。


回复

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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

页面底部区域 foot.htm