历史上的今天
今天是:2025年06月21日(星期六)
2018年06月21日 | Keil C51对C语言的关键词扩展之三: bdata
2018-06-21 来源:eefocus
使用bdata定义的变量即可字寻址,也可比特位寻址。
Keil C51编译器把使用bdata定义的变量放置在8051内部RAM可位寻址区。
bdata定义的变量必须为全局变量,不能在任一函数内部定义bdata类型的变量。
bdata关键词使用方法:
int bdata x1; /* 定义可位寻址的整型变量*/
char bdata bary [4]; /* 定义可位寻址的数组*/
此时,x1,bary均可按比特位寻址。使用sbit关键词定义可操作其任一比特位的变量。
sbit mybit0 = x1 ^ 0; /* x1的比特0*/
sbit mybit15 = x1 ^ 15; /* x1的比特15 */
sbit Ary07 = bary[0] ^ 7; /* bary[0]的比特7*/
sbit Ary37 = bary[3] ^ 7; /* bary[3]的比特7 */
Keil C51编译器总是像对sfr16那样把可位寻址的变量视为little endian字节序,标准C类型如int ,long则以big endian方式存储。
调用其他源文件中定义的sbit变量,以如下方式声明:
extern bit mybit0;
extern bit mybit15;
extern bit Ary07;
extern bit Ary37;
操作bdata声明的对象,方式如下:
Ary37 = 0; /* 对bary[3]的比特7清零*/
bary[3] = 'a'; /* bary[3]直接赋值*/
x1 = -1; /* x1直接赋值 */
mybit15 = 1; /* 对x1的比特15置一*/
也可声明结构体和联合体的sbit变量,示例:
union lft
{
float mf;
long ml;
};
bdata struct bad /*注意 bdata*/
{
char m1;
union lft u;
} tcp; /*注意tcp位于位寻址区*/
sbit tcpf31 = tcp.u.ml ^ 31;
sbit tcpm10 = tcp.m1 ^ 0;
sbit tcpm17 = tcp.m1 ^ 7;
须要注意的是,使用sbit定义针对非bdata类型变量的某一比特位,毫无意义。
史海拾趣
|
我在学习Altium Designer 6.9时在原件库这里有的原件有封装图样而又的却没有(如图1;2)。我也尝试在网上找出答案,但没有结果;我又尝试阅读软件自带的help也没能找出答案。谁有好主意能告诉我,我应查些什么资料或是这个问题应怎样解决。谢谢大 ...… 查看全部问答> |
|
windows ce 5.0 购买问题 急求 偶想买windows ce 卖方说里面有bsp pb5.0 evc 我想知道我只够买windows ce bsp pb5.0 evc 这些在网上可以免费下载么 请求各位大侠帮帮在下了… 查看全部问答> |
|
“symbol referencing errors”的解决方法(转) 原文出处 http://www.hellodsp.com/bbs/viewthread.php?tid=16417&highlight=ERROR 经常看到朋友有问到这一个错误,\"error: symbol referencing errors\",下面我们以一个会员朋友遇到的问题为例讲述解决方法,其实非常简单。首先我们 ...… 查看全部问答> |
|
static const unsigned char g_pucFont[96][5] ={ { 0x00, 0x00, 0x00, 0x00, 0x00 }, // \" \" { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! { 0x00, 0x07, 0x00, 0x07, 0x00 }, // \" &n ...… 查看全部问答> |
|
作者:李强,华清远见嵌入式学院讲师。转载自http://www.embedu.org/Column/Column338.htm问题来源:在讲授Linux初级驱动的时候,我发现困惑很多同学的是不真正理解从应用层到我们自己所写的驱动层的调用过程,所以写此文章来大概描述。首先我们知道 ...… 查看全部问答> |
|
电源设计一直是工程师面对的一个难题,随着全球节能环保意识的提升, 设计简捷、高效、轻巧的绿色电源成为工程师的首要任务,为了帮助工程师解决这方面的难题,TI推出了一本电子书叫做《电源开关设计秘笈30例》,对电源开关设计技巧做出了详细的说 ...… 查看全部问答> |
|
const UART_DCM_TBL tbl[72] = { {1.000, 0, 1}, {1.067, 1, 15}, {1.071, 1, 14}, {1.077, 1, 13}, {1.083, 1, 12}, {1.091, 1, 1 ...… 查看全部问答> |
|
flash擦除例程如下,其中 /* Wait for erase to complete */为什么if (*pdata & 0x80)就能判断擦除完成? while (1) & ...… 查看全部问答> |




