打印

关于新手如何编写程序

[复制链接]
23882|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
NE5532|  楼主 | 2010-4-11 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
收到一封网友来信,觉得比较有代表性,所以用帖子形式来回答,以扩大受益面。来信内容与下:

你好:
     你所发给我的附件我已经收到了,在这里非常感谢你的帮助,在观看你的**以后让我懂得了很多在书上没有过的知识,但是我在观看别人的程序,觉得别人写得很好,自己就总是不会写,也不知该从哪里入手写起,所以我很希望能够得到你能指点我关于编程方面的心得,因为在学校里老师大部份都是按着书上照本宣科按地来告诉我们,作为学生的我们真的很难明白讲台上的老师到底在说些什么。对于一个项目,到底要怎么编,怎么写才能使程序精,短,简,而且让别人也很容易得读得懂呢?有时,我连自己编得代码都看不懂,真的很难明白为什么别人就能编写出这么好的代码出来?由其要编一些关于要LCD显示来表达的代码时就更弄不懂了!
    期待你的帮助

----------------------------------------------------------------------------

     下面是我的回答:

     关于编程,我的观点是——会说话就会写程序。要写程序,首先要熟悉的不是单片机本身。单片机不过是个工具,就像word一样,大家不会认为会word就能成作家一样。如果要写一个LCD显示程序,就应该首先明确需要在上面显示写什么内容,这一步可以叫“应用需求分析”。
    下一步是将应用需求和具体的硬件环境挂钩,比如LCD是图型化显示还是自带字库还是图文混显,接口是串口还是并口,需要多少跟控制线,单片机是否有空间存储字库。挂钩过程可能需要倒回去修改需求分析后者更改硬件,例如发现LCD的分辨率不够或者发现单片机没有足够的空间存储字库文件。
    再下一步是用自然语言描述软件需要做的工作,划分软件的功能模块,例如想在LCD上显示一个图片,那么就需要LCD初始化及控制数据通讯模块,这个模块可以进一步分解为“像LCD传送一条命令”和“调用传送一条命令程序向LCD传送一组命令”两个层次,另一个平行的模块是从存储器中调出图片的点阵数据并按LCD要求的顺序送给LCD命令传送程序,这个程序可能是一个单独的模块,例如叫做lcd_draw的作图程序。
     最后一步大家应该能想到了,就是体力活,用语句实现上述各功能模块并调试组装。

     从上面可以看出,与单片机硬件接触的是需求分析和硬件挂钩阶段,真正需要了解语言系统进行编程的只有最后的体力活阶段。
     学校的单片机教学实际上大多是一种“怪物”教学法,学生一头进入具体的单片机环境,比如51或者PIC,根本忘记了分析问题和解决问题的根本来源,很多学生学完了以后甚至认为世界上只有51或者PIC这一种单片机。
     学习单片机不难,难的是回归到“分析需求”、“工程实现”的基本思路上来。所以你说看不懂人家的程序是正常的,我也经常看不懂人家的程序,特别是一些比较“标新立异”的人写出来的程序,所以我要求我的徒弟写程序时候,汇编语言的注释率不能少于80%,C语言不能少于30%,这样才能利人利己。
     但是如果你说连自己写的程序也看不懂,我就表示怀疑了。这说明你在下手写程序之前,对自己到底想做什么事情一无所知,你所扮演的无非是一个打字员的角色——真的,和外面打字店里的mm没什么区别。
     再拔高一个层次看问题,写程序和做工程设计的原理实际上是一样的,只有通过精心分析问题,结合已有资源才能给出最优的解决方案。

     最后打个广告,在《深入浅出AVR单片机》里,我们提出了“单片机哲学”的思想,这个思想超越了一切具体的硬件和软件架构,是一种工程化的开发思想,虽然书内没有明确提出这个词,但此种思想贯穿在整个书中,对希望以后靠单片机或电子设计吃饭的初学者,我们推荐能跟着这本书做一做。

相关帖子

沙发
一大堆草| | 2010-4-11 13:37 | 只看该作者
对于一个项目,到底要怎么编,怎么写才能使程序精,短,简,而且让别人也很容易得读得懂呢?
这个问题!不是这本书就能回答的,LZ的回答也不能算是针对这个问题。因为这个问题可以说成是“软件架构”或“程序架构”的问题!而这个问题,没有一定的功底是理解不了的!LZ说书上也有“软件架构”的思想,我想提到的也不多吧,而且对于一个初学者,谈“软件架构”就有点早了。怎么样的情况下谈“软件架构”呢?我认为:首先你要会编程,不会编的就照抄人家的程序,直到你慢慢理解,慢慢会编写自己的程序。编写程序,初级阶段是争取每个基本功能自己都能够编得出来,当你认为你很会编写了。就找人给你出题,出任务。第一次完成人家提出的任务,我想:即使你能完成了,也是需要一段时间的。如此,当你能完成人家给你出的各种任务,那么,这叫做“入门”了。这时候也许你会有点自大,想象自己什么功能都会编,真简单!但是,当你拿自己写的程序和别的高手比较时,你会发现:自己写的程序很乱,很丑,代码多----等等。这时,你会慢慢考虑程序的质量和效率的问题了。同时,你也开始接手一些复杂的大的项目了。你会发现,也许你也能完成项目,但是所需要的时间很长,编写的程序很大,很乱--------慢慢的,你会考虑去找“高手”了。也许你现在最常做的是看人家怎么写程序的,结构怎么样?(你不会去看具体的功能的)-------到了此时,也许你还会学别的“高手”去完成那么一两个项目,等你有经验了,那么,你也算“高手”了。此时,你虽然有自己的“软件架构”了,但是那是从人家那里得来的!高傲的你也许认为,这个“软件架构”还不是很完美,你也许会去参看很多程序架构这方面的书籍了。所以说,初学者,考虑软件架构的还是太早了。

使用特权

评论回复
板凳
一大堆草| | 2010-4-11 13:41 | 只看该作者
我也是一根草,正在考虑程序架构的问题,如果回答的不好,希望各位不要责怪,你有好的思想,请说出来,大家交流交流。

使用特权

评论回复
地板
NE5532|  楼主 | 2010-4-11 15:39 | 只看该作者
2楼稍微有一点理解偏了。应该说我从来就不承认单片机上存在着“软件”这种东西,单片机软件实际是紧密围绕硬件进行服务的,当然在平台上做应用的除外。可以这样简单来分,如果一个写程序的人对什么是寄存器很茫然,他就是写软件的;如果很了然,他可能是做硬件的。为什么说可能呢?因为做单片机硬件不但要会敲代码,还要会设计电路,会焊板子,懂工艺流程,甚至还要懂市场需求分析。

所以我给他回的信,不是要他学会如何写程序,而是教他学会去当一个工程师而不是一个代码民工。要真正具备工程的能力,我自己都还只是初出茅庐,要想一本书把他介绍完,是不可能的。

在书店里你只能找到所谓“软件方法”的书,却找不到“硬件方法”的书,因为该书重量达数顿,不便生产和销售,哈哈!!

使用特权

评论回复
5
一大堆草| | 2010-4-11 18:48 | 只看该作者
LZ不承认单片机有软件?晕----------

对单片机寄存器都不熟悉还谈什么软件编程,看玩笑吧楼主

问题是什么就回答什么。只是实事论事,望LZ勿怪,人家问项目编程,你回答硬件问题,好像不着边。

使用特权

评论回复
6
NE5532|  楼主 | 2010-4-11 19:38 | 只看该作者
说都可以说啦,我只是站在一个Project Manager的角度来谈问题罢了。

使用特权

评论回复
7
nathenlu| | 2010-4-11 23:10 | 只看该作者
楼主对单片机的硬件及其工作原理不够熟悉

使用特权

评论回复
8
NE5532|  楼主 | 2010-4-12 19:52 | 只看该作者
我的妈呀,匠人大叔来看看吧,我已经寒死了。

使用特权

评论回复
9
yoke22| | 2010-4-12 22:04 | 只看该作者
这个吗   ....

使用特权

评论回复
10
lxyppc| | 2010-4-13 09:50 | 只看该作者
我的妈呀,匠人大叔来看看吧,我已经寒死了。
NE5532 发表于 2010-4-12 19:52

呵呵,不用寒了
有的人痴迷叶脉的纹路,有的人向往森林的葱郁
有的人是Coder,有的人是Manager
层次不同,不分贵贱

使用特权

评论回复
11
john_light| | 2010-4-13 11:48 | 只看该作者
模块化编程是入门第一步……

使用特权

评论回复
12
cclgxuanshao| | 2013-5-16 14:53 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:††††看NE5532教学视频,炼就工程技术研发功力†††††††††† 《跟我学DC-DC电源管理技术》【从只会写软件成长为软硬兼施】 《印刷电路板设计进阶》【12年一线设计经验大放送】 《印刷电路板设计基础》【新手别怕,老工程师带你入门!】

159

主题

13769

帖子

586

粉丝