收到一封网友来信,觉得比较有代表性,所以用帖子形式来回答,以扩大受益面。来信内容与下:
你好:
你所发给我的附件我已经收到了,在这里非常感谢你的帮助,在观看你的**以后让我懂得了很多在书上没有过的知识,但是我在观看别人的程序,觉得别人写得很好,自己就总是不会写,也不知该从哪里入手写起,所以我很希望能够得到你能指点我关于编程方面的心得,因为在学校里老师大部份都是按着书上照本宣科按地来告诉我们,作为学生的我们真的很难明白讲台上的老师到底在说些什么。对于一个项目,到底要怎么编,怎么写才能使程序精,短,简,而且让别人也很容易得读得懂呢?有时,我连自己编得代码都看不懂,真的很难明白为什么别人就能编写出这么好的代码出来?由其要编一些关于要LCD显示来表达的代码时就更弄不懂了!
期待你的帮助
----------------------------------------------------------------------------
下面是我的回答:
关于编程,我的观点是——会说话就会写程序。要写程序,首先要熟悉的不是单片机本身。单片机不过是个工具,就像word一样,大家不会认为会word就能成作家一样。如果要写一个LCD显示程序,就应该首先明确需要在上面显示写什么内容,这一步可以叫“应用需求分析”。
下一步是将应用需求和具体的硬件环境挂钩,比如LCD是图型化显示还是自带字库还是图文混显,接口是串口还是并口,需要多少跟控制线,单片机是否有空间存储字库。挂钩过程可能需要倒回去修改需求分析后者更改硬件,例如发现LCD的分辨率不够或者发现单片机没有足够的空间存储字库文件。
再下一步是用自然语言描述软件需要做的工作,划分软件的功能模块,例如想在LCD上显示一个图片,那么就需要LCD初始化及控制数据通讯模块,这个模块可以进一步分解为“像LCD传送一条命令”和“调用传送一条命令程序向LCD传送一组命令”两个层次,另一个平行的模块是从存储器中调出图片的点阵数据并按LCD要求的顺序送给LCD命令传送程序,这个程序可能是一个单独的模块,例如叫做lcd_draw的作图程序。
最后一步大家应该能想到了,就是体力活,用语句实现上述各功能模块并调试组装。
从上面可以看出,与单片机硬件接触的是需求分析和硬件挂钩阶段,真正需要了解语言系统进行编程的只有最后的体力活阶段。
学校的单片机教学实际上大多是一种“怪物”教学法,学生一头进入具体的单片机环境,比如51或者PIC,根本忘记了分析问题和解决问题的根本来源,很多学生学完了以后甚至认为世界上只有51或者PIC这一种单片机。
学习单片机不难,难的是回归到“分析需求”、“工程实现”的基本思路上来。所以你说看不懂人家的程序是正常的,我也经常看不懂人家的程序,特别是一些比较“标新立异”的人写出来的程序,所以我要求我的徒弟写程序时候,汇编语言的注释率不能少于80%,C语言不能少于30%,这样才能利人利己。
但是如果你说连自己写的程序也看不懂,我就表示怀疑了。这说明你在下手写程序之前,对自己到底想做什么事情一无所知,你所扮演的无非是一个打字员的角色——真的,和外面打字店里的mm没什么区别。
再拔高一个层次看问题,写程序和做工程设计的原理实际上是一样的,只有通过精心分析问题,结合已有资源才能给出最优的解决方案。
最后打个广告,在《深入浅出AVR单片机》里,我们提出了“单片机哲学”的思想,这个思想超越了一切具体的硬件和软件架构,是一种工程化的开发思想,虽然书内没有明确提出这个词,但此种思想贯穿在整个书中,对希望以后靠单片机或电子设计吃饭的初学者,我们推荐能跟着这本书做一做。 |