单片机C语言入门之六switch case语句流水灯
除了if else语句,C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:
switch(表达式)
{
case常量表达式1:
语句1;
break;
case常量表达式2:
语句2;
break;
…
case常量表达式n:
语句n;
break;
default:
语句n+1;
}
其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。看个例子:输入几就输出星期几。
main(){
int a;
printf("input integer number: ");
scanf("%d",&a);
switch (a){
case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n"); break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thursday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
case 7:printf("Sunday\n");break;
default:printf("error\n");
}
}
在使用switch语句时还应注意以下几点:
- 在case后的各常量表达式的值不能相同,否则会出现错误。
- 在case后,允许有多个语句,可以不用{}括起来。
- 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
- default子句可以省略不用。
- 在case语句结束应要加break 语句,否则将不能跳出switch语句,输出不应有的结果。
break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。
当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。即满足条件时便跳出循环。
continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。其执行过程可用下图表示。
关于switch就说这么多,下面来看在单片机中的例子,使用switch case语句实现流水灯。
#include<stc12.h> //STC12系列头文件 复制到工程目录下
sbit LEDK = P1^4;// 控制三极管基极
void main(void)
{
unsigned char i=0; //声明变量i
unsigned int k;
LEDK=0; //置0使PNP型三极管导通LED负极接地
P0M1=0x00;
P0M0=0xff; //P0口全部设置为推挽输出 见手册87页 IO口模式配置
while(1)
{
switch(i) //i等于几就执行相应的case语句块
{
case 0:
{
P0=0x01; //点亮最低位的LED 下面的语句八个LED依次点亮
}break; //执行完case遇到break就跳出当前switch循环
case 1:
{
P0=0x02;
}break;
case 2:
{
P0=0x04;
}break;
case 3:
{
P0=0x08;
}break;
case 4:
{
P0=0x10;
}break;
case 5:
{
P0=0x20;
}break;
case 6:
{
P0=0x40;
}break;
case 7:
{
P0=0x80;
}break;
default:
break;
}
i++; //执行完上一个case后出来i增1
if(i==8)i=0; //i=8 八个case执行完 i赋值为0 继续从头开始
for(k=0;k<50000;k++); //延时一会
}
}