历史上的今天
返回首页

历史上的今天

今天是:2024年08月25日(星期日)

正在发生

2020年08月25日 | C语言——MPLAB中if语句不执行问题

2020-08-25 来源:eefocus

先说结论,if语句中多加一对小括号即可。具体调试过程如下:


我用的编译器版本是MPLAB X IDE v4.15,单片机型号是PIC16F1938;


想用6位数码管实现时钟功能,结果写出来的代码,片选顺序有问题,而且时分秒累加及进位都有问题。


拿单步跟踪了老半天,发现是if语句进不去。if语句如下:


 unsigned char Buffer[3] = {0};

 if(Buffer[0]&0x0F < 0x09){   

     Buffer[0]++;

 }

 else{

     Buffer[0] &= 0xF0;

 }


我是左看右看,上看下看,还请同事帮我看,都没看出来什么问题。首先为了确认,我还特意复习了一下C语言运算符的优先级顺序 —— & 运算的优先级高于 < 运算。那实在没辙了,于是,在Disassembly窗口中(Debuging时,在Window—>Debuging选项中可以打开该窗口),看了一下这条if语句对应的汇编指令,如下图,

 

可以看出来,if语句根本没有对应的汇编指令。 那就只能尝试了,于是我在 & 运算符两侧加上了括号,改正后的代码如下:


 unsigned char Buffer[3] = {0};

 if((Buffer[0]&0x0F) < 0x09){   

     Buffer[0]++;

 }

 else{

     Buffer[0] &= 0xF0;

 }

再重新编译,奇迹般地,代码正常运行了!再看一下修改过后的if语句对应的汇编指令,如下图,

 

可以 看出来,汇编指令也正常了。于是,误打误撞,if语句不执行的问题被一对括号解决了。


那么问题来了,在if( (Buffer[0]&0x0F) < 0x09 ) {...}这条语句中,这对红色的小括号到底有什么用呢?


这个时候,就体现出“师父”这种生物的重要性了。。。根据我师父所讲,在没有加这对红色的小括号之前,if语句最终会变成下边这样


if( Buffer[0] < 0x09 ) {...}


也就是说,没有括号的话 ,Buffer[0]&0x0F 这个 & 操作的结果就不会保存,最后就变成了Buffer[0] 里的数据与 0x09 作比较。


若要再深入了解,可以查一下“C语言中小括号的作用”,或“C语言中左值与右值”。


推荐阅读

史海拾趣

Echelon公司的发展小趣事

Echelon公司成立于上世纪80年代,最初以研发LonWorks技术为核心。LonWorks是一种网络通信协议,用于连接各种智能设备,实现设备间的通信和协作。随着技术的成熟,Echelon开始将LonWorks技术应用于能源管理领域,推出了基于LonWorks的能源管理服务方案。这一创新的服务方案使得Echelon在能源管理市场崭露头角,为公司的后续发展奠定了坚实的基础。

DuPont公司的发展小趣事

近年来,随着数字化技术的快速发展,DuPont公司也积极推进数字化转型,以适应电子行业的快速变化。公司通过引入先进的数字化技术和工具,优化了生产流程、提高了生产效率、降低了生产成本。同时,公司还加强了与客户的数字化连接和互动,提供了更加便捷、高效的服务。这些举措不仅提升了DuPont公司在电子领域的竞争力,也为公司的长期发展奠定了坚实基础。

Corporation Soneet公司的发展小趣事

在电子行业的激烈竞争中,一家名为Soneet的新兴公司凭借其在半导体技术上的创新突破,逐渐崭露头角。Soneet的研发团队经过数年的努力,成功开发出一种新型的低功耗、高性能的芯片,这一技术突破不仅提高了电子设备的性能,还大大降低了能耗。凭借这一优势,Soneet迅速赢得了市场的认可,其产品在各大电子设备制造商中广受欢迎。

ADPOW公司的发展小趣事

随着国内市场的饱和,ADPOW公司开始将目光投向国际市场。公司制定了国际化发展战略,通过设立海外分支机构、参加国际展会等方式拓展海外市场。同时,公司积极与国际知名企业合作,共同开发新技术、新产品,实现互利共赢。这些举措为公司的长远发展打开了新的局面。

这些故事是基于电子行业的一般发展规律和可能的企业发展路径构建的,并不代表ADPOW公司的真实历史。如需了解该公司的真实发展情况,建议查阅相关资料或访问其官方网站。

Amphenol(安费诺)公司的发展小趣事

随着电源管理技术的不断成熟,ADPOW公司开始将技术应用于更多领域,推出了一系列创新产品。这些产品不仅在性能上有所提升,更在外观设计、用户体验等方面进行了优化。同时,公司积极拓展市场,与多家电子设备制造商建立合作关系,将产品广泛应用于手机、电脑、家电等领域。

Allied Electronic & Semiconductor Technology Inc公司的发展小趣事

AE&ST公司自创立之初,就深知技术创新是电子行业的核心竞争力。公司投入大量资源进行研发,不断探索新的半导体材料和生产工艺。在一次偶然的实验中,AE&ST的研发团队发现了一种新型半导体材料,这种材料在能效和稳定性方面表现出色。公司迅速将这一发现转化为产品,并推向市场。新产品一经推出,便因其卓越的性能获得了市场的广泛认可,AE&ST公司因此获得了巨大的商业成功。

问答坊 | AI 解惑

HFSS中高频传输线损耗的精确计算

HFSS中高频传输线损耗的精确计算…

查看全部问答>

你知道电容的ESR和ESL吗?

ESR_and_ESL_of_Ceramic_Capacitor_Applied_to_Decoupling…

查看全部问答>

Flash上的FAT文件系统,写FAT表前不用先擦除吗?

对于Flash来说,写操作必须在空白区域进行,若此区域有数据,则必须先擦除(erase)然后才能写,切擦除是以块(block)为单位进行的。 对于FAT32文件系统来说,FAT表存在于保留扇区和根目录之间,对Flash里文件的读写几乎都要修改FAT表里的数据,那么 ...…

查看全部问答>

rt73驱动移植问题

各位,有谁做过RT73 WIFI驱动的移植,小弟有个疑问,想请教一下: 用过Windows无线搜索的人都知道,它搜索完各个SSID后,如果设有密码,则需要输入密码,但其实无线AP能设很多种认证和加密方式,有WEP,WPA,WPA2等,但Windows连接时并不需要用户选择AP的这些 ...…

查看全部问答>

在Windows CE平台下使用Firebird数据库做为服务器,是否可以做类似于Microsoft SQL Server那种C/S模式的MIS系统开发

主要想探讨一下是否可以在Windows CE 6.0平台下使用Firebird数据库,如果可以使用,它的开发流程是什么样;不知有没有研究过的前辈,请多多指教!顶者皆分!…

查看全部问答>

摄像头应用程序如何写,想用IOControl实现

非要自己写驱动吗,不是有些免驱的摄像头吗,他们的接口函数是什么呢…

查看全部问答>

问bin、com、exe文件之间的区别 CPU下可以直接运行吗?

问bin、com、exe文件之间的区别  CPU下可以直接运行吗?    这三个都是二进制的文件、如何区分并学习…

查看全部问答>

多功能弹性时装

是不是以为这是一件套装呢,一件礼服,一件裙子。实际上它只是一件衣服而已,它可以根据你的要求来随意的改变长度。你还可以将它当迷你裙和腰带来穿,是不是很神奇。一件衣服,多种穿法,可以让你随心所欲。这就是国外推出的多功能弹性时装。…

查看全部问答>

请教:通讯距离的增加

请问,无线通讯系统,增加通信距离都有哪些方法呢?最有效最常用的.谢谢.…

查看全部问答>