先说结论,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语言中左值与右值”。
关键字:C语言 MPLAB if语句不执行
引用地址:
C语言——MPLAB中if语句不执行问题
推荐阅读最新更新时间:2024-10-23 19:21
C语言——MPLAB中if语句不执行问题
先说结论,if语句中多加一对小括号即可。具体调试过程如下: 我用的编译器版本是MPLAB X IDE v4.15,单片机型号是PIC16F1938; 想用6位数码管实现时钟功能,结果写出来的代码,片选顺序有问题,而且时分秒累加及进位都有问题。 拿单步跟踪了老半天,发现是if语句进不去。if语句如下: unsigned char Buffer = {0}; if(Buffer &0x0F 0x09){ Buffer ++; } else{ Buffer &= 0xF0; } 我是左看右看,上看下看,还请同事帮我看,都没看出来什么问题。首先为了确认,我还特意复习了一下C语言运算符的优先级顺序
[单片机]
PIC单片机C语言程序设计实例之C语言if语句与LED数码管显示
if 语句也称为条件语句,是C 语言中转移语句之一。在设计C 语言程序时,常常要根据某些条件以决定程序运行的流向,这时就需要if 语句来实现。任何if语句(包括else 部分),都可当作一条C 语句使用。 格式:if(表达式) 语句1 else 语句2 其中else 为选择项;即可有、可无的。所以条件语句,可分为两种;if 语句和if— else 语句。 式中的表达式为关系表达式或逻辑表达式以及由条件运算符(有关运算符将在后文介绍)构成的一种表达式。 功能:先计算if 中的条件表达式,其值为真(满足条件时),执行语句1 ;其值为假(不满足条件时),若有else,就执行语句2。 If 语句常用有几种形式:
[单片机]
C语言for,while,if-else,return语句的综合使用
#include stdio.h void main() { int i,j,k; j=10; while(j--) //j控制换行 { i=10-j; while(i--) //i控制循环,而且控制的是紧随其后的语句,即printf( * );而控住不了printf(
); if(i 3) //if-else的用法是满足if则执行其后的语句,否则执行else。在本程序中i =3时执行break跳出循环 printf( * ); else break; //break的用法是结束当前其所在的循环。在此程序中用来结束while(i--) printf(
); } printf
[单片机]
实例讲解for循环的语句执行顺序
在一个技术QQ群中,试着做了一道C的题,感觉是考察for循环的执行流程. 原题: 在C语言中,下列代码的输出结果是 ( ) (选择一项) 群里居然有不少人都选了B,那个提问者还一直在问正确的结果。 最终的正确结果是:A. 哈哈,好基本的知识。 后来偶就顺手写了一个代码,大家做了它可以对for循环的运算顺序就比较清楚啦。 运行结果是: 执行判断条件,i=0,j=10 0,10 执行for循环体中的最后一句,i=0,j=10 执行for()中的第三个语句,i=1,j=9 执行判断条件,i=1,j=9 执行for循环体中的最后一句,i=1,j=10 执行for()中的第三个
[单片机]
单片机c语言教程第十三章--C51循环语句
循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作。如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 1000 次空语句 才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写 1000 条空语 句那是多么麻烦的事情,再者就是要占用很多的存储空间。我们能知道这 1000 条空语句, 无非就是一条空语句重复执行 1000 次,因此我们就能用循环语句去写,这样不但使程序 结构清晰明了,而且使其编译的效率大大的提高。在 C 语言中构成循环控制的语句有 while,do-while,for 和 goto 语句。同样都是起到循环作用,但具体的作用和使用方法又大不一 样
[单片机]
单片机C语言中的表达式语句及复合语句
1. 表达式语句 在表达式的后边加一个分号“;”就构成了表达式语句 ,如: a=++b*9; x=8;y=7; ++k; 可以一行放一个表达式形成表达式语句,也可以一行放多个表达式形成表达式语句,这时每个表达式后面都必须带“;”号,另外,还可以仅由—个分号“;”占一行形成一个表达式语句,这种语句称为空语句。 空语句在程序设计中通常用于两种情况: (1)在程序中为有关语句提供标号,用以标记程序执行的位置。例如采用下面的语句可以构成一个循环。 repeat:; : goto repeat; (2)在用while语句构成的循环语句后面加一个分号,形成一个不执行其它操作的空循环体。这种结
[单片机]
单片机C语言C51的语句
1. if语句 if语句是C51中的一个基本条件选择语句,它通常有三种格式: (1)if (表达式) {语句;} (2)if (表达式) {语句1;} else {语句2;} (3)if (表达式1) {语句1;} else if (表达式2) (语句2;) else if (表达式3) (语句3;) …… else if (表达式n-1) (语句n-1;) else {语句n} 【例】 if语句的用法。 (1)if (x!=y) printf(“x=%d,y=%dn”,x,y); 执行上面语句时,如果x不等于y,则输出x的值和y的值。 (2)if (x y) max=x;
[单片机]
51单片机C语言教程(八) 表达式语句1
从第四课到第七课,学习了大部分的基本语法,这一课所要学习的各种基本语句的语法可以说是组成程序的灵魂。在前面的课程中的例子里,也简单理解过一些语句的用法,可以看出C语言是一种结构化的程序设计语言。C语言提供了相当丰富的程序控制语句。学习掌握这些语句的用法也是C语言学习中的重点。 表达式语句是最基本的一种语句。不同的程序设计语言都会有不一样的表达式语句,如VB就是在表达式后面加入回车就构成了VB的表达式语句,而在51 单片机 的C语言中则是加入分号 ; 构成表达式语句。举例如下: b = b * 10; Count++; X = A;Y = B; Page = (a+b)/a-1; 以上的都是合法的表达式语句。
[单片机]