389

帖子

0

TA的资源

纯净的硅(高级)

41
 
原帖由 辛昕 于 2013-4-3 21:49 发表
你这话我就听不懂了,,,什么叫改成等于就去除了松手检测,,那就是真正的松手检测,,,,
别的没听懂,,
while改成if就对了,就是不能死循环,if就是对的。
反正一直在更大的循环里,其实效果一样,不过这样就 ...
怎么不是呢?改成等于之后,只要还按着按键temp&0xf0就不会等于0xf0,直接就跳出while循环了
  1. temp=temp&0xf0;
  2.                         while(temp==0xf0)                         //松手检测,
  3.                         {
  4.                                 temp=P3;
  5.                                 temp=temp&0xf0;
  6.                         }
复制代码
还没松手就已经进入下一根扫描线的判断,难道不是去除了松手检测么?
此帖出自51单片机论坛
 

回复

389

帖子

0

TA的资源

纯净的硅(高级)

42
 
原帖由 辛昕 于 2013-4-3 21:58 发表
亮了就对了。
亮了意味着程序更多的时间正常地分配在数码管显示上
这个事情呢,告诉我们两件事,现在知道while等待有多恶劣了吧,把程序卡的死死的。
另一个事情,有时其实是程序写的不对,却认为是硬件问题,这 ...

嗯,这话说的有道理,不过我怎么感觉看的时候,前面一种还舒服一些呢?
呵呵,这是个人感觉而已。
程序的时间始终不能完全的分配到数码管显示上,只要存在松手检测,那么就有必要在松手前将
程序停在扫描程序中。势必会分走显示程序的一段时间。
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

43
 
说程序写错了,意思不只是语法错误或者逻辑错误,还包括了从一开始实现方法或者思路就错了。

你的想法本身是有错误的。

其实任何过程都可以做成分步完成的,包括 等待按键松开 这个动作并不需要程序里停下来等待。

给你一个思路,要检测松手,按键才有效,我并不需要死在哪里等待松开,我只要在检测到按键按下后值起一个标志,然后检测到按键松开时,一并检测这个标志,就可以实现 按下并松手的判断了。

每次都只是if而非while
推而广之,任何动作判断都一样,你不能在一个地方傻等,你要接着往前走,做其他动作,然后定时循环来检查这个事情再加上从前的状态综合判断即可。

一个很简单的例子,你很口渴,煮开水,这大致需要十来分钟,你不会一直在开水跟前等着水来吧?
你可以去做任何事,只要时不时回头看看开了没就成——当然,现在的水壶都挺先进的,自动关电。
此帖出自51单片机论坛

点评

哦,原来是我的实现方法错了,在检测松手的时候直接让CPU在哪里傻等 确实是得不偿失,可以通过你说的并行处理机制提高CPU的利用率 总结一下辛哥的发言: 1.任何过程都可以做成分步完成的,当分步到足够小时就可看  详情 回复 发表于 2013-4-4 19:39
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

44
 
while那种写法好看,这话不错,的确如此,为何?因为你只要关心条件是否满足,程序要么停在这里,要么继续往下走,标准串行程序,顺序执行。
而我所教你的写法会导致你慢慢写出并行程序。
我有过一段时间,大量使用并行程序,把所有动作拆成可打断过程,为的是程序可以同时处理许多动作,使程序非常灵活。

但后来我也尝到了苦果,并行程序需要面对多线程类似的麻烦,在并行程序中要小心数据的读写冲突以及更复杂的状态机设计。

但是,这不代表这种思路要不得,因为有时候它可以灵活处理很多事情,提高系统的响应速度和吞吐量,只是要斟酌到底需要不需要。

一般而言,在一个程序里,读键和显示必不可少,而且它们是属于 极其低速的外设,人的视觉和动作和几m的cpu相比,自然是极其慢,所以,这两块一般都做成这种可分步执行的函数,然后放在不间断的定时中断或者主循环中反复调用
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

45
 
再说一点。
我说的 串行程序 并行程序 多线程 这些概念,与那些狭义的,比方说只有操作系统自己实现了线程机制的多线程 还有现在常指多核cpu的并行程序设计 是两回事。
但它们具有一样的内涵。
单片机里我们使用中断程序,可以认为是一种简单的粗糙的多线程实现机制,假设一下,如果你开启一个定时中断,十毫秒一个周期,每次中断,就切换一个任务号,然后在主程序里,把所有程序要做的事分成一个个编号的任务段,主程序里是一个switch case,按顺序号切换执行,那这就可以说是一个最基本的时间片轮询系统了。

同样的,我说的串行并行也如此。
串行是cpu一件事一件事往下做,循规蹈矩。并行是这件事做几步,换做另一件事,然后反复,这种手法是为了最大限度利用cpu的速度,试想一秒钟可以动作几百万次的操作器,为了等待延迟,消抖,白白在那傻等,岂不是浪费!
这实际上和多个cpu同时处理几件事的效果是类似的。
此帖出自51单片机论坛
 
 
 

回复

389

帖子

0

TA的资源

纯净的硅(高级)

46
 

回复 43楼 辛昕 的帖子

哦,原来是我的实现方法错了,在检测松手的时候直接让CPU在哪里傻等
确实是得不偿失,可以通过你说的并行处理机制提高CPU的利用率
总结一下辛哥的发言:
1.任何过程都可以做成分步完成的,当分步到足够小时就可看成程序的并行执行
这样可以灵活处理很多事情,提高系统的响应速度和吞吐量。
2.并行与串行各有各的优点,关键在于你所针对的具体事件,对于键盘这种操作
时间远大于CPU执行时间的器件,使用并行更为高效。
3.对于串行程序 并行程序 多线程这些概念可以引申到单片机上,所谓只可意会,
不可言传,打的就是如此罢!

多谢辛哥的耐心回复
真心多谢了!呵呵
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

47
 
不客气,慢慢玩吧~
写完后,把代码贴出来,大家一起瞧瞧,我就偷偷懒,不用整理程序……
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表