Keil Software –Cx51 编译器…

本文档详细介绍了Cx51编译器在编译过程中可能遇到的各类错误与警告信息,并提供了每种错误和警告的具体含义及解决建议。此外,还概述了Cx51标准库的功能特性,包括其提供的丰富函数和宏定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Keil Software –Cx51 编译器用户手册 中文完整版--页面标题


 (摘于http://www.18ic.com/Html/mpumcu/2005122959_4.html
223 被零取模
编译器检测到一个被零除或取模
225 表达式太复杂需简化
一个表达式太复杂必须分成两个或多个子表达式
226 重复的struct/union/enum标记
一个struct union 或enum名早已定义
227 表示一个union标记
一个union名称早已定义为别的类型
228 表示一个struct标记
一个struct名早已定义为别的类型
229 表示一个enum标记
一个enum名早已定义为别的类型
230 未知的struct/union/enum标记
指定的struct union 或enum名未定义
231 重复定义
指定的名称已被定义
232 重复标号
指定的标号已定义
233 未定义标号
表示一个标号未定义有时候这个信息会在实际的标号的几行后出现这是所
用的未定义标号的搜索方法引起的
234 { 堆栈范围溢出31
超过了最多31个嵌套块超出的嵌套块被忽略
235 参数<数字> 不同类型
函数声明的参数类型和函数原型中的不同
Keil Software – Cx51 编译器用户手册— 第七章错误信息199
号错误信息和说明
236 参数列表的长度不同
函数声明中的参数数目和函数原型中的不同
237 函数早已定义
试图声明一个函数体两次
238 重复成员
239 重复参数
试图定义一个已存在的struct成员或函数参数
240 超出128个局部bit
在一个函数内不能超过128个bit标量
241 auto段太大
局部目标所需的空间超过模式的极限最大的段大小定义如下
SMALL 128字节
COMPACT 256字节
LARGE 65535字节
242 太多的初始化软件
初始化软件的数目超过初始化目标的数量
243 字符串超出范围
字符串中的字符数目超出字符串初始化的数目
244 不能初始化错误的类型或类
试图初始化一个bit或sfr
245 未知的pragma 跳过本行
#pragma状态未知所以整行被忽略
246 浮点错误
当一个浮点参数超出32位的范围就产生本错误32位IEEE值的范围是
±1.175494E-38到±3.402823E+38
247 非地址/常数初始化
一个有效的初始化表达式必须是一个常数值求值或一个目标名加或减去一个常

248 集合初始化需要大括号
给定struct或union初始化缺少大括号{}
249 段<名> 段太大
编译器检测到一个数据段太大一个数据段的最大的大小由存储空间决定
250 \esc 值超过255
一个字符串常数中的转义序列超过有效值范围最大值是255
252 非法八进制数
指定的字符不是一个有效的八进制数
252 主要控制放错地方行被忽略
主要控制必须被指定在C模块的开头在任何#include命令或声明前
Keil Software – Cx51 编译器用户手册— 第七章错误信息200
号错误信息和说明
253 内部错误ASMGEN\CLASS
在下列情况下出现本错误
  一个内在函数例如_testbit_ 被错误激活这种情况是在没有函数原
型存在和实参数目或类型错误对这种原因必须使用合适的声明文件
INTRINS.H STRING.H 参考第八章中的instrinsic函数
  Cx51确认一个内部一致性问题请接洽技术支持
255 switch表达式有非法类型
在一个switch表达式没有合法的数据类型
256 存储模式冲突
一个包含alien属性的函数只能包含模式标识符small 函数的参数必须位于内
部数据区这适用于所有的外部alien声明和alien函数例如
alien plm_func(char c) large {…}
产生错误256
257 alien函数不能重入
一个包含alien属性的函数不能同时包含reentrant属性函数参数不能跳过虚拟
堆栈传递这适用于所有的外部alien声明和alien函数
258 struct/union成员的存储空间非法
非法空间的参数被忽略
一个结构的成员或参数不能包含一个存储类型标识符但指针所指的目标可
能包含一个存储类型例如
struct vp{char code c;int xdata i; };
产生错误258
struct v1{char c;int xdata *i; };
是正确的struct声明
259 指针不同的存储空间
一个空指针被关联到别的不同存储空间的空指针例如
char xdata *p1;
char idata *p2;
p1 = p2;
260 指针断开
一个空指针被关联到一些常数值这些值超过了指针存储空间的值范围例如
char idata *p1 = 0x1234;
Keil Software – Cx51 编译器用户手册— 第七章错误信息201
号错误信息和说明
261 reentrant()内有bit
一个可重入属性的函数的声明中不能包含bit目标例如
int func1(int i1) reentrant {
bit b1,b2;
return(i1-1);
}
262 using/disable 不能返回bit值
用using属性声明的函数和禁止中断#pragma disable 的函数不能返回一个bit
值给调用者例如
bit test(void) using 3
{
bit b0;
return(b0);
}
产生错误262
263 保存/恢复堆栈保存溢出/下溢
#pragma save的最大嵌套深度是八级堆栈的pragma save和restore工作根据
LIFO 后进先出规则
264 内在的<内在的名称> 声明/激活错误
本错误表示一个内在的函数错误定义参数数目或省略号如果用标准的.H
文件就不会产生本错误确认使用了Cx51所有的.H文件不要尝试对内在的
库函数定义自己的原型
265 对非重入函数递归调用
非重入函数不能被递归调用因为这样会覆盖函数的参数和局部数据如果需
要递归调用需声明函数为可重入函数
267 函数定义需要ANSI类型的原型
一个函数被带参数调用但是声明是一个空的参数列表原型必须有完整的参
数类型这样编译器就可能通过寄存器传递参数和适合应用的调用机制
268 任务定义错误任务ID/优先级/using
任务声明错误
271 asm/endasm 控制放错地方
asm和endasm声明不能嵌套endasm要求一个汇编块前面用asm开头例如
#pragma asm
...
汇编指令
...#pragma endasm
Keil Software – Cx51 编译器用户手册— 第七章错误信息202
号错误信息和说明
272 asm 要求激活SRC控制
在一个源文件中使用asm和endasm 要求文件用SRC控制编译那么编译器就
会生成汇编源文件然后可以用A51汇编
273 asm/endasm 在包含文件中不允许
在包含文件中不允许asm和endasm 为了调试在包含文件不能有任何的可执
行代码
274 非法的绝对标识符
绝对地址标识符对位目标函数和局部函数不允许地址必须和目标的存储
空间一致例如下面的声明是无效的因为间接寻址的范围是0x00到0xFF
idata int _at_ 0x1000;
278 常数太大
当浮点参数超出32位的浮点值范围就产生本错误32位IEEE值的范围是
±1.175494E-38到±3.402823E+38
279 多次初始化
试图多次初始化一个目标
280 没有使用符号/标号/参数
在一个函数中声明了一个符号标号或参数但没有使用
281 非指针类型转换为指针
引用的程序目标不能转换成一个指针
282 不是一个SFR引用
本函数调用要求一个SFR作为参数
283 asmparms 参数不适合寄存器
参数不适合可用的CPU寄存器
Keil Software – Cx51 编译器用户手册— 第七章错误信息203
284 <名称> 在可覆盖空间函数不再可重入
一个可重入函数包含对局部变量的明确的存储类型标识符函数不再
完全可重入
300 注释未结束
一个注释没有一个结束符*/
301 期望标识符
一个预处理器命令期望一个标识符
302 误用#操作符
字符操作符# 没有带一个标识符
303 期望正式参数
字符操作符# 没有带一个标识符表示当前所定义的宏的一个正式
参数名
304 错误的宏参数列表
宏参数列表没有一个大括号逗号分开的标识符列表
305 string/char 常数未结束
一个字符串活字符常数是无效的典型的后引号丢失
306 宏调用未结束
预处理器在收集和扩展一个宏调用的实际的参数时遇到输入文件的结

Keil Software – Cx51 编译器用户手册— 第七章错误信息204
号错误信息和说明
307 宏名称参数计算不匹配
在一个宏调用中实际的参数数目和宏定义的参数数目不匹配本错
误表示指定了太少的参数
308 无效的整数常数表达式
一个if/elif 命令的数学表达式包含一个语法错误
309 错误或缺少文件名
在一个include 命令中的文件名参数是无效的或没有
310 条件嵌套过多20
源文件包含太多的条件编译嵌套命令最多允许20 级嵌套
311 elif/else 控制放错地方
312 endif 控制放错地方
命令elif else 和endif 只有在if ifdef 或ifndef 命令中是合法的
313 不能清除预定义的宏名称
试图清除一个预定义宏用户定义的宏可以用#undef 命令删除预定
义的宏不能清除
314 #命令语法错误
在一个预处理器命令中字符# 必须跟一个新行或一个预处理器
命令名例如if/define/ifdef …
315 未知的#命令名称
预处理器命令是未知的
316 条件未结束
到文件结尾endif 的数目和if 或ifdef 的数目不匹配
318 不能打开文件文件名
指定的文件不能打开
319 文件不是一个磁盘文件
指定的文件不是一个磁盘文件文件不能编辑
320 用户自定义的内容
本错误号未预处理器的#error 命令保留#error 命令产生错误号320
送出用户定义的错误内容终止编译器生成代码
321 缺少<字符>
在一个include 命令的文件名参数中缺少结束符例如
#include<stdio.h
325 正参名称重复
一个宏的正参只能定义一次
326 宏体不能以## 开始或结束
## 不能是一个宏体的开始或结束
327 宏宏名超过50 个参数
每个宏的参数数目不能超过50
Keil Software – Cx51 编译器用户手册— 第七章错误信息205
警告
警告产生潜在问题的信息他们可能在目标程序的运行过程中出现警告不妨碍源文
件的编译
警告在列表文件中生成信息警告信息用下面的格式
*** WARNING number IN LINE line OF file: warning message
这里
number 错误号
line 在源文件或包含文件中的对应行号
file 错误产生的源或包含文件名
warning message 警告的内容
下表按号列出了警告警告信息包括一个主要的内容和可能的原因和纠正措施
号警告信息和说明
173 缺少返回表达式
一个函数返回一个除了int 类型以外的别的类型的值必须包含一个
返回声明包括一个表达式为了兼容旧的程序对返回一个int 值
的函数不作检查
182 指针指向不同的目标
一个指针关联了一个不同类型的地址
185 不同的存储空间
一个目标声明的存储空间和前面声明的同样目标的存储空间不同
196 存储空间可能无效
把一个无效的常数值分配给一个指针无效的指针常数是long 或
unsigned long 编译器对指针采用24 位3 字节低16 位代表偏移
高8 位代表选择的存储空间
198 sizeof 返回零
一个目标的大小计算结果为零如果目标是外部的或如果一个数组
的维数没有全知道则值是错误的
Keil Software – Cx51 编译器用户手册— 第七章错误信息206
号警告信息和说明
206 缺少函数原型
因为没有原型声明被调用的函数是未知的调用一个未知的函数通
常是危险的参数的数目和实际要求不一样如果是这种情况函数
调用不正确
没有函数原型编译器不能检查参数的数目和类型要避免这种警告
应在程序中包含函数的原型
函数原型必须在函数被调用前声明注意函数定义自动生成原型
209 实参太少
在一个函数调用中包含太少的实参
219 long 常数被缩减为int
一个常数表达式的值必须能被一个int 类型所表示
245 未知的pragma 本行被忽略
#pragma 声明是未知的因此整行程序被忽略
258 struct/union 成员的存储空间方法
参数的存储空间被忽略
一个结构的成员或一个参数不能指定存储类型但是指针所指的目
标可以包含一个存储类型例如
struct vp{ char code c;int xdata i; };
产生警告258
struct v1{ char c;int xdata *i; };
对struct 是正确的声明
259 指针不同的存储空间
两个要比较的指针没有引用相同的存储类型的目标
260 指针折断
把一个指针转换为一个更小偏移区的指针转换会完成但大指针的
偏移会折断来适应小指针
261 bit 在重入函数
一个reentrant 函数不能包含bit 因为bit 标量不能保存在虚拟堆栈中
265 名称对非重入函数递归调用
发现对一个非重入函数直接递归这可能是故意的但对每个独立的
情况进行功能性检查通过生成的代码间接递归由连接/定位器检

Keil Software – Cx51 编译器用户手册— 第七章错误信息207
号警告信息和说明
271 asm/endams 控制放错地方
asm 和endasm 不能嵌套endasm 要求一个以asm 声明开头的汇编块
例如
#pragma asm
...
汇编指令
...
#pragma endasm
275 表达式可能无效
编译器检测到一个表达式不生成代码例如
void test(void) {
int i1,i2,i3;
i1,i2,i3;
i1 << i3;
}
276 常数在条件表达式
编译器检测到一个条件表达式有一个常数值在大多数情况下是一个
输入错误例如
void test(void) {
int i1,i2,i3;
if( i1 = 1) i2 = 3;
while( i3 = 2);
}
277 指针有不同的存储空间
一个typedef 声明的存储空间冲突例如
typedef char xdata XCC;
typedef XCC idata PICC;
280 符号/标号未使用
一个符号或标号定义但未使用
307 宏名称参数计算不匹配
一个宏调用的实参的数目和宏定义的参数数目不匹配表示用了太多
的的参数过剩的参数被忽略
317 宏名称重新定义无效
一个预定义的宏不能重新定义或清除参考138 页的预定义宏常数
322 未知的标识符
在一个#if 命令行的标识符未定义等效为FALSE
323 期望新行发现多余字符
一个#命令行正确但包含多余的非注释字符例如
#include <stdio.h> foo
Keil Software – Cx51 编译器用户手册— 第七章错误信息208
号警告信息和说明
324 期望预处理器记号
期望一个预处理器记号但输入的是一个新行例如#line 这里缺
少#line 命令的参数
Keil Software – Cx51 编译器用户手册— 第八章库参考209
      
Cx51 运行库提供超过100 个可用在8051 C 程序中的预定义函数和宏通过库所提供
程序执行公共的程序任务例如字符串和缓冲区操作数据转换和浮点算术运算
使得内嵌软件开发更容易
典型的本库的程序符合ANSI C 标准但是为了利用8051 结构的特性一些程序
有些不同例如函数isdigit 返回一个bit 值而不是一个int 如有可能函数的返回
类型和参数类型调整为更小的数据类型另外unsigned data 类型比signed 更有利
这些对标准库的改变可以提供最好的性能同时减少程序的大小
库中的所有程序和函数使用什么寄存器组无关
固有程序
Cx51 编译器支持许多固有的库函数非固有函数用ACALL 或LCALL 指令调用库程
序固有函数生成内嵌代码运行库程序生成的内嵌代码比调用一个程序更快更有
效下面的函数就是固有函数
_crol_ _iror_ _nop_
_cror_ _lrol_ _testbit_
_irol_ _lror_
在下面各节中详细这些程序
Keil Software – Cx51 编译器用户手册— 第八章库参考210
库文件
Cx51 库包括六个编译库对各种功能性要求进行优化这些库支持大多数的ANSI C
函数调用
库文件说明
C51S.LIB SMALL 模式库没有浮点运算
C51FPS.LIB SMALL 模式浮点运算库
C51C.LIB COMPACT 模式库没有浮点运算
C51FPC.LIB COMPACT 模式浮点运算库
C51L.LIB LARGE 模式库没有浮点运算
C51FPL.LIB LARGE 模式浮点运算库
80C751.LIB SIGNETICS 8xC751 和派生系列库
PHILIPS 80C51MX DALLAS390 连续模式和可变代码BANKING 要求一个不同的Cx51
运行库LX51 连接/定位器自动把相应的库加到PROJECT 中
几个库模块以源代码形式提供这些程序用来运行和低级硬件相关的I/O 的流I/O 函数
可以在LIB 目录发现这些程序的源文件可以修改这些源文件替换库中的程序应
用这些程序可以快速的使用库来运行用任何目标可用的硬件I/O 设备流I/O 参
考224 页的流输入和输出
Keil Software – Cx51 编译器用户手册— 第八章库参考211
标准类型
Cx51 标准库包含许多标准类型的定义它们可以用在库程序中这些标准类型在包含
文件中声明可以被C 程序访问
jmp_buf
jmp_buf 类型在SETJMP.H 中定义指定了setjmp 和longjmp 程序用来保存和恢复程
序环境的缓冲区jmp_buf 类型如下定义
#define _JBLEN 7
typedef char jmp_buf[_JBLEN];
va_list
va_list 数组类型在STDARG.H 定义本类型保存va_arg 和va_end 程序所需的数据
va_list 类型如下定义
typedef char *va_list;
Keil Software – Cx51 编译器用户手册— 第八章库参考212
绝对存储区访问宏
Cx51 标准库包含许多允许访问直接存储地址的宏的定义这些宏定义在ABSACC.H
中每个宏的用法和数组一样
CBYTE
CBYTE 宏允许访问8051 程序存储区的每个字节可以在程序中这样使用宏
rval = CBYTE[0x0002];
读程序存储区地址0002h 字节的内容
CWORD
CWORD 宏允许访问8051 程序存储区的每个字节可以在程序中这样使用宏
rval = CWORD[0x0002];
读程序存储区地址0004h 2×sizeof(unsigned int)=4 字的内容
注意
这个宏所用的索引不代表存储区地址的整数值为了得到存储区地址必须索引乘以
一个整数2 字节的大小
Keil Software – Cx51 编译器用户手册— 第八章库参考213
DBYTE
DBYTE 宏允许访问8051 内部数据存储区的单个字节可以在程序中这样使用宏
rval = DBYTE[0x0002];
DBYTE[0x0002] = 5
读或写内部数据区地址0002h 字节的内容
DWORD
DWORD 宏允许访问8051 内部数据存储区的单个字节可以在程序中这样使用宏
rval = DWORD[0x0002];
DWORD[0x0002] = 57
读或写内部数据区地址0004h 2×sizeof(unsigned int)=4 字的内容
注意
这个宏所用的索引不代表存储区地址的整数值为了得到存储区地址必须索引乘以
一个整数2 字节的大小
Keil Software – Cx51 编译器用户手册— 第八章库参考214
FARRAY FCARRAY
FARRAY 和FCARRAY 宏可以用来访问一个far 和const far 存储区的数组类型目标
FARRAY 访问far 空间存储类HDATA FCARRAY 访问const far 空间存储类
HCONST 可以在程序中这样用宏
int i;
long l;
l = FARRAY(long,0x8000)[i];
FARRAY(long,ox8000)[10] = 0x12345678;
#define DualPortRam FARRAY(int,0x24000)
DualPortRam[i] = 0x1234;
l = FCARRAY(long,0x18000)[5];
FARRAY 和FCARRAY 宏把目标的类型大小加到结果地址得到索引最后的地址用
来访问存储区
注意
绝对地址目标不能穿过64KB 段边界例如不能访问一个起始地址为0xFFF8 有10
个元素的long 数组
Keil Software – Cx51 编译器用户手册— 第八章库参考215
FVAR FCVAR
FVAR 和FCVAR 宏可以用来访问far 和const far 存储区的绝对地址FVAR 访问far
空间存储类HDATA FCVAR 访问const far 空间存储类HCONST 可以在程序
中这样用宏
#define IOVL FVAR(long,0x14FFE) // long 在HDATA 地址0x14FFE
var = IOVAL;
IOVAL = 0x10
var = FCVAR(int,0x24002)
HVAR 宏用huge 修饰符用段和偏移访问存储区但和MVAR 的页和偏移不一样
注意
绝对地址目标不能穿过64KB 段边界例如不能在地址0xFFFE 访问一个long 变量
Keil Software – Cx51 编译器用户手册— 第八章库参考216
PBYTE
PBYTE 宏允许访问8051 外部页数据区的单个字节可以如下使用
rval = PBYTE[0x0002];
PBYTE[0x002] = 38;
读或写pdata 存储区地址0002h 的字节内容
PWORD
PWORD 宏允许访问8051 外部页数据区的单个字可以如下使用
rval = PWORD[0x0002];
PWORD[0x002] = 57;
读或写pdata 存储区地址0004h 2×sizeof(unsigned int)=4 的字内容
注意
这个宏所用的索引不代表存储区地址的整数值为了得到存储区地址必须索引乘以
一个整数2 字节的大小
Keil Software – Cx51 编译器用户手册— 第八章库参考217
XBYTE
XBYTE 宏允许访问8051 外部数据区的单个字节可以如下使用
rval = XBYTE[0x0002];
XBYTE[0x002] = 57;
读或写外部数据存储区地址0002h 的字节内容
XWORD
XWORD 宏允许访问8051 外部数据区的单个字可以如下使用
rval = XWORD[0x0002];
XWORD[0x002] = 57;
读或写外部数据存储区地址0004h 2×sizeof(unsigned int)=4 的字内容
注意
这个宏所用的索引不代表存储区地址的整数值为了得到存储区地址必须索引乘以
一个整数2 字节的大小
Keil Software – Cx51 编译器用户手册— 第八章库参考218
程序分类
本节给出Cx51 标准库主要程序类的一个概况参考232 页的参考
注意
Cx51 标准库中的许多程序是可重入的固有的或两者都是这些说明列在下表的属
性中除非特别说明程序是非重入和非固有的
缓冲区操作
程序属性说明
memccpy 从一个缓冲区拷贝数据字节到另一个缓冲区直到一个指定的
字符或字符数
memchr 可重入返回一个缓冲区中指定字符第一次出现的位置指针
memcmp 可重入比较两个不同缓冲区给定数目的字符
memcpy 可重入从一个缓冲区拷贝指定数目的数据到另一个缓冲区
memmove 可重入从一个缓冲区拷贝指定数目的数据到另一个缓冲区
memset 可重入初始化一个缓冲区的指定数目的数据字节为指定的字符值
缓冲区操作程序用在存储缓冲区以字符为基础一个缓冲区就是一个字符数组类
似于字符串但是缓冲区不是用NULL \0 字符结束因此这些程序要求一个
缓冲区长度或计数
所有的这些程序作为程序运行函数原型在STRING.H 包含文件中
Keil Software – Cx51 编译器用户手册— 第八章库参考219
字符转换和分类
程序属性说明
isalnum 可重入是否是一个字母或数字字符
isalpha 可重入是否是一个字母字符
iscntrl 可重入是否是一个控制字符
isdigit 可重入是否是一个十进制数
isgraph 可重入是否是一个除空格以外的可打印字符
islower 可重入是否是一个小写字母字符
isprint 可重入是否是一个可打印字符
ispunct 可重入是否是一个标点字符
isspace 可重入是否是一个空格
isupper 可重入是否是一个大写字母字符
isxdigit 可重入是否是一个十六进制数
toascii 可重入转换一个字符为一个ASCII 码
toint 可重入转换一个十六进制数为一个十进制数
tolower 可重入测试一个字符如果是大写则转换成小写
_tolower 可重入无条件的转换一个字符为小写
toupper 可重入测试一个字符如果是大写则转换成小写
_toupper 可重入无条件的转换一个字符为大写
字符转换和分类程序允许测试单个字符的各种属性并转换成不同的格式
_tolower _toupper 和toascii 程序作为宏来运行所有的别的程序作为函数所有的
宏定义和函数原型在包含文件CTYPE.H 中
Keil Software – Cx51 编译器用户手册— 第八章库参考220
数据转换
程序属性说明
abs 可重入取一个整数类型的绝对值
atof/atof517 转换一个字符串为一个float
atoi 转换一个字符串为一个int
atol 转换一个字符串为一个long
cabs 可重入取一个字符类型的绝对值
labs 可重入取一个long 类型的绝对值
strtod/strtod
517
一个字符串转换成一个float
strtol 一个字符串转换成一个long
strtoul 一个字符串转换成一个unsigned long
数据转换程序把ASCII 字符串转换成数字所有的这些程序作为函数执行大多数的
原型在STDLIB.H 中abs cabs 和labs 函数的原型在MATH.H 中atof517 和strtod517
函数的原型在80C517.H 中
Keil Software – Cx51 编译器用户手册— 第八章库参考221
数学程序
程序属性说明
acos/acos517 反余弦
asin/asin517 反正弦
atan/atan517 反正切
atan2 分数的反正切
ceil 取整
cos/cos517 余弦
cosh 双曲余弦
exp/exp517 指数函数
fabs 可重入取绝对值
floor 小于等于指定数的最大整数
fmod 浮点数余数
log/log517 自然对数
log10/log105
17
常用对数
modf 取出整数和小数部分
pow 幂
rand 随机数
sin/sin517 正弦函数
sinh 双曲正弦
srand 初始化随机数发生器
sqrt/sqrt517 平方根
tan/tan517 正切函数
tanh 双曲正切
_chkfloat_ 固有的
可重入的
检查float 数的状态
_crol_ 固有的
可重入的
一个unsigned char 向左循环位移
_cror_ 固有的
可重入的
一个unsigned char 向右循环位移
_irol_ 固有的
可重入的
一个unsigned int 向左循环位移
_iror_ 固有的
可重入的
一个unsigned int 向右循环位移
_lrol_ 固有的
可重入的
一个unsigned long 向左循环位移
_lror_ 固有的
可重入的
一个unsigned long 向右循环位移
Keil Software – Cx51 编译器用户手册— 第八章库参考222
数学程序运行通用的算术计算大多数这些程序用浮点数因此包含浮点库和支持程

所有的这些程序作为函数多数原型在包含文件MATH.H 中以517 结尾的函数
acos517 asin517 atan517 cos517 exp517 log517 log10517 sin517 sqrt517
和tan517 的原型在包含文件80C517.H 中rand 和srand 函数的原型在STDLIB.H

_chkfloat_ _crol_ _cror_ _irol_ _iror_ _lrol_ 和_lror_函数的原型在INTRINS.H

Keil Software – Cx51 编译器用户手册— 第八章库参考223
存储区分配程序
程序属性说明
calloc 从存储池给一个数组分配存储区
free 释放用calloc malloc 或realloc 分配彻底存储块
init_mempool 初始化存储池的位置和大小
malloc 从存储池分配一个块
realloc 从存储池再分配一个块
存储区分配函数提供一种方法来指定分配和释放存储池的存储块所有的存储区
分配函数作为函数执行原型再STDLIB.H 中
在用这些函数分配存储区前必须首先用init_mempool 指定存储池的位置和大小以
满足后面要求的存储区
calloc 和malloc 程序从存储池分配存储块calloc 程序分配一个数组指定给定大小的
元素的数目初始化数组元素为0 malloc 程序分配指定数目的字节
realloc 程序改变一个已分配块的大小free 程序释放一个前面分配的存储块回到存储

Keil Software – Cx51 编译器用户手册— 第八章库参考224
流输入和输出程序
程序属性说明
getchar 可重入用_getkey 和putchar 程序读和显示一个字符
_getkey 用8051 串口读一个字符
gets 用getchar 程序读和显示一个字符串
printf/printf517 用putchar 程序写格式化数据
putchar 用8051 串口写一个字符
puts 可重入用putchar 程序写一个字符串和换行符\n
scanf/scanf517 用getchar 程序读格式化数据
sprintf/sprintf517 写格式化数据到一个字符串
sscanf/sscanf517 从一个字符串读格式化数据
ungetchar 把一个字符放回到getchar 输入缓冲区
vprintf 用putchar 函数写格式化数据
vsprintf 写格式化数据到一个字符串
流输入和输出程序允许从8051 串口或一个用户定义的I/O 口读和写数据缺省的Cx51
的_getkey 和putchar 函数用8051 串口读和写字符可以在LIB 目录发现这些函数的
源文件可以修改这些源文件并替代库程序如果这样别的流函数就会用新的_getkey
和putchar 程序输入输出
如果想要使用已有的_getkey 和putchar 函数必须首先初始化8051 串口如果串口
没有正确初始化缺省的流函数就不起作用初始化串口要求操作8051 的特殊功能寄
存器SFR 包含文件REG51.H 包含所需的SFR 的定义
Keil Software – Cx51 编译器用户手册— 第八章库参考225
下面的例子代码必须在启动后立即执行应在任何流函数调用前
流程序把输入和输出作为单个的字符流有程序处理字符同时有函数处理字符串
选择最适合要求的程序
所有的这些程序作为函数执行大多数原型在STDIO.H 中printf517 scanf517
sprintf517 和sscanf517 函数的原型在80C517.H 中
...
#include <reg51.h>
. . .
SCON = 0x50;


PCON &= 0x7F;

TMOD &= 0xCF

TMOD |= 0x20;
TH1 = 0xFD;

TR1 = 1;
TI = 1;
. .
Keil Software – Cx51 编译器用户手册— 第八章库参考226
字符串操作程序
程序属性说明
strcat 连接两个字符串
strchr 可重入返回一个字符串中指定字符第一次出现的位置指针
strcmp 可重入比较两个字符串
strcpy 可重入拷贝一个字符串到另一个
strcspn 返回一个字符串中和第二个字符串的任何字符匹配的第一
个字符的索引
strlen 可重入字符串长度
strncat 从一个字符串连接指定数目的字符到另一个字符串
strncmp 比较两个字符串中指定数目的字符
strncpy 从一个字符串拷贝指定数目的字符到另一个字符串
strpbrk 返回一个字符串中和第二个字符串的任何字符匹配的第一
个字符的指针
strpos 可重入返回一个指定字符在一个字符串中第一次出现的索引
strrchr 可重入返回一个指定字符在一个字符串中最后出现的指针
strrpbrk 返回一个字符串中和第二个字符串的任何字符匹配的最后
一个字符的指针
strrpos 可重入返回一个指定字符在一个字符串中最后出现的索引
strspn 返回一个字符串中和第二个字符串中的任何字符不匹配的
第一个字符索引
strstr 返回一个字符串中和另一个子字符串一样的指针
字符串程序作为函数运行原型在STRING.H 中它们执行下面的操作
  拷贝字符串
  添加一个字符串到另一个字符串的结尾
  比较两个字符串
  定位一个字符串中的一个或多个字符
所有的字符串函数都对NULL 结尾的字符串操作对无结尾的字符串用前一节所说
的缓冲区操作程序
Keil Software – Cx51 编译器用户手册— 第八章库参考227
可变长度参数列表程序
程序属性说明
va_arg 可重入从一个参数列表返回一个参数
va_end 可重入重设参数指针
va_start 可重入设置一个指针到一个参数列表的开头
可变长度参数列表程序作为宏在STDARG.H 中定义这些程序提供一个简单的方法
访问一个可变参数的函数的参数这些宏遵循ANSI C 标准的可变长度参数列表
其他程序
程序属性说明
setjmp 可重入保存当前堆栈条件和编程地址
longjmp 可重入恢复堆栈条件和编程地址
_nop_ 固有的
可重入
插入一个8051 NOP 指令
_testbit_ 固有的
可重入
测试一个位值并清0
其他类中的程序不能和别的库程序类合并setjmp 和longjmp 程序为函数原型在
STDJMP.H 中
_nop_和_testbit_程序直接编译分别产生一个NOP 指令和一个JBC 指令这些程序
的原型在INTRINS.H 中
Keil Software – Cx51 编译器用户手册— 第八章库参考228
包含文件
Cx51 标准库提供的包含文件在INC 子目录下这些文件包含常数和宏定义类型定义
和函数原型下面各节说明每个包含文件的使用和内容同时列出了文件中的宏和函

8051 特殊功能寄存器包含文件
Cx51 编译器包许多包含文件定义许多8051 派生系的特殊功能寄存器的明显常数
这些文件在目录KEIL\C51\INC 和子目录下例如PHILIPS 80C554 的特殊功能寄存
器SFR 定义在文件KEIL\C51\INC\PHILIPS\REG554.H 中
在µVision2 编辑器内容菜单点击鼠标右键可以打开一个编辑窗口可以插入所先的
器件的SFR 定义
可以从www.keil.com下载所有8051 变种的SFR 定义网站的设备数据库包含差不多所
有8051 器件的特殊功能寄存器的头文件
80C517.H
80C517.H 包含文件包括使用80C517 CPU 和派生系的增强功能的程序这些程序有
acos517 log10517 sqrt517
asin517 log517 sscan517
atan517 printf517 strtod517
atof517 scanf517 tan517
cos517 sin517
exp517 sprintf517
Keil Software – Cx51 编译器用户手册— 第八章库参考229
ABSACC.H
ABSACC.H 文件包含允许直接访问8051 不同存储区的宏定义
CBYTE FARRAY PBYTE
CWORD FCARRAY PWORD
DBYTE FCVAR XBYTE
DWORD FVAR XWORD
ASSERT.H
ASSERT.H 文件定义assert 宏可以用来建立程序的测试条件
CTYPE.H
CTYPE.H 文件包含对ASCII 字符分类和字符转换的程序和原型下面是程序的列表
isalnum isprint toint
isalpha ispunct tolower
iscntrl isspace _tolower
isdigit isupper toupper
isgraph isxdigit _toupper
islower toascii
INTRINS.H
INTRINS.H 文件包含指示编译器产生嵌入固有代码的程序的原型
_chkfloat_ _irol_ _lror_
_crol_ _iror_ _nop_
_cror_ _lrol_ _testbit_
Keil Software – Cx51 编译器用户手册— 第八章库参考230
MATH.H
MATH.H 文件包含所有浮点数运算的程序的原型和定义别的数学函数也在这个文件
中所有的数学程序如下
abs exp modf
acos fabs pow
asin floor sin
atan fmod sinh
atan2 fprestore sqrt
cabs fpsave tan
ceil labs tanh
cos log
cosh log10
SETJMP.H
SETJMP.H 包含文件定义jmp_buf 类型和setjmp 和longjmp 程序的原型
STDARG.H
STDARG.H 包含文件定义允许访问可变长度参数列表的函数的参数的宏包括
va_arg va_end va_start
另外va_list 类型也在文件中定义
STDDEF.H
STDDEF.H 包含文件定义offsetof 宏可以用来确定结构成员的偏移
Keil Software – Cx51 编译器用户手册— 第八章库参考231
STDIO.H
STDIO.H 文件包含流I/O 程序的原型和定义有
getchar putchar sscanf
_getkey puts ungetchar
gets scanf vprintf
printf sprintf vsprintf
STDIO.H 包含文件也定义了EOF 常数
STDLIB.H
STDLIB.H 文件包含下面类型转换和存储区分配程序的原型和定义
atof init_mempool strtod
atoi malloc strtol
atol rand strtoul
calloc realloc
free srand
STDLIB.H 包含文件也定义了NULL 常数
STRING.H
STRING.H 文件包含下面字符串和缓冲区操作程序的原型
memccpy strchr strncpy
memchr strcmp strpbrk
memcmp strcpy strpos
memcpy strcspn strrchr
memmove strlen strrpbrk
memset strncat strrpos
strcat strncmp strspn
STRING.H 包含文件也定义了NULL 常数
Keil Software – Cx51 编译器用户手册— 第八章库参考232
参考
下面是Cx51 标准库函数的参考标准库中包含的程序按字母顺序排列每个分成几部

摘要简要的说明程序作用列出包含声明和原型的头文件举例说明语法和
参数
说明提供程序的详细说明和如何使用
返回值程序的返回值
参考相关程序的名称
例子给出一个函数或程序段说明函数正确的使用方法
Keil Software – Cx51 编译器用户手册— 第八章库参考233
abs
摘要#include<math.h>
int abs(
int val);
说明abs 函数取整数参数val 的绝对值
返回值abs 函数返回val 的绝对值
参考cabs fabs labs
例子
#include <math.h>
#include <stdio.h>
void tst_abs(void) {
int x;
int y;
x = -42;
y = abs(x);
pirntf("ABS(%d) = %d\n",x,y);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考234
acos/acos517
摘要#include<math.h>
float acos(
float x);
说明acos 函数计算浮点数x 的反余弦x 的值必须在-1 和1 之间acos
返回的浮点数值在0 到π之间
acos517 函数和acos 一样但使用INFINEON C517x C509 的算术
单元提供更快的运算当使用这些函数应包含80C517.H 头文
件不支持这特征的CPU 不要使用这些程序
返回值acos 函数返回x 的反余弦
参考asin atan atan2
例子
#include <math.h>
#include <stdio.h>
void tst_acos (void) {
float x;
float y;
for (x = -1.0; x <= 1.0; x += 0.1) {
y = acos (x);
printf ("ACOS(%f) = %f\n", x, y);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考235
asin/asin517
摘要#include<math.h>
float asin(
float x);
说明asin 函数计算浮点数x 的反正弦x 的值必须在-1 和1 之间asin
返回的浮点数值在-π/2 到π/2 之间
asin517 函数和asin 一样但使用INFINEON C517x C509 的算术
单元提供更快的运算当使用这些函数应包含80C517.H 头文
件不支持这特征的CPU 不要使用这些程序
返回值asin 函数返回x 的反正弦
参考acos atan atan2
例子
#include <math.h>
#include <stdio.h>
void tst_asin (void) {
float x;
float y;
for (x = -1.0; x <= 1.0; x += 0.1) {
y = asin (x);
printf ("ASIN(%f) = %f\n", x, y);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考236
assert
摘要#include<assert.h>
float assert(
expression);
说明assert 宏测试expression 如果为假则用printf 打印一个详细诊断
返回值无
例子
#include <assert.h>
#include <stdio.h>
void check_parms (
char *string)
{
assert (string != NULL);
printf ("String %s is OK\n", string);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考237
atan/atan517
摘要#include<math.h>
float atan(
float x);
说明atan 函数计算浮点数x 的反正切x 的值必须在-1 和1 之间atan
返回的浮点数值在-π/2 到π/2 之间
atan517 函数和atan 一样但使用INFINEON C517x C509 的算术
单元提供更快的运算当使用这些函数应包含80C517.H 头文
件不支持这特征的CPU 不要使用这些程序
返回值atan 函数返回x 的反正切
参考acos asin atan2
例子
#include <math.h>
#include <stdio.h>
void tst_atan (void) {
float x;
float y;
for (x = -10.0; x <= 10.0; x += 0.1) {
y = atan (x);
printf ("ATAN(%f) = %f\n", x, y);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考238
atan2
摘要#include<math.h>
float atan2(
float y,
float x);
说明atan2 函数计算浮点数y/x 的反正切函数用x 和y 的符号来确定返
回值的象限atan2 返回的浮点数值在-π/2 到π/2 之间
返回值atan2 函数返回y/x 的反正切
参考acos asin atan
例子
#include <math.h>
#include <stdio.h>
void tst_atan2 () {
float x;
float y;
float z;
x = -1.0;
for (y = -10.0; y < 10.0; y += 0.1) {
z = atan2 (y,x);
printf ("ATAN2(%f/%f) = %f\n", y, x, z);
}


}
Keil Software – Cx51 编译器用户手册— 第八章库参考239
atof/atof517
摘要#include<stdlib.h>
float atof(
void *string);
说明atof 函数转换string 为一个浮点数string 是一个字符序列可以解
释为一个浮点数如果string 的第一个字符不能转换成数字就停
止处理
atof517 函数和atof 一样但使用INFINEON C517x C509 的算术
单元提供更快的运算当使用这些函数应包含80C517.H 头文
件不支持这特征的CPU 不要使用这些程序
atof 函数要求string 有下面的格式
[{+|-}] 数字[. 数字][{e|E}[{+|-}] 数字]
这里
数字可能是一个或多个十进制数
返回值atof 函数返回string 的浮点值
参考atoi atol strtod strtol strtoul
例子
#include <stdlib.h>
#include <stdio.h>
void tst_atof (void) {
float f;
char s [] = "1.23";
f = atof (s);
printf ("ATOF(%s) = %f\n", s, f);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考240
atoi
摘要#include<stdlib.h>
int atoi(
void *string);
说明atoi 函数转换string 为一个整数值string 是一个字符序列可以解
释为一个整数如果string 的第一个字符不能转换成数字就停止
处理
atoi 函数要求string 有下面的格式
[ 空格][{+|-}] 数字
这里
数字可能是一个或多个十进制数
返回值atoi 函数返回string 的整数值
参考atof atol strtod strtol strtoul
例子
#include <stdlib.h>
#include <stdio.h>
void tst_atoi (void) {
int i;
char s [] = "12345";
i = atoi (s);
printf ("ATOI(%s) = %d\n", s, i);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考241
atol
摘要#include<stdlib.h>
long atol(
void *string);
说明atol 函数转换string 为一个长整数值string 是一个字符序列可以
解释为一个长整数如果string 的第一个字符不能转换成数字就
停止处理
atol 函数要求string 有下面的格式
[ 空格][{+|-}] 数字
这里
数字可能是一个或多个十进制数
返回值atol 函数返回string 的长整数值
参考atof atoi strtod strtol strtoul
例子
#include <stdlib.h>
#include <stdio.h>
void tst_atol (void) {
long l;
char s [] = "8003488051";
l = atol (s);
printf ("ATOL(%s) = %ld\n", s, l);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考242
cabs
摘要#include<math.h>
char cabs(
char val);
说明cabs 函数取val 的绝对值
返回值cabs 返回val 的绝对值
参考abs fabs labs
例子
#include <math.h>
#include <stdio.h>
void tst_cabs (void) {
char x;
char y;
x = -23;
y = cabs (x);
printf ("CABS(�) = �\n", x, y);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考243
calloc
摘要#include<stdlib.h>
void *calloc(
unsigned int num,
unsigned int len);
说明calloc 函数从一个数组分配num 个元素的存储区每个元素占用len
字节并清0 字节总数为num×len
注意
在LIB 目录提供程序的源代码可以修改源程序为硬件定制本函
数参考149 页的第六章. 高级编程技术
返回值calloc 函数返回一个指针指向分配的存储区如果不能分配则
返回一个NULL 指针
参考free inti_mempool malloc realloc
例子
#include <stdlib.h>
#include <stdio.h>
void tst_calloc (void) {
int xdata *p;
p = calloc (100, sizeof (int));
if (p == NULL)
printf ("Error allocating array\n");
else
printf ("Array address is %p\n", (void *) p);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考244
ceil
摘要#include<math.h>
float ceil(
float val);
说明ceil 函数计算大于或等于val 的最小整数值
返回值ceil 函数返回一个float 包含不小于val 的最小整数值
参考floor
例子
#include <math.h>
#include <stdio.h>
void tst_ceil (void) {
float x;
float y;
x = 45.998;
y = ceil (x);
printf ("CEIL(%f) = %f\n", x, y);

}
Keil Software – Cx51 编译器用户手册— 第八章库参考245
_chkfloat_
摘要#include <intrins.h>
unsigned char _chkfloat_(
float val);
说明_chkfloat_函数检查浮点数的状态
返回值_chkfloat_函数返回一个unsigned char 值包含下面的状态信息
返回值意义
0 标准浮点数
1 浮点数0
2 +INF 正溢出
3 -INF 负溢出
4 NaN 不是一个数错误状态
例子
#include <intrins.h>
#include <stdio.h>
char _chkfloat_ (float);
float f1, f2, f3;
void tst_chkfloat (void) {
f1 = f2 * f3;
switch (_chkfloat_ (f1)) {
case 0:
printf ("result is a number\n"); break;
case 1:
printf ("result is zero\n"); break;
case 2:
printf ("result is +INF\n"); break;
case 3:
printf ("result is -INF\n"); break;
case 4:
printf ("result is NaN\n"); break;
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考246
cos/cos517
摘要#include <math.h>
float cos(
float x);
说明cos 函数计算浮点数x 的余弦x 的值必须在-65535 和65535 之间
超出的结果是NaN 错误
cos517 函数和cos 一样但使用INFINEON C517x C509 的算术单
元提供更快的运算当使用这些函数应包含80C517.H 头文件
不支持这特征的CPU 不要使用这些程序
返回值cos 函数返回x 的余弦
参考sin tan
例子
#include <math.h>
#include <stdio.h>
void tst_cos (void) {
float x;
float y;
for (x = 0; x < (2 * 3.1415); x += 0.1) {
y = cos (x);
printf ("COS(%f) = %f\n", x, y);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考247
cosh
摘要#include <math.h>
float cosh(
float x);
说明cosh 函数计算浮点数x 的双曲余弦
返回值cosh 函数返回x 的双曲余弦
参考sinh tanh
例子
#include <math.h>
#include <stdio.h>
void tst_cosh (void) {
float x;
float y;
for (x = 0; x < (2 * 3.1415); x += 0.1) {
y = cosh (x);
printf ("COSH(%f) = %f\n", x, y);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考248
_crol_
摘要#include <intrins.h>
unsigned char _crol_(
unsigned char c,
unsigned char b);
说明_crol_程序左移c 字符b 位本程序是固有函数代码要求内嵌
而不是调用
返回值_crol_程序返回结果c
参考_cror_ _irol_ _iror_ _lrol_ _lror_
例子
#include <intrins.h>
void tst_crol (void) {
char a;
char b;
a = 0xA5;
b = _crol_(a,3);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考249
_cror_
摘要#include <intrins.h>
unsigned char _cror_(
unsigned char c,
unsigned char b);
说明_cror_程序右移c 字符b 位本程序是固有函数代码要求内嵌
而不是调用
返回值_cror_程序返回结果c
参考_crol_ _irol_ _iror_ _lrol_ _lror_
例子
#include <intrins.h>
void tst_cror (void) {
char a;
char b;
a = 0xA5;
b = _crol_(a,1);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考250
exp/exp517
摘要#include <math.h>
float exp(
float x);
说明exp 函数计算浮点数x 的指数函数
exp517 函数和exp 一样但使用INFINEON C517x C509 的算术
单元提供更快的运算当使用这些函数应包含80C517.H 头文
件不支持这特征的CPU 不要使用这些程序
返回值exp函数返回浮点值x e
参考log,log10
例子
#include <math.h>
#include <stdio.h>
void tst_exp (void) {
float x;
float y;
x = 4.605170186;
y = exp (x);
printf ("EXP(%f) = %f\n", x, y);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考251
fabs
摘要#include<math.h>
float fabs(
float val);
说明fabs函数确定浮点数val的绝对值
返回值fabs返回val的绝对值
参考abs,cabs,labs
例子
#include <math.h>
#include <stdio.h>
void tst_fabs (void) {
float x;
float y;
x = 10.2;
y = fabs (x);
printf ("FABS(%f) = %f\n", x, y);
x = -3.6;
y = fabs (x);
printf ("FABS(%f) = %f\n", x, y);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考252
floor
摘要#include<math.h>
float floor(
float val);
说明floor函数计算小于等于val的最大整数值
返回值floor函数返回不大于val的最大整数值的一个float数
参考ceil
例子
#include <math.h>
#include <stdio.h>
void tst_floor (void) {
float x;
float y;
x = 45.998;
y = floor (x);
printf ("FLOOR(%f) = %f\n", x, y); * prints 45 */
}
Keil Software – Cx51 编译器用户手册— 第八章库参考253
fmod
摘要#include <math.h>
float fmod(
float x,
float y);
说明fmod 函数返回一个值f f 符号和x 相同f 的绝对值小于y 的
绝对值同时有一个整数k k*y+f=x 如果不能表示x/y 的商
结果是不确定的
返回值fmode 函数返回x/y 的浮点余数
例子
#include <math.h>
void tst_fmod (void) {
float f;
f = fmod (15.0, 4.0);
printf ("fmod (15.0, 4.0) = %f\n", f);
}
#include <stdio.h>
Keil Software – Cx51 编译器用户手册— 第八章库参考254
free
摘要#include <stdlib.h>
void free(
void xdata *p);
说明free 函数返回一个存储块到存储池p 参数指向用calloc
malloc 或realloc 函数分配的存储块一旦块返回到存储池
就可被再分配
如果p 是一个NULL 指针被忽略
注意
本程序的源代码在\KEIL\C51\LIB 目录中可以修改源程序
根据硬件来定制本程序参考149 页的第六章. 高级编程技

返回值无
参考calloc init_mempool malloc realloc
例子
#include <stdlib.h>
#include <stdio.h>
void tst_free (void) {
void *mbuf;
printf ("Allocating memory\n");
mbuf = malloc (1000);
if (mbuf == NULL) {
printf ("Unable to allocate memory\n");
}
else {
free (mbuf);
printf ("Memory free\n");
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考255
getchar
摘要#include <stdio.h>
char getchar(void);
说明getchar 函数用_getkey 函数从输入流读一个字符所读的字符
用putchar 函数显示
注意
本函数基于_getkey 和/ 或putchar 函数的操作这些函数在标
准库中提供用8051 的串口读和写字符定制函数可以用别
的I/O 设备
返回值getchar 返回所读的字符
参考_getkey putchar ungetchar
例子
#include <stdio.h>
void tst_getchar (void) {
char c;
while ((c = getchar ()) != 0x1B) {
printf ("character = %c %bu %bx\n", c, c, c);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考256
_getkey
摘要#include <stdio.h>
char _getkey(void);
说明_getkey 函数等待从串口接收字符
注意
本函数指定运行功能可能和上面所说的不一样_getkey 和
putchar 函数的源代码可以修改提供针对硬件的字符级的I/O
参考150 页的定制文件
返回值_getkey 返回接收到的字符
参考getchar putchar ungetchar
例子
#include <stdio.h>
void tst_getkey (void) {
char c;
while ((c = _getkey ()) != 0x1B) {
printf ("key = %c %bu %bx\n", c, c, c);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考257
gets
摘要#include <stdio.h>
char *gets(
char *string,
int len);
说明gets 函数调用getchar 函数读一行字符到string 这行包括所有
的字符和换行符\n 在string 中换行符被一个NULL 字符
\0 替代
len 参数指定可读的最多字符数如果长度超过len gets 函数
用NULL 字符终止string 并返回
注意
本函数指定执行基于_getkey 和/ 或putchar 函数的操作这些
函数在标准库中提供用8051 的串口读写对别的I/O 设备
可以定制
返回值gets 函数返回string
参考printf puts scanf
例子
#include <stdio.h>
void tst_gets (void) {
xdata char buf [100];
do {
gets (buf, sizeof (buf));
printf ("Input string \"%s\"", buf);
} while (buf [0] != '\0');
}
Keil Software – Cx51 编译器用户手册— 第八章库参考258
init_mempool
摘要#include<stdio.h>
void init_mempool(
void xdata *p,
unsigned int size);
说明init_mempool 函数初始化存储管理程序提供存储池的开始地
址和大小p 参数指向一个xdata 的存储区用calloc free
malloc 和realloc 库函数管理size 参数指定存储池所用的字
节数
注意
本函数必须在如何其他的存储管理函数calloc free malloc
realloc 被调用前设置存储池只在程序的开头调用
init_mempool 一次
本程序的源代码在目录\KEIL\C51\LIB 中可以修改源程序以
适合硬件环境参考149 页的第六章.高级编程技术
返回值无
参考calloc free malloc realloc
例子
#include <stdlib.h>
void tst_init_mempool (void) {
xdata void *p;
int i;
init_mempool (&XBYTE [0x2000], 0x1000);

p = malloc (100);
for (i = 0; i < 100; i++) ((char *) p)[i] = i;
free (p);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考259
_irol_
摘要#include <intrins.h>
unsigned int _irol_(
unsigned int i,
unsigned char b);
说明_irol 程序循环左移整数i b 位本程序是一个固有函数代码
要求内嵌而不是被调用
返回值_irol_程序返回左移后的值i
参考_cror_ _crol_ _iror_ _lrol_ _lror_
例子
#include <intrins.h>
void tst_irol (void) {
int a;
int b;
a = 0xA5A5;
b = _irol_(a,3);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考260
_iror_
摘要#include <intrins.h>
unsigned int _iror_(
unsigned int i,
unsigned char b);
说明_iror 程序循环右移整数i b 位本程序是一个固有函数代码
要求内嵌而不是被调用
返回值_iror_程序返回右移后的值i
参考_cror_ _crol_ _irol_ _lrol_ _lror_
例子
#include <intrins.h>
void tst_iror (void) {
int a;
int b;
a = 0xA5A5;
b = _irol_(a,1);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考261
isalnum
摘要#include<ctype.h>
bit isalnum(
char c);
说明isalnum 函数测试c 确定是否是一个字母或数字字符A -
Z a - z 0 - 9
返回值如果c 是一个字母或数字字符isalnum 函数返回1 否则返回
0
参考isalpha iscntrl isdigit isgraph islower isprint ispunct
isspace isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_isalnum (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (isalnum (i) ? "YES" : "NO");
printf ("isalnum (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考262
isalpha
摘要#include<ctype.h>
bit isalpha(
char c);
说明isalpha 函数测试c 确定是否是一个字母字符A - Z 或
a - z
返回值如果c 是一个字母字符isalpha 函数返回1 否则返回0
参考isalnum iscntrl isdigit isgraph islower isprint ispunct
isspace isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_isalpha (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (isalpha (i) ? "YES" : "NO");
printf ("isalpha (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考263
iscntrl
摘要#include<ctype.h>
bit iscntrl(
char c);
说明iscntrl 函数测试c 确定是否是一个控制字符0x00-0x1F 或
0x7F
返回值如果c 是一个控制字符iscntrl 函数返回1 否则返回0
参考isalnum isalpha isdigit isgraph islower isprint ispunct
isspace isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_iscntrl (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (iscntrl (i) ? "YES" : "NO");
printf ("iscntrl (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考264
isdigit
摘要#include<ctype.h>
bit isdigit(
char c);
说明isdigit 函数测试c 确定是否是一个十进制数0 - 9
返回值如果c 是一个十进制数isdigit 函数返回1 否则返回0
参考isalnum isalpha iscntrl isgraph islower isprint ispunct
isspace isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_isdigit (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (isdigit (i) ? "YES" : "NO");
printf ("isdigit (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考265
isgraph
摘要#include<ctype.h>
bit isgraph(
char c);
说明isgraph 函数测试c 确定是否是一个可打印字符不包括空
格字符值在0x21-0x7E 之间
返回值如果c 是一个可打印字符isgraph 函数返回1 否则返回0
参考isalnum isalpha iscntrl isdigit islower isprint ispunct
isspace isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_isgraph (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (isgraph (i) ? "YES" : "NO");
printf ("isgraph (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考266
islower
摘要#include<ctype.h>
bit islower(
char c);
说明islower 函数测试c 确定是否是一个小写字母字符a - z
返回值如果c 是一个小写字母字符islower 函数返回1 否则返回0
参考isalnum isalpha iscntrl isdigit isgraph isprint ispunct
isspace isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_islower (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (islower (i) ? "YES" : "NO");
printf ("islower (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考267
isprint
摘要#include<ctype.h>
bit isprint(
char c);
说明isprint 函数测试c 确定是否是一个可打印字符0x20-0x7E
返回值如果c 是一个可打印字符isprint 函数返回1 否则返回0
参考isalnum isalpha iscntrl isdigit isgraph islower ispunct
isspace isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_isprint (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (isprint (i) ? "YES" : "NO");
printf ("isprint (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考268
ispunct
摘要#include<ctype.h>
bit ispunct(
char c);
说明ispunct 函数测试c 确定是否是一个标点符号字符下面的符
号是标点符号字符
! " # $ % & ' (
) * + ' - . / :
; < = > ? @ [ \
] ^ _ ` { | } ~
返回值如果c 是一个标点符号字符ispunct 函数返回1 否则返回0
参考isalnum isalpha iscntrl isdigit isgraph islower isprint
isspace isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_ispunct (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (ispunct (i) ? "YES" : "NO");
printf ("ispunct (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考269
isspace
摘要#include<ctype.h>
bit isspace(
char c);
说明isspace 函数测试c 确定是否是一个空白字符0x09-0x0D 或
0x20
返回值如果c 是一个空白字符isspace 函数返回1 否则返回0
参考isalnum isalpha iscntrl isdigit isgraph islower isprint
ispunct isupper isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_isspace (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (isspace (i) ? "YES" : "NO");
printf ("isspace (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考270
isupper
摘要#include<ctype.h>
bit isupper(
char c);
说明isupper 函数测试c 确定是否是一个大写字母字符A - Z
返回值如果c 是一个大写字母字符isupper 函数返回1 否则返回0
参考isalnum isalpha iscntrl isdigit isgraph islower isprint
ispunct isspace isxditit
例子
#include <ctype.h>
#include <stdio.h>
void tst_isupper (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (isupper (i) ? "YES" : "NO");
printf ("isupper (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考271
isxdigit
摘要#include<ctype.h>
bit isxdigit(
char c);
说明isxdigit 函数测试c 确定是否是一个十六进制数A - Z
a - z 0 - 9
返回值如果c 是一个十六进制数isxdigit 函数返回1 否则返回0
参考isalnum isalpha iscntrl isdigit isgraph islower isprint
ispunct isspace isupper
例子
#include <ctype.h>
#include <stdio.h>
void tst_isxdigit (void) {
unsigned char i;
char *p;
for (i = 0; i < 128; i++) {
p = (isxdigit (i) ? "YES" : "NO");
printf ("isxdigit (%c) %s\n", i, p);
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考272
labs
摘要#include<math.h>
long labs(
long val);
说明labs 函数确定长整数val 的绝对值
返回值labs 函数返回val 的绝对值
参考abs cabs fabs
例子
#include <math.h>
#include <stdio.h>
void tst_labs (void) {
long x;
long y;
x = -12345L;
y = labs (x);
printf ("LABS(%ld) = %ld\n", x, y);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考273
log/log517
摘要#include<math.h>
float log(
float val);
说明log 函数计算浮点数val 的自然对数自然对数用基数e 或
2.718282…
log517 函数和log 一样但使用INFINEON C517x C509 的算
术单元提供更快的运行速度当使用整个函数时应包含
80C517.H 头文件不要对不支持的CPU 用本程序
返回值log 函数返回val 的浮点自然对数
参考exp log10
例子
#include <math.h>
#include <stdio.h>
void tst_log (void) {
float x;
float y;
x = 2.71838;
x *= x;
y = log (x);
printf ("LOG(%f) = %f\n", x, y);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考274
log10/log10517
摘要#include<math.h>
float log10(
float val);
说明log10 函数计算浮点数val 的常用对数自然对数用基数10
log10517 函数和log10 一样但使用INFINEON C517x C509
的算术单元提供更快的运行速度当使用整个函数时应包
含80C517.H 头文件不要对不支持的CPU 用本程序
返回值log10 函数返回val 的浮点常用对数
参考exp log
例子
#include <math.h>
#include <stdio.h>
void tst_log10 (void) {
float x;
float y;
x = 1000;
y = log10 (x);
printf ("LOG10(%f) = %f\n", x, y);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考275
longjmp
摘要#include<setjmp.h>
void longjmp(
jmp_buf env,
int retval);
说明longjmp 函数恢复前面setjmp 函数保存在env 的状态retval
参数指定从setjmp 函数调用返回值
longjmp 和setjmp 函数可以用来执行非局部跳转通常用来传
递控制给一个错误恢复程序
只有用volatile 属性声明的局部变量和函数参数被恢复
返回值无
参考setjmp
Keil Software – Cx51 编译器用户手册— 第八章库参考276
例子
#include <setjmp.h>
#include <stdio.h>
jmp_buf env;
bit error_flag;
void trigger (void) {
. . .

...
if (error_flag != 0) {
longjmp (env, 1);
} . . .
}
void recover (void) {

}
void tst_longjmp (void) {
.. .
if (setjmp (env) != 0) {
printf ("LONGJMP called\n");
recover ();
}
else {
printf ("SETJMP called\n");
error_flag = 1;
trigger ();
}
}
Keil Software – Cx51 编译器用户手册— 第八章库参考277
_lrol_
摘要#include <intrins.h>
unsigned long _lrol_(
unsigned long l,
unsigned char b);
说明_lrol 程序循环左移长整数l b 位本程序是一个固有函数代
码要求内嵌而不是被调用
返回值_lrol_程序返回左移后的值l
参考_cror_ _crol_ _irol_ _iror_ _lror_
例子
#include <intrins.h>
void tst_lrol (void) {
long a;
long b;
a = 0xA5A5A5A5;
b = _lrol_(a,3);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考278
_lror_
摘要#include <intrins.h>
unsigned long _lror_(
unsigned long l,
unsigned char b);
说明_lror 程序循环右移长整数l b 位本程序是一个固有函数代
码要求内嵌而不是被调用
返回值_lror_程序返回右移后的值l
参考_cror_ _crol_ _irol_ _iror_ _lrol_
例子
#include <intrins.h>
void tst_lror (void) {
long a;
long b;
a = 0xA5A5A5A5;
b = _lrol_(a,1);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考279
malloc
摘要#include<stdlib.h>
void *malloc(
unsigned int size);
说明malloc 函数从存储池分配size 字节的存储块
注意
本程序的源代码在\KEIL\C51\LIB 目录中可以根据硬件环境
修改源文件参考149 页的第六章. 高级编程技术
返回值malloc 返回一个指向所分配的存储块的指针如果没有足够的
空间则返回一个NULL 指针
参考calloc free init_mempool realloc
例子
#include <stdlib.h>
#include <stdio.h>
void tst_malloc (void) {
unsigned char xdata *p;
p = malloc (1000);
if (p == NULL)
printf ("Not enough memory space\n");
else
printf ("Memory allocated\n");
}
Keil Software – Cx51 编译器用户手册— 第八章库参考280
memccpy
摘要#include<string.h>
void *memccpy(
void *dest,
void *src,
char c,
int len);
说明memccpy 函数从src 到dest 复制0 或更多的字符直到字符c
被复制或len 字节被复制那个条件先遇到就执行那个条件
返回值memccpy 函数返回一个指针指向dest 最后一个复制的字符的
后一个字节如果最后一个字符是c 则返回一个NULL 指针
参考memchr memcmp memcpy memmove memset
例子
#include <string.h>
#include <stdio.h>
void tst_memccpy (void) {
static char src1 [100] = "Copy this string
to dst1";
static char dst1 [100];
void *c;
c = memccpy (dst1, src1, 'g', sizeof (dst1));
if (c == NULL)
printf ("'g' was not found in the src
buffer\n");
else
printf ("characters copied up to 'g'\n");
}
Keil Software – Cx51 编译器用户手册— 第八章库参考281
memchr
摘要#include<string.h>
void *memchr(
void *buf,
char c,
int len);
说明memchr 函数扫描buf 的第一个len 字节查找字符c
返回值memchr 函数返回字符c 在buf 中的指针如没有则返回一个
NULL 指针
参考memccpy memcmp memcpy memmove memset
例子
#include <string.h>
#include <stdio.h>
void tst_memchr (void) {
static char src1 [100] =
"Search this string from the start";
void *c;
c = memchr (src1, 'g', sizeof (src1));
if (c == NULL)
printf ("'g' was not found in the buffer\n");
else
printf ("found 'g' in the buffer\n");
}
Keil Software – Cx51 编译器用户手册— 第八章库参考282
memcmp
摘要#include<string.h>
char memcmp(
void *buf1,
void *buf2,
int len);
说明memcmp 函数比较两个缓冲区buf1 和buf2 len 字节并返回一
个值表示关系如下
值意义
<0 buf1 小于buf2
=0 buf1 等于buf2
>0 buf1 大于buf2
返回值memcmp 函数返回一个正负或零值表示buf1 和buf2 的关

参考memccpy memchr memcpy memmove memset
例子
#include <string.h>
#include <stdio.h>
void tst_memcmp (void) {
static char hexchars [] = "0123456789ABCDEF";
static char hexchars2 [] = "0123456789abcdef";
char i;
i = memcmp (hexchars, hexchars2, 16);
if (i < 0)
printf ("hexchars < hexchars2\n");
else if (i > 0)
printf ("hexchars > hexchars2\n");
else
printf ("hexchars == hexchars2\n");
}
Keil Software – Cx51 编译器用户手册— 第八章库参考283
memcpy
摘要#include<string.h>
void *memcpy(
void *dest,
void *src,
int len);
说明memcpy 函数从src 到dest 复制len 字节如果存储缓冲区重叠
memcpy 函数不能保证src 中的那个字节在被覆盖前复制到
dest 如果缓冲区重叠用memmove 函数
返回值memcpy 函数dest
参考memccpy memchr memcmp memmove memset
例子
#include <string.h>
#include <stdio.h>
void tst_memcpy (void) {
static char src1 [100] =
"Copy this string to dst1";
static char dst1 [100];
char *p;
p = memcpy (dst1, src1, sizeof (dst1));
printf ("dst = \"%s\"\n", p);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考284
memmove
摘要#include<string.h>
void *memmove(
void *dest,
void *src,
int len);
说明memmove 函数从src 到dest 复制len 字节如果存储缓冲区重
叠memmove 函数保证src 中的那个字节在被覆盖前复制到
dest
返回值memmove 函数返回dest
参考memccpy memchr memcmp memcpy memset
例子
#include <string.h>
#include <stdio.h>
void tst_memmove (void) {
static char buf [] = "This is line 1 "
"This is line 2 "
"This is line 3 ";
printf ("buf before = %s\n", buf);
memmove (&buf [0], &buf [16], 32);
printf ("buf after = %s\n", buf);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考285
memset
摘要#include<string.h>
void *memset(
void *buf,
char c,
int len);
说明memset 函数设置buf 的第一个len 字节为c
返回值memset 函数返回dest
参考memccpy memchr memcmp memcpy memmove
例子
#include <string.h>
#include <stdio.h>
void tst_memset (void) {
char buf [10];
memset (buf, '\0', sizeof (buf));

}
Keil Software – Cx51 编译器用户手册— 第八章库参考286
modf
摘要#include<math.h>
float modf(
float val,
float *ip);
说明modf 函数把浮点数val 分成整数和小数部分val 的小数部分
为一个带符号的浮点数整数部分保存在浮点数ip 中
返回值modf 函数返回带符号小数部分val
例子
#include <math.h>
#include <stdio.h>
void tst_modf (void) {
float x;
float int_part, frc_part;
x = 123.456;
frc_part = modf (x, &int_part);
printf ("%f = %f + %f\n", x, int_part,frc_part);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考287
_nop_
摘要#include<intrins.h>
void _nop_(void);
说明_nop_程序插入一个8051 NOP 指令到程序本程序可以用来停
顿1 个CPU 周期本程序是一个固有函数代码要求内嵌而
不是调用
返回值无
例子
#include <intrins.h>
#include <stdio.h>
void tst_nop (void) {
P1 = 0xFF;
_nop_ ();
_nop_ ();
_nop_ ();
P1 = 0x00;
}
Keil Software – Cx51 编译器用户手册— 第八章库参考288
offsetof
摘要#include<stddef.h>
int offsetof(
structure,
member);
说明offsetof 宏计算结构元素member 从结构开头的偏移structure
参数必须指定一个结构的名称member 参数必须指定结构的
成员的名称
返回值offsetof 宏返回member 元素从struct structure 开头的偏移的字
节数
例子
#include <stddef.h>
struct index_st
{
unsigned char type;
unsigned long num;
unsigned ing len;
};
typedef struct index_st index_t;
void main (void)
{
int x, y;
x = offsetof (struct index_st, len);
y = offsetof (index_t, num);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考289
pow
摘要#include<math.h>
float pow(
float x,
float y);
说明pow 函数计算x 的y 次幂
返回值pow 函数返回值y x 如果x ≠ 0 和y = 0 pow 返回值1 如果
x = 0 和y ≤ 0 pow 返回NaN 如果x < 0 和y 不是一个整数
pow 返回NaN
参考sqrt
例子
#include <math.h>
#include <stdio.h>
void tst_pow (void) {
float base;
float power;
float y;
base = 2.0;
power = 8.0;
y = pow (base, power);
printf ("%f ^ %f = %f\n", base, power, y);
}
Keil Software – Cx51 编译器用户手册— 第八章库参考290
printf/printf517
摘要#include <stdio.h>
int printf(
const char *fmtstr
[,arguments]…);
说明printf 函数格式化一系列的字符串和数值生成一个字符串用
putchar 写到输出流fmtstr 参数是一个格式化字符串可能是
字符转义系列和格式标识符
普通的字符和转义系列按说明的顺序复制到流格式标识符通
常以百分号% 开头要求在函数调用中包含附加的参数
arguments
格式字符串从左向右读第一个格式标识符使用fmtstr 后的第
一个参数用格式标识符转换和输出第二个格式标识符访问
fmtstr 后的第二个参数等等如果参数比格式标识符多多
出的参数被忽略如果参数不够结果是不可预料的
格式标识符用下面的格式
%[flags][width][.precision][{b|B|l|L}]type
格式标识符中的每个域可以是一个字符或数字指定特殊的格
式选项
Keil Software – Cx51 编译器用户手册— 第八章库参考291
type 域是一个字符指定参数是否解释为一个字符字符串
数字或指针如下表所示
字符参数类型输出格式
d int 带符号十进制数
u unsigned int 不带符号十进制数
o unsigned int 不带符号八进制数
x unsigned int 不带符号十六进制数用
0123456789abcdef
X unsigned int 不带符号十六进制数用
0123456789ABCDEF
f float 浮点数用格式[-]dddd.dddd
e float 浮点数用格式[-]d.dddde[-]dd
E float 浮点数用格式[-]d.ddddE[-]dd
g float 浮点数用e 或f 格式无论那个对指
定的值或精度更简洁
G float 和g 格式一样除了可能指数
前为E 而不是e
c char 单个字符
s 通用* 用NULL 字符结尾的字符串
p 通用* 指针用t:aaaa 格式这里t 是指针
索引的存储类型c:code
i:data/idata x:xdata p:pdata aaaa
是十六进制地址
可选的字符b 或B 和l 和L 可直接放在类型字符前分别指定
整数类型d i u o x 和X 的char 或long 版本
Keil Software – Cx51 编译器用户手册— 第八章库参考292
flags 域是单个字符用来对齐输出和打印+/-号和空白小数
点和八进制和十六进制的前缀如下表所示
标记意义
- 对指定的域宽度左对齐输出
+ 如果输出是一个带符号类型用+或-符号为输出
值的前缀
空白如果是一个带符号正值输出值的前缀是空格
否则没有空格
# 当用o x 和X 域类型时对非零输出值分别
用0 0x 或0X 为前缀
当用e E f g 和G 域类型时#标记强迫输
出值包含一个小数点
在其他的情况#标记被忽略
* 忽略格式标识符
width 域时一个非负数字指定显示的最小字符数如果输出
值的字符数小于width 空白会加到左边或右边当指定了-标
记以达到最小的宽度如果width 用一个0 前缀则填充
的是零而不是空白width 域不会截短一个域如果输出枝的
长度超过指定宽度则输出所有的字符
width 域可能是一个星号* 在这种情况参数列表的一
个int 参数提供宽度值如果参数使用的是一个unsigned char
在星号标识符前指定一个b
Keil Software – Cx51 编译器用户手册— 第八章库参考293
precision 域是一个非负数字指定显示的字符数小数位数
或有效位precison 域可能使输出值切断或舍入在一个浮点
数入下表所指定
类型意义
d,u,o,x,X precison 域用来指定输出值的数字的最小数目
如果参数中的数字数目超过precision 域定义的
数字就不会被切断如果参数的数字的数目小于
precison 域输出值在左边用零填充
f precision 域用来指定小数点后面的数字的位数
最后一位舍入
e,E precision 域用来指定小数点后面的数字的位数
最后一位舍入
g,G precision 域用来指定输出值的有效位的最大数

c,p precision 域无效
s precision 域指定输出值的最多字符数超过的不
输出
precision 域可能是一个星号* 在这种情况参数列表的
一个int 参数提供宽度值如果参数使用的是一个unsigned
char 在星号标识符前指定一个b
printf517 函数和printf 一样但使用INFINEON C517x C509
的算术单元提供更快的运行速度当使用整个函数时应包
含80C517.H 头文件不要对不支持的CPU 用本程序
Keil Software – Cx51 编译器用户手册— 第八章库参考294
注意
本函数指定执行基于putchar 函数的操作本函数作为标
准库提供用8051 的串口写字符用别的I/O 设备可以定制函

必须确保参数类型和指定的格式匹配可用类型影射确保正确
的类型传递到printf
可传递给printf 的总的字节数受到8051 的存储区的限制
SMALL 模式或COMPACT 模式最多15 字节LARGE 模式最
多40 字节
返回值printf 函数返回实际写到输出流的字符数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值