- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
C语言及单片机概述
在单片机程序设计中对于变量类型的选择确认有两条最基本的原则须遵循:能用短的变量就不用长的;能
用无符号数就不用有符号数。这两条基本原则将在很大程度上决定你代码的长度和效率。因此请多多使用
byte或word类型变量。由于08系列单片机内部硬件寄存器定义的特点,对于多字节组成的变量,例
如int、long等,C编译器缺省的变量内存排列方式是”bigendian”模式,即高位字节放在低地址,低位
字节放在高地址,又俗称”大头朝上”。这一点相比普通Intel格式,例如51系列和PIC系列正好相反,
它们都是”littleendian”模式,即“大头朝下”,在程序跨平台移植时请特别注意。当然CW编译器本身可
以设定改变成”littleendian”模式,但单片机内部寄存器地址排列顺序无法改变,故这样做将使最终的程
序代码效率降低,特别是在存取一些16位长的寄存器组时,它们在硬件上都是由顺序排列的两个8位寄
存器组成,高字节在前,低字节在后。单片机程序设计中经常会用到的位变量作为一些标志。CW中没
有特别的位变量定义关键词,位变量必须由位域结构体的型式来定义。例如:
struct{
unsignedpowerOn:1;
unsignedalarmOn:1;
unsignedcommActive:1;
unsignedsysError:1;
}myFlag;
若引用某个位变量,只需
myFlag.alarmOn=1;
myFlag.sysError=0;
这样定义的各个位变量将被顺序排放在一起,以字节为基本单位,字节的第0位放第一个位变量,一个字
节含8个位变量。因此如果位域结构中定义的位变量数目很多,在最后内存分配上将占居多个字节。有
时为了编程方便,位变量需单独定义和操作但又希望一次整个字节一起初始化(清零或赋值),这时我们可
以定义字节(或字)和位域结构的联合体:
union{
byteflagByte;
struct{
unsignedpowerOn:1;
unsignedalarmOn:1;
unsignedcommActive:1;
unsignedsysError:1;
}bits;
}myFlag;
整字节操作可以
myFlag.flagByte=0;
单独某一个位操作可以可以
myFlag.bits.powerOn=1;
myFmActive=!myFmActive;
若嫌这样的位变量名称太长,大可以在你自己的头文件里用”#define”预定义,用
更简洁易懂的名称进行替换。
最后要提醒的是在定义位变量时尽量将它们指定分配到内存空间的第0页(地址范
围0x00-0xff),这样对位变量操作的C代码将直接被编译成对应的汇编位操作指
令,代码效率最高。具体的定位方法将在介绍”#pragma”时说明。
3.2变量的特殊修饰
上面介绍的各类基本变量和由其合成的高级变量如数组、结构和联合,将满足95%以上的单片机程序设计
1
C语言及单片机概述
工作。由于单片机资源的有限性和特殊型,还有一小部分因素需要在定义变量时加以考虑:
3.2.1变量的绝对定位
变量绝对定位是特别针对芯片内部的硬件寄存器定义的。所有的硬件寄存器在编写C程序时均被视为变量
它们都已在CW给定的头文件中预先定义。由于是硬件资源,其地址是唯一且不可改的,所以在头文件中
定义这些寄存器时都采用绝对定位
9S08AW32PORTA
/***PTAD-PortADataRegister;0***/
typedefunion{
byteByte;
struct{
bytePTAD0:1;/*PortADataRegisterBit0*/
bytePTAD1:1;/*PortADataRegisterBit1*/
bytePTAD2
文档评论(0)