并行数字输入输出端口的使用_4.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章并行数字输入/输出端口的使用
——数码管显示电路的设计
目标
通过本章的学习,应掌握以下知识
●MSP430系列微控制器的并行数字输入/输出端口
●数码管的结构和工作原理
●数码管的显示数据与显示代码之间的关系
●利用查表实现代码转换的方法——译码程序
●函数的格式以及函数的调用
●数据类型
●循环语句
●利用循环语句实现时间延迟
引言
显示电路是应用系统的一个组成部分,使用者用这个部分可以获取系统工作结果和工作状态的信息。
在学习过程中,通常首先掌握这部分内容的相关知识,这样就能够用显示电路来获得将要学习电路的工作结果和工作状态。
数码管是一种最常用的显示器件,虽然它只能显示数值,而不能像液晶显示器那样还可以显示字符和图形,但是它使用简单,价格便宜,很适用初学者使用,而且数码管电路的工作原理与基于发光二极管的流水灯电路非常类似。
数码管显示电路的工作方式分静态显示和动态显示两种。
前者,数码管的每一个管脚需要占用微控制器芯片的一个信号输出管脚;后者虽然可以减少对微控制器管脚资源的占用,但是这时需要微控制器不停地输出控制信号,即几乎占用了CPU的全部时间。
这里只描述数码管静态显示电路。
本章首先描述MSP430系列微控制器并行数字输入/输出端口的相关寄存器,通过这些寄存器可以完成工作方式的选择以及数据传输的实现;接着讨论如何将显示数据转换为数码管的显示代码;微控制器的工作速度很快,完成一次并行数据传输仅需几个us,因此在连续向数码管进行数据发送之间需要添加具有时间延迟功能的程序块。
1
4.1MSP430系列微控制器的并行数字输入/输出端口
MSP430系列微控制器最多可以提供8个并行数字输入/输出端口,它们被分别命名为P1~P8。
每个并行数字输入/输出端口最多可以提供8个数字输入/输出管脚,它们被分别命名为Px.0~Px.7,这里x可以理解为变量,它表示MSP430系列微控制器可以提供的8个并行数字输入/输出端口中的任意一个。
MSP430系列芯片具有多种封装型式,因此并不是所有芯片都能够提供所有这些并行数字输入/输出管脚资源。
例如MSP430G2231微控制器芯片的14-PDIP(14管脚,塑料、双列、直插封装)封装只能提供具有8个管脚的P1数字输入/输出端口,P1.0~P1.7;具有2个管脚的P2数字输入/输出端口,P2.6和P2.7。
MSP430F2619微控制器芯片的64-PIN LQFP (一种具有64个管脚的表贴形式封装)封装可以提供6个并行数字输入/输出端口,P1~P6。
每一个并行数字输入/输出端口都具有8个管脚。
微控制器对数字输入/输出端口工作情况的配置,工作状态的控制也是通过访问相关寄存器来实现。
并行数字输入/输出端口的相关寄存器包括任意端口都具有的寄存器和只有P1端口和P2端口具有的寄存器,因为只有P1和P2端口具有中断能力。
所有并行数字输入/输出端口都具有的寄存器包括输入寄存器(PxIN)、输出寄存器(PxOUT)、方向寄存器(PxDIR)和功能寄存器(PxSEL)。
P1端口和P2端口涉及中断的寄存器包括中断使能寄存器(PxIE)、中断触发边沿选择寄存器(PxIES)和中断标志寄存器(PxIFG)。
本章不讨论P1端口和P2端口涉及中断的寄存器,这些内容在后面结合按键电路予以描述。
PxSEL.x:管脚功能选择
0 普通并行数字输入/输出管脚
1 外围功能模块管脚
MSP430系列微控制器的大部分管脚是复用管脚,即一个管脚可以扮演多种作用。
功能选择寄存器(PxSEL)用来配置管脚实现不同的功能。
每一个端口都具有功能选择寄存器,该寄存器的每一位控制1个管脚。
一些MSP430微控制器芯片的管脚具有更多功用,因此它们还具有功能选择寄存器2(PxSEL2),这时功能选择寄存器(PxSEL)和功能选择寄存器2(PxSEL2)联合实现对管脚功能的选择。
2
无论管脚设置为普通并行数字输入/输出管脚,还是外围模块管脚,即无论功能选择寄存器中的位取何值,都必须合适地设置方向控制寄存器的位PxDIR.x内容,以决定管脚信号的流向。
PxDIR.x:管脚信号传输方向选择
0 输入
1 输出
当管脚设置为普通并行数字输入/输出管脚,输入传输方向时,读输入寄存器中位PxIN.x内容就可以获得对应管脚的状态。
PxIN.x:管脚输入状态
0 低电平
1 高电平
当管脚设置为普通并行数字输入/输出管脚,输出传输方向时,写入输出寄存器位PxOUT.x内容将控制对应管脚的状态。
PxOUT.x:管脚输出状态
0 低电平
1 高电平
3
4 4.2 基于并行数据传输的数码管电路
4.2.1 数码管
数码管是应用电路中常用的显示器件。
数码管内部包含8个发光二极管,它的原理图、外形图和电路符号图如图4.1所示。
数码管原理图如图4.1的(a )和(b )所示。
数码管分共阴极和共阳极两种类型。
共阴极数码管内部8个二极管的N 极被连接在一起,再和管脚COM 相接。
在使用时管脚COM 应该接低电平,这样当数码管其余的某个管脚接高电平,则该管脚对应的发光二极管将被点亮,也就是数码管对应的发光段被点亮。
共阳极数码管内部8个二极管的P 极被连接在一起,再和管脚COM 相接。
在使用时管脚COM 应该接高电平,这样当数码管其余的某个管脚接低电平,则该管脚对应的发光二极管将被点亮,也就是数码管对应的发光段被点亮。
数码管外形图如图4.1的(c )所示。
数码管有2个COM 管脚,这两个管脚在数码管内部被连接在一起,在使用时,应用电路中只需要连接一个COM 管脚即可。
数码管的电路符号图如图4.1的(d )所示。
a
b
c
d
e
f g dp
a
b
c
d
e
f g
dp
(a )
(b )
(c )
(d )
图4.1 数码管的原理图、外形图和电路符号图
数码管显示电路可以由图2.1所示的流水灯电路改装来实现。
从流水灯电路中去掉发光二极管,换上一个共阴极数码管,就成为基于MSP430微控制器芯片的P1并行输入/输出端口的数码管显示电路。
具体电路如图4.2所示。
这里数码管的各个管脚与MSP430芯片P1端口各个管脚的连接关系如表4.1所示。
1.8
图4.2基于P1端口的数码管电路
在图4.2中,数码管也可以采用共阴极数码管,也可以采用共阳极数码管。
如果使用共阴极数码管,它的管脚COM应该通过一个限流电阻和接地线相接;如果使用共阳极数码管,它的管脚COM应该通过一个限流电阻和电源线相接。
不使用数码管的小数点时,控制共阴极数码管发光段“dp”的管脚P1.7可以一直输出低电平。
这种情况下,数码管的显示字符与输入代码,即P1端口的输出数据,之间的关系如表4.2所示。
在表4.2中,共阳极数码管的显示字符与输入代码的关系也被同时列出。
注意,两种显示代码都不驱动小数点的发光段“dp”。
硬件是软件的基础。
数码管接收的显示代码就是微控制器数字输出端口的输出数据,两者不同的连接关系将会具有不同的显示代码。
可以尝试采用更为方便的连接关系来组装电路,因为编写显示代码比在电路板上连线方便。
图4.2所示的数码管电路是由图2.1所示的流水灯电路改装来实现,数码管显示的控制程序同样可以由图2.8所示的MSP430系列微控制器开发软件的工作窗口中程序示例为模板写出。
逐个、顺序向P1端口输出寄存器(P1OUT)传送表4.2所示的数码管显示代码就可以实现数字的顺序、循环显示。
仿照图2.8中的程序示例,读者试着编写一个实现字符从0~F连续、循环显示的程序。
5
4.2.2显示数据的译码
以图2.8中的程序示例为模板写出的数码管显示程序可以实现字符从0~F连续、循环的显示,但是只能按照预先设定的模式进行显示。
如果希望使用数码管显示电路来显示一个测量结果,由于数据不可能事先知道,因此不可能在程序中向端口输出寄存器赋值对应的显示代码。
也不可以将测量数据直接送到端口输出寄存器,因为数据必须转换为对应的显示代码才能驱动数码管,实现希望的数据显示。
程序示例4.1能够自动地将希望显示的数据转换为相应的显示代码,这样就可以驱动数码管,实现数据显示的目的。
程序示例4.1
// 程序名称:seg1_1p
// 程序功能:1 个 8 段共阴极数码管显示
// MSP430 与数码管之间通过 P1 并行数据接口连接
#include <MSP430.h> // 包含名称定义和对应地址或数据的头函数
const unsigned char decoder_seg7[18]
={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a, 0x9e,0x8e,0x00,0xff}; // 共阴极数码管显示代码
// 连接关系按表 4.1 所示
int main(void) // 主函数
{
unsigned char data_seg7; // 声明显示数据变量
WDTCTL=WDTPW+WDTHOLD; // 关闭看门狗
P1SEL=0x00; // 设置 P1 端口为并行数字输入 / 输出口
P1DIR=0xff; // 设置 P1 端口为输出口
while(1) // 重复执行
{
for(data_seg7=0x00; data_seg7<0x10; data_seg7++)
// 利用循环语句产生显示数据
{
P1OUT=decoder_seg7[data_seg7]; // 数据译码, 显示代码送 P1 端口
}
}
}
对比图2.8所示的MSP430系列微控制器开发软件工作窗口中的程序示例,程序示例4.1在包含语句和主函数之间放置了1个常数表。
关键词“const”声明这个常数表将存储到程序存储器。
关键词“unsigned char”声明这个常数表中数据的类型,这里为无符号字符型数据类型,也可以理解为无符号8位数据类型。
unsigned char数据类型的值域为0x00~0xff,或者0~255。
“decoder_seg7”为给这个常数表起的名称。
名称后面中括号中的内容为这6
个常数表的容量。
主函数中的第1句
unsigned char data_seg7; // 声明显示数据变量
关键词“unsigned char”用来声明变量“data_seg7”的数据类型。
使用的数据,包括常量和变量,必须首先声明,然后再使用。
在程序中,通常将声明语句写在前面,将可执行语句写在声明语句的后面。
接着的语句用来关闭“看门狗”,这句的功用在第2章中已经介绍,这里不再重复。
再接着的2条语句涉及并行数字输入/输出端口相关寄存器的配置。
完成驱动数码管的并行数字输入/输出端口P1所需要的配置的语句如下
P1SEL=0x00; // 设置 P1 端口为并行数字输入 / 输出口
P1DIR=0xff; // 设置 P1 端口为输出口
向寄存器P1SEL赋值完成端口P1在并行数字输入/输出管脚,或者外围功能模块管脚之间的选择;向寄存器P1DIR赋值完成信号传输方向为流出MSP430微控制器芯片,或者流入MSP430微控制器芯片之间的选择。
现在的选择为端口P1用作并行数字输入/输出管脚,信号传输方向从MSP430微控制器芯片流出。
上述配置工作完成以后,当向并行数字输入/输出端口P1的输出寄存器P1OUT写入数据将使得对应的管脚电平发生相应的反应,进而驱动数码管,显示所需要的字符。
在实现重复执行的语句while(1)中存在一个循环语句。
for(data_seg7=0x00; data_seg7<0x10; data_seg7++)
这里使用这个循环语句来产生显示数据,模拟希望显示的测量结果。
循环语句起始数据为0,结束数据为F,完成1次循环数据加1。
这样数据循环语句实现显示数据变量data_seg7从0x00到0x0f的顺序、循环变化。
循环体中的语句
P1OUT=decoder_seg7[data_seg7]; // 数据译码, 显示代码送 P1 端口
以显示数据变量data_seg7作为地址对常数表decoder_seg7查表。
常数表decoder_seg7中放置着按照图3.2进行连线的共阴极数码管的显示代码。
显示代码按照显示数据从0x00到0x0f的顺序放置,这样显示代码的地址就是它对应的显示数据。
常数表decoder_seg7,即显示代码表,中查出来的显示代码送到并行数字输入/输出端口P1的输出寄存器P1OUT。
由于已经将端口P1配置为普通数字输入/输出端口、数据输出方向,这样端口P1的管脚电平以2进制数据格式反映输出寄存器P1OUT中的内容。
管脚上的电压最终驱动数码管的发光段,显示相应的字符。
从一种数据编码形式转换为另一种数据编码形式的过程通常称为“译码”,程序示例4.1利用查表的方法完成显示数据编码到数码管的显示代码的转换,因此将这样的程序也称为译码程序。
注意,程序示例4.1只能进行模拟调试和单步仿真,不能进行全速仿真,也不能用来对芯片进行编程,因为程序执行的速度太快。
如果MSP430微控制器芯片全速运行程序示例4.1,数码管的所有发光段看起来就像全部都亮起来一样。
7
4.3延时函数
对于数码管显示,MSP430微控制器芯片的工作速度显得非常快,因此程序示例 4.1不能全速运行。
如果在每次向并行数字输入/输出端口P1的输出寄存器P1OUT进行赋值以后,设法延迟一段时间,例如1s左右,然后再进行第二次赋值,这样就能观察到数码管的数字显示情况。
在C语言中,重复使用的语句块都写成函数形式,使得这个语句块能够在程序的不同地方使用。
使用函数能够提高程序存储器的使用效率,同时也简化程序的结构,提高程序的阅读性。
MSP430系列微控制器开发软件中,函数的声明、定义以及函数的调用格式将在本节结合一个可以独立运行的1位数码管演示程序予以说明。
4.3.1延时函数
实现1s左右时间的延迟函数如下。
void delay_1s(void) // 1s 延迟函数
{
unsigned long data_delay; // 声明循环次数变量
// 利用循环语句实现时间延迟
for(data_delay=0; data_delay<126654; data_delay++)
{
}
}
语句
void delay_1s(void) // 1s 延迟函数
中第1个关键词“void”用来声明这个函数无返回值。
“delay_1s”为函数名,函数名可以随便选取,但是不能使用关键词。
括号中的关键词“void”用来声明这个函数无参量,即调用这个函数不需要向函数传递数据。
延迟函数使用循环语句实现时间延迟,虽然现在循环体内部什么都没有做,但是即使空转也需要花费时间。
循环变量data_delay的循环终值控制循环次数。
具体的循环次数可以通过模拟调试获得。
按照所示的循环语句计数终值,调用函数delay_1s可以获得999999个机器周期的时间延迟。
当MSP430系统时钟频率为1MHz时,就可以获得非常接近于1s的时间延迟。
变量在使用之前必须声明,语句
unsigned long data_delay; // 声明循环次数变量
声明了变量data_delay,并指出这个变量的数据类型为无符号长整型,unsigned long。
无符号长整型数据具有32位,取值范围为0~4294967295。
8
4.3.2函数的使用
在程序示例4.1中,通过使用具有1s左右时间延迟的函数delay_1s(),使得这段程序能够被下载到MSP430微控制器芯片之中,并能够独立运行。
下面的程序示例4.2包含了函数的声明、函数原型以及函数调用。
程序示例4.2
// 程序名称:seg71p_delay
// 程序功能:1 个 8 段共阴极数码管显示
// 显示数据之间插入 1s 延迟
// MSP430 与数码管之间通过 P1 并行数据接口
#include <MSP430.h> // 包含名称定义和对应地址或数据的头函数
void delay_1s(void); // 声明 1s 延迟函数
const unsigned char decoder_seg7[18]
={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a, 0x9e,0x8e,0x00,0xff}; // 共阴极数码管显示代码
int main(void) // 主函数
{
unsigned char data_seg7; // 声明显示数据变量
WDTCTL=WDTPW+WDTHOLD; // 关闭看门狗
P1SEL=0x00; // 设置 P1 端口为并行数字输入 / 输出口
P1DIR=0xff; // 设置 P1 端口为输出口
while(1) // 重复执行
{
for(data_seg7=0x00; data_seg7<0x10; data_seg7++)
// 利用循环语句产生显示数据
{
P1OUT=decoder_seg7[data_seg7]; // 数据译码, 显示代码送 P1 端口 delay_1s( ); // 调用 1s 延迟函数
}
}
}
void delay_1s(void) // 1s 延迟函数
{
unsigned long data_delay; // 声明循环次数变量
// 利用循环语句实现时间延迟
for(data_delay=0; data_delay<126654; data_delay++)
{ }
}
9
程序示例4.2中,接着包含语句的语句
void delay_1s(void); // 声明 1s 延迟函数
被用来声明延迟函数。
在对显示数据进行译码、并将显示代码送到并行数字输入/输出端口P1的输出寄存器P1OUT的语句之后的语句
delay_1s( ); // 调用 1s 延迟函数
用来调用延迟函数。
由于调用的这个函数没有返回值,因此不需要向变量赋值,可以单独成行。
函数不需要传递参数,因此括号内为空。
程序示例4.2将延迟函数放在主函数之后。
函数也可以放在主函数之前。
如果函数放在主函数之前,这时就不需要在主函数之前对函数进行声明。
对于存在函数的程序调试,使用调试工具“Step Into”(快捷键F11),或者“Step Over”(快捷键F10)是有区别的。
“Step Into”调试工具与“Step Over”调试工具的区别是可以进入其它的函数内部逐条执行,完全描述微控制器内部程序的执行过程。
在被调用函数已经调试通过的情况下,使用工具“Step Over”可以加快调试速度。
程序示例4.2可以被下载到MSP430微控制器芯片,并独立运行。
4.4数据类型
变量在使用之前必须声明其数据类型,便于编译系统为这个变量分配存储空间。
MSP430系列微控制器开发软件支持的数据类型和存储各种数据类型数据占用的存储空间如表4.3所示。
数据类型的选择必须合适,即不能发生数据溢出,也不要浪费存储器资源。
不必要地选择较大值域的数据类型,不仅浪费存储器资源,而且完成同样的运算还会花费过长的时间,这点尤其在选择浮点数数据类型的情况。
通过模拟调试程序示例4.3可以直观地观察到在选择不同的数据类型对存储空间的占用和完成同样的加法运算所花费的时间。
10
程序示例4.3
// 程序名称:operate
// 程序功能:检查不同数据类型对运算时间、存储器资源的影响
#include<msp430.h> // 包含名称定义和对应地址或数据的头函数
int main(void) // 主函数
{
float data_a, data_b, data_c; // 声明显示数据变量
data_a=10; // 数据变量赋值
data_b=10;
while(1) // 重复执行
{
data_c=data_a+data_b; // 完成加法运算
_NOP(); // 避免 while 语句对运算时间的测量影响
}
}
在程序示例4.3中,变量data_a、data_b和data_c可以被声明为表4.3列出的任意一种数据类型。
在加法运算后面添加一条语句的目的是为了准确地测量加法运算所需要的时间,否则时间测量会受到循环语句的影响。
当变量data_a、data_b和data_c被声明为不同的数据类型,程序示例4.3需要的存储空间和完成加法运算所需要的时间如表4.4所示。
表4.4显示,对于整型数据变量,同类型的有符号数和无符号数对资源的占用和完成加法运算所需要的时间是一样的。
字符型(char)数据变量和整型(int)数据变量对资源的占用和完成加法运算所需要的时间是一样的,这是因为MSP430微控制器是一种16位器件。
长整型(long)数据变量由于数据宽度为32位,16位MSP430微控制器需要分2次完成加法运算,因此将占用较多的资源,需要较多的运算时间。
浮点型(float)数据变量在编译过程中需要调用MSP430系列微控制器开发软件提供的函数,并把函数添加到用户程序之中,所以这时将占用更多的资源,需要更多的运算时间。
11
12 MSP430系列微控制器中的存储器是按字节为单位来组织,因此不存在字节对准问题,数据结构的成员是顺序放置的。
例如整型变量的长度为16位,它的存储需要2个字节,如果这个整型变量的数值为0x1234,它在存储器中按以下方式存储。
地址
数值
+0+1
0x34
0x12
图4.3 数据的存储方式
浮点型数据的长度为32位,它存储需要4个字节,它的组成和在存储器中的存储方式如图4.4所示。
地址数值
SEEE EEEE
+0EMMM MMMM MMMM MMMM MMMM MMMM
+1
+2
+3
图4.4 浮点型数据的组成和在存储器中的存储方式
图中,S :符号位。
1表示负,0表示正; E :阶码; M :尾数。
4.5 循环语句
在需要进行规律性的重复操作时,循环语句能够简化程序结构。
例如,程序示例 4.1和程序示例4.2中采用循环语句产生显示数据比使用顺序程序结构具有很大的优势。
循环语句由循环体和循环终止条件两部分组成。
MSP430系列微控制器开发软件支持的循环语句有以下3种:while 语句、do while 语句以及for 语句。
4.5.1 while 语句
while 语句的格式为
while (表达式)
// 循环终止条件
{ 可执行语句;
// 循环体
}
括号中的表达式的计算结果用来判定循环体中的语句是否被执行。
当表达式的计算结果为非0,即逻辑真,就执行循环体中的语句;循环体中的语句被执行完以后,再次计算这个括号中的表达式,并再次判断是否执行循环体中的语句。
当表达式的计算结果为0,
即逻辑假,循环体中的语句将不被执行,并且不再判断是否执行循环体中的语句,转为执行该循环语句后面跟着的语句。
while语句的特点首先进行是否执行循环体的条件判断,即首先计算表达式,因此循环体中的内容可能一次都不执行。
如果循环体内具有多条语句,循环体必须使用花括号{ },表示循环体是一个语句块。
如果循环体内只有一条语句,循环体可以不使用花括号{ }。
推荐使用花括号{ }将循环体包括起来,使程序更加安全可靠。
在前面所有的程序示例中,主函数内部都有一个while语句的应用实例
while(1) // 重复执行
{
……
}
这里的表达式的值恒为1,因此循环体的内容将被一直执行。
4.5.2do while语句
do while语句的格式为
do
{
可执行语句;// 循环体
}
while(表达式)// 循环终止条件
do while语句的特点首先执行循环体,然后进行是否再次执行循环体的条件判断,因此循环体中的内容至少被执行一次。
括号中的表达式的计算结果用来判定循环体中的语句是否被再次执行。
当表达式的计算结果为非0,即逻辑真,就再次执行循环体中的语句。
当表达式的计算结果为0,即逻辑假,循环体中的语句将不被执行,转为执行该循环语句后面跟着的语句。
在第3章给出的高频振荡器(XT2)初始化函数clkxt2_begin中有一个do while语句的应用实例
do
{
IFG1&=~OFIFG; // 清除振荡器错误标志
_NOP( ); // 产生一个 MSP430 系统时钟周期的延时}
while((IFG1 & OFIFG)!=0); // 如果标志为 1,继续等待
这里首先清除标志OFIFG,然后进行检测,如果标志OFIFG没有清除,再次清除标志OFIFG,直到完成。
13
4.5.3for语句
for语句的格式为
for( 表达式1;表达式2;表达式3 )
{
可执行语句;// 循环体
}
for语句的工作步骤为
第1步:利用表达式1完成循环条件的初始化;
第2步:利用表达式2判断是否满足循环条件,如果满足条件,执行循环体内的语句,然后进入第3步;如果不满足条件,结束for语句,转为执行该循环语句后
面跟着的语句;
第3步:利用表达式3调整循环条件,再回到第2步。
延迟函数delay_1s中使用for语句
for(data_delay=0; data_delay<126654; data_delay++)
{
}
使用循环语句实现时间延迟,虽然这里循环体内部什么都没有做,但是即使空转也需要花费时间。
这个循环语句对应表达式1的位置给变量data_delay赋初值0;对应表达式2的位置判断变量data_delay是否小于126654,如果条件成立,进入循环体,否则结束循环语句;从循环体出来会利用对应表达式3的表达式使变量data_delay加1,再次判断变量data_delay 是否小于126654。
相对于使用多重循环结构来实现多次循环,这里使用单循环结构容易利用模拟调试获得要求时间的延迟。
for语句的3个表达式的位置可以全部为空,即
for( ;;)
{
可执行语句;// 循环体
}
这将导致无限循环。
这种结构可以代替
while(1) // 重复执行
{
可执行语句;
}
for语句的3个表达式的位置也可以部分为空。
如果表达式1缺省,for语句将不对循环变量赋初值,这时循环变量初值取决于程序执行状态,即循环变量初值为变量的当前值;如果表达式2缺省,这时循环条件一直成立,循环将一直进行;如果表达式1和表达式3缺省,这时循环变量初值取决于程序执行状态,在循环体内需要修改循环变量。
14
4.6小结
并行输入/输出接口是计算机一种数据交换接口。
MSP430微控制器提供多个并行输入/输出接口。
这些并行输入/输出接口的配置和使用是通过访问相关寄存器来实现的。
本章介绍了除过涉及中断功能以外的并行输入/输出接口的相关寄存器。
数码管是一种应用系统常用的显示器件,它属于一种并行接口器件。
使用MSP430微控制器提供多个并行输入/输出接口可以直接驱动数码管。
需要显示的数据必须经过译码才能送到数码管,利用查表的方法是实现译码的一种方法。
利用循环语句,即使空转,也能实现延时功能。
在显示演示程序每次输出之后添加一段具有延时功能的语句块能够使演示正常进行。
本书没有按照首先介绍C语言,然后再进行程序设计的方法组织内容,而是通过一系列具有明确目的的设计任务来组织撰写的内容,这样在C语言内容的完整性方面可能有所欠缺。
为了弥补这点,结合需要,前一章介绍了逻辑位的运算操作符,用来实现位寻址功能的实现;本章介绍了MSP430系列微控制器开发软件支持的数据类型、循环语句以及函数的使用。
在后继章节中,C语言的其它内容还将继续介绍。
15。