PIC单片机C语言知识入门基础实例.doc
.PIC单片机C语言入门1.2.1 认识PIC单片机C语言用C语言来开发单片机系统软件最大的好处是编写代码效率高。软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C语编程在单片机系统设计中已得到越来越广泛的应用。但在单片机上用C语言写程序和在PC机上写程序绝对不能简单等同。珊在的PC机资源十分丰富,运算能力强大,因此,程序员在写PC机的应用程序时,几乎不用关心编译后的可执行代码在运行过程中需要占用多少系统资源,也基本不用担心运行效率有多高。写单片机的C语言程序最关键的一点是单片机内的资源非常有限,控制的实时性要求又很高,因此,如果没有对单片机体系结构和硬件资源作详尽的了解,以笔者的愚见认为是无法写出高质量实用性很高的C语程序。本书围绕PIC中档系统单机来展开讨论的,Microchip公司自己没有针对PIC中档系列单片机的C语言编译器,但很多专业的第三方公司有众多支持PIC单片机的C语言编译器提供,常见的有Hitech、CCS、IAR、Bytecraft等公司。其中笔者最常用的是Hitech公司的PICC编译器,它稳定可靠,编译生成的代码效率高,在用PIC单片机进行系统设计和开发的工程师群体中得到广泛认可。其正式完全版软件需要购置,但在其网站上有限时的试用版供用户评估。另外,Hitech公司针对广大PIC的业余爱好者和初学者,还提供了完全免费的学习版PICC-Lite编译器套件。它的使用方式与完全版相同,只是支持的PIC单片机型号限制在PIC16F84、PIC16F877和PIC16F628等几款。这几款Flash型的单片机因其所具备的丰富的片上资源而最适用于单片机学习入门,因此,笔者建议感兴趣的读者可以从PICC-Lite入手掌握PIC单片机的C语言编程。我们一起来认识训练项目2跑马灯的仿真与演示的程序LEDS.C。1#include"pic.h"2int a;/定义整型变量a3void main( )4TRISB=0X00;/定义端口B为输出模式5while(1)/while循环语句6PORTB=0XFE;/1111 1110 7for(a=1000;a>0;a-);/for循环语句8PORTB=0XFD;/1111 11019for(a=1000;a>0;a-);/for循环语句10PORTB=0XFB;/1111 101111for(a=1000;a>0;a-);/for循环语句12PORTB=0XF7;/1111 011113for(a=1000;a>0;a-);/for循环语句14PORTB=0XEF;/1110 111115for(a=1000;a>0;a-);/for循环语句16PORTB=0XDF; /1101 111117for(a=1000;a>0;a-);/for循环语句18PORTB=0XBF;/1011 111119for(a=1000;a>0;a-);/for循环语句20PORTB=0X7F;/0111 111121for(a=1000;a>0;a-);/for循环语句22 23说明:第1行:#include"pic.h"是文件包含语句,表示把语句中指定文件的全部内容复制到此处,与当前的源程序文件链接成一个源文件。该语句中指定的文件pic.h是Hitech-PICC编译器提供的头文件,保存在“C:HT-PICinclude”路径下,该文件包含了对PIC单片机特殊功能寄存器SFR和位名称的定义。在编写每一个程序时,首先编写的一条语句就是#include"pic.h"。第2行:int a。是定义一个整型变量a,具体什么是整型变量?有何功能?请看数据与数据类型号中的介绍。第3行:void main( )。定义主函数void main( )。其是C语言程序中必不可少的主函数,也是程序开始执行的第一个函数。函数一般分成两个部分,一个部分为函数名:main,另一个部分为函数体:从第4行的到23行的为止。第4行:TRISB=0X00。是给单片机的B端口方向寄存器赋值,使B端口数据方向为输出方向,具体TRISB寄存器功能请查看【知识链接3】PIC单片机I/O接口及其应用。第5行:while(1)。是while( ) 循环语句。第6行:PORTB=0XFE。是给单片机的B端口寄存器赋值,使B端口寄存器为0XFE,具体PORTB寄存器功能请查看【知识链接3】PIC单片机I/O接口及其应用。第7行:for(a=1000;a>0;a-)。是for循环语句。第821行都与第6、7行相类似,在此就不再重复,int 、while、for等C语言知识接下将一一介绍。1.2.2 数据与数据类型数据是计算机的对象,任何程序设计都要进行数据处理。具有一定格式的数字或数值称为数据,数据的不同格式称为数据类型。数据类型单精度型(float)双精度型(double)整型(int)实型(浮点型)字符型(char)基本类型构造类型枚举类型号(enum)数组类型结构体类型(struct)共用体类型(union)指针类型空类型(void)在C语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型四大类,如图1-2-1所示。图1-2-1 C语言的数据类型在进行PIC单片机程序设计时,支持的数据类型与编译器相关。Hitech-PICC编译器所支持的数据类型如表1-2-1所示,其遵循Little-endian标准,多字节变量的低字节放在存储空间的低地址,高字节放在高地址。表1-2-1 Hitech-PICC编译器所支持的数据类型序号数据类型名称长度(位数)值 域1位类型bit1B0或1 2有符号字符型char8B-128 +1273无符号字符型unsigned char8B0 2554有符号整型short16B-32768 +327675无符号整型unsigned short16B0 655356有符号整型int 16B-32768 +327677无符号整型unsigned int16B0 655358有符号长整型long32B-2 147 483 648 +2 147 483 6479无符号长整型unsigned long32B0 4294 967 29510浮点型float24B-2 147 483 648 +2 147 483 64711双精度浮点型double24B或32B-8 388 608 +8 388 607 或-2 147 483 648 +2 147 483 647注:Hitech-PICC编译器缺省认定double型变量为24位长,但可以改变编译选项改成32位长1.2.3 常量与变量单片机程序中处理的数据有常量和变量两种形式,二者的区别在于:常量的值在程序执行期间是不能发生变化的,而变量的值在程序执行期间可以发生变化。1常量在程序运行的过程中,其值不能改变的量称为常量。常量的数据类型有整型、浮点型、字符型和字符串型。(1)整型常量可以表示为十进制数、十六进制数或八进制数等,例如:十进制数12、-60等;十六进制数以0x开关,如0x13、0xAB等;八进制数以字母o开关,如o14、o17等。若要表示长整型,就在数字后面加字母L,如104L、o34L、0Xf340L等。(2)浮点型常量可以分为十进制表示形式和指数表示形式两种,如0.888、3345.345、123e3、-2.4e-2等。(3)字符型常量是用单引号括起来的单一字符,如a、9等。(4)字符串型常量是用双引号括起来的一串字符,如“test”、“ok”等。字符串是由多个字符连接起来组成的。2变量在程序运行中,其值可以改变的量称为变量。一个变量主要由两部分构成;一个是变量名,一个是变量值。每个变量都有一个变量名,在内存中占据一定的存储单元(地址),并在该内存单元中存放该变量的值。下例为对符号常量和变量进行说明:1#define CONST 602void main( )3int variable, result;4variable = 20;5result = variable * CONST;6第1行:#define CONST 60。这一行定义了一个符号常量CONST,其值为60。这样在后面的程序中,凡是出现CONST的地方,都代表常量60。第2行:variable和result就是变量。它们的数据类型为整型(int)。注意:符号常量与变量的区别在于,符号变量的值在作用域(本例中为主函数)中,不能改变,也不能用等号赋值,习惯上,总将符号常量名用大写,变量名用小写,以示区别。(1)变量的定义变量必须先定义后使用,用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。变量的定义格式如下:存储种类 数据类型 存储器类型 变量名表;其中,数据类型和变量名表是必须的,存储种类和存储类型是可选项。存储种类有四种:auto(自动变量)、extern(外部变量)、static(静态变量)和register(寄存器变量)。默认类型为auto(自动变量)。例如:int a ;/*定义a为整型变量*/int m,n;/*定义m和n为整型变量*/float x,y,z;/*定义x,y,z单精度实型变量*/char ch;/*定义ch为字符变量*/long int t;/*定义t为长整型变量*/static int r;/*定义r为静态的整型变量*/进行变量定义时,应注意以下几点: 允许在一个数据类型标识符后,说明多外相同类型的变量,各变量名之间用逗号隔开; 数据类型标识符与变量名之间至少用一个空格隔开; 最后一个变量名后必须以分号“;”结尾; 变量说明必须放在变量使用之前,一般放在函数体的开头部分; 在同一个程序中变量不允许重复定义。例如:int x,y,z;int a,b,x; /*变量x被重得定义*/(2)变量的初始化在定义变量的同时可以给变量赋初值,称为变量的初始化。变量初始化的一般格式为:数据类型标识符 变量名1=常量1,变量名2=常量2,变量名n=常量n;例如:int m=3,n=5; /*定义m和n为整型变量,同时m,n分别赋初值3,5*/float x=0,y=0,z=0; /*定义x,y,z为单精度实型变量,同时x,y,z都赋初值为0*/char ch=a; /*定义ch为字符型变量,同时赋初值字符a*/long int a=1000,b;/*定义a,b为长整型变量,同时a赋初值1000*/(3)整型变量整型变量的基本类型符为int,可以根据数值的范围将整型变量定义为基本整型变量、短整型变量或长整型变量。 基本整型变量用int表示; 短整型变量用short int 表示(或用short)表示; 长整型变量用long int 表示(或用long)表示。在计算机(或单片机)中数据是以二进制形式表示的,基本整型变量占用内存2个字节,即16位。16位中最左边的一位表示符号,该位0,表示正数;该位1,表示负数。一个基本整型变量的值范围为-215(215-1),即-32 76832 767。实际应用时注意整型变量的值不能超出范围,否则容易出错,为了充分利用变量表示数据的范围,可以将变量定义为“无符号”类型。归纳起来,可以使用以下6种整型变量:带符号基本整型变量signed int无符号基本整型变量unsigned int带符号短整型变量signed short int无符号短整型变量unsigned short int带符号长整型变量signed long int无符号长整型变量unsigned long int如果在定义整型变量时不指定unsigned,则隐含为有符号(signed)。假设定义两个变量a和b如下:int a;usigned int b;则变量a的取范围为了-32 76832 767。而变量b的取值范围为065 535。图1-2-2(a)表示有符号的基本整型变量a的最大值(32 767),图1-2-2(b)表示无符号的基本整型变量b的最大值(65 535)。符号位=32 7670111111111111111(a)有符号整型变量表示数据的最高位=65 5351111111111111111(b)无符号整型变量图1-2-2 变量a和b的最大值(4)实型变量实型数据与整型数据在内定中的存储方式不同,实型数据是按照指数形式存放的,系统把一个实数分成小数和指数两个部分分别进行存放。指数部分采用规范化的指数形式,例如:-21.34638在内存中的存放形式如图1-2-3所示。实型号变量分为单精度(float)、双精度(double)和长双精度(long double),但Hitech-PICC编译器只支持单精度(float)和双精度(double)两种,具体规则如表1-2-1所示。-.21346382符号 小数部分 指数 - .2134638 2 图1-2-3 实数在内存中的存放形式(5)字符型变量 字符型变量用来存放字符常量,注意只能存放一个字符。例如:char c1,c2,c3,c4,c5;/定义5个字符变量c1=a;/正确c2=”a”; /不正确c3=abc; /不正确c4=107; /正确c5=6; /正确将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。例如:char c1,c2;/定义2个字符变量c1=a;c2=b;/给字符变量c1赋值为a、c2赋值为b字符a的ASCII代码为十进制数97,字符b的ASCII代码为十进制数98,在内存中变量c1、c2的实际上是以二进形式存放的。(6)位变量 bit 型位变量只能是全局的或静态的。PICC将把定位在同一bank内的8个位变量合并成1个字节存放于一个固定地址。因此,所有针对位变量的操作将直接使用PIC单片机的位操作汇编指令高效实现。基于此,位变量不能是局部自动型变量,也无法将其组合成复合型号高级变量。1.2.5 运算符和表达式数据处理是程序的核心部分。在数据处理中,各种运算又是最主要的部分。C语言不仅数据类型丰富,而且运算符也十分丰富,几乎所有的操作都可以用运算符来处理。由运算符加适当的运算对象(常量、变量、函数等)可构成表达式,而表达式是C语言的重要要素之一,因此掌握好运算符的使用对编写程序十分重要。对于每一个运算符,要注意从两个方面去把握:运算符的优先级和运算符的结合性。运算符的优先级指多个运算符用在同一个表达式中时先进行什么运算,后进行什么运算;而运算的结合性是指运算符所需要的数据是从左边开始取还是从右边开始取,因而有所谓“左结合性”和“右结合性”之说。C语言提供了丰富的运算符,它们能构成多种表达式,处理不同的问题,从而使C语言的运算功能十分强大。另外C语言的运算符可以分为12类,如表1-2-3所示。表1-2-3 C语言的运算符运算符名运算符算术运算符+ - * / % + -关系运算符> < = >= <= != 逻辑运算符! && |位运算符<< >> & |赋值运算符=条件运算符? :逗号运算符,指针运算符* &求字节数运算符sizeof强制类型转换运算符(类型)下标运算符 函数调用运算符( )表达式是由运算符及运算对象组成的、具有特定含义的式子。C语言是一种表达式语言,表达式后面加上分号“;”就构成了表达式语句。这里我们主要介绍在Hitech-PICC编程中经常用到的算术运算、赋值运算、关系运算、逻辑运算、位运算、逗号运算及其表达式。1运算符的优先级和结合性学习C语言的运算符,不仅要掌握各种运算符的功能,以及它各自可连接的运算对象个数,而且还要了解各种运算符彼此之间的优先级和结合性,运算符可按其优先级从高到低分为15个等级,如表1-2-4所示。表1-2-4 运算符的优先级和结合性优先级运算符含 义运算量个数结合性1() ->.括号运算符下标运算符指向结构体成员运算符成员运算符自左至右2!+ -(类型)* &sizeof逻辑非运算符按位取反运算符自加、自减运算符负号运算符强制类型转换运算符指针和地址运算符取长度运算符单目运算符右结合3* / %乘、除、求余运算符双目运算符自左至右4+ -算术加、减运算符双目运算符自左至右5<< >>位左移、右移运算符双目运算符自左至右6< <= > >= 关系运算符双目运算符自左至右7= !=关系运算符双目运算符自左至右8&按位与运算符双目运算符自左至右9位异或运算符双目运算符自左至右10|位或运算符双目运算符自左至右11&&逻辑与运算符双目运算符自左至右12|逻辑或运算符双目运算符自左至右13?:条件运算符三目运算符右结合14= += -= *= /= %=<<= >>= &= |= =组合算术运算符组合运算符双目运算符右结合15,逗号运算符自左至右(1)优先级求解表达式时,总是先按运算符的优先次序由高到低进行操作。优先级是用来标志运算符在表达式中的运算顺序的。相当于加括号,运算时进行脱括号运算。(2)结合性当一个运算对象两侧的运算符优先级相同时,则按运算符的结合性确定表达式的运算顺序。它分为两类:一类是运算符的结合性为“从左到右”(大多数运算符是这样的),另一类运算符的结合性为“从右到左”。例如:3-5*2,按运算符的优后次先乘后减,表达式的值为了-7;3*5/2,5的两侧是“*”和“/”优先级相同,则按结合性处理,算术运算符的结合性为“从左到右”,则先乘后除,表达式的值为7。C语言规定了各种运算符的结合方向(结合性),关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。2算术运算符与算术表达式Hitech-PICC中的算术运算符如表1-2-5所示。表1-2-5 算术运算符运算符名称功能+ 加法 求两个数的和,例如8+9=17-减法求两个数的差,例如20-7=13*乘法求两个数的积,例如20*5=100/除法求两个数的商,例如20/5=4%取余求两个数的余数,例如20%9=2+自增1变量自动加1-自减1变量自动减1在使用上述运算符时,应注意以下几点: 要注意除法运算符在进行浮点数相除时,其结果为浮点数,如20.0/5所得值为4.0;而进行两个整数相除时,所得值是整数,如7/3,值为2。 取余运算符(模运算符)“%”要求参与运算的量均为整型,其结果等于两数相除后的余数。 Hitech-PICC提供的自增运算符“+”和自减运算符“-”,作用是使变量值自动加1或减1。自增运算和自减运算只能用于变量而不能用于常量表达式,运算符放在变量前和变量后是不同的。后置运算:i+(或i-)是先使用i的值,再执行i+1(或i-1)。前置运算:+i(或-i)是先执行i+1(或i-1),再使用i的值。对自增、自减运算的理解和使用是比较容易出错的,应仔细地分析,例如:int i=100,j;j=+i;/j=101,i=101j=i+;/j=101,i=102j=-i;/j=101,i=101j=i-;/j=101,i=100编程时常将“+”、“-”这两个运算符用于循环语句中,使循环变量自动1;也常用于指针变量,使指针自动加1指向下一个地址。3赋值运算符与赋值表达式赋值运算符“=”的作用变是给变量赋值,如“x=10;”。用赋值运算符将一个变量与一个表达式连接起来 的式子称为赋值表达式,在表达式后面加“;”便构成了赋值语句。赋值勤语句的格式如下。变量 = 表达式;例如:k=0xff;/将十六进制数FFH赋予变量kb=c=33;/将33同时赋予变量b和cd=e;/将变量e的值赋予变量df=a+b; /将表达式a+b的值赋予变量f由此可见,赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性,因此有下面的语句:a=b=c=5;可以理解为:a=(b=(c=5);按照C语言的规定上,任何表达式在其末尾加上分号就构成语句。因此“x=8;”和“a=b=c=5;”都是赋值语句。如果赋值运算符两过的数据类型号不相同,系统将自动进行类型转换,即把赋值右边的类型换成左边的类型。具体规定如下: 实型赋给整型,舍去小数部分。 整型赋给实型,数值不变,但将以浮点开式存放,即增加小数部分(小数部分的值为0)。 字符型赋给整型,由于字符型为1字节,而整型2字节,故将字符ASCII码值放到整型量的低8位中,高8位为0。 整型赋给字符型,只把低8位赋给字符量。图1-2-4表示了各数据类型自动转换的规则。低intunsigned longdoubleunsigned longshor、char float高图1-2-4 各种数据类型的高低顺序在C语言程序设计中,经常使用复合赋值运算符对变量进行赋值。复合赋值运算符就是在赋值符“=”之前加上其他运算符,表1-2-4中优先级14就是复合赋值运算符。构成复合赋值表达式的一般形式为:变量 双目运算符 = 表达式;它等效于:变量 = 变量 运算符 表达式;例如:a+=5;/相当于a=a+5;x*=y+7;/相当于x=x*(y+7);r%=p;/相当于r=r%p;在程序中使用复合赋值运算符,可以简化程序,有利于编译处理,提高编译效率并产生质量较高的目标代码。4关系运算符与赋值表达式在前面介绍过的分支选择程序结构中,经常需要比较两个变量的大小关系,以决定程序下一步的操作。比较两个数据量的运算符称为关系运算符。C语言提供了6种关系运算符: 大于运算符:>; 大于等于运算符:>=; 小于运算符:<; 小于等于运算符:<=; 等于运算符:=; 不等于运算符:!=;在关系运算符中,<、<=、>、>=的优先级相同,=和!=优先级相同;前者优先级高于后者。例如:“a=b>c;”应理解为“a=(b>c);”。关系运算符优先级低于算术运算符,高于赋值运算符。例如:“a+b>c+d;”应理解为“(a+b)>(c+d);”。关系表达式是用关系运算符连接的两个表达式。它绵一般形式为:表达式 关系运算符 表达式关系表达式的值只有0和1两种,即逻辑的“真”与“假”。当指定的条件满足时,结果为1,不满足时结果为0。例如表达式“5>0;”的值为“真”,即结果为1;而表达式“(a=3)>(b=5);”由于3>5不成立,故其值为“假”,即结果为0。a+b>c/若a=1,b=2,c=3,则表达式的值为0(假)a>3/2/若x=2,则表达式的值为1(真)c=5/若c=1,则表达式的值为0(假)5关系运算符与赋值表达式C语言中提供了三种逻辑运算符,一般形式有以下三种。 逻辑与运算符:&&; 逻辑或运算符:|; 逻辑非运算符:!;逻辑表达式的一般形式有以下三种。逻辑与:条件式1&&条件式2逻辑或:条件式1|条件式2逻辑非:!条件式“&&”和“|”是双目运算符,要求有两个运算对象,结合方向是从左到右。“!”是单目运算符,只要求一个运算对象,结合方向是从右至左。(1)逻辑与:a&&b,当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。(2)逻辑或:a|b,当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。(3)逻辑非:!a,当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。表1-2-6给出了执行逻辑运算的结果条件1条件2逻辑运算ab!aa&&ba|b11011100010110100100表1-2-6 执行逻辑运算的结果例如:设x=3,则(x>0)&&(x<6)的值为“真”(即为“1”),而(x<0)&&(x>6)的值为“假”(即为“0”),!x的值为“假”。逻辑运算符“!”的优先级最高,其次为“&&”,最低为“|”。具体请读者见表1-2-4 运算符的优先级和结合性。6位运算符与位运算表达式 在PIC系列单片机应用系统设计中,对IO端口的操作是非常频繁的,因此往往要求程序在位(bit)一级进行运算或处理,因此,汇编语言具有强大灵活的位处理能力。Hitech-PICC语言直接面对:PIC系列单片机硬件,也提供了强大灵活的位运算功能,使得c语言也能像汇编语言一样对硬件直接进行操作。 Hitech-PICC提供了6种位运算符: 按位与运算符:&; 按位或运算符:|; 按位异或运算符:; 按位取反运算符:; 右移运算符:>>; 左移运算符:<<; 位运算符的作用是按二进制位对变量进行运算,表1-2-7 是位运算符的真值表。表1-2-7 位运算符的真值表条件1条件2逻辑运算ab!aa&&ba|b11011100010110100100位变量1位变量2位 运 算ababa&ba|bab0011000011001110010111100110 左移运算符“<<”的功能,是把“<<”左边的操作数的各二进制位全部左移若干位,移动的位数由“<<”右边的常数指定,高位丢弃,低位补O。例如:“a<<4”是指把a的各二进制位向左移动4位。如a=000000llB(十进制数3),左移4位后为00110000B(十进制数48)。 右移运算符“>>”的功能,是把“>>”左边的操作数的各二进制位全部右移若干位,移动的位数由“>>”右边的常数指定。进行右移运算时,如果是无符号数,则总是在其左端补“0”;对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补O,而为负数时,符号位为1,最高位是补0还是补1取决于编译系统的规定。例如:设a=Ox98,如果a为无符号数,则“a>>2”表示把10011000B右移为001001lOB;如果a为有符号数,则“a>>2表示把10011000B右移为11 100110B。 在使用位运算符时,有如下技巧:按位与运算通常用来对某些位清零或保留某些位。例如,要保留从PORTB端口的RB0和RB1读入的两位数据,可以执行"control=PORTB&0x03;"操作(0x03的二进制数为00000011B);而要清除PORTB端口的RB4RB7为0,可以执行“PORTB=PORTB&OxOf;”操作(0x0f的二进制数为00001111B。同样,按位或运算经常用于把指定位置1、其余位不变的操作。 流水灯控制程序LEDS.c就是采用移位运算来实现的发光二极管点亮位置的移动。 用位运算符“|”改写的流水灯控制程序如下。1#include"pic.h"2int a;/定义整型变量a3void main( )4TRISB=0X00;/定义端口B为输出模式5while(1)/while循环语句6PORTB= PORTB|0XFE;/1111 1110 7for(a=1000;a>0;a-);/for循环语句8PORTB= PORTB|0XFD;/1111 11019for(a=1000;a>0;a-);/for循环语句10PORTB= PORTB|0XFB;/1111 101111for(a=1000;a>0;a-);/for循环语句12PORTB= PORTB|0XF7;/1111 011113for(a=1000;a>0;a-);/for循环语句14PORTB= PORTB|0XEF;/1110 111115for(a=1000;a>0;a-);/for循环语句16PORTB= PORTB|0XDF; /1101 111117for(a=1000;a>0;a-);/for循环语句18PORTB= PORTB|0XBF;/1011 111119for(a=1000;a>0;a-);/for循环语句20PORTB= PORTB|0X7F;/0111 111121for(a=1000;a>0;a-);/for循环语句22 23分析上面程序可知,该程序实现的流水灯效果。7逗号运算符与逗号运算表达式 在c语言中逗号“,”也是一种运算符,称为逗号运算符,其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式,其一般形式为:表达式1,表达式2,表达式n 逗号表达式的求值过程是:从左军右分别求出各个表达式的值,并以最右边的表达式n的值作为整个逗号表达式的值。 程序中使用逗号表达式的目的,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。例如:x=(y=10,y+5); 上面括号内的逗号表达式,逗号左边的表达式是将10赋给y,逗号右边的表达式进行y+5的计算,逗号表达式的结果是最右边的表达式“y+5”的结果15赋给x。 并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明、函数参数表中的逗号只是用做各变量之间的间隔符,例如:unsigned int i, j; 1.2.6基本语句C语言程序的执行部分由语句组成。C语言提供了丰富的程序控制语句,按照结构化程序设计的基本结构:顺序结构、选择结构和循环结构,组成各种复杂程序。这些语句主要包括表达式语句、复合语句、选择语句和循环语句等。1表达式语句表达式语句是最基本的C语言语句。表达式语句由表达式加上分号“;”组成,其一般形式如下:表达式;执行表达式语句就是计算表达式的值。例如:PORTB=0XFD;/赋值语句,在程序LEDS.c中将端口B赋值为0XFDx=y+z; / y和z进行加法运算后赋值给变量xi+; /自增1语句,i增加1后,再赋给变量i在C语言中有一个特殊的表达式语句,称为空语句。空语句中只有一个分号“;”,程序执行空语句时需要占用一条指令的执行时间,但是什么也不做。在程序中常常把空语句作为循环体,用于消耗CPU时间等待事件发生的场合。例如,在LEDS.c函数中,有下面语句:for(a=1000;a>0;a-);/for循环语句上面的for语句后面的“;”是一条空语句,作为循环体出现。在使用“;”时的小技巧: 表达式是由运算及运算对象所组成的、具有特定含义的式子,例如“y+z”。C语言是一种表达式语言,表达式后面加上分号“;”就构成了表达语句,例如“y+z”。C语言中的表达式与表达式语句的区别就是前者没有分号“;”,而后者有“;”。 在while或for构成的循环语句后面加一个分号,构成一个不执行其他操作的空循环体。例如:While(1);上面语句循环条件永远为真,是无限循环;循环体为空,什么也不做。程序设计时,通常把该语句作为停机语句