感觉现在每一天写的程序都在增加难度,或者是因为我太心急,书中的一些过渡程序我觉得太简单就只看书上的例程,理解后没有亲自在电脑上调试,结果编写进阶的程序就感觉很困难了。所以以后要一个一个程序慢慢递进,不能太心急了。
今天这个程序是在昨天按键控制led灯的基础上改为按键控制数码管了,要实现按一个键数码管显示的数字加一,按另一个键数码管的数字减一。虽然这个功能简单,但实现起来却很复杂。我调试了一个小时还找不出错误,最后还是打开书本参考了一下例程才豁然开朗。
调试记录:
(1)程序中的,inc count语句我第一次写的时候把它调到去process子程序中,结果是没有任何操作的时候,数码管不断自加,debug的时候程序卡住了,连keil软件都无反应,只好用Ctrl+alt+del强制关闭。原因是按照我的主程序,无论按键处理后收到高电平还是低电平,都会执行放在process中的inc count。也就是不断自加。实验失败。所以以后收集到信息后要第一时间处理,或用内存空间来记录,否则错了还找不出来。
(2)
书中已指出的可能会出现的错误,即自加的数据超过99,和为负数的时候会溢出,我设置了一个判断,对数据为99时再加1已不再处理,为0时再减1也不再理会,停在99或0的位置。
(3)
如果按照之前控制led灯的程序照抄的话会出现按下键不释放的话数码管会熄灭,于是在不断循环检测按键释放的指令之前,也循环call display,即数码管循环输出原来的数字,保证看起来数码管没有熄灭。
最大的收获:
写这个程序我最大的收获不只是调试的经验,还有一点模块化编程的意识,最后算是比较深刻地区分sjmp和ret的关系吧,感觉汇编的跳转很容易让人头痛,c语言的逻辑性似乎看起来要清晰很多。
附代码如下 :