HT-IDE3000HoltekC语言编程指南(中文).docx
HT-IDE3000 Holtek C 语言编程指南Ver 1.1注意使用指南中所出现的信息在出版当时相信是正确的,然而盛群对于说明书的使用不负任何责任。文中提到的 应用目的仅仅是用来做说明,盛群不保证或表示这些没有进一步修改的应用将是适当的,也不推荐它的产品 使用在会由于故障或其它原因可能会对人身造成危害的地方。盛群产品不授权使用于救生、维生器件或系统 中做为关键器件。盛群拥有不事先通知而修改产品的权利。对于最新的信息,请参考我们的网址 .tw目录HOUEKFT目录简介1C语言的程序结构2语句2注释2标识符3保留字3数据类型3数据类型与大小3宣告4常量5整型常量5字符型常量6字符串常量6枚举常量6运算符7算术运算符7关系运算符7等式运算符7逻辑运算符8位运算符8复合赋值运算符8递增和递减运算符9条件运算符9逗号运算符9运算符的优先权与结合性10类型转换11程序流程控制12函数16古典形式16现代形式16指针与数组17指针17数组17结构体与共用体(Structures and Unions)18前置处理伪指令19HOLTEK目录盛群C语言的扩充功能与限制存储器区块(memory bank)二位数据类型:内嵌式汇编语言:常量:指针:初始值:乘数/除数/模内建函数:第二章混合语言31Little Endian31函数与参数的命名规则32全局变量32局部变量32函数33函数的参数34参数的传递34返回值34寄存器内容的保存34在C程序调用汇编语言函数35在汇编程序调用C函数36使用汇编语言撰写ISR函数38第三章用C语言编程39开始一个C程序39定义中断入口向量40在C源程序文件中宣告中断服务子程序的名称和地址40在C源程序文件中定义1SR40限制40在程序存储器中定义表格与标号41在数据存储器内定义变量42指定变量地址42在多个数据存储器区块访问变量42在程序存储器区块0中指定变量(提高性能)43指针范围44访问LCD数据存储空间45单片机特殊功能寄存器42访问特殊功能寄存器42HOLTEK目录访问输入输出端口 47内置函数48类似汇编语句的内置函数 48移位函数49高低位交换函数49延迟周期函数50编程提示50定义变量为无符号数据类型50将变量定义在数据存储区块051定义位变量52分配地址给指针52使用更有效的方法获得模数53常量变换/强制转换 54串行端口传输范例56初始程序56调节传输时序57波特率匹配调节58框架程序范例59数据类型60数据类型60第四章C程序范例61输入/输出应用61扫描灯61交通灯63键盘扫描65LCM68I/O端口的串行应用73中断和定时/计数器的应用76电子钢琴76时钟79iiiHT-IDE3000 Holtek C语言编程指南#第一章盛群C语言1简介盛群半导体公司的C编译器基本上是建构于ANSIC,由于受限于盛群单片机 的硬件结构,因此只能支持部分的 ANSI C ,本章节主要用来说明盛群C编译 器所提供的C程序语言。手章节包含以下的主题::C语言的程序结构:标识符数据类型:常量*运算符:程序流程控制:函数.指针与数组 结构体与共用体 前置处理程序伪指令 盛群C语言的扩充功能与限制HOUEKFTC语言的程序结构C语言程序由语句、注释和前置处理程序伪指令组合而成。语句语句由变量、常量、运算符和函数共同组成,以分号作为结束符,并且可以执g以下的动作: 宣告数据变量与数据结构:定义数据空间 执行数学与逻辑运算 执行程序的控制动作一行程序可以包含多个语句,复合语句由一个或多个被包含在一对大括号内的 语句组成,并且可将其当成单一的语句来使用。有些语句和前置处理程序伪指 令必须在盛群C源程序文件中使用。以下是一个整体 轮廓的例子: void main ()* user application source code * 源程序中必须要定义主函数maino项目中可能会包含不只一个源程序文件, 但只有一个源程序文件中可以定义主函数maino注释注释经常用于在文件中解释源程序语句的意义与作用,除了在C关键字的中 间、函数名称之间或变量名称之间外,注释可以放置在程序中的任何位置。C 编译器不对注释做处理。注释不可嵌套(nesl)。盛群C编译器提供两种注释方 式,块注释与行注释。J块注释块注释开始于/*而结束于*/,以下为一范例: * this is a block comment *块注释的结束符*/也许会与块注释的开始符/*位于不同的程序行,介于开始符/*和结束符*/之间所有的文字或符号都会被C编译器当成注释而不予编译。J行注释行注释开始于/直到此行的结束为止。在双斜线之后的文字或符号均视为注释。 范例如下:/ this is a line commentHOLTEKHT-IDE3000 Holtek C语言编程指南标识符?示识符的名称包含连续的字母、数字或下划线,不过需要遵守下列规则:第一个字符不可为数字:最长只能有31个字符:大写字母与小写字母是不同的 不可以使用保留字保留字下列为盛群C编译器所提供的保留字,注意要小写。autobitbreakcasecharconstcontinuedefaultdoelsecnumexternforgotoifintlongreturnshortsignedstaticstructswitchtypcdcfunionunsignedvoidvolatilewhile盛群C编译器不提供double float和register这三个保留字。数据类型数据类型与大小盛群C编译器提供四种基本数据类型,分别为:bit单一的位char占用一个字节的字符int占用一个字节的整数void数值的空集合,用于函数没有返回值的类型。接下来为可使用的限定词,分别为:限定词适用的数据类型作用constlong int short int signed unsignedany将数据放入ROM地址区生成一16位的整数生成一8位的整数char,int生成一个有符号的变量char,int生成一个无符号的变量下列为数据类型、大小与范围,分 别为:数据类型大小范 围bit10,1char8-128127unsigned char80255int8-128127unsigned80255short int8128127unsigned short int80255ong16-3276832767unsigned long16065535宣告在定义变量的大小及数据类型之前必须先要宣告此变量的存在。宣告的语法如 下:data_type variable _name z variable _name.;在该范例中,data_type是合法的数据类型而variable_name是变量的名 称。在函数中所宣告的变量只是此函数私有的(或局部的)变量,其它函数不 可以直接存取此变量。只有当函数被调用时,此函数中的局部变量才存在及有 效,当执行流程从函数回到调用的程序时,局部变量便不再有效。如果变量在 所有函数之外宣告,则此变量为全局变量,即所有函数均可使用、存取此变量。限定词const可以使用在任何变量的宣告,主要是定义此变量的值为不可改变 的,也就是宣告时用const限定的这个变量会存放在ROM地址区。限定词const 也可以使用在数组变量中,const变量必须在宣告时以等号和表达式设定初始 值,其它的变量在宣告时不能设定初始值。可以利用符号宣示变量放置在某个特定的数据存储器地址,其语法如下: data_type variable_name memory_location ;J!, memory_location是指定给变量的地址。如果单片机拥有多个RAM 存储器区块,若变量要放置于编号为0的RAM存储器区块之外时,可以利用 memory_location的高字节去指定所要存放的存储器区块编号。使用 者可 查阅盛群单片机的规格以取得可使用的RAM空间信息。范例:int vl 0x40; / declare vl in the RAM bank 0 offset 0×40 int v2 0×160; / declare v2 in the RAM bank 1 offset 0×60#第一章盛群c语言数组也可以被宣告在特定地址:int port 8 0x20;/ array port takes memory location/ 0×20 through 0×27所有被盛群C编译器实现的变量,除了被宣告为外部变量之外,都为静态变量。 无论是静态变量或是外部变量,盛群C编译器都不会为其预设初始值。注意:变量被宣告为无符号的数据类型比宣告为有符号的数据类型能够编译出效率更高的程序代 码常量常量可以是任何数字、单一字符或字符串。整型常量整型常量为ini型数据,长常量通常以1或L结尾,无符号常量则以U或U结 尾,而字尾为ul或UL则表示为无符号长常量。整型常量的数值可以用下列的 形式指定:二进制常量:以0b或0B为首的数字八进制常量:以0为首的数字+六进制常量:以Ox或0X为首的数字+进制常量:非以上为首的数字5HOLTEK第一章盛群c语言HOUEKFT字符型常量字符型常量是整数,它是用单引号括起来的一个字符。字符型常量的数值就是 机器字符集中的字符数值。ANSI C把转义字符(escape sequence)当作字符型常量处理。转义字符说明十六进制数值a警报(铃声)字符07b退格字符08f换页字符0Cn换行字符0Ar回车字符0Dt横向跳格字符09v竖向跳格字符0B反斜杠字符5C?问号字符3FV单引号字符27双引号字符22字符串常量字符串常量是由一对双引号括起来的零个或多个字符(包括ANSI C转义字 符)。字符串常量是一个字符数组并且在字符的 最后附加一个隐含的零值。因 此,所需要的储存空间大小是双引号括起来的字符总数再加上1。枚举常量整型常量的另一种命名方法称之为枚举常量,例如: enum PORTA, PORTB, PORTC;定义三个整型常量的枚举常量,并且分别分配数值。枚举常量是int型(-128127),而且也可以指定一个明确的整数值给各枚举常 量,例如:enum BIG=10x SMALL=20;如果没有对枚举常量指定明确的数值时,第一个枚举常量值为0,之后的枚举常量将依序加1。枚举语句也可以被命名,例如:enum boolearn NO, YES;在枚举语句中第一个名称(NO)的值为0,下一个的名称的值是lo运算符表达式是由一串运算符及操作数所组成并且指明其运算的式子,它会遵循代数 的规则以计算出数值或某些负效果。表达式中某些部分计算时的顺序将会根据 运算符的执行优先权和运算符所属的群组来决定。数学上常使用的运算符的结 合性及交换性规则,只能应用在具有结合性和交换性的运算符。接下来讨论各 种类型的运算符。算术运算符共有五种算术运算符。+加法运算符- 减法运算符* 乘法运算符/ 除法运算符% 模运算符(余数为小于除数的正数或零)模运算符%只能使用在整数的数据类型。关系运算符关系运算符比较两个数值,然后根据比较结果返回TURE (真)或FALSE (假)。> 大于> = 大于或等于> 小于> = 小于或等于等式运算符等式运算符类似于关系运算符。= 等于!= 不等于9HOUEKFT逻辑运算符逻辑运算符提供AND、OR、和NOT的逻辑运算并且生成TURE (真)或FALSE (假)值。由&&和I I连接的表达式由左到右计算,只要结果生成就停止计算。如果关系表达式或逻辑表达式的结果为真(TRUE),则表达式的结果数值 为1,否则为0o否定运算符!用来将变为1及1变为0o&&逻辑ANDI I逻辑OR! 逻辑NOT位运算符提供六种运算符用于位对位的运算。位移运算符 >>和<<会对运算符左边的操 作数执行向右或向左的位移动,移动的位数由运算符右边的操作数指定。单操 作数运算符生成整数的1阶补码(oneis complement),也就是将1改为0,将0 改为o& 位 ANDI 位OR 位 XOR 取3补码(位反向)» 右移<< 左移复合赋值运算符表达式的语句中总共有10种复合赋值运算符。对于单纯的赋值运算就是使用 一个等号,以表达式计算出的数值代表等号左边的变量。另外还提供一种直接 对变量本身做运算以达到修改变量的快捷方式。<var>+=<expr>变量加上expr的值,将结果存回变量<var>-=<expr>变量减去expr的值,将结果存回变量<var>*=<expr>变量乘以expr的值,将结果存回变量<var>=<expr>变量除以expr的值,将商数存回变量<var>%=<expr>变量除以expr的值,将余数存回变量<var>&=<expr>变量与expr的值做位AND后,将结果存回变量<var>I =<expr>变量与expr的值做位OR后,将结果存回变量<var>=<expr>变量与expr的值做位XOR后,将结果存回变量<var>>>=<expr>变量向右移expr个位后,将结果存回变量<var><<=<expr>变量向左移expr个位后,将结果存回变量递增和递减运算符递增和递减运算符可以使用在语句本身或将其插入有其它运算符的语句中。运 算符的位置表示递增和递减是要在语句的计算结 果之前(前缀运算符)或是之 后(后缀运算符)。+<var> 变量先加1,再做运算<var>+ 运算之后,变量再加1-<var>变量先减1,再做运算<var>- 运算之后,变量再减1条件运算符条件运算符?:是一个简洁的语句,它根据表达式的结果再去执行两个语句中 的一个。<expr> ? <statement 1 > : <statement2 >如果<expr>的计算结果为一非零值(真)则<sWe"?e"" >被执行,反之(假) 则执行 <statement2 >o逗号运算符一组用逗号分隔的表达式,由左计算到右,而左边表达式的值会被舍弃。左边 表达式的结果会先行计算出并会影响右边表达式执行的结果。整个表达式执行 结果的数值和数据类型将是最右边表达式的结果数值及数据类型。范例:£ (a, (t=3, t+2), c);上式有三个参数,而第二个参数值为5oHOLTEKFTHT-IDE3000 Holtek C语言编程指南6乙,运算符的优先权与结合性下表为运算符的优先权与结合性,优先权顺序是由高到低排列,而在同一格中 的运算符拥有同等的优先权,单操作数运算符(unary operator)和复合赋值运 算符的结合性为从右到左,而其它运算符的结合性为从左到右。运算符说明结合性数组元素由左到右0小括号结构体指针结构体成员sizeof数据类型的长度-+由右到左;减1-取1阶补码!逻辑非-负号+正号&变量地址*存取指针所指地址的内容乘法运算由左到右/除法运算%模运算加法运算由左到右> 减法运算左移运算由左到右> >右移运算T由左到右> =小于或等于> 大于> =大于或等于-&人I IN o R N R 算 于A X o A O运 于等位位位辑辑件 等不按按按逻逻条由左到右#HOLTEK第一章盛群c语言运算符说明结合性=由右到左相乘后存入变量/=相除后存入变量%=取模后存入变量+=相加后存入变量-=相减后存入变量«=左移后存入变量»=右移后存入变量&=按位AND后存入变量I =按位OR后存入变量八=按位XOR后存入变量逗号由左到右类型转换对于数据类型转换的规则而言,大都是将较小的操作数转换为较大的操作数而 不致遗漏数据,例如将整数类型转换为长整数类型。从char转到long则会做 正负符号的延伸。使用cast运算符可以将任何表达式的结果做明确的数据类型 转换。例如:(type-name ) expressionexpression的结果将被转换为type-name所指定的数据类型。11HOLTEK第一章盛群c语言HOLTEK FT程序流程控制本节的语句都是用来控制程序执行的流程。同时也叙述如何使用控制语句中的 关系与逻辑运算符以及如何执行循环。'if-else 语句 语法if (expression )statementl ;elsestatement2 ;.说明if-else是一种条件语句,语句区段的执行与否完全看expression的 结果,如果expression的结果为非零值,则与其相关联的语句区段被执 行,否则如果else的区段存在的话,与else相关联的语句区段就会被执 行。else语句与其关联的语句区段并不一定要存在。 范例if(word_count> 80)word_count=l;line+;elseword_count+;J for语句 语法for (initial-expression; condition-expression; update-expression) statement; 说明initial-expression最先被执行且只执行一次,通常用来给循环的计 数变量指定初始值,此变量必须在for循环之前被宣告。condi t ion - express! on要在每一z(b循环执行前先计算,如果结果为一 非零值则循环中的语句被执行,否则会跳出循环且在循环后的第一个语句 将会是下一个被执行的语句。update-expression会在循环内的语句执 行完之后才被执行。for语句可用来重复执行一行语句或一段语句。 范例for (i=0; i<10;i+)ai=bi; / copy elements from an array to another arraywhile语句.语法while(condition-expression )statement ;.说明while语句是另一种形式的循环。当condition- express! on不为零则 while循环会执行statement o在执行statement之前会先行查验 condit ion-expression 是否符合条件。.范例i= 0;while (bi!=0)ai =bi;i+;do-while 语句 语法dostatement;while (condition-expression ); 说明do-while语句是另一种形式的while循环。statement 会在 condit ion - express! on 被计算之前先执行一次,因此在查验 condit ion-express ion 之前至少会执行一次 statement o范例i = 0;doa i= b i;i+; while (i<10);13HOLTEKHT-IDE3000 Holtek C语言编程指南break 和 continue 语句.语法break ;continue ;.说明break语句用来强迫程序立即由while、for、do-whil e循环和switch 中跳出。break语句会跳过正常的结束流程,如果它发生在嵌套循环的内 部,则会返回上一层的嵌套。Continue语句会指示程序跳跃至循环的结束而重新开始下一轮循环。在 while和do-while 循环中,Continue 语句会强迫立即执行 condit ion-express ion ,而在for循环中,则会回去执行 update-expression o范例char a10, b10, i, j;for (i=j=0;i<10;i+)/copy data from b to a , skip blanksif (bi= 0) break;if (bi= 0×20) continue;a j+ =bi;Jgoto语句和语句标号.语法goto label ;.说明语句标号与变量名称的形式一样,但是其后要接冒号,其范围在整个函数 中有效。.范例参考switch语句的范例。#HOLTEK第一章盛群c语言switch语句.语法switch (variable )caseconstantl :statementl ;break ;case constant2 :statement2 ;goto Label1 ;caseconstants :statements ;break ;default :statement ;Labe11 : statement4 ; break ;.说明switch语句的variable变量用来测试变量与列表中的常量是否吻合, 当吻合时此常量所属的语句被执行,并且一直执行到遇上break语句才会 停止。如果break语句不存在,则程序会执行到switch程序段的结束为 止。如果没有符合的常量,则执行default所属的语句,此语句并非必要 的。if-else语句可以用来做二选一的选择,但是当有很多选择存在时就变得 很麻烦了。switch语句可以做多种方式的选择,当表达式的结果符合这些 选择中的一个时,就跳到相关的语句执行。它相当于多个if-else语句。 switch语句的限制为switch变量的数据类型必须为整数,而且只能与 常量值做比较。范例for(i=j=0;i<10;i+)switch(b(i)case 0: goto outloop;case 0×20: break;default:aj =b i; j+; break;outloop:HOUEKFT函数在C语言中,所有的执行语句都必须存在于函数之内。在使用或调用函数之前, 必须要定义或是宣告函数,否则C编译器会发出警告信息。在宣告或定义函数 B寸,可使用两种语法,即古典形式与现代形式。针对具有多个程序存储器区块 (bank)的单片机撰写程序时,函数 就与变量有所不同,使用者不需要而且也没 有办法将函数指定在存储器的 固定区块(bank)。连接器(Linker)会将函数安排在 程序存储器ROM的适当区块。古典形式return-type function-name (argl, arg2,.) var-type argl; var-type arg2;现代形式return-type function-name (var-type argl, var-type arg2,.)在上述两种形式中,return-type是函数返回值的数据类型,如果函数没有 返回值,必须将return-type宣告为void类型。function-name是函数 的名称,对其他所有的函数而言,它相当于一个全局变量。参数argl,arg2是 在此函数内使用的变量,必须指定它们的数据类型,当调用函数时,这些变量 会代替形式参数储存对应的输入值。J 函数的宣告/ classic formreturn-type function-name (argl, arg2, .);/ modem formreturn-type function-name (var-type argl, var-type arg2,.);J 函数的定义/ classic formreturn-type function-name (argl, arg2,.)var-type argl;var-type arg2;statements;/ modem formreturn-type function-name (var-type argl, var-type arg2,.)statements;J 函数参数的传递亨两种函数参数传递的方法:传值此方法是将参数值复制到函数中对应的形式参数。在函数中对形式参数的 任何改变都不会影响到调用此函数的程序内对应变量的原始值。传地址此方法是将参数的地址复制给函数的形式参数。在函数中,通 过传入的参 数地址,形式参数可以 直接改变实际变量的内容,此实际变量是在调用此 函数的程序内使用的。因此改变形式参数可以连带改变变量的内容。函数的返回值函数可以利用return语句将数值返回至调用此函数的程序。返回值必须是函 数所指定的数据类型,如果return-type是void类型即表示没有返回值, 应该没有数值在return语句之中。执行到return语句之后,函数会回到调用 此函数的地方继续执行,任何在return语句之后的语句都不会被执行。指针与数组指针指针是存有另一变量地址的变量,例如,如果一个指针变量varpoint存放变量 var的地址,则varpoint指向var,宣告指针变量的语法如下:data-type *var_name;指针的data-type需是合法的C数据类型,它标明了 var_name所指向的 变量的数据类型。在var_name之前的星号(*)是告知C编译器var_name 为一指针变量。有两个特族运算符(*)和(&)与指针的使用有关,而 如在 变量之前加上&运算符可以存取此变量的地址,而在变量 之前加上*运算符则 可取得此变量所指地址的内容。除了*和&之外,还有四个运算符可以使用于指针变量,分别是+、+、-和。 只有整数值才能加到指针变量或从指针变量减去。另外,当执行指针的加减运 算时,指针的值会依据它所指向的数据类型的长度而调整。数组数组是具有相同数据类型而且可用同样名称使用的变量列表。在数组内的各变 量被称为数组元素,数组的第一个元素是定义在下标为0的元素而最后一个元 素是定义在下标为元素总数减1的元素。C编译器会将一维数组(one-dimension) 安置在地址连续的存储器中,第一个元素放在最小的地址。C编译器不对数组 做边界检查。17HOLTEK第一章盛群c语言不支持将一个数组赋值给另一个数组的运算,必须从第一个数组以一次一个元 素的方式复制到第二个数组对应的元素。只要是变量或常量可以使用的地方, 就可以使用数组元素。结构体与共用体(Stmctures and Unions)J争构体.语法 struct struct-namedata-typememberl;data-typemember2;data-typemembern; variable-list ;说明结构体是一或多个相同或不相同数据类型的变量的集合,整合在单一名称 下以方便处理。结构体可以被复制、赋值或传递给函数、也可由函数返回。 C编译器支持位的数据类型及嵌套式结构体。保留字struct表示要定义一结构体,而struct-name为此结构体的名 称,在结构体中data-type必须是合法的数据类型,在结构体中的成员 可以定义为不同的数据类型。variable-list宣告为struct-name类 型的变量,而结构体中的每一个项目是一个成员。在定义一个结构体之后, 其它相同类型的变量可以使用下列语法进行宣告:struct struct-name variable-list;要存取结构体的成员时,必须指定变量名称及结构体的成员名称,中间加上句点分隔。语法如下:variable .memberlvariable是结构体类型的变量而memberl是结构体成员的名称。一个结构体成员的数据类型可以是前 面已经定义好的结构体,这种结构即所谓的嵌套结构(nested structure) o范例struct person_idcharid_num 6;charname 3;unsignedlong birth_date; mark;J共用体.语法union union-namedata-type memberl;data-typemember2;data-type memberm; variable-list ;说明共用体是将不同类型的变量聚集为一群并使用相同的存储器空间。共用体 类型类似于结构体类型,但是对于存储器的使用却极为不同。在结构体中 所有的成员顺序地安排存储器空间,而在共用体类型中,所有的成 员都从 同一地址安置而且共用体类型的大小等于成 员中占用最大空间的类型的大 小。存取共用体类型成员的方式与存取结构体成员方式相同。union是一个保留字而union-name为此共用体的名称,variable-list 定义有相同数据类型的变量,可有可无。.范例union common_areachar name 3 ;intid;longdata; cdata;前置处理伪指令前置处理伪指令将会指导编译器如何去编译源程序代码。此伪指令类似一个简 单的宏处理器,在编译器正式编译源程序前先行处理 某些程序。一般而言,前 置处理伪指令不会直接编译成执行码。C编译器在编译的初期会将源程序中的 前置处理指令行移除并做适当的处理,同时也会将调用宏指令的程序替换为宏 展开后的程序,以及其它的数据,例如#line命令。前置处理伪指令以#号做为 开头,即以#号开头的程序行即被视为前置处理伪指令,其后则为命令的名称, 以下为前置处理伪指令:' 宏替换:#define.语法#definename replaced-text#definename (parameter-list ) replaced-text.说明#define伪指令定义字符串常量。在编译源程序 之前,会以定义的字符串常量替换到程序中。其主要目的是增加源程序的可读性与维护性。如果无法在一行中写完replaced-text ,可以使用反斜线()表示还有更多的程 序行。19范例#define#define#define#defineTOTAL COUNTUSERNAME MAX(a,b) SWAP(a,b)40Henry国(a)>(b)7(a) : (b)ittmp=a; b=a; a=tmp;tmp;#error语法#errormessage-string*说明#error伪指令会生成一个使用者所定义的诊断信息,message-string。范例TOTAL_COUNT > 100 ''Too many count."#if#error#endif条件编译:#if #else #endif.语法#if expressionsource codesi#elsesource codes2 #endif.说明#if和#e11<11f是一组用来做条件编译程序的伪指令,而编译条件则 取决于expression的运算值。#else伪指令提供二选一的编译方式,它是可 有可无的。如果expression运算的结果不为零,贝U source codesl将 被编译,否则如果有source codes2 ,则source code2被编译。HOLTEKHT-IDE3000 Holtek C语言编程指南范例#define MODE 2#if MODE > 0#defineDISP_MODE MODE#elsedefineDISP_MODE 7#endifJ条件编译:#ifdef语法#ifde£symbolsource codesi#ifdefsource codes2 #endif u说明 u#ifdef伪指令类似包£伪指令,但是它不是以表达式的结果决定编译的 程序行,而是以检查所指定的symbol是否已经被定义的方式决定的。#else伪指令提供二选一的编译方式,它不是一定要有的。如果symbol 已经被定义则source codesl将被编译,否则如果source codes2存 在,它将被编译。.范例#ifdef DE