用if语句可以构成选择结构。它根据给定的条件表达式进行判断,以决定执行某个分支程序段。C语言的if语句有两种基本形式。
1.基本形式一
基本形式只有if,其一般书写形式为
或
可以看出来if语句是一种复合语句,由多个部分构成。其功能是如果表达式的值为真,则执行其后的语句,否则跳过语句向下执行。其执行流程如图4-8所示。
由于本书中第一次出现这种流程图,所以解释一下如何看这种流程图,此流程图中只有3种符号,非常容易理解。
●带方向的线段表示下一个要执行的模块是哪一个。
●菱形表示一个条件判断,菱形的出口一般只有两个,即“真”或“假”,各用一个带方向的线表示执行方向。在实际绘制中,为了节省纸张,也有将其绘制为左右两侧带尖的矩形。
图4-8 if语句第一种形式的流程图
●方框表示一个顺序执行的模块。
这里有必要说明一下图4-8中语句的范围,当if语句中的表达式不成立时,系统会跳过if后的第一条语句,那么什么是一条语句呢?在C语言中,有两种情况代表一条语句。
●一对大括号括起来的程序块(其中可以有任意多条其他语句)被C语言编译器认为是一条语句。
●如果if后无大括号,则其后的第一个以“;”结尾的语句称为其后的第一条语句。
对第一条语句的理解非常重要,往往是初学者易犯错误的地方,下面通过实例来加深对以上知识的理解。
【例4-12】阅读以下程序,说出此程序执行到第8行之后PORTD的值是什么。所用硬件电路图为图4-1。
设计过程
1)修改S041项目中的main.c的内容,将以上代码输入(注释内容可以不输入)。
2)将以上代码编译后用Proteus VSM运行一次,查看PORTD的值。
运行效果分析
运行后是VT1亮,其他灭,也就是说PORTD值是0b00000010。因为程序执行到第4行时Data1为2使第4行的if语句内表达式不成立,结果为假,所以接下来要跳过if后的第一条语句向下执行。由于if后没有紧跟大括号,所以其后的第一条语句就是到第一个以“;”结尾的语句,即if后的第一条语句就是第5行的内容(虽然第5行和第6行都相对于if语句缩进了两个空格书写,但是缩进书写不会影响语句之间的从属关系)。当if语句的表达式不成立时,第5行就被跳过去了,向下执行就执行到了第6行,所以使Data2左移了1位,变为0b00000010。在第8行把Data2向PORTD输出,所以使PORTD输出结果为0b00000010。
【例4-13】阅读以下程序,说出此程序执行到第10行之后PORTD的值是什么。所用硬件电路图为图4-1。
运行效果分析
本例设计过程与上例相同,这里就不重写了。直接运行后看结果,答案是0b00000001。因为此程序中if后紧跟了一对大括号,使if后的第一条语句是一个由大括号括起来的复合语句,包括了第6行和第7行。当if的表达式不成立时,跳过if后的第一条语句,包括第6行和第7行,然后执行PORTD=Data2,Data2没有变化,还是初始值1,所以PORTD输出结果是0b00000001。(www.daowen.com)
2.基本形式二
第二种形式为完整的if语句,即if+else,一般书写格式为
其语义是,若表达式的值为真,则执行语句1后跳过语句2,否则跳过语句1执行语句2。其具体执行过程如图4-9所示。需要强调的是,if后面表达式的小括号千万不能省略。
图4-9 if+else语句流程图
通过图4-9可以看出,当表达式为真时只执行语句1,不执行语句2。if+else语句中的语句1和语句2每次判断表达式后只能执行两者之一,不能全部执行。有了if语句后,单片机就可以进行判断了,通常用if语句实现对外部信号状态的判断。根据外部信号不同状态来完成不同的工作,这就是一种典型的单片机控制方法。下面通过例子来说明这种方法的应用。
【例4-14】硬件电路如图4-10所示,要求编程实现通过按键S1来控制8个LED的状态。按下S1时,只有低4位亮,抬起后只有高4位亮。
电路图在光盘位置:“\Example\Chapter4\S042\sch\led8key1.dsn”。
图4-10 S042实验原理图
题意分析
●S1与RB0相连,通过上拉电阻R9实现高低两种电平状态的输入。所以RB0应为输入状态。
●VT0~VT7通过电阻与C口8个引脚相连,可见是用C口控制LED灯。所以C口应为输出状态。
●根据题意要求,如果S1是0,则C口低4位输出高电平;如果S1是1,则C口高4位输出高电平。由于不知道用户何时按S1键,所以判断语句和相应的处理代码应该写在一个死循环中,不断地读取RB0状态,这样才能防止漏掉用户的随机按键。
设计过程
1)用Proteus ISIS软件按图4-10绘制一个新的电路图并保存(推荐自己画,学习就是一个熟能生巧的过程)。
2)用MPLAB新建一个C语言项目,项目命名为S042,并新建一个main.c文件加入到项目中。在main.c中,加入如下内容(注释可以不输入)。
3)在MPLAB中使用Proteus VSM调试工具,打开本例电路图。将以上代码编译后用Proteus VSM运行一下,观察按与不按S1的情况下,LED的状态如何变化,尽量弄明白代码与运行效果的关系。不明白的地方请看相应语句后的注释内容。
运行效果分析
●本程序运行效果是,当S1未按下时,RB0被上拉电阻R9拉为高电平,RB0的值为1,if语句判断时条件为假执行else分支,即执行语句“PORTC=0xF0;”,所以C口只有高4位亮。
●当S1按下时,RB0接地,导致读取RB0的值为0,if语句判断时条件成立,执行if后的语句“PORTC=0x0F;”,所以C口只有低4位亮。
注意:在书写条件表达式时,不要判断无符号数大于或等于0。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。