浅谈PICC 的位操作

更新时间:2024-07-02 09:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

[求助]请问PIC的绝对寻址位操作指令的那句话怎么理解啊 在PIC单片机的里有这么一句话

#define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit)) static bit ch451_dclk @ PORTBIT(PORTB,3);

这个怎么理解啊,&adr为什么要乘8 还有PORTB这个标号应该对应的是B口的地址 PORTB可不可以理解为指针PORTB=0xFF是不是类似*p=0xFF

那adr=PORTB &adr对应的不就是B口的地址值? 为什么要把地址乘8咧? static bit ch451_dclk @ PORTBIT(PORTB,3); 里面的 @写在PORTBIT函数的前面是什么意思啊 ch451_dclk怎么就指向B口第3位了啊 谢谢大哥们指导一下,谢谢了

我的理解:

编译器看到位变量的时候,应该是想到BCF f,b BSF f,b,这些位操作指令 这些指令有两个操作数,一个是内存地址f,一个是位地址b

编译器需要从位变量中得到这两个信息,最好就是把这两个信息与位变量绑定在一起 结果就组成了这样的定义方式: fffffffbbb 七个f表示内存地址,三个b表示位地址

写出来就是 (fffffff) * 8 + (bbb) ==> Address * 8 + bit 位操作,操作的是比特,一个字节八个比特。所以乘8。

@写在PORTBIT函数的前面是什么意思啊:定义了一个绝对地址的变量 附:别人写的,希望对你有帮助

浅谈PICC 的位操作

由于PIC 处理器对位操作是最高效的,所以把一些BOOL 变量放在一个内存的位中,既可以达到运算

速度快,又可以达到最大限度节省空间的目的。在C 中的位操作有多种选择。 ********************************************* 如:char x;x=x|0B00001000; /*对X 的4 位置1。*/ char x;x=x&0B11011111; /*对X 的5 位清0。*/ 把上面的变成公式则是:

#define bitset(var,bitno)(var |=1<

char x;bitclr(x,5)

************************************************* 但上述的方法有缺点,就是对每一位的含义不直观,最好是能在代码中能直观看出每一位代表的意思,

这样就能提高编程效率,避免出错。如果我们想用X 的0-2 位分别表示温度、电压、电流的BOOL 值可以 如下:

unsigned char x @ 0x20; /*象汇编那样把X 变量定义到一个固定内存中。*/ bit temperature@ (unsigned)&x*8+0; /*温度*/ bit voltage@ (unsigned)&x*8+1; /*电压*/ bit current@ (unsigned)&x*8+2; /*电流 */

这样定义后X 的位就有一个形象化的名字,不再是枯燥的1、2、3、4 等数字了。可以对X 全局修改,

也可以对每一位进行操作:

char=255;

temperature=0; if(voltage)......

***************************************************************** 还有一个方法是用C 的struct 结构来定义: 如:

struct cypok{

temperature:1; /*温度*/ voltage:1; /*电压*/ current:1; /*电流*/ none:4; }x @ 0x20; 这样就可以用 x.temperature=0; if(x.current).... 等操作了。

**********************************************************

PICC 中变量的绝对定位

首先必须强调,在用C 语言写程序时变量一般由编译器和连接器最后定位,在写程序 之时无需知道所定义的变量具体被放在哪个地址(除了bank 必须声明)。

真正需要绝对定位的只是单片机中的那些特殊功能寄存器,而这些寄存器的地址定位在 PICC 编译环境所提供的头文件中已经实现,无需用户操心。编程员所要了解的也就是PICC

是如何定义这些特殊功能寄存器和其中的相关控制位的名称。好在PICC 的定义标准基本上 按照芯片的数据手册中的名称描述进行,这样就秉承了变量命名的一贯性。一个变量绝对定 位的例子如下:

张明峰 2004-4-7 于上海 8 of 26

unsigned char tmpData @ 0x20; //tmpData 定位在地址0x20

千万注意,PICC 对绝对定位的变量不保留地址空间。换句话说,上面变量tmpData 的 地址是0x20,但最后0x20 处完全有可能又被分配给了其它变量使用,这样就发生了地址冲

突。因此针对变量的绝对定位要特别小心。从笔者的应用经验看,在一般的程序设计中用户 自定义的变量实在是没有绝对定位的必要。

如果需要,位变量也可以绝对定位。但必须遵循上面介绍的位变量编址的方式。如果一 个普通变量已经被绝对定位,那么此变量中的每个数据位就可以用下面的计算方式实现位变 量指派:

unsigned char tmpData @ 0x20; //tmpData 定位在地址0x20 bit tmpBit0 @ tmpData*8+0; //tmpBit0 对应于tmpData 第0 位 bit tmpBit1 @ tmpData*8+1; //tmpBit0 对应于tmpData 第1 位 bit tmpBit2 @ tmpData*8+2; //tmpBit0 对应于tmpData 第2 位

如果tmpData 事先没有被绝对定位,那就不能用上面的位变量定位方式。

本文来源:https://www.bwwdw.com/article/mhz.html

Top