您的位置 首页 硬件

PICC编程的位操作示例程序

由于PIC处理器对位操作是最高效的,所以把一些BOOL变量放在一个内存的位中,既可以达到运算速度快,又可以达到最大限度节省空间的目…

因为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<#define bitclr(var,bitno)(var &=~(1<则上面的操作便是:char x;bitset(x,4)
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)….
等操作了。
**********************************************************上面的办法在一些简略的规划中很有用,但关于杂乱的规划中就比较费劲。如象在多路工业操控上。前端需求别离搜集多路的多路信号,然后再设定操控多路的多路输出。如:有2 路操控,每一路的前端信号有温度、电压、电流。后端操控有电机、喇叭、继电器、LED。假如用汇编来完成的话,是很头疼的工作,用C 来完成是很轻松的工作,这儿也涉及到一点C 的内存办理(其实C 的最大长处便是内存办理)。选用如下结构:
union cypok{
struct out{
motor:1; /*电机*/
relay:1; /*继电器*/
speaker:1; /*喇叭*/
led1:1; /*指示灯*/
led2:1; /*指示灯*/
}out;
struct in{
none:5;
temperature:1; /*温度*/
voltage:1; /*电压*/
current:1; /*电流*/
}in;
char x;
};
union cypok an1;
union cypok an2;
上面的结构有什么优点呢?
细分了信号的路an1 和an2;
细分了每一路的信号的类型(是前端信号in 仍是后端信号out):
an1.in ;
an1.out;
an2.in;
an2.out;
然后又细分了每一路信号的具体意义,如:
an1.in.temperature;
an1.out.motor;
an2.in.voltage;
an2.out.led2;等
这样的结构很直观的在2 个内存中就表明了2 路信号。而且能够极端便利的扩大。如增加更多路的信号,只需求增加:
union cypok an3;
union cypok an4;
从上面就能够看出用C 的巨大优点一:用位操作来做一些标志位,也便是BOOL变量.能够简略如下界说:
bit a,b,c;
PICC会主动组织一个内存,并在此内存中主动组织一位来对应a,b,c.因为咱们仅仅用它们来简略的 表明一些0,1信息,所以咱们不需求具体的知道它们的地址\位终究是多少,只管拿来就用好了.
二:要是需求用一个地址固定的变量来位操作,能够参照PIC.H里边界说寄存器.
如:用25H内存来界说8个位变量.
static volatile unsigned char myvar @ 0x25;
static volatile bit b7 @ (unsigned)&myvar*8+7;
static volatile bit b6 @ (unsigned)&myvar*8+6;
static volatile bit b5 @ (unsigned)&myvar*8+5;
static volatile bit b4 @ (unsigned)&myvar*8+4;
static volatile bit b3 @ (unsigned)&myvar*8+3;
static volatile bit b2 @ (unsigned)&myvar*8+2;
static volatile bit b1 @ (unsigned)&myvar*8+1;
static volatile bit b0 @ (unsigned)&myvar*8+0;
这样即能够对MYVAR操作,也能够对B0--B7直接位操作.但欠好的是,此招在等级低片子,如C5X系列上可能会出问题.还有便是表达起来杂乱,你不觉得输入代码劳累么?呵呵
三:这也是一些常用办法:
#define testbit(var, bit) ((var) & (1 <<(bit))) //测验某一位,能够做BOOL运算
#define setbit(var, bit) ((var) |= (1 << (bit))) //把某一方位1
#define clrbit(var, bit) ((var) &= ~(1 << (bit))) //把某一位清0
付上一段代码,能够用MPLAB调试调查
#include#define testbit(var, bit) ((var) & (1 <<(bit)))
#define setbit(var, bit) ((var) |= (1 << (bit)))
#define clrbit(var, bit) ((var) &= ~(1 << (bit)))
char a,b;
void main(){
char myvar;
myvar=0B10101010;
a=testbit(myvar,0);
setbit(myvar,0);
a=testbit(myvar,0);
clrbit(myvar,5);
b=testbit(myvar,5);
if(!testbit(myvar,3))
a=255;
else
a=100;
while(1){;}
}
四:用规范C的共用体来表明:
#includeunion var{
unsigned char byte;
struct {
unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
} bits;
};
char a,b;
void main(){
static union var myvar;
myvar.byte=0B10101010;
a=myvar.bits.b0;
b=myvar.bits.b1;
if(myvar.bits.b7)
a=255;
else
a=100;
while(1){;}
}
五:用指针转换来表明:
#includetypedef struct {
unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
} bits; //先界说一个变量的位
#define mybit0 (((bits *)&myvar)->b0) //取myvar 的地址(&myvar)强制转换成bits 类型的指针
#define mybit1 (((bits *)&myvar)->b1)
#define mybit2 (((bits *)&myvar)->b2)
#define mybit3 (((bits *)&myvar)->b3)
#define mybit4 (((bits *)&myvar)->b4)
#define mybit5 (((bits *)&myvar)->b5)
#define mybit6 (((bits *)&myvar)->b6)
#define mybit7 (((bits *)&myvar)->b7)
char myvar;
char a,b;
void main(){
myvar=0B10101010;
a=mybit0;
b=mybit1;
if(mybit7)
a=255;
else
a=100;
while(1){;}
}
六:五的办法仍是烦琐,能够用张贴符号的方式来简化它.
#includetypedef struct {
unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
} bits;
#define _paste(a,b) a##b
#define bitof(var,num) (((bits *)&(var))->_paste(b,num))
char myvar;
char a,b;
void main(){
a=bitof(myvar,0);
b=bitof(myvar,1);
if(bitof(myvar,7))
a=255;
else
a=100;
while(1){;}
}
有必要说说#define _paste(a,b) a##b 的意思:
此句子是张贴符号的意思,表明把b 符号张贴到a 符号之后.
比如中是
a=bitof(myvar,0);--->(((bits *)&(myvar))->_paste(b,0))--->(((bits *)&(var))->b0)能够看出来,_paste(b,0)的作用是把0 张贴到了b 后边,成了b0 符号.
总结:C言语的优势是能直接对低层硬件操作,代码能够十分十分挨近汇编,上面几个比如的位操作代码是100%的到达汇编的程度的.另一个优势是可读性高,代码灵敏.上面的几个位操作办法任由你选,你不用忧虑会发生剩余的代码量出来.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/266140.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部