6.5.5 内部函数库

内部函数库提供了循环移位和延时等操作函数。内部函数的原型声明包含在头文件intrins.h中,内部函数库的函数如表6.10所示。下面分别介绍各个函数。

1.循环左移函数crolirollrol

6.5.5 内部函数库 - 图1

循环左移函数crolirollrol的函数原型如下。


unsigned charcrol(unsigned char val,unsigned char n);

unsigned intirol(unsigned int val,unsigned char n);

unsigned longlrol(unsigned long val,unsigned char n);


其中,参数val为待移位的变量,n为循环移位的次数。循环左移函数主要用于将数据按照二进制循环左移n位。函数crolirollrol分别用于字符型、整型和长整型变量的循环左移,其返回值分别为移位后的字符型、整型和长整型数据。程序示例如下。


include<intrins.h>//头文件

include<stdio.h>

include<reg51.h>

void main(void)//主函数

{

char a=0x5A;//声明并初始化变量

int b=21;

long c=123456789;

//初始化串口

printf(“crol(%bx,1)=%bx\n”,a,crol(a,1));//循环左移一位

printf(“irol(%d,3)=%d\n”,b,irol(b,3));//循环左移三位

printf(“lrol(%ld,3)=%ld\n”,c,lrol(c,3));//循环左移三位

}


该程序可以在KeilµVision3编译环境中执行,运行的结果如下。


crol(5a,1)=b4

irol(213,3)=168

lrol(123456789,3)=987654312


在该程序中,首先声明并初始化变量,接着分别调用crol函数、irol函数和lrol函数来对a进行循环左移1位,对b和c进行循环左移3位,最后使用printf函数输出结果。

2.循环右移函数crorirorlror

循环右移函数crorirorlror的函数原型如下。


unsigned charcror(unsigned char val,unsigned char n);

unsigned intiror(unsigned int val,unsigned char n);

unsigned longlror(unsigned long val,unsigned char n);


其中,参数val为待移位的变量,n为循环移位的次数。循环右移函数主要用于将数据按照二进制循环右移n位。函数crorirorlror分别用于字符型、整型和长整形变量的循环右移,其返回值分别为移位后的字符型、整型和长整形数据。程序示例如下。


include<intrins.h>//头文件

include<stdio.h>

include<reg51.h>

void main(void)//主函数

{

char a=0x5A;//声明并初始化变量

int b=21;

long c=123456789;

//初始化串口

printf(“cror(%bx,1)=%bx\n”,a,cror(a,1));//循环右移1位

printf(“iror(%d,3)=%d\n”,b,iror(b,3));//循环右移3位

printf(“lror(%ld,3)=%ld\n”,c,lror(c,3));//循环右移3位

}


该程序可以在KeilµVision3编译环境中执行,运行的结果如下。


cror(5a,1)=2d

iror(21,3)=-24574

lror(123456789,3)=-1595180638


在该程序中,首先声明并初始化变量,接着分别调用cror函数对a进行循环右移1位,调用iror函数和lror函数来对b和c进行循环右移3位,最后使用printf函数输出结果。

3.延时函数nop

延时函数nop的函数原型如下。


voidnop(void);


延时函数nop用于使单片机程序产生延时,该函数类似于8051单片机的NOP指令。程序示例如下。


include<intrins.h>//头文件

include<reg51.h>

void main(void)//主函数

{

P2=0xAA;//P1端口输出0xAA

nop();//延时

P2=0x55;//P1端口输出0x55

}


该程序可以在KeilµVision3集成开发环境中运行。在程序中,首先置P1端口为0xAA,接着调用nop()函数延时,然后置P1端口为0x55。

4.位测试函数testbit

位测试函数testbit的函数原型如下。


voidtestbit(bit x);


其中,参数x为待测位变量。位测试函数testbit用于对字节中的一位进行测试,如果该位变量置位则函数返回1,同时将该位复位为0,否则返回0。该函数只能用于可直接寻址的位,不可以在表达式中使用。程序示例如下。


include<intrins.h>//头文件

include<stdio.h>

include<reg51.h>

void main(void)//主函数

{

bit flag;//声明位变量

//初始化串口

flag=1;//置位位变量

if(testbit(flag))//位测试函数

printf(“Bit was set\n”);

else

printf(“Bit was clear\n”);

if(testbit(flag))//再次进行位测试函数

printf(“Bit was set\n”);

else

printf(“Bit was clear\n”);

}


该程序可以在KeilµVision3编译环境中执行,运行的结果如下。


Bit was set

Bit was clear


在该程序中,首先声明并初始化位变量flag=1,接着调用testbit函数测试该位变量是否置位,如果置位,则将flag重置为0。因此,再次测试时该位变为0。