Keil C51汉字显示的bug问题

合集下载

解决keil不能设置字体和颜色的问题

解决keil不能设置字体和颜色的问题

很多朋友都在想,怎么让keil C51与ARM能够并存使用。

有安装经验的朋友都知道,安好C51后再安ARm,C51不能正常工作;安好ARM后再安C51,ARM不能正常工作.网上也有相关解决办法,不过不怎么样,要么不详细,要么就是复制粘贴。

不多说看图片:我想大家一定发现问题了,就是在c51的编译器等目录下面没有他的目标路径而arm有,所以他肯定会提示工具不匹配之类的问题。

解决方法很简单,根据ARM的样子也写个路径就OK了,第一:先安装C51(必须先安装C51,不能先安装ARM,否则会失败。

)第二:安装keil ARM(不能安装在同一个文件夹下)我当前安装的是mdk arm4.53第三:打开keil c51和keil arm 两个文件夹,分别找到tools.ini分别打开两个“tools.ini”,将keil C51文件夹下的tools.ini文件中[C51]段复制到keil ARM中tools.ini文件的最后;将keil ARM文件夹下的tools.ini文件中[ARM]段复制到keil C51中tools.ini文件的最后:tools.ini -->keil ARM[UV2]ORGANIZATION="小川电子工作室"NAME="小川电子工作室", "小川电子工作室"EMAIL="paulhyde@"ARMSEL=1BOOK0=UV4\RELEASE_NOTES.HTM("uVision Release Notes",GEN)[ARM]PATH="D:\Keil ARM\ARM\"VERSION=4.50PATH1="C:\Program Files\arm-none-eabi-gcc-4_6\"TOOLPREFIX=arm-none-eabi-CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV10) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDR V9,TDRV11,TDRV12,TDRV13) # Drivers for Cortex-M devicesCPUDLL2=SARMCR4.DLL(TDRV7) # Drivers for Cortex-R4 devicesBOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C)BOOK2=HLP\RL_RELEASE_NOTES.HTM("RL-ARM Release Notes",GEN)BOOK3=CMSIS\index.html("CMSIS Documentation",GEN)TDRV0=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")TDRV1=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver")TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")TDRV4=BIN\lmidk-agdi.dll("Stellaris ICDI")TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet")TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE")TDRV7=Segger\JL2CM3.dll("Cortex-M/R J-LINK/J-Trace")TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link (Deprecated Version)")TDRV9=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")TDRV10=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")TDRV11=NULink\Nu_Link.dll("NULink Debugger")TDRV12=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")TDRV13=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger")DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0")LIC0=ZB48T-RRRXD-GJE6P-M4J11-65JI1-GHTPNBOOK4=Signum\Docs\SigUV3Arm.htm("Signum Systems JTAGjet Driver Documentation",GEN)[ARMADS]PATH="D:\Keil ARM\ARM\"PATH1="BIN40\"CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV10) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDR V9,TDRV11,TDRV12,TDRV13) # Drivers for Cortex-M devicesCPUDLL2=SARMCR4.DLL(TDRV7) # Drivers for Cortex-R4 devicesBOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C)BOOK2=HLP\RL_RELEASE_NOTES.HTM("RL-ARM Release Notes",GEN)BOOK3=CMSIS\index.html("CMSIS Documentation",GEN)BOOK4=Signum\Docs\SigUV3Arm.htm("Signum Systems JTAGjet Driver Documentation",GEN)TDRV0=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")TDRV1=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver")TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")TDRV4=BIN\lmidk-agdi.dll("Stellaris ICDI")TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet")TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE")TDRV7=Segger\JL2CM3.dll("Cortex-M/R J-LINK/J-Trace")TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link (Deprecated Version)")TDRV9=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")TDRV10=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")TDRV11=NULink\Nu_Link.dll("NULink Debugger")TDRV12=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")TDRV13=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger") RTOS0=Dummy.DLL("Dummy")RTOS1=VARTXARM.DLL ("RTX Kernel")DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0") [C51]PATH="D:\Keil C51\C51\"VERSION=V9.06BOOK0=HLP\Release_Notes.htm("Release Notes",GEN)BOOK1=HLP\C51TOOLS.chm("Complete User's Guide Selection",C) TDRV0=BIN\MON51.DLL ("Keil Monitor-51 Driver")TDRV1=BIN\ISD51.DLL ("Keil ISD51 In-System Debugger")TDRV2=BIN\MON390.DLL ("MON390: Dallas Contiguous Mode") TDRV3=BIN\LPC2EMP.DLL ("LPC900 EPM Emulator/Programmer") TDRV4=BIN\UL2UPSD.DLL ("ST-uPSD ULINK Driver")TDRV5=BIN\UL2XC800.DLL ("Infineon XC800 ULINK Driver")TDRV6=BIN\MONADI.DLL ("ADI Monitor Driver")TDRV7=BIN\DAS2XC800.DLL ("Infineon DAS Client for XC800") TDRV8=BIN\UL2LPC9.DLL ("NXP LPC95x ULINK Driver")RTOS0=Dummy.DLL("Dummy")RTOS1=RTXTINY.DLL ("RTX-51 Tiny")RTOS2=RTX51.DLL ("RTX-51 Full")LIC0=EXTEV-PIY1M-WN1AF-6K3HK-DRA7Y-FBXVWkeil-->c51[UV2]ORGANIZATION="小川工作室"NAME="王川北", "111"EMAIL="111"BOOK0=UV4\RELEASE_NOTES.HTM("uVision Release Notes",GEN) [C51]PATH="D:\Keil C51\C51\"VERSION=V9.06BOOK0=HLP\Release_Notes.htm("Release Notes",GEN)BOOK1=HLP\C51TOOLS.chm("Complete User's Guide Selection",C) TDRV0=BIN\MON51.DLL ("Keil Monitor-51 Driver")TDRV1=BIN\ISD51.DLL ("Keil ISD51 In-System Debugger")TDRV2=BIN\MON390.DLL ("MON390: Dallas Contiguous Mode")TDRV3=BIN\LPC2EMP.DLL ("LPC900 EPM Emulator/Programmer")TDRV4=BIN\UL2UPSD.DLL ("ST-uPSD ULINK Driver")TDRV5=BIN\UL2XC800.DLL ("Infineon XC800 ULINK Driver")TDRV6=BIN\MONADI.DLL ("ADI Monitor Driver")TDRV7=BIN\DAS2XC800.DLL ("Infineon DAS Client for XC800")TDRV8=BIN\UL2LPC9.DLL ("NXP LPC95x ULINK Driver")RTOS0=Dummy.DLL("Dummy")RTOS1=RTXTINY.DLL ("RTX-51 Tiny")RTOS2=RTX51.DLL ("RTX-51 Full")LIC0=8V02Z-JIX83-09VG9-4M1JI-YKSD6-5KBQ3[ARM]PATH="D:\Keil ARM\ARM\"VERSION=4.50PATH1="C:\Program Files\arm-none-eabi-gcc-4_6\"TOOLPREFIX=arm-none-eabi-CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV10) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDR V9,TDRV11,TDRV12,TDRV13) # Drivers for Cortex-M devicesCPUDLL2=SARMCR4.DLL(TDRV7) # Drivers for Cortex-R4 devicesBOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C)BOOK2=HLP\RL_RELEASE_NOTES.HTM("RL-ARM Release Notes",GEN)BOOK3=CMSIS\index.html("CMSIS Documentation",GEN)BOOK4=Signum\Docs\SigUV3Arm.htm("Signum Systems JTAGjet Driver Documentation",GEN)TDRV0=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")TDRV1=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver")TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")TDRV4=BIN\lmidk-agdi.dll("Stellaris ICDI")TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet")TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE")TDRV7=Segger\JL2CM3.dll("Cortex-M/R J-LINK/J-Trace")TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link (Deprecated Version)")TDRV9=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")TDRV10=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")TDRV11=NULink\Nu_Link.dll("NULink Debugger")TDRV12=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")TDRV13=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger")DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0")LIC0=UJWBS-LNGB0-8FWIE-5N2GJ-UKXD9-NTBGM[ARMADS]PATH="D:\Keil ARM\ARM\"PATH1="BIN40\"CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV10) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV2,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8,TDR V9,TDRV11,TDRV12,TDRV13) # Drivers for Cortex-M devicesCPUDLL2=SARMCR4.DLL(TDRV7) # Drivers for Cortex-R4 devicesBOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN)BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C)BOOK2=HLP\RL_RELEASE_NOTES.HTM("RL-ARM Release Notes",GEN)BOOK3=CMSIS\index.html("CMSIS Documentation",GEN)BOOK4=Signum\Docs\SigUV3Arm.htm("Signum Systems JTAGjet Driver Documentation",GEN)TDRV0=BIN\UL2ARM.DLL("ULINK2/ME ARM Debugger")TDRV1=BIN\UL2CM3.DLL("ULINK2/ME Cortex Debugger")TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver")TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger")TDRV4=BIN\lmidk-agdi.dll("Stellaris ICDI")TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet")TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE")TDRV7=Segger\JL2CM3.dll("Cortex-M/R J-LINK/J-Trace")TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link (Deprecated Version)")TDRV9=BIN\ULP2CM3.DLL("ULINK Pro Cortex Debugger")TDRV10=BIN\ULP2ARM.DLL("ULINK Pro ARM Debugger")TDRV11=NULink\Nu_Link.dll("NULink Debugger")TDRV12=SiLabs\SLAB_CM_Keil.dll("SiLabs UDA Debugger")TDRV13=STLink\ST-LINKIII-KEIL_SWO.dll ("ST-Link Debugger")RTOS0=Dummy.DLL("Dummy")RTOS1=VARTXARM.DLL ("RTX Kernel")DELDRVPKG0=ULINK\UninstallULINK.exe("ULINK Pro Driver V1.0")。

Keil C51中光标问题的处理方法

Keil C51中光标问题的处理方法

在KEIL C中,总是会出现光标在汉字的中间,比如说,你想删
除“);”中的“)”,而你正常情况下肯定会把光标调整为状态,然后再删除,但是当你按一次键盘上的Backspace键后发现,“;”被删除了,这样是不是很不方便啊!我曾经也遇到过这样的问题,我当时很郁闷,每次修改时都要想好把光标放在哪儿才能删除想要删除的内容,最后我实在忍受不了了,我就想,有什么方法可以改正这种情况呢?最后我发现原因了,因为KEIL C对汉字的识别能了有限,因此我找到了方法和大家分享,可以通过如下步骤改变:
1)点击“Edit”命令栏,在下拉菜单中选择“Configuration”选项,如图1,就会出来“Configuration”对话框。

或者直接点击快捷图标就可以了。

图1
2)单击“Color&Fonts”选项,就会显示出Window下拉菜单列表,如
图2。

单击“8051:Editor C Files”,就会发现Font栏变成了图3。

图2
图3
3)把Font的字体格式改为“新宋体”或“宋体”,其他字体好像不可以,不过你可以试试。

keil串口printf中文乱码

keil串口printf中文乱码

keil串口printf中文乱码Keil是一款嵌入式开发软件,既可以用来编写代码,也可以用来调试。

在Keil中,串口printf功能是很常见的一个使用场景,可以将单片机的调试信息通过串口输出到计算机上,方便调试。

然而,在使用串口printf输出中文时,有可能会出现乱码的情况,这篇文章将围绕此问题展开分析。

一、串口printf输出中文的原理在Keil中,我们通常使用下面的代码来实现通过串口输出调试信息:```printf("This is a test!\r\n");```在上述代码中,"\r\n"是回车换行符,用于换行;而printf()函数则是用于输出。

它将字符串作为参数,通过串口输出到计算机上。

但是,printf()函数默认是不支持中文输出的。

因为在字符编码中,中文字符的编码一般是多字节的,而printf()函数默认只能输出单字节的字符。

二、中文输出乱码的原因既然printf()函数默认不支持中文输出,那么在使用printf()输出中文时,就会出现乱码的情况。

这可能是因为:1.缓冲区不够如果缓冲区不够大,那么中文字符的多字节编码就无法全部存储在缓冲区中,从而导致输出乱码。

这时应该适当增大缓冲区的大小。

2.编码格式不匹配有时候,我们使用的开发板与计算机的编码格式不一致,导致中文字符的编码格式与printf函数默认的编码格式不一致,进而输出乱码。

因此,我们需要将它们的编码格式设置为一致。

3.字符集不一致另外,不同的字符集也可能导致中文字符乱码。

由于我们在开发过程中导入的库可能字符集与实际需要的字符集不一致,这也可能导致中文字符的乱码。

三、解决方案针对上述原因,我们可以采取以下措施解决中文输出乱码的问题:1.增加缓冲区大小在使用printf()函数输出大量中文字符时,需要适当增加缓冲区大小,以确保能够完整存储输出的字符编码。

2.设置编码格式我们可以使用Windows记事本或其他文本编辑器,确保开发板和计算机的编码格式是一致的。

Keil C51错误及其警告大全

Keil C51错误及其警告大全

࢒໕ᐺࡇᇙቧᇦ本章列出了编程中可能遇到的致命错误语法错误和警告信息每节包括一个信息的主要说明和消除错误或警告条件可采取的措施致命错误致命错误立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不能访问一个特定的源包含文件时也产生致命错误致命错误信息采用下面的格式C51 FATAL-ERROR –ACTION<current action>LINE:<line in which the error is detected>ERROR:<corresponding error message> C51 TERMIANTED.C51 FATAL-ERROR –ACTION<current action>FILE:<file in which the error is detected>ERROR:<corresponding error message> C51 TERMIANTED.下面说明Action和Error中可能的内容ActionsALLOCATING MEMORY编译器不能分配足够的存储区来编译指定的源文件CREATING LIST-FILE / OBJECT-FILE / WORKFILE编译器不能建立列表文件OBJ文件或工作文件这个错误的出现可能是磁盘满或写保护或文件已存在和只读GENERATING INTERMEDIATE CODE源文件包含的一个函数太大不能被编译器编译成虚拟代码尝试把函数分小或重新编译OPENING INPUT-FILE编译器不能发现或打开所选的源或包含文件PARSING INVOKE-/#PRAGMA-LINE当在命令行检测到参数计算或在一个#pragma中检测到参数计算就产生这样的错误PARSING SOURCE-FILE/ANALYZING DECLARATIONS源文件包含太多的外部参考减少源文件访问的外部变量和函数的数目WRITING TO FILE当写入列表文件OBJ文件或工作文件时遇到的错误Errors‘(‘ AFTER CONTROL EXPECTED一些控制参数需要用括号包含一个参数当没有左括号时显示本信息‘)’ AFTER PARAMETER EXPECTED本信息表示包含没有参数的右括号BAD DIGIT IN NUMBER一个控制参数的数字参数包含无效字符只能是十进制数CAN’T CREATE FILE在FILE行定义的文件名不能建立CAN’T HA VE GERERAL CONTROL IN INVOCATION LINE一般控制例如EJECT不能包含在命令行把这些控制用#pragma声明放在源文件中FILE DOES NOT EXIST没有发现定义在FILE行的文件FILE WRITE-ERROR因为磁盘空间不够写到列表预打印工作或目标文件时出错IDENTIFIER EXPECTED当DEFINE控制没有参数时产生本信息DEFINE要求一个参数作为标识符这和C语言的规则相同MEMORY SPACE EXHAUSTED编译器不能分配足够的存储区来编译指定的源文件如果始终出现这个信息应该把源文件分成两个或多个小文件再重新编译MORE THAN100ERRORS IN SOURCE-FILE在编译时检测到的错误超过100个这使编译器终止MORE THAN256SEGMENTS/EXTERNALS在一个源文件中的参考超过256个单个的源文件不能有超过256个函数或外部参考这是INTEL目标模块格式OMF-51的历史的限制包含标量和/或bit声明的函数在OBJ文件中生成两个有时候三个段定义NON-NULL ARGUMENT EXPECTED所选的控制参数需要用括号包含一个参数例如一个文件名或一个数字OUT OF RANGE NUMBER一个控制参数的数字参数超出范围例如OPTIMIZE控制只允许数字0到6值7就将产生本错误信息PARSE STACK OVERFLOW解析堆栈溢出如果源程序包含很复杂的表达式或如果块的嵌套深度超过31级就会出现这个错误PREPROCESSOR LINE TOO LONG32K一个中间扩展长度超过32K字符PREPROCESSOR MACROS TOO NESTED在宏扩展期间预处理器所用的堆栈太大这个信息通常表示一个递归的宏定义但也可表示一个宏嵌套太多RESPECIFIED OR CONFLICTING CONTROL一个命令行参数指定了两次或命令行参数冲突SOURCE MUST COME FROM A DISK-FILE源和包含文件必须存在控制台CON CI或类似的设备不能作为输入文件UNKNOWN CONTROL所选的控制参数不认识语法和语义错误语法和语义错误一般出现在源程序中它们确定实际的编程错误当遇到这些错误时编译器尝试绕过错误继续处理源文件当遇到更多的错误时编译器输出另外的错误信息但是不产生OBJ文件语法和语义错误在列表文件中生成一条信息这些错误信息用下面的格式*** ERROR number IN LINE line OF file:error message这里number错误号line对应源文件或包含文件的行号file产生错误的源或包含文件名error message对错误的叙述说明下表按错误号列出了语法和语义错误错误信息列出了主要说明和可能的原因和改正100跳过不可打印字符0x??在源文件中发现一个非法字符注意不检查注释中的字符101字符串没结束一个字符串没有用双引号终止102字符串太长一个字符串不能超过4096个字符用串联符号\在逻辑上可延长字符串超过4096个字符这个模式的行终止符在词汇分析时是连续的103无效的字符常数一个字符常数的格式无效符号\c是无效的除非c是任何可打印的ASCII字符125声明符太复杂20一个目标的声明可包含最多20个类型修饰符[]*这个错误经常伴随着错误126126类型堆栈下溢类型声明堆栈下溢这个错误通常死错误125的副产品127无效存储类一个目标用一个无效的存储空间标识符声明如果一个目标在一个函数外用存储类auto或register声明就会产生本错误129在标记前缺少本错误通常表示前一行缺少分号当出现本错误时编译器会产生很多错误信息130值超出范围在一个using或interrupt标识符后的数字参数是无效的using标识符要求一个0到3之间的寄存器组号interrupt标识符要求一个0到31之间的中断矢量号131函数参数重复一个函数有相同的参数名在函数声明中参数名必须是唯一的132没在正式的参数列表一个函数的参数声明用了一个名称没在参数名列表中例如char function(v0,v1,v2)char *v0,*v1,*v5;/* ‘v5’没在正式列表中 */{/* … */}134函数的xdata/idata/pdata/data不允许函数通常位于code存储区不能在别的存储区运行函数默认定义为存储类型code135bit的存储类错bit标量的声明可能包含一个static或extern存储类register或alien类是无效的136变量用了voidvoid类型只允许作为一个不存在的返回值或一个函数的空参数列表voidfunc(void)或和一个指针组合void *138Interrupt()不能接受或返回值一个中断函数被定义了一个或多个正式的参数或一个返回值中断函数不能包含调用参数或返回值140位在非法的存储空间bit标量的定义可以包含可选的存储类型data如果没有存储类型则默认为data因为位通常在内部数据存储区当试图对一个bit标量定义别的数据类型时会产生本错误141临近标志语法错误期待别的标志…编译器所见的标志是错误的参考所显示的期待的内容142无效的基地址一个sfr或sbit声明的基地址是错误的有效的基地址范围在0x80到0xFF之间如果用符号基地址^位号声明则基地址必须是8的倍数143无效的绝对位地址sbit声明中的绝对位地址必须在0x80到0xFF之间144基地址^位号无效的位号sbit声明中定义的位号必须在0到7之间145未知的sfr146无效sfr一个绝对位基地址^位号的声明包含一个无效的基地址标识符基地址必须是已经声明的sfr任何别的名称是无效的147目标文件太大单个目标文件不能超过6553564K字节-1149struct/union包含函数成员struct或union不能包含一个函数类型的成员但是指向函数的指针是可以的150struct/union包含一个bit成员一个union不能包含bit类型成员这是8051的结构决定的151struct/union自我关联一个结构不能包含自己152位号超出位域位域声明中指定的位号超过给定基类的位号153命名的位域不能为零命名的位域为零只要未命名的位域允许为零154位域指针指向位域的指针不允许155位域要求char/int位域的基类要求char或int unsigned char和unsigned int类型也行156alien只允许对函数157alien函数带可变参数存储类alien只对外部PL/M-51函数允许符号ch a r*,…在alien函数中是非法的PL/M-51函数通常要求一个固定的参数表158函数包含未命名的参数一个函数的参数列表定义包含一个未命名的抽象类型定义这个符号只允许在函数原型中159void后面带类型函数的原型声明可包含一个空参数列表例如int func(void)在void后不能再有类型定义160void无效void类型只在和指针组合或作为一个函数的不存在的返回值中是合法的161忽视了正式参数在一个函数内一个外部函数的声明用了一个没有类型标识符的参数名列表例如extern yylex(a,b,c);180不能指向一个函数指向一个函数的类型是无效的尝试用指针指向一个函数181操作数不兼容对给定的操作符至少一个操作数类型是无效的例如~float_type183左值不能修改要修改的目标位于code存储区或有const属性因此不能修改184sizeof非法操作数sizeof操作符不能确定一个函数或位域的大小185不同的存储空间一个目标声明的存储空间和前一个同样目标声明的存储空间不同186解除参照无效一个内部编译器问题会产生本信息如果本错误重复出现请和技术支持接洽187不是一个左值所需的参数必须是一个可修改的目标地址188未知目标大小因为没有一个数组的维数或间接通过一个void指针一个目标的大小不能计算189&对bit/sfr非法取地址符’&’不允许对bit目标或特殊函数寄存器sfr190&不是一个左值尝试建立一个指针指向一个未知目标193非法操作类型193对ptr非法add/sub193对bit的非法操作193错误操作数类型当对一个给定的操作符用了非法的操作数类型时产生本错误例如无效的表达式如bit*bit ptr+ptr或ptr*anything这个错误信息包括引起错误的操作符下面的操作对bit类型的操作数是可行的赋值=OR/复合OR||=AND/复合AND&&=XOR/复合XOR^^=bit比较= =!=取反~bit操作数可和别的数据类型在表达式中混用在这种情况类型转换自动执行194*间接指向一个未知大小的目标间接操作符*不能和void指针合用因为指针所指的目标的大小是未知的195*间接非法*操作符不能用到非指针参数196存储空间可能无效转换一个常数到一个指针常数产生一个无效的存储空间例如 char*p=0x91234198sizeof返回零sizeof操作符返回一个零199->’的左边要求struct/union指针->操作符的左边参数必须是一个struct指针或一个union指针200.左边要求struct/union.操作符的左边参数要求必须是struct或union类型201未定义的struct/union给定的struct或union名是未知的202未定义的标识符给定的标识符是未定义的203错误的存储类参考名本错误表示编译器的一个问题如果重复出现请接洽技术支持204未定义的成员给定的一个struct或union成员名是未定义的205不能调用一个中断函数一个中断函数不能象一个正常函数一样调用中断的入口和退出代码是特殊的207参数列表声明为void参数列表声明为void的函数不能从调用者接收参数208太多的实参函数调用包含太多的实参209太少的实参调用函数包含太少的实参210太多的嵌套调用函数的嵌套调用不能超过10级211调用不是对一个函数一个函数的调用项不是对一个函数或函数指针求值212间接调用寄存器的参数不匹配通过一个指针的间接函数调用不包含实际的参数一个例外是当所有的参数可以通过寄存器传递这是由于Cx51所用的传递参数的方法被调用的函数名必须是已知的因为参数写到被调用函数的数据段但是对间接调用来说被调用函数的名称是未知的213赋值符的左边不是一个左值赋值符的左边要求一个可修改目标的地址214非法指针转换bit float或集合类型的目标不能转换为指针215非法类型转换struct/union/void不能转换为任何别的类型216标号用在非数组中或维数超出一个数组引用包含太大的维数或目标不是一个数组217非整数索引一个数组的维数表达式必须是char unsigned char int或unsigned int类型别的类型都是非法的218控制表达式用了void类型在一个while for或do的限制表达式中不能用类型void219long常数缩减为int一个常数表达式的值必须能用一个int类型表示220非法常数表达式期望一个常数表达式目标名变量或函数不允许出现在常数表达式中221非常数case/dim表达式一个case或一个维数[ ]必须是一个常数表达式222被零除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参数<数字>不同类型函数声明的参数类型和函数原型中的不同236参数列表的长度不同函数声明中的参数数目和函数原型中的不同237函数早已定义试图声明一个函数体两次238重复成员239重复参数试图定义一个已存在的struct成员或函数参数240超出128个局部bit在一个函数内不能超过128个bit标量241auto段太大局部目标所需的空间超过模式的极限最大的段大小定义如下SMALL128字节COMPACT256字节LARGE65535字节242太多的初始化软件初始化软件的数目超过初始化目标的数量243字符串超出范围字符串中的字符数目超出字符串初始化的数目244不能初始化错误的类型或类试图初始化一个bit或sfr245未知的pragma跳过本行#pragma状态未知所以整行被忽略246浮点错误当一个浮点参数超出32位的范围就产生本错误32位IEEE值的范围是±1.175494E-38到±3.402823E+38247非地址/常数初始化一个有效的初始化表达式必须是一个常数值求值或一个目标名加或减去一个常数248集合初始化需要大括号给定struct或union初始化缺少大括号{}249段<名>段太大编译器检测到一个数据段太大一个数据段的最大的大小由存储空间决定250\esc值超过255一个字符串常数中的转义序列超过有效值范围最大值是255252非法八进制数指定的字符不是一个有效的八进制数252主要控制放错地方行被忽略主要控制必须被指定在C模块的开头在任何#include命令或声明前253内部错误ASMGEN\CLASS在下列情况下出现本错误一个内在函数例如_testbit_被错误激活这种情况是在没有函数原型存在和实参数目或类型错误对这种原因必须使用合适的声明文件INTRINS.H STRING.H参考第八章中的instrinsic函数Cx51确认一个内部一致性问题请接洽技术支持255switch表达式有非法类型在一个switch表达式没有合法的数据类型256存储模式冲突一个包含alien属性的函数只能包含模式标识符small函数的参数必须位于内部数据区这适用于所有的外部alien声明和alien函数例如alien plm_func(char c) large {…}产生错误256257alien函数不能重入一个包含alien属性的函数不能同时包含reentrant属性函数参数不能跳过虚拟堆栈传递这适用于所有的外部alien声明和alien函数258struct/union成员的存储空间非法非法空间的参数被忽略一个结构的成员或参数不能包含一个存储类型标识符但指针所指的目标可能包含一个存储类型例如struct vp{char code c;int xdata i; };产生错误258struct v1{char c;int xdata *i; };是正确的struct声明259指针不同的存储空间一个空指针被关联到别的不同存储空间的空指针例如char xdata *p1;char idata *p2;p1 = p2; /* 不同的存储空间 */260指针断开一个空指针被关联到一些常数值这些值超过了指针存储空间的值范围例如char idata *p1 = 0x1234; /* 结果是0x34 */261reentrant()内有bit一个可重入属性的函数的声明中不能包含bit目标例如int func1(int i1) reentrant {bit b1,b2; /* 不允许 */return(i1-1);}262using/disable不能返回bit值用using属性声明的函数和禁止中断#pragma disable的函数不能返回一个bit值给调用者例如bit test(void) using 3{bit b0;return(b0);}产生错误262263保存/恢复堆栈保存溢出/下溢#pragma save的最大嵌套深度是八级堆栈的pragma save和restore工作根据LIFO后进先出规则264内在的<内在的名称>声明/激活错误本错误表示一个内在的函数错误定义参数数目或省略号如果用标准的.H文件就不会产生本错误确认使用了Cx51所有的.H文件不要尝试对内在的库函数定义自己的原型265对非重入函数递归调用非重入函数不能被递归调用因为这样会覆盖函数的参数和局部数据如果需要递归调用需声明函数为可重入函数267函数定义需要ANSI类型的原型一个函数被带参数调用但是声明是一个空的参数列表原型必须有完整的参数类型这样编译器就可能通过寄存器传递参数和适合应用的调用机制268任务定义错误任务ID/优先级/using任务声明错误271asm/endasm控制放错地方asm和endasm声明不能嵌套endasm要求一个汇编块前面用asm开头例如#pragma asm...汇编指令...#pragma endasm272asm要求激活SRC控制在一个源文件中使用asm和endasm要求文件用SRC控制编译那么编译器就会生成汇编源文件然后可以用A51汇编273asm/endasm在包含文件中不允许在包含文件中不允许asm和endasm为了调试在包含文件不能有任何的可执行代码274非法的绝对标识符绝对地址标识符对位目标函数和局部函数不允许地址必须和目标的存储空间一致例如下面的声明是无效的因为间接寻址的范围是0x00到0xFFidata int _at_ 0x1000;278常数太大当浮点参数超出32位的浮点值范围就产生本错误32位IEEE值的范围是±1.175494E-38到±3.402823E+38279多次初始化试图多次初始化一个目标280没有使用符号/标号/参数在一个函数中声明了一个符号标号或参数但没有使用281非指针类型转换为指针引用的程序目标不能转换成一个指针282不是一个SFR引用本函数调用要求一个SFR作为参数283asmparms参数不适合寄存器参数不适合可用的CPU寄存器284<名称>在可覆盖空间函数不再可重入一个可重入函数包含对局部变量的明确的存储类型标识符函数不再完全可重入300注释未结束一个注释没有一个结束符*/301期望标识符一个预处理器命令期望一个标识符302误用#操作符字符操作符#没有带一个标识符303期望正式参数字符操作符#没有带一个标识符表示当前所定义的宏的一个正式参数名304错误的宏参数列表宏参数列表没有一个大括号逗号分开的标识符列表305string/char常数未结束一个字符串活字符常数是无效的典型的后引号丢失306宏调用未结束预处理器在收集和扩展一个宏调用的实际的参数时遇到输入文件的结尾307宏名称参数计算不匹配在一个宏调用中实际的参数数目和宏定义的参数数目不匹配本错误表示指定了太少的参数308无效的整数常数表达式一个if/elif命令的数学表达式包含一个语法错误309错误或缺少文件名在一个include命令中的文件名参数是无效的或没有310条件嵌套过多20源文件包含太多的条件编译嵌套命令最多允许20级嵌套311elif/else控制放错地方312endif控制放错地方命令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.h325正参名称重复一个宏的正参只能定义一次326宏体不能以##开始或结束##不能是一个宏体的开始或结束327宏宏名超过50个参数每个宏的参数数目不能超过50警告警告产生潜在问题的信息他们可能在目标程序的运行过程中出现警告不妨碍源文件的编译警告在列表文件中生成信息警告信息用下面的格式*** 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位代表选择的存储空间198sizeof返回零一个目标的大小计算结果为零如果目标是外部的或如果一个数组的维数没有全知道则值是错误的206缺少函数原型因为没有原型声明被调用的函数是未知的调用一个未知的函数通常是危险的参数的数目和实际要求不一样如果是这种情况函数调用不正确没有函数原型编译器不能检查参数的数目和类型要避免这种警告应在程序中包含函数的原型函数原型必须在函数被调用前声明注意函数定义自动生成原型209实参太少在一个函数调用中包含太少的实参219long常数被缩减为int一个常数表达式的值必须能被一个int类型所表示245未知的pragma本行被忽略#pragma声明是未知的因此整行程序被忽略258struct/union成员的存储空间方法参数的存储空间被忽略一个结构的成员或一个参数不能指定存储类型但是指针所指的目标可以包含一个存储类型例如struct vp{ char code c;int xdata i; };产生警告258struct v1{ char c;int xdata *i; };对struct是正确的声明259指针不同的存储空间两个要比较的指针没有引用相同的存储类型的目标260指针折断把一个指针转换为一个更小偏移区的指针转换会完成但大指针的偏移会折断来适应小指针261bit在重入函数一个reentrant函数不能包含bit因为bit标量不能保存在虚拟堆栈中265名称对非重入函数递归调用发现对一个非重入函数直接递归这可能是故意的但对每个独立的情况进行功能性检查通过生成的代码间接递归由连接/定位器检查271asm/endams控制放错地方asm和endasm不能嵌套endasm要求一个以asm声明开头的汇编块例如#pragma asm...汇编指令...#pragma endasm275表达式可能无效编译器检测到一个表达式不生成代码例如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; /* 存储空间xdata */typedef XCC idata PICC; /* 存储空间冲突 */280符号/标号未使用一个符号或标号定义但未使用307宏名称参数计算不匹配一个宏调用的实参的数目和宏定义的参数数目不匹配表示用了太多的的参数过剩的参数被忽略317宏名称重新定义无效一个预定义的宏不能重新定义或清除参考138页的预定义宏常数322未知的标识符在一个#if命令行的标识符未定义等效为FALSE323期望新行发现多余字符一个#命令行正确但包含多余的非注释字符例如#include <stdio.h> foo。

keil文字显示处理办法

keil文字显示处理办法

1、keil 4中注释时,为什么不能打进汉字,都是方框?
方法:Edit -> Configuration,点击Colors & Fonts选项卡,在Window列表中选择Editor C Files,在右侧选择字体Courier,Use color in Comments 不能打钩.
显示效果如下:
1、操作前:
如果后面注释的黑线是方框,操作一样,但要适当改变字体(eg:宋体、新宋体都行)。

2、操作后显示效果:
2、改变关键字颜色:
方法:Edit -> Configuration->Colors & Fonts->Editor C Files->keyword->选择foreground为任意你想要的颜色(蓝色)。

显示效果如下:
3、当前操作行底纹颜色和选中文字颜色设置:(1)当前工作行底纹和选中其文字设置:
显示效果:
(2)当前选中文字颜色和底纹显示:
显示效果:
4、程序中空格显示为一点,如下图:
解决办法:
修改后显示效果:
5、没有程序行数框架显示,如下图:
操作方法:
操作后显示结果:
其它操作方式基本类似,均可进行相应操作,达到自己想要的结果。

以上均是个人操作经验,均已被验证可行后才分享给大家的,也愿大家相互补充,使其所有操作更加完整,使更多得人学好keil,更希望你们的分享。

ZJK 2012.11.03
QQ:459576729。

KEIL中文显示问题和光标对不准和自定义关键字设为keil识别的关键字

KEIL中文显示问题和光标对不准和自定义关键字设为keil识别的关键字

KEIL中文显示问题,光标对不准这是因为在keil中对显示设置的问题,在默认的设置中EDIT->Configutation->Colors & Fonts->8051:Editor c Files中,
将Keyword和Identifier设置为加粗了的,加粗了之后了在显示中并不能同步移动光标,这就导致有光标对不起的情况,将里面所有的配置(图标中3所示)全部Style改为Normal就能解决这个问题了。

而且可以根据自己对颜色的喜欢在图标4所示中设定不同的颜色。

在KEIL中还可以自己定义Keywords,也在EDIT->Configutation->User Keywords,在方框中加入要添加的关键字
就可以了
列子中加的uchar(#define uchar unsigned char);这样就可以解决自己定义的关键字无颜色变化的问题。

附录B KeilC51编译常见错误与警告

附录B KeilC51编译常见错误与警告

317附录B Keil C51 编译常见错误与警告在利用Keil C51进行单片机软件程序的编写、调试过程中,经常会出现这样的现象,因为疏忽大意或是对于程序编写规则的不熟悉等原因,工程编译不能正常通过,导致最终未能生成单片机用于下载烧片所需的.hex 文件。

以下列举出了一些在工程编译过程中,常见的警告或错误的提示信息,以及解决这些警告或错误的具体方法;给出了常见编译器错误信息的查找方法和Keil C51编译器常见错误与警告提示信息中英文对照表,供读者在工程调试和编译过程中参考。

一、常见错误与警告现象现象一:部分程序如下:{…ET0=1 ET1=1; … }错误编号:C141原因:程序LED.C 第49行语句前缺少分号。

解决方法:语句 ET0=1后加";"即:ET0=1; 现象二:部分程序如下:{ …ET0=1; ET1=1; … }错误编号:C100、C141原因:程序LED.C 里53行有中文标点符号“;”。

解决方法:将中文符号改变成英文符号“;” 现象三:318警告编号:L16原因:delay2( )函数未被其它函数调用,它会占用程序存放空间。

解决方法:(1)删除delay2( )函数;(2)检查程序,某调用该子函数;(3)利用注释“/* … */”将整个delay2()函数体包含,可保留该函数但不被编译。

现象四:警告/错误编号:C206,C267,C231原因:‘delay ’函数未定义,即未编写程序内容或函数已定义但未作声明。

解决方法:(1)将该子函数放在调用它的主调函数前;(2) 在调用它的主调函数前,对该函数进行声明。

现象五:警告编号:C318原因:在编译main.c 程序过程中由于main.c 使用了头文件包含#include “buzzer.h ”,但编译器却找不见buzzer.h 头文件。

解决方法:找到相应的buzzer.h 或编写buzzer.h 文件,并存入到c:\keil 的相关目录中。

Keil中的常见错误和警告

Keil中的常见错误和警告

Keil中的常见错误和警告C51编译器识别错类型有三种1、致命错误:伪指令控制行有错、命令行指定的无效选项、访问不存在的原文件或头文件等。

致命错误立即终止程序编译。

2、语法及语义错误:语法和语义错误都发生在源文件中。

有这类错误时,给出提示但不产生目标文件,错误超过一定数量才终止编译。

3、警告:警告出现并不影响目标文件的产生,但执行时有可能发生问题,程序员应斟酌处理。

错误信息及可能发生的原因列表*ERROR 100:unprintable character 0x??skipped源文件中发现非法字符(注意,注解内的字符不做检查)。

*ERROR 101:unclosed string字符串未用引号结尾。

*ERROR 102:string too long字符串不得超过511 个字符。

为了定义更长的串,用户必须使用续行符‘\’逻辑的继续该字符串,在词汇分析时遇到以该符号结尾的行会与下行连接起来.*ERROR 103: invalid character constant试图再声明一个已定义的宏,已存在的宏可以用#undef指令删除。

预定义的宏不能删除。

*ERROR 104: identifier expected预处理器指令期望产生一个标示符,如ifdef。

*ERROR 105: unclosed comment当注解无结束界定符(*/)时产生此错误。

*EROOR 106: unbalanced#if-endif controlsendif的数量与if或ifdef的数量不匹配。

*ERROR 107:include file nesting exceeds 9include指令后的文件名无效或丢失*ERROR 108:expected string,如#error “string”预处理器指令期望一个串变量。

*ERROR 109:由#error 伪指令引入的错误信息以错误信号形式显示。

*ERROR 110:missing directive预处理行#后缺少伪指令。

KEIL C51错误的解决办法

KEIL C51错误的解决办法
ห้องสมุดไป่ตู้
另外一个比较常见错误:AD_converter.C(58): warning C316: unterminated conditionals
该错误是说,你的AD_converter.c文件有一个凌乱的条件编译或预编译。因为C语言中有时自己做头文件,头文件中的预编译或宏定义,那么条件编译就避免不了。那写条件编译时,可能有忘写一个基本的语句。比如说,你用了条件编译#ifndef而忘记写#endif。因为他们本来就是配套的。有前者必有后者。不能丢掉其中任何一个。就像你写C语句,你不会写了 int i 而不能忘记写 " ; " 。总之,出现上述问题。先看看整个C文件中是否出现上述错误。或整个工程中自己做的头文件中。
..\校长基金1\TEXT1.C(56): error C100: unprintable character 0xA2 skipped
但是在这一行,怎么找,也没找到错误。觉得是很正确的,其实,可能就是在第56行是否有在中文输入法下输入的东西,尤其是()这个东西或者是,在你的56行,有中文符号,可能偶尔是你不小心按错键盘没注意到。但是没有显示出来,因为在KEIL C51中,中文符号只能在注释里显示出来。()这个符号除外。可以在你的这行开头。加上注释符“//”,他就会显示出来,再把它删掉就可以了。
KEIL C51错误的解决办法 2009-07-14 14:02:25| 分类: 技术交流 | 标签: |字号大中小 订阅 .
有时候在编好一个程序之后,编译链接时,提示说有如下错误。
错误为
..\校长基金1\TEXT1.C(56): error C100: unprintable character 0xA1 skipped

C51-keil编译常见错误和警告处理

C51-keil编译常见错误和警告处理

C51-keil编译常见错误和警告处理53keil错误;C51编译器识别错类型有三种:1、致命错误:伪指令控制行有错,访问不存在的原文;2、语法及语义错误:语法和语义错误都发生在原文件;3、警告:警告出现并不影响目标文件的产生,但执行;C_51FATAL_ERRORACTION:&l;ERROR:<错误信息>termin;FILE:<错误所在文件>;ERROR:<错误信息>keil错误C51编译器识别错类型有三种1、致命错误:伪指令控制行有错,访问不存在的原文件或头文件等。

2、语法及语义错误:语法和语义错误都发生在原文件中。

有这类错误时,给出提示但不产生目标文件,错误超过一定数量才终止编译。

3、警告:警告出现并不影响目标文件的产生,但执行时有可能发生问题。

程序员应斟酌处理。

D.1 致命错误C_51 FATAL_ERROR ACTION: <当前行为> LINE: <错误所在行>ERROR: <错误信息> terminated 或C_51 FATAL ERROR ACTION: <当前行为>FILE: <错误所在文件>ERROR: <错误信息> terminated C_51 TERMINATED C_51 (1) ACTION 的有关信息*PARSING INVOKE-/#PRAGMA_LINE在对#pragma 指明的控制行作此法分析时出错。

*ALLOCATING MEMORY系统分配存储空间时出错。

编译较大程序需要512k空间。

*OPENING INPUT_FILE打开文件时,未找到或打不开源文件/头文件。

*CREATE LIST_FILE/OBJECT_FILE/WORK_FILE不能创建上述文件。

可能磁盘满或文件已存在而且写保护。

*PARSING SOURCE_FILE/ANALYZING DECLARATIONS分析源程序时发现外部引用名太多。

附录B-KeilC51编译常见错误和警告

附录B-KeilC51编译常见错误和警告

附录B Keil C51 编译常见错误与警告在利用Keil C51进行单片机软件程序的编写、调试过程中,经常会出现这样的现象,因为疏忽大意或是对于程序编写规则的不熟悉等原因,工程编译不能正常通过,导致最终未能生成单片机用于下载烧片所需的.hex文件。

以下列举出了一些在工程编译过程中,常见的警告或错误的提示信息,以及解决这些警告或错误的具体方法;给出了常见编译器错误信息的查找方法和Keil C51编译器常见错误与警告提示信息中英文对照表,供读者在工程调试和编译过程中参考。

一、常见错误与警告现象现象一:部分程序如下:{…ET0=1ET1=1;…}错误编号:C141原因:程序LED.C第49行语句前缺少分号。

解决方法:语句 ET0=1后加";"即:ET0=1;现象二:部分程序如下:{…ET0=1;ET1=1;…}错误编号:C100、C141原因:程序LED.C里53行有中文标点符号“;”。

解决方法:将中文符号改变成英文符号“;”现象三:警告编号:L16原因:delay2( )函数未被其它函数调用,它会占用程序存放空间。

解决方法:(1)删除delay2( )函数;(2)检查程序,某调用该子函数;(3)利用注释“/* … */”将整个delay2()函数体包含,可保留该函数但不被编译。

现象四:警告/错误编号:C206,C267,C231原因:‘delay’函数未定义,即未编写程序内容或函数已定义但未作声明。

解决方法:(1)将该子函数放在调用它的主调函数前;(2) 在调用它的主调函数前,对该函数进行声明。

现象五:警告编号:C318原因:在编译main.c 程序过程中由于main.c 使用了头文件包含#include “buzzer.h”,但编译器却找不见buzzer.h头文件。

解决方法:找到相应的buzzer.h或编写buzzer.h文件,并存入到c:\keil的相关目录中。

现象六:错误编号:C237原因:‘delay’函数名称重复定义,即有两个重名的函数。

我总结的KEIL51调试的错误总结

我总结的KEIL51调试的错误总结

KEIL51调试时一些的错误总结(1)提示无M51文件编译时候提示:F:\...\XX.M51File has been changed outside the editor, reload ?------解决方法:重新生成项目,产生STARTUP.A51即可。

(2)L15重复调用***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP如果函数可以在其执行时被调用,则情况会变得更复杂一些。

这时可以采用以下几种方法:1.主程序调用该函数时禁止中断,可以在该函数被调用时用#pragma disable语句来实现禁止中断的目的。

必须使用OVERLAY指令将该函数从覆盖分析中除去。

2.复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。

3.将该函数设为重入型。

例如:void myfunc(void) reentrant {...}这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配置。

这种方法消耗更多的RAM并会降低重入函数的执行速度。

(3)L16无调用*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_COMPARE?TESTLCD说明:程序中有些函数例如COMPARE(或片段)以前(调试过程中)从未被调用过,或者根本没有调用它的语句。

这条警告信息前应该还有一条信息指示出是哪个函数导致了这一问题。

只要做点简单的调整就可以。

不理它也没什么大不了的。

解决方法:去掉COMPARE()函数或利用条件编译#if …..#endif,可保留该函数并不编译。

keil 切换编码中文乱码的一种手动解决方法

keil 切换编码中文乱码的一种手动解决方法

一、引言在使用keil进行编码时,有时会遇到中文乱码的问题,这给我们的编程工作带来了不便。

本文将介绍一种手动解决keil切换编码中文乱码问题的方法,希望能够帮助到大家。

二、问题分析1. 中文乱码问题的原因在keil中,中文乱码可能是由于编码格式不一致所导致的。

不同的编码格式会导致中文字符的显示出现问题,从而影响程序的编写和阅读。

2. 解决方法针对keil切换编码中文乱码问题,我们可以通过手动调整编码格式来解决。

接下来将介绍具体的操作步骤。

三、操作步骤1. 打开keil软件,找到需要解决中文乱码的文件。

2. 点击菜单栏中的“文件”选项,选择“另存为”。

3. 在另存为窗口中,找到“编码”选项,点击下拉箭头选择“UTF-8”编码格式。

4. 点击“保存”按钮,将文件保存为UTF-8编码格式。

5. 关闭原文件,重新打开刚才保存的文件,此时中文乱码的问题应该得到了解决。

通过以上操作步骤,我们可以实现keil切换编码中文乱码问题的解决。

四、注意事项1. 在进行编码格式转换时,建议先备份原文件,以防操作失误导致文件损坏。

2. 在保存文件时,确保选择了正确的编码格式,否则可能会导致文件内容损坏或者乱码问题未能解决。

3. 如果以上操作仍未能解决中文乱码问题,可以考虑使用其他编辑工具来处理文件编码格式,或者寻求专业人士的帮助。

五、总结通过本文介绍的方法,我们可以手动解决keil切换编码中文乱码问题,从而提高编程效率和便利性。

在日常使用keil过程中,如果遇到类似问题,可以尝试以上方法进行处理,相信会对大家带来帮助。

六、结语希望本文介绍的内容能够对大家解决keil编码中文乱码问题有所帮助,也希望大家能够在使用keil软件时更加顺利地进行编程工作。

谢谢大家的阅读!中文乱码问题在使用keil进行编码的过程中是一个很常见的困扰,特别是对于初学者来说。

在编程过程中,我们经常需要使用中文注释或者中文命名变量,但是由于不同的编码格式,导致中文字符显示出现问题,给我们的编程工作带来了很大的不便。

KEIL C51 常见问题集合

KEIL C51 常见问题集合

Keil Cx51编译器编程基本原则和代码的优化 ——和复杂声明的理解Copyleft2009 by高飞电子经营部(官网地址,点击之前请确认。

)图1 51基本内核的结构框图以上各部分通过内部总线相连接。

在很多情况下,单片机还要和外部设备或外部存储器相连接,连接方式采用三总线(地址、数据、控制)方式,但在51单图2 普通51单片机的存储器组织结构空间名称 地址范围 说明 DATA D:00H~D:7FH 片内RAM直接寻址BDATA D:20H~D:2FH 片内RAM位寻址IDATA I:00H~I:FFH 片内RAM间接寻址XDATA X:0000H~X:FFFFH 64KB片外RAM数据区CODE C:0000H~C:FFFFH 64KB片外ROM代码区 BANK0~BANK31B0:0000~B0:FFFFH...B31:0000~B31:FFFFH分组代码区,最大可扩展32x64KB ROM表1 普通51单片机存储器空间分配表高飞出品必属精品,版权所有欢迎转载欢迎光临我的淘宝小店-高飞电子经营部/图3 新型51单片机的扩展存储器组织结构空间名称 地址范围 说明DATA D:00H~D:7FH 片内RAM 直接寻址 BDATA D:20H~D:2FH 片内RAM 位寻址 IDATA I:00H~I:FFH 片内RAM 间接寻址 XDATA X:0000H~X:FFFFH 64KB 片外RAM 数据区 CODE C:0000H~C:FFFFH 64KB 片外ROM 代码区 HCONST(ECODE) C:0000H~C:FFFFFFH 16MB 扩展片外ROM 常数区(对Dallas390可用做代码区)BANK0~BANK31 B0:0000~B0:FFFFH . . . B31:0000~B31:FFFFH分组代码区,最大可扩展32x64KB ROM表2 新型80C51单片机扩展存储器空间分配表6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP FROM : 0025H TO: 0025H说明外部存储器ROM的0025H 重复定义地址。

Keil C51错误及其警告大全

Keil C51错误及其警告大全

࢒໕ᐺࡇᇙቧᇦ本章列出了编程中可能遇到的致命错误语法错误和警告信息每节包括一个信息的主要说明和消除错误或警告条件可采取的措施致命错误致命错误立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不能访问一个特定的源包含文件时也产生致命错误致命错误信息采用下面的格式C51 FATAL-ERROR –ACTION<current action>LINE:<line in which the error is detected>ERROR:<corresponding error message> C51 TERMIANTED.C51 FATAL-ERROR –ACTION<current action>FILE:<file in which the error is detected>ERROR:<corresponding error message> C51 TERMIANTED.下面说明Action和Error中可能的内容ActionsALLOCATING MEMORY编译器不能分配足够的存储区来编译指定的源文件CREATING LIST-FILE / OBJECT-FILE / WORKFILE编译器不能建立列表文件OBJ文件或工作文件这个错误的出现可能是磁盘满或写保护或文件已存在和只读GENERATING INTERMEDIATE CODE源文件包含的一个函数太大不能被编译器编译成虚拟代码尝试把函数分小或重新编译OPENING INPUT-FILE编译器不能发现或打开所选的源或包含文件PARSING INVOKE-/#PRAGMA-LINE当在命令行检测到参数计算或在一个#pragma中检测到参数计算就产生这样的错误PARSING SOURCE-FILE/ANALYZING DECLARATIONS源文件包含太多的外部参考减少源文件访问的外部变量和函数的数目WRITING TO FILE当写入列表文件OBJ文件或工作文件时遇到的错误Errors‘(‘ AFTER CONTROL EXPECTED一些控制参数需要用括号包含一个参数当没有左括号时显示本信息‘)’ AFTER PARAMETER EXPECTED本信息表示包含没有参数的右括号BAD DIGIT IN NUMBER一个控制参数的数字参数包含无效字符只能是十进制数CAN’T CREATE FILE在FILE行定义的文件名不能建立CAN’T HA VE GERERAL CONTROL IN INVOCATION LINE一般控制例如EJECT不能包含在命令行把这些控制用#pragma声明放在源文件中FILE DOES NOT EXIST没有发现定义在FILE行的文件FILE WRITE-ERROR因为磁盘空间不够写到列表预打印工作或目标文件时出错IDENTIFIER EXPECTED当DEFINE控制没有参数时产生本信息DEFINE要求一个参数作为标识符这和C语言的规则相同MEMORY SPACE EXHAUSTED编译器不能分配足够的存储区来编译指定的源文件如果始终出现这个信息应该把源文件分成两个或多个小文件再重新编译MORE THAN100ERRORS IN SOURCE-FILE在编译时检测到的错误超过100个这使编译器终止MORE THAN256SEGMENTS/EXTERNALS在一个源文件中的参考超过256个单个的源文件不能有超过256个函数或外部参考这是INTEL目标模块格式OMF-51的历史的限制包含标量和/或bit声明的函数在OBJ文件中生成两个有时候三个段定义NON-NULL ARGUMENT EXPECTED所选的控制参数需要用括号包含一个参数例如一个文件名或一个数字OUT OF RANGE NUMBER一个控制参数的数字参数超出范围例如OPTIMIZE控制只允许数字0到6值7就将产生本错误信息PARSE STACK OVERFLOW解析堆栈溢出如果源程序包含很复杂的表达式或如果块的嵌套深度超过31级就会出现这个错误PREPROCESSOR LINE TOO LONG32K一个中间扩展长度超过32K字符PREPROCESSOR MACROS TOO NESTED在宏扩展期间预处理器所用的堆栈太大这个信息通常表示一个递归的宏定义但也可表示一个宏嵌套太多RESPECIFIED OR CONFLICTING CONTROL一个命令行参数指定了两次或命令行参数冲突SOURCE MUST COME FROM A DISK-FILE源和包含文件必须存在控制台CON CI或类似的设备不能作为输入文件UNKNOWN CONTROL所选的控制参数不认识语法和语义错误语法和语义错误一般出现在源程序中它们确定实际的编程错误当遇到这些错误时编译器尝试绕过错误继续处理源文件当遇到更多的错误时编译器输出另外的错误信息但是不产生OBJ文件语法和语义错误在列表文件中生成一条信息这些错误信息用下面的格式*** ERROR number IN LINE line OF file:error message这里number错误号line对应源文件或包含文件的行号file产生错误的源或包含文件名error message对错误的叙述说明下表按错误号列出了语法和语义错误错误信息列出了主要说明和可能的原因和改正100跳过不可打印字符0x??在源文件中发现一个非法字符注意不检查注释中的字符101字符串没结束一个字符串没有用双引号终止102字符串太长一个字符串不能超过4096个字符用串联符号\在逻辑上可延长字符串超过4096个字符这个模式的行终止符在词汇分析时是连续的103无效的字符常数一个字符常数的格式无效符号\c是无效的除非c是任何可打印的ASCII字符125声明符太复杂20一个目标的声明可包含最多20个类型修饰符[]*这个错误经常伴随着错误126126类型堆栈下溢类型声明堆栈下溢这个错误通常死错误125的副产品127无效存储类一个目标用一个无效的存储空间标识符声明如果一个目标在一个函数外用存储类auto或register声明就会产生本错误129在标记前缺少本错误通常表示前一行缺少分号当出现本错误时编译器会产生很多错误信息130值超出范围在一个using或interrupt标识符后的数字参数是无效的using标识符要求一个0到3之间的寄存器组号interrupt标识符要求一个0到31之间的中断矢量号131函数参数重复一个函数有相同的参数名在函数声明中参数名必须是唯一的132没在正式的参数列表一个函数的参数声明用了一个名称没在参数名列表中例如char function(v0,v1,v2)char *v0,*v1,*v5;/* ‘v5’没在正式列表中 */{/* … */}134函数的xdata/idata/pdata/data不允许函数通常位于code存储区不能在别的存储区运行函数默认定义为存储类型code135bit的存储类错bit标量的声明可能包含一个static或extern存储类register或alien类是无效的136变量用了voidvoid类型只允许作为一个不存在的返回值或一个函数的空参数列表voidfunc(void)或和一个指针组合void *138Interrupt()不能接受或返回值一个中断函数被定义了一个或多个正式的参数或一个返回值中断函数不能包含调用参数或返回值140位在非法的存储空间bit标量的定义可以包含可选的存储类型data如果没有存储类型则默认为data因为位通常在内部数据存储区当试图对一个bit标量定义别的数据类型时会产生本错误141临近标志语法错误期待别的标志…编译器所见的标志是错误的参考所显示的期待的内容142无效的基地址一个sfr或sbit声明的基地址是错误的有效的基地址范围在0x80到0xFF之间如果用符号基地址^位号声明则基地址必须是8的倍数143无效的绝对位地址sbit声明中的绝对位地址必须在0x80到0xFF之间144基地址^位号无效的位号sbit声明中定义的位号必须在0到7之间145未知的sfr146无效sfr一个绝对位基地址^位号的声明包含一个无效的基地址标识符基地址必须是已经声明的sfr任何别的名称是无效的147目标文件太大单个目标文件不能超过6553564K字节-1149struct/union包含函数成员struct或union不能包含一个函数类型的成员但是指向函数的指针是可以的150struct/union包含一个bit成员一个union不能包含bit类型成员这是8051的结构决定的151struct/union自我关联一个结构不能包含自己152位号超出位域位域声明中指定的位号超过给定基类的位号153命名的位域不能为零命名的位域为零只要未命名的位域允许为零154位域指针指向位域的指针不允许155位域要求char/int位域的基类要求char或int unsigned char和unsigned int类型也行156alien只允许对函数157alien函数带可变参数存储类alien只对外部PL/M-51函数允许符号ch a r*,…在alien函数中是非法的PL/M-51函数通常要求一个固定的参数表158函数包含未命名的参数一个函数的参数列表定义包含一个未命名的抽象类型定义这个符号只允许在函数原型中159void后面带类型函数的原型声明可包含一个空参数列表例如int func(void)在void后不能再有类型定义160void无效void类型只在和指针组合或作为一个函数的不存在的返回值中是合法的161忽视了正式参数在一个函数内一个外部函数的声明用了一个没有类型标识符的参数名列表例如extern yylex(a,b,c);180不能指向一个函数指向一个函数的类型是无效的尝试用指针指向一个函数181操作数不兼容对给定的操作符至少一个操作数类型是无效的例如~float_type183左值不能修改要修改的目标位于code存储区或有const属性因此不能修改184sizeof非法操作数sizeof操作符不能确定一个函数或位域的大小185不同的存储空间一个目标声明的存储空间和前一个同样目标声明的存储空间不同186解除参照无效一个内部编译器问题会产生本信息如果本错误重复出现请和技术支持接洽187不是一个左值所需的参数必须是一个可修改的目标地址188未知目标大小因为没有一个数组的维数或间接通过一个void指针一个目标的大小不能计算189&对bit/sfr非法取地址符’&’不允许对bit目标或特殊函数寄存器sfr190&不是一个左值尝试建立一个指针指向一个未知目标193非法操作类型193对ptr非法add/sub193对bit的非法操作193错误操作数类型当对一个给定的操作符用了非法的操作数类型时产生本错误例如无效的表达式如bit*bit ptr+ptr或ptr*anything这个错误信息包括引起错误的操作符下面的操作对bit类型的操作数是可行的赋值=OR/复合OR||=AND/复合AND&&=XOR/复合XOR^^=bit比较= =!=取反~bit操作数可和别的数据类型在表达式中混用在这种情况类型转换自动执行194*间接指向一个未知大小的目标间接操作符*不能和void指针合用因为指针所指的目标的大小是未知的195*间接非法*操作符不能用到非指针参数196存储空间可能无效转换一个常数到一个指针常数产生一个无效的存储空间例如 char*p=0x91234198sizeof返回零sizeof操作符返回一个零199->’的左边要求struct/union指针->操作符的左边参数必须是一个struct指针或一个union指针200.左边要求struct/union.操作符的左边参数要求必须是struct或union类型201未定义的struct/union给定的struct或union名是未知的202未定义的标识符给定的标识符是未定义的203错误的存储类参考名本错误表示编译器的一个问题如果重复出现请接洽技术支持204未定义的成员给定的一个struct或union成员名是未定义的205不能调用一个中断函数一个中断函数不能象一个正常函数一样调用中断的入口和退出代码是特殊的207参数列表声明为void参数列表声明为void的函数不能从调用者接收参数208太多的实参函数调用包含太多的实参209太少的实参调用函数包含太少的实参210太多的嵌套调用函数的嵌套调用不能超过10级211调用不是对一个函数一个函数的调用项不是对一个函数或函数指针求值212间接调用寄存器的参数不匹配通过一个指针的间接函数调用不包含实际的参数一个例外是当所有的参数可以通过寄存器传递这是由于Cx51所用的传递参数的方法被调用的函数名必须是已知的因为参数写到被调用函数的数据段但是对间接调用来说被调用函数的名称是未知的213赋值符的左边不是一个左值赋值符的左边要求一个可修改目标的地址214非法指针转换bit float或集合类型的目标不能转换为指针215非法类型转换struct/union/void不能转换为任何别的类型216标号用在非数组中或维数超出一个数组引用包含太大的维数或目标不是一个数组217非整数索引一个数组的维数表达式必须是char unsigned char int或unsigned int类型别的类型都是非法的218控制表达式用了void类型在一个while for或do的限制表达式中不能用类型void219long常数缩减为int一个常数表达式的值必须能用一个int类型表示220非法常数表达式期望一个常数表达式目标名变量或函数不允许出现在常数表达式中221非常数case/dim表达式一个case或一个维数[ ]必须是一个常数表达式222被零除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参数<数字>不同类型函数声明的参数类型和函数原型中的不同236参数列表的长度不同函数声明中的参数数目和函数原型中的不同237函数早已定义试图声明一个函数体两次238重复成员239重复参数试图定义一个已存在的struct成员或函数参数240超出128个局部bit在一个函数内不能超过128个bit标量241auto段太大局部目标所需的空间超过模式的极限最大的段大小定义如下SMALL128字节COMPACT256字节LARGE65535字节242太多的初始化软件初始化软件的数目超过初始化目标的数量243字符串超出范围字符串中的字符数目超出字符串初始化的数目244不能初始化错误的类型或类试图初始化一个bit或sfr245未知的pragma跳过本行#pragma状态未知所以整行被忽略246浮点错误当一个浮点参数超出32位的范围就产生本错误32位IEEE值的范围是±1.175494E-38到±3.402823E+38247非地址/常数初始化一个有效的初始化表达式必须是一个常数值求值或一个目标名加或减去一个常数248集合初始化需要大括号给定struct或union初始化缺少大括号{}249段<名>段太大编译器检测到一个数据段太大一个数据段的最大的大小由存储空间决定250\esc值超过255一个字符串常数中的转义序列超过有效值范围最大值是255252非法八进制数指定的字符不是一个有效的八进制数252主要控制放错地方行被忽略主要控制必须被指定在C模块的开头在任何#include命令或声明前253内部错误ASMGEN\CLASS在下列情况下出现本错误一个内在函数例如_testbit_被错误激活这种情况是在没有函数原型存在和实参数目或类型错误对这种原因必须使用合适的声明文件INTRINS.H STRING.H参考第八章中的instrinsic函数Cx51确认一个内部一致性问题请接洽技术支持255switch表达式有非法类型在一个switch表达式没有合法的数据类型256存储模式冲突一个包含alien属性的函数只能包含模式标识符small函数的参数必须位于内部数据区这适用于所有的外部alien声明和alien函数例如alien plm_func(char c) large {…}产生错误256257alien函数不能重入一个包含alien属性的函数不能同时包含reentrant属性函数参数不能跳过虚拟堆栈传递这适用于所有的外部alien声明和alien函数258struct/union成员的存储空间非法非法空间的参数被忽略一个结构的成员或参数不能包含一个存储类型标识符但指针所指的目标可能包含一个存储类型例如struct vp{char code c;int xdata i; };产生错误258struct v1{char c;int xdata *i; };是正确的struct声明259指针不同的存储空间一个空指针被关联到别的不同存储空间的空指针例如char xdata *p1;char idata *p2;p1 = p2; /* 不同的存储空间 */260指针断开一个空指针被关联到一些常数值这些值超过了指针存储空间的值范围例如char idata *p1 = 0x1234; /* 结果是0x34 */261reentrant()内有bit一个可重入属性的函数的声明中不能包含bit目标例如int func1(int i1) reentrant {bit b1,b2; /* 不允许 */return(i1-1);}262using/disable不能返回bit值用using属性声明的函数和禁止中断#pragma disable的函数不能返回一个bit值给调用者例如bit test(void) using 3{bit b0;return(b0);}产生错误262263保存/恢复堆栈保存溢出/下溢#pragma save的最大嵌套深度是八级堆栈的pragma save和restore工作根据LIFO后进先出规则264内在的<内在的名称>声明/激活错误本错误表示一个内在的函数错误定义参数数目或省略号如果用标准的.H文件就不会产生本错误确认使用了Cx51所有的.H文件不要尝试对内在的库函数定义自己的原型265对非重入函数递归调用非重入函数不能被递归调用因为这样会覆盖函数的参数和局部数据如果需要递归调用需声明函数为可重入函数267函数定义需要ANSI类型的原型一个函数被带参数调用但是声明是一个空的参数列表原型必须有完整的参数类型这样编译器就可能通过寄存器传递参数和适合应用的调用机制268任务定义错误任务ID/优先级/using任务声明错误271asm/endasm控制放错地方asm和endasm声明不能嵌套endasm要求一个汇编块前面用asm开头例如#pragma asm...汇编指令...#pragma endasm272asm要求激活SRC控制在一个源文件中使用asm和endasm要求文件用SRC控制编译那么编译器就会生成汇编源文件然后可以用A51汇编273asm/endasm在包含文件中不允许在包含文件中不允许asm和endasm为了调试在包含文件不能有任何的可执行代码274非法的绝对标识符绝对地址标识符对位目标函数和局部函数不允许地址必须和目标的存储空间一致例如下面的声明是无效的因为间接寻址的范围是0x00到0xFFidata int _at_ 0x1000;278常数太大当浮点参数超出32位的浮点值范围就产生本错误32位IEEE值的范围是±1.175494E-38到±3.402823E+38279多次初始化试图多次初始化一个目标280没有使用符号/标号/参数在一个函数中声明了一个符号标号或参数但没有使用281非指针类型转换为指针引用的程序目标不能转换成一个指针282不是一个SFR引用本函数调用要求一个SFR作为参数283asmparms参数不适合寄存器参数不适合可用的CPU寄存器284<名称>在可覆盖空间函数不再可重入一个可重入函数包含对局部变量的明确的存储类型标识符函数不再完全可重入300注释未结束一个注释没有一个结束符*/301期望标识符一个预处理器命令期望一个标识符302误用#操作符字符操作符#没有带一个标识符303期望正式参数字符操作符#没有带一个标识符表示当前所定义的宏的一个正式参数名304错误的宏参数列表宏参数列表没有一个大括号逗号分开的标识符列表305string/char常数未结束一个字符串活字符常数是无效的典型的后引号丢失306宏调用未结束预处理器在收集和扩展一个宏调用的实际的参数时遇到输入文件的结尾307宏名称参数计算不匹配在一个宏调用中实际的参数数目和宏定义的参数数目不匹配本错误表示指定了太少的参数308无效的整数常数表达式一个if/elif命令的数学表达式包含一个语法错误309错误或缺少文件名在一个include命令中的文件名参数是无效的或没有310条件嵌套过多20源文件包含太多的条件编译嵌套命令最多允许20级嵌套311elif/else控制放错地方312endif控制放错地方命令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.h325正参名称重复一个宏的正参只能定义一次326宏体不能以##开始或结束##不能是一个宏体的开始或结束327宏宏名超过50个参数每个宏的参数数目不能超过50警告警告产生潜在问题的信息他们可能在目标程序的运行过程中出现警告不妨碍源文件的编译警告在列表文件中生成信息警告信息用下面的格式*** 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位代表选择的存储空间198sizeof返回零一个目标的大小计算结果为零如果目标是外部的或如果一个数组的维数没有全知道则值是错误的206缺少函数原型因为没有原型声明被调用的函数是未知的调用一个未知的函数通常是危险的参数的数目和实际要求不一样如果是这种情况函数调用不正确没有函数原型编译器不能检查参数的数目和类型要避免这种警告应在程序中包含函数的原型函数原型必须在函数被调用前声明注意函数定义自动生成原型209实参太少在一个函数调用中包含太少的实参219long常数被缩减为int一个常数表达式的值必须能被一个int类型所表示245未知的pragma本行被忽略#pragma声明是未知的因此整行程序被忽略258struct/union成员的存储空间方法参数的存储空间被忽略一个结构的成员或一个参数不能指定存储类型但是指针所指的目标可以包含一个存储类型例如struct vp{ char code c;int xdata i; };产生警告258struct v1{ char c;int xdata *i; };对struct是正确的声明259指针不同的存储空间两个要比较的指针没有引用相同的存储类型的目标260指针折断把一个指针转换为一个更小偏移区的指针转换会完成但大指针的偏移会折断来适应小指针261bit在重入函数一个reentrant函数不能包含bit因为bit标量不能保存在虚拟堆栈中265名称对非重入函数递归调用发现对一个非重入函数直接递归这可能是故意的但对每个独立的情况进行功能性检查通过生成的代码间接递归由连接/定位器检查271asm/endams控制放错地方asm和endasm不能嵌套endasm要求一个以asm声明开头的汇编块例如#pragma asm...汇编指令...#pragma endasm275表达式可能无效编译器检测到一个表达式不生成代码例如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; /* 存储空间xdata */typedef XCC idata PICC; /* 存储空间冲突 */280符号/标号未使用一个符号或标号定义但未使用307宏名称参数计算不匹配一个宏调用的实参的数目和宏定义的参数数目不匹配表示用了太多的的参数过剩的参数被忽略317宏名称重新定义无效一个预定义的宏不能重新定义或清除参考138页的预定义宏常数322未知的标识符在一个#if命令行的标识符未定义等效为FALSE323期望新行发现多余字符一个#命令行正确但包含多余的非注释字符例如#include <stdio.h> foo。

【精品博文】KeilC51中文乱码问题

【精品博文】KeilC51中文乱码问题

【精品博文】KeilC51中文乱码问题
最近编译器显示中文乱码问题不断遇到,虽然不影响程序执行,但看着一堆乱码总是感觉别扭,有点强迫症,总想把它改过来!
遇到这个问题原因是大家开发程序时采用了不同的文档编码方式。

比如这两天打开了一个SJA1000的头文件,显示成这个了。

只需要在KEIL中选一下编码方式就解决问题了。

可以看到显示正常!
但是问题又来了,比如我原来写的程序使用了UTF-8编码,需要添加一个ANSI编码的文件,这时候不能因为需要这个文件显示正常,就不顾其它文件了,那怎么办呢?
其实很简单,找个编码转换软件转换一下就可以了,那用哪个呢?其实很简单,我们计算机上的记事本就是一个很简单的工具可实现此功能。

比如使用记事本打开你的文件。

然后另存时改一下编码就好了。

将两个文件都在KEIL中显示一下就可以对比发现实现了我们的预期要求,讲一个ANSI编码文档改成了UTF-8文档。

反过来同样适用。

keil串口printf中文乱码

keil串口printf中文乱码

keil串口printf中文乱码在使用Keil开发单片机过程中,常常需要通过串口输出中文字符。

但是,很容易出现中文乱码的问题,导致显示不正常。

这是因为Keil默认使用的是ASCII码,而中文字符一般使用Unicode编码。

因此,需要进行一些设置才能实现中文输出。

一种解决方法是通过在Keil的设置中添加中文字符集。

具体操作是:点击工具栏上的“Options for Target”,在弹出的窗口中选择“C/C++”选项卡,在“Additional Text”一栏中添加以下代码: #pragma import(__use_no_semihosting)struct __FILE{int handle;};FILE __stdout;void _sys_exit(int x){x = x;}int fputc(int ch, FILE *f){while((USART1->SR&0X40)==0);USART1->DR = (u8) ch;return ch;}这段代码定义了一个结构体__FILE和一个指向__stdout的指针,同时重定义了fputc函数,使其向串口输出字符。

此时,通过串口输出中文字符就不会出现乱码问题了。

除此之外,还可以通过使用GB2312编码的方法实现中文输出。

具体操作是:将中文字符转换为GB2312编码,然后将编码按照ASCII 码的方式输出。

在接收端,将接收到的编码转换为中文字符即可。

综上所述,Keil串口输出中文乱码可以通过添加中文字符集或使用GB2312编码来解决。

具体方法根据实际需求选择。

成都控制器开发:容易忽略!用KEIL编码汉字也会有BUG

成都控制器开发:容易忽略!用KEIL编码汉字也会有BUG

成都控制器开发:容易忽略!用KEIL编码汉字也会有BUG 有时你以为不会有错,但是错误往往出现在意料之外。

那天,用MCU的串口向触摸屏发送汉字字符串,但是在发送某个字符串的时候想要显示的东西总是不能在触屏上正常显示,发送另外的字符串却能正常显示,这就奇了怪了,那么问题在哪里呢?故事是这样的:原本计划在触摸屏上的文本控件上显示压力的报警信息。

当传感器检查到压力异常时用串口向触屏发送字符串:压力过高,于是用KEIL编了一句指令代码:”sendstring(“t9.txt=\”压力过高\””);”不过,酒醉的故事开始了。

载入程序测试时,在触屏上死活不能正常显示“压力过高”这个字符串,干脆直接就没有反应。

于是就纳闷了,代码检查了又检查,并且与其他类似的代码比对,没错误啊!几分钟后,于是决定试试改变一下字符串的内容,改为:“sendstring(“t9.txt=\”已选双发\””);”,surprise,这个代码居然能在触摸屏上的t9文本控件上正常显示“已选双发”这个字符。

同样的代码,只是里面的字符串内容不同,就有那么大的差异,这可就真的见了鬼了。

于是打开串口助手,倒要看看哪里见了鬼。

图 1 测试“已选双发”的串口发送的结果:正常图 2 测试“压力过高”的串口结果:不正常经分析,原来在用KEIL 进行程序编码的时候,对汉字字符串的处理出现了BUG ,对某些汉字不能正常编码。

经过实践,对ASCII 码的字符串(英文、数字、符号等)KEIL 基本能够正确处理,但是对于汉字或者其他字符却不能保证每次都正确,已选双发:这个字符串是基本正常的。

压力过高:这个就有问题了,乱码了,最后面一个”号偶尔丢失,怪不得没反应。

业务QQ:2531263726更多信息微信公众号yonkotech这点需要开发者注意,在使用的时候避开可能会导致乱码的汉字字符,另外串口助手是个调试的好东西。

全文完。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Keil C51汉字显示的bug问题(0xFD问题)
Keil C51汉字显示的bug问题
一、缘起
这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序。

如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”。

二、问题
但是,花了1天多时间辛辛苦苦改好的程序后,却发现有些汉字显示有问题。

比如:
P1:在第一行显示“实时参数”,第二行显示“工作状态”,实际上“工作状态”却重复显示了,除了在正确的地方显示外,还在“实时参数”后显示了。

P2:"正"字后若有":",则都显示成乱码。

如果后面没有":",则"正"字可正确显示,但是后面却显示了后面的一行字。

P3:"过"字总显示乱码;
三、求索
通过调试发现,上述汉字显示不正常的时候,是因为在字库中找不到匹配的汉字。

可是,自建的字库中明明有这些汉字,而且"数","正"字在后面无字符的时候是显示正确的啊!
问题找了好久,怀疑传参类型不对,汉字查找可能溢出等,反复修改,总是无法解决问题,而且从现象来思考,都不应该是这些问题。

今日灵光一现:为什么不在传递字符串后显示该字符串的变量值呢?
经过详细研究,西文字符在传递时应该是ACSII值,一个字节,数值小于128;而汉字传递的是其机内码,分高低2个字节,2个字节都大于127,当然并小于256。

字符串传递参数值一显示,可不得了。

其惊人之处有:
1."数","正","过"正确显示时其传参值为:0xca00,0xd500,0xb900;而其正确的机内码应该是:0xca fd,0xd5fd,0xb9fd。

看来其低位字节被无情忽视。

2."数","正","过"单独显示正确,但是后面带一个字符或汉字就显示乱码了。

如"正:"传参的值为:0xd53a,0x0000;"数
"传参的值为:0xca20,0x0000。

而":"和"
"的ASCII值恰好是0x3a,0x20,看来这几个汉字是叛变到西文字符中去了,机内码只有一个高位字节了。

3.将传参值直接赋给汉字显示函数,如"过"用"0xb9,0xfd"是显示不了的,只能用"0xb9,0x00"。

4.比较发现,显示不正常的"数","正","过"三个字的低位字节都是0xfd,而一直显示正确的"一二"等汉字机内码的低位字节都不是0xfd。

莫非keil跟0xfd有不共戴天之仇?
四、解决
天涯茫茫寻不到,无奈只有上百度。

用"keil
c51的汉字显示问题"一搜就找到组织了,泪奔啊。

组织的力量大,很快就给出了让我这等底层开发者劳累辛苦的原因:这是万恶的keil存在的一个臭名昭著的bug!伟大的组织同时无私的提供了答案,而且还不止一种哦。

以下是从某同志的blog中摘录:
“解决方法两个:
①下个晓奇工作室出的补丁,自己搜一下。

(/mcu/)
②用十六进制编辑软件如HexEdit打开c51.exe,搜索80FBFD,改为80FBFF即可。

c51.exe位置:Keil安装目录/keil/c51/bin/c51.exe”
赶紧拿起前辈们提供的武器,向keil 0xfd bug发起猛烈冲锋!……
待我重新烧录好程序,轻轻的打开电源,液晶屏幕上的一个个汉字显示得整齐而又干净,整个世界清静了…………
本文来自CSDN博客,转载请标明出处:/willhu2008/archive/2009/08/25/448248 7.aspx
Keil过滤0xfd字符的bug的修正
keil c51在编译的时候会将0xfd的字符(有些汉字含该字符的内码)过滤, 而导致程序出错.特别是在做液晶汉字显示时. 针对这个bug.由网友编写了这个补丁. 请下载之后放到你的keil\c51\bin 目录里,运行这个程序.就可以了. 支持v8.02
去晓奇网站上下个补丁程序运行下即可
这么多年了,Keil还是有这个Bug,而且晓奇做的哪个补丁程序也不错,这么多年了都还能适用:-)
相关链接:
直接用Uedit打开需要修改的文件,将对应的0xFD修改成0xFF就可
例如,对于51编译器,那么用Uedit打开C51/BIN/目录下的C51.exe,然后查找80FBFD56,找到后将FD改成FF,保
存,就OK拉。

对于UV3的CARM编译器,那么应该找到ARM/BIN/目录下的CA.exe,然后查找80FBFD,找到后将FD改成FF,保存,
就OK的拉~
就是遇到0xFD时就被过滤掉了。

例如,你写一个字符穿,里面包含一个数学的数字,那么这个数字就丢了一半……
char MyString[]="数字";
如果你不打补丁,通过串口发送出去的就是乱码...因为错位了,“数”字被丢掉了0xFD...
~~
v905之前的0xfd漏洞修正方法:用HEXEdit修改c51.exe、a51.exe
查找 80fbfd56
替换为 80fbff56
v905的0xfd漏洞修正方法
查找 80fbfd0f
替换为 80fbff0f
你好,9.50的查找那个数据提示没有找到!!!
查找 80fbfd0f
替换为 80fbff0f
这个数据查找,记得去掉勾选的FIND TEXT
查找 80fbfd0f
替换为 80fbff0f
这个数据查找,记得去掉勾选的FIND TEXT
意思就是说,如果你的字符中包含了0xFD,那么就会被忽略。

但如果用\x转义符写的却不会,例如可以在字符串
中写"\xFD",最后的数据中会保留这个字符。

所以对于受到影响的汉字,你可以直接用两个\x转义符把编码直接写上。

或者额外写一个\xFD补上被滤掉的。

例如,“数字电路”这个字符串,直接写的话,“数”会出问题。

那么你可以写:(“数”的编码是0xCA 0xFD

"\xCA\xFD字电路"
或者写:
"数\xFD字电路"。

相关文档
最新文档