英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 4082|回复: 0
打印 上一主题 下一主题

PICC的位操作

[复制链接]
跳转到指定楼层
1#
发表于 2009-3-21 17:25:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于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<<bitno)
#define bitclr(var,bitno)(var &=~(1<<bitno))
则上面的操作就是: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;
。。。。。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-11-24 08:34 , Processed in 0.051987 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表