3.3.2 XC8语言的特性
本文讲的是PIC微控制器项目设计:C语言一3.3.2 XC8语言的特性,在本节中,我们将介绍XC8 C语言的一些特性。不熟悉C语言的读者在继续阅读本章之前应阅读第4章。这里将在适当的时候将给出mikroC Pro for PIC和XC8之间的差异。
有关XC8语言的详细信息可以参阅MPLAB XC8编译器用户指南,该指南可从Microchip公司网站上获取。
程序模板
当创建一个新的XC8程序时,编译器生成图3.22所示的模板。在程序中,我们将修改此模板,并使用图3.23所示的模板来代替它。
XC8程序具有以下结构:
必须在程序开始处声明单个头文件,以声明所有编译器和器件特定类型及SFR。
变量类型
XC8支持表3.1中的变量类型。请注意,字符型变量本身与无符号字符型变量相同。
此外,XC8编译器支持24位或32位浮点变量,可以使用关键字double和float进行声明。
常量
常量对象是只读的,它们存储在微控制器的程序存储器中。在程序中不改变值的对象应存储为常量,以节省有限的随机存取存储器空间。
常量声明的示例如下所示:
在最后一个例子中,从程序存储单元0x100处开始存储常量表。
持久性限定符
持久性限定符可指示变量不能被运行时启动代码所清除。下面给出一个例子:
访问各个I/O引脚
可以通过指定端口名称,后跟字位,然后是句点和端口引脚名称来访问单个I/O引脚。下面给出一个例子:
访问变量的各个位
可以使用以下的宏定义设置或复位变量的各个位:
下面的代码设置了变量Count的第2位:
指定配置位
pragma config指令用于为微控制器编程配置位。下面给出一个例子:
C程序中的汇编语言指令
使用asm语句可以将汇编语言指令插入C程序中。下面给出一个例子:
中断服务程序
中断服务程序通过关键字interrupt来识别,然后是程序的名字。下面给出一个例子:
中断优先级可以在关键字interrupt后指定。例如,
如果要在主程序和中断服务程序之间访问变量,那么建议将这些变量声明为volatile。
语句ei( )和di( )分别启用和禁用全局中断。
程序启动
Main()函数是复位后执行的第一个函数。然而,在复位之后,由编译器提供的附加代码,(也称为启动代码)首先被执行。启动代码将控制传递给main()函数,在启动代码期间,带有指定值的全局变量将加载这些值,没有指定值的全局变量被清除为零。跳转到地址0(复位)位于函数main()的结尾处,因此,如果在main()中最后一条指令之后包含返回语句,或者代码执行到达main()结束处的最后一个终止括号,则程序执行软复位。建议在程序结束时添加一个循环,以便程序在结束时不再执行软复位。
MPLAB XC8软件库函数
MPLAB XC8编译器包含大量的软件库,它们在程序开发过程中非常有用。在本节中,我们将讨论一些常用的库函数。
__delay_ms, __delay_us _delay, _delay3
函数__delay_ms和__delay_us可在程序中创建毫秒和微秒级别的延迟。在使用这些函数之前,应先使用定义_XTAL_FREQ声明时钟频率。假设时钟频率为8MHz,以下代码可以生成20ms延迟:
函数_delay可以根据参数中指定的指令周期创建延迟。在下面的示例中,延迟为20个指令周期:
函数_delay3可以基于3倍指令周期创建延迟。在下面的示例中,延迟为60个指令周期:
__EEPROM_DATA
此函数将数据存储在EEPROM存储器中,这些数据必须以8字节的数据块指定。下面给出一个例子:
ab, labs
它们分别返回整数(abs)或长整数(labs)的绝对值。头文件必须在程序开始处声明。下面给出一个例子:
cos, sin, tan
这些函数返回三角函数的结果,参数必须以弧度来表示。头文件必须在程序的开头声明。下面给出一个例子来计算30°的正弦值,并将结果存储在变量s中:
cosh, sinh, tanh
这些函数实现了双曲线函数cosh、sinh和tanh。头文件必须在程序的开头处声明。下面给出一个例子来计算3.2的双曲正弦函数值:
acos, asin, atan, atan2
这些函数返回以弧度表示的三角函数的倒数。头文件必须在程序的开头声明。
itoa
此函数将数字转换为带有指定基数的字符串。头文件必须在程序的开头声明。在下面的例子中,数字25被转换为字符串并保存到具有十六进制基数的变量bufr中:
log, log10
函数log返回浮点数的自然对数。函数log10返回以10为底的对数。头文件必须包含在程序的开头。
memcmp
此函数是用指定的字节填充n个字节的内存。头文件必须在程序的开头声明。在下面的例子中,表示了用10个字符‘x’填充bufr:
rand
这是一个随机数生成函数,它返回一个0~32?767之间的整数,每次调用该函数时生成的数都会发生改变。头文件必须在程序的开头声明。起始点使用函数srand进行设置。下面给出一个例子:
round
此函数将参数四舍五入为浮点格式最接近的整数值。头文件必须在程序的开头声明。下面给出一个例子:
SLEEP
使用此函数可以将微控制器置于睡眠模式。
sqrt
此函数可以计算浮点数的平方根。头文件必须在程序的开头声明。
String Functions
提供的一些字符串函数如下所示:
tolower, toupper, toascii
它们的作用分别是将小写字符转换为大写字符,将大写字符转换为小写字符,以及将字符转换为ASCII码。
trunc
此函数将参数四舍五入为最接近的整数。头文件必须在程序的开头处声明。
MPLAB XC8外设库
除了这些有用的函数之外,XC8编译器还提供了许多外设库,在使用外围设备开发复杂项目时它们是非常有用的。这些库可用在LCD、SD卡、USB端口、CAN总线、I2C总线、SPI总线等处。
原文标题:PIC微控制器项目设计:C语言一3.3.2 XC8语言的特性