《HT-IDE3000HoltekC语言编程指南(中文).docx》由会员分享,可在线阅读,更多相关《HT-IDE3000HoltekC语言编程指南(中文).docx(92页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、HT-IDE3000 Holtek C 语言编程指南Ver 1.1注意使用指南中所出现的信息在出版当时相信是正确的,然而盛群对于说明书的使用不负任何责任。文中提到的 应用目的仅仅是用来做说明,盛群不保证或表示这些没有进一步修改的应用将是适当的,也不推荐它的产品 使用在会由于故障或其它原因可能会对人身造成危害的地方。盛群产品不授权使用于救生、维生器件或系统 中做为关键器件。盛群拥有不事先通知而修改产品的权利。对于最新的信息,请参考我们的网址 .tw目录HOUEKFT目录简介1C语言的程序结构2语句2注释2标识符3保留字3数据类型3数据类型与大小3宣告4常量5整型常量5字符型常量6字符串常量6枚举
2、常量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参
3、数的传递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高低
4、位交换函数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,由于受限于盛群单片机 的硬件
5、结构,因此只能支持部分的 ANSI C ,本章节主要用来说明盛群C编译 器所提供的C程序语言。手章节包含以下的主题::C语言的程序结构:标识符数据类型:常量*运算符:程序流程控制:函数.指针与数组 结构体与共用体 前置处理程序伪指令 盛群C语言的扩充功能与限制HOUEKFTC语言的程序结构C语言程序由语句、注释和前置处理程序伪指令组合而成。语句语句由变量、常量、运算符和函数共同组成,以分号作为结束符,并且可以执g以下的动作: 宣告数据变量与数据结构:定义数据空间 执行数学与逻辑运算 执行程序的控制动作一行程序可以包含多个语句,复合语句由一个或多个被包含在一对大括号内的 语句组成,并且可将其当成
6、单一的语句来使用。有些语句和前置处理程序伪指 令必须在盛群C源程序文件中使用。以下是一个整体 轮廓的例子: void main ()* user application source code * 源程序中必须要定义主函数maino项目中可能会包含不只一个源程序文件, 但只有一个源程序文件中可以定义主函数maino注释注释经常用于在文件中解释源程序语句的意义与作用,除了在C关键字的中 间、函数名称之间或变量名称之间外,注释可以放置在程序中的任何位置。C 编译器不对注释做处理。注释不可嵌套(nesl)。盛群C编译器提供两种注释方 式,块注释与行注释。J块注释块注释开始于/*而结束于*/,以下为一
7、范例: * this is a block comment *块注释的结束符*/也许会与块注释的开始符/*位于不同的程序行,介于开始符/*和结束符*/之间所有的文字或符号都会被C编译器当成注释而不予编译。J行注释行注释开始于/直到此行的结束为止。在双斜线之后的文字或符号均视为注释。 范例如下:/ this is a line commentHOLTEKHT-IDE3000 Holtek C语言编程指南标识符?示识符的名称包含连续的字母、数字或下划线,不过需要遵守下列规则:第一个字符不可为数字:最长只能有31个字符:大写字母与小写字母是不同的 不可以使用保留字保留字下列为盛群C编译器所提供的保留
8、字,注意要小写。autobitbreakcasecharconstcontinuedefaultdoelsecnumexternforgotoifintlongreturnshortsignedstaticstructswitchtypcdcfunionunsignedvoidvolatilewhile盛群C编译器不提供double float和register这三个保留字。数据类型数据类型与大小盛群C编译器提供四种基本数据类型,分别为:bit单一的位char占用一个字节的字符int占用一个字节的整数void数值的空集合,用于函数没有返回值的类型。接下来为可使用的限定词,分别为:限定词适用的数
9、据类型作用constlong int short int signed unsignedany将数据放入ROM地址区生成一16位的整数生成一8位的整数char,int生成一个有符号的变量char,int生成一个无符号的变量下列为数据类型、大小与范围,分 别为:数据类型大小范 围bit10,1char8-128127unsigned char80255int8-128127unsigned80255short int8128127unsigned short int80255ong16-3276832767unsigned long16065535宣告在定义变量的大小及数据类型之前必须先要宣告此
10、变量的存在。宣告的语法如 下:data_type variable _name z variable _name.;在该范例中,data_type是合法的数据类型而variable_name是变量的名 称。在函数中所宣告的变量只是此函数私有的(或局部的)变量,其它函数不 可以直接存取此变量。只有当函数被调用时,此函数中的局部变量才存在及有 效,当执行流程从函数回到调用的程序时,局部变量便不再有效。如果变量在 所有函数之外宣告,则此变量为全局变量,即所有函数均可使用、存取此变量。限定词const可以使用在任何变量的宣告,主要是定义此变量的值为不可改变 的,也就是宣告时用const限定的这个变量会
11、存放在ROM地址区。限定词const 也可以使用在数组变量中,const变量必须在宣告时以等号和表达式设定初始 值,其它的变量在宣告时不能设定初始值。可以利用符号宣示变量放置在某个特定的数据存储器地址,其语法如下: data_type variable_name memory_location ;J!, memory_location是指定给变量的地址。如果单片机拥有多个RAM 存储器区块,若变量要放置于编号为0的RAM存储器区块之外时,可以利用 memory_location的高字节去指定所要存放的存储器区块编号。使用 者可 查阅盛群单片机的规格以取得可使用的RAM空间信息。范例:int v
12、l 0x40; / declare vl in the RAM bank 0 offset 040 int v2 0160; / declare v2 in the RAM bank 1 offset 060#第一章盛群c语言数组也可以被宣告在特定地址:int port 8 0x20;/ array port takes memory location/ 020 through 027所有被盛群C编译器实现的变量,除了被宣告为外部变量之外,都为静态变量。 无论是静态变量或是外部变量,盛群C编译器都不会为其预设初始值。注意:变量被宣告为无符号的数据类型比宣告为有符号的数据类型能够编译出效率更高的
13、程序代 码常量常量可以是任何数字、单一字符或字符串。整型常量整型常量为ini型数据,长常量通常以1或L结尾,无符号常量则以U或U结 尾,而字尾为ul或UL则表示为无符号长常量。整型常量的数值可以用下列的 形式指定:二进制常量:以0b或0B为首的数字八进制常量:以0为首的数字+六进制常量:以Ox或0X为首的数字+进制常量:非以上为首的数字5HOLTEK第一章盛群c语言HOUEKFT字符型常量字符型常量是整数,它是用单引号括起来的一个字符。字符型常量的数值就是 机器字符集中的字符数值。ANSI C把转义字符(escape sequence)当作字符型常量处理。转义字符说明十六进制数值a警报(铃声)
14、字符07b退格字符08f换页字符0Cn换行字符0Ar回车字符0Dt横向跳格字符09v竖向跳格字符0B反斜杠字符5C?问号字符3FV单引号字符27双引号字符22字符串常量字符串常量是由一对双引号括起来的零个或多个字符(包括ANSI C转义字 符)。字符串常量是一个字符数组并且在字符的 最后附加一个隐含的零值。因 此,所需要的储存空间大小是双引号括起来的字符总数再加上1。枚举常量整型常量的另一种命名方法称之为枚举常量,例如: enum PORTA, PORTB, PORTC;定义三个整型常量的枚举常量,并且分别分配数值。枚举常量是int型(-128127),而且也可以指定一个明确的整数值给各枚举常
15、 量,例如:enum BIG=10x SMALL=20;如果没有对枚举常量指定明确的数值时,第一个枚举常量值为0,之后的枚举常量将依序加1。枚举语句也可以被命名,例如:enum boolearn NO, YES;在枚举语句中第一个名称(NO)的值为0,下一个的名称的值是lo运算符表达式是由一串运算符及操作数所组成并且指明其运算的式子,它会遵循代数 的规则以计算出数值或某些负效果。表达式中某些部分计算时的顺序将会根据 运算符的执行优先权和运算符所属的群组来决定。数学上常使用的运算符的结 合性及交换性规则,只能应用在具有结合性和交换性的运算符。接下来讨论各 种类型的运算符。算术运算符共有五种算术运
16、算符。+加法运算符- 减法运算符* 乘法运算符/ 除法运算符% 模运算符(余数为小于除数的正数或零)模运算符%只能使用在整数的数据类型。关系运算符关系运算符比较两个数值,然后根据比较结果返回TURE (真)或FALSE (假)。 大于 = 大于或等于 小于 = 小于或等于等式运算符等式运算符类似于关系运算符。= 等于!= 不等于9HOUEKFT逻辑运算符逻辑运算符提供AND、OR、和NOT的逻辑运算并且生成TURE (真)或FALSE (假)值。由&和I I连接的表达式由左到右计算,只要结果生成就停止计算。如果关系表达式或逻辑表达式的结果为真(TRUE),则表达式的结果数值 为1,否则为0o否
17、定运算符!用来将变为1及1变为0o&逻辑ANDI I逻辑OR! 逻辑NOT位运算符提供六种运算符用于位对位的运算。位移运算符 和会对运算符左边的操 作数执行向右或向左的位移动,移动的位数由运算符右边的操作数指定。单操 作数运算符生成整数的1阶补码(oneis complement),也就是将1改为0,将0 改为o& 位 ANDI 位OR 位 XOR 取3补码(位反向) 右移 左移复合赋值运算符表达式的语句中总共有10种复合赋值运算符。对于单纯的赋值运算就是使用 一个等号,以表达式计算出的数值代表等号左边的变量。另外还提供一种直接 对变量本身做运算以达到修改变量的快捷方式。+=变量加上expr的
18、值,将结果存回变量-=变量减去expr的值,将结果存回变量*=变量乘以expr的值,将结果存回变量=变量除以expr的值,将商数存回变量%=变量除以expr的值,将余数存回变量&=变量与expr的值做位AND后,将结果存回变量I =变量与expr的值做位OR后,将结果存回变量=变量与expr的值做位XOR后,将结果存回变量=变量向右移expr个位后,将结果存回变量=变量向左移expr个位后,将结果存回变量递增和递减运算符递增和递减运算符可以使用在语句本身或将其插入有其它运算符的语句中。运 算符的位置表示递增和递减是要在语句的计算结 果之前(前缀运算符)或是之 后(后缀运算符)。+ 变量先加1,
19、再做运算+ 运算之后,变量再加1-变量先减1,再做运算- 运算之后,变量再减1条件运算符条件运算符?:是一个简洁的语句,它根据表达式的结果再去执行两个语句中 的一个。 ? : 如果的计算结果为一非零值(真)则被执行,反之(假) 则执行 o逗号运算符一组用逗号分隔的表达式,由左计算到右,而左边表达式的值会被舍弃。左边 表达式的结果会先行计算出并会影响右边表达式执行的结果。整个表达式执行 结果的数值和数据类型将是最右边表达式的结果数值及数据类型。范例: (a, (t=3, t+2), c);上式有三个参数,而第二个参数值为5oHOLTEKFTHT-IDE3000 Holtek C语言编程指南6乙,
20、运算符的优先权与结合性下表为运算符的优先权与结合性,优先权顺序是由高到低排列,而在同一格中 的运算符拥有同等的优先权,单操作数运算符(unary operator)和复合赋值运 算符的结合性为从右到左,而其它运算符的结合性为从左到右。运算符说明结合性数组元素由左到右0小括号结构体指针结构体成员sizeof数据类型的长度-+由右到左;减1-取1阶补码!逻辑非-负号+正号&变量地址*存取指针所指地址的内容乘法运算由左到右/除法运算%模运算加法运算由左到右 减法运算左移运算由左到右 右移运算T由左到右 =小于或等于 大于 =大于或等于-&人I IN o R N R 算 于A X o A O运 于等位
21、位位辑辑件 等不按按按逻逻条由左到右#HOLTEK第一章盛群c语言运算符说明结合性=由右到左相乘后存入变量/=相除后存入变量%=取模后存入变量+=相加后存入变量-=相减后存入变量=左移后存入变量=右移后存入变量&=按位AND后存入变量I =按位OR后存入变量八=按位XOR后存入变量逗号由左到右类型转换对于数据类型转换的规则而言,大都是将较小的操作数转换为较大的操作数而 不致遗漏数据,例如将整数类型转换为长整数类型。从char转到long则会做 正负符号的延伸。使用cast运算符可以将任何表达式的结果做明确的数据类型 转换。例如:(type-name ) expressionexpression
22、的结果将被转换为type-name所指定的数据类型。11HOLTEK第一章盛群c语言HOLTEK FT程序流程控制本节的语句都是用来控制程序执行的流程。同时也叙述如何使用控制语句中的 关系与逻辑运算符以及如何执行循环。if-else 语句 语法if (expression )statementl ;elsestatement2 ;.说明if-else是一种条件语句,语句区段的执行与否完全看expression的 结果,如果expression的结果为非零值,则与其相关联的语句区段被执 行,否则如果else的区段存在的话,与else相关联的语句区段就会被执 行。else语句与其关联的语句区段并不
23、一定要存在。 范例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循环执行前先计算,如果结果为一 非零值则循环中的语句被执行,否则会跳出循环且在循环后的第一个语句 将会是
24、下一个被执行的语句。update-expression会在循环内的语句执 行完之后才被执行。for语句可用来重复执行一行语句或一段语句。 范例for (i=0; i10;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
25、 是否符合条件。.范例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 (i10);13HOLTEKHT-IDE3000 Holtek C语言编程指南break 和 co
26、ntinue 语句.语法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;i10;i+)/c
27、opy data from b to a , skip blanksif (bi= 0) break;if (bi= 020) continue;a j+ =bi;Jgoto语句和语句标号.语法goto label ;.说明语句标号与变量名称的形式一样,但是其后要接冒号,其范围在整个函数 中有效。.范例参考switch语句的范例。#HOLTEK第一章盛群c语言switch语句.语法switch (variable )caseconstantl :statementl ;break ;case constant2 :statement2 ;goto Label1 ;caseconstants :
28、statements ;break ;default :statement ;Labe11 : statement4 ; break ;.说明switch语句的variable变量用来测试变量与列表中的常量是否吻合, 当吻合时此常量所属的语句被执行,并且一直执行到遇上break语句才会 停止。如果break语句不存在,则程序会执行到switch程序段的结束为 止。如果没有符合的常量,则执行default所属的语句,此语句并非必要 的。if-else语句可以用来做二选一的选择,但是当有很多选择存在时就变得 很麻烦了。switch语句可以做多种方式的选择,当表达式的结果符合这些 选择中的一个时,就
29、跳到相关的语句执行。它相当于多个if-else语句。 switch语句的限制为switch变量的数据类型必须为整数,而且只能与 常量值做比较。范例for(i=j=0;i(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#elsesou
30、rce codes2 #endif.说明#if和#e11 0#defineDISP_MODE MODE#elsedefineDISP_MODE 7#endifJ条件编译:#ifdef语法#ifdesymbolsource codesi#ifdefsource codes2 #endif u说明 u#ifdef伪指令类似包伪指令,但是它不是以表达式的结果决定编译的 程序行,而是以检查所指定的symbol是否已经被定义的方式决定的。#else伪指令提供二选一的编译方式,它不是一定要有的。如果symbol 已经被定义则source codesl将被编译,否则如果source codes2存 在,它将被编译。.范例#ifdef DE