引言
在随着金善愚老师学习单片机时,在学习单片机应用之独立按键的应用基于底层程序模块的应用层程序开发时遇到一个BUG,在评论区也有人提出
虽然有解决方案,但截至本人写稿前,未曾见有人搞清楚此问题来源,现将本人调试过程记录如下
发现问题
跟着老师一步步做
到此出现问题,上图是老师的图,下面贴出我的图
数码管根本就没亮
问题所在
就如同评论区所说,把Display函数里面的变量 i定义成静态变量static就行了,但这并不能搞清楚问题,所以本人进行了一番调试
可以看到第一次进入DIsplay函数后,i变成1出来,这是符合我们的程序设计的
继续调试,当再次进入DIsplay函数,你会发现i变成0了
按照我们的构想,此时的i应该还是1才对,故出现BUG。
那么,为什么i会变成0?我们看一下,keil分配给i的内存位置,将鼠标放在i上,可以看到i(D:0x0C)= 0x00,即i在D:0x0C
在memory中,如下图的位置可以看到此位置的值
在Display函数中,i再次+1
进入Key.c后,执行完unsigned char KeyNum = 0;
,d:0x0c的值变为0
将鼠标放在变量KeyNum上可以看到,分配的位置也是d:0x0c
至此,问题已经清晰了,keil分配给i和KeyNum的内存位置是同一个,故每次执行Key_Scan函数时,都会被unsigned char KeyNum = 0;
重新赋0。