单片机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后,允许有多个语句,可以不用{}括起来。
  • casedefault子句的先后顺序可以变动,而不会影响程序执行结果。
  • default子句可以省略不用。
  • case语句结束应要加break 语句,否则将不能跳出switch语句,输出不应有的结果。

下面我要提一下breakcontinue语句,先了解下:

break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。

break语句用于do-whileforwhile循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。即满足条件时便跳出循环。

continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在forwhiledo-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++);  //延时一会 
  }
}

版权声明:
作者:wawooo
链接:http://www.wawooo.com/152.html
来源:挖窝网
文章版权归作者所有,未经允许请勿转载。

THE END
分享
手机浏览