打印
[微控制器/MCU]

IAR的位操作

[复制链接]
2053|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Massif123|  楼主 | 2010-9-25 16:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3.1.在c语言里对位的操作如一般如下:
PORTB|=(1<<2);//置PORTB的第2位=1
PORTB&=~(1<<2);//置PORTB的第2位=0
PORTB^|=(1<<2);//取反PORTB的第2位
While(PORTB&(1<<2));//判断1
While(!(PORTB&(1<<2)));//判断为0
3.2.IAR编译器对位的支持更强大,除了上面的方法外还有以下更简单的操作方法:
PORTB_ Bit2=1; //置PORTB的第2位=1
PORTB_ Bit2=0; //置PORTB的第2位=0
PORTB_ Bit2=~ PORTB_ Bit2;//取反PORTB的第2位
While(PORTB_ Bit2);或者while(PORTB_Bit2==1);//判断1
while(PORTB_ Bit2==0);//判断0
PORTC_Bit4=PORTB_Bit2;//把PORTB的第2位传送到PORTC的第4位
3.3.位变量定义:
由于iar使用了扩展语言,它对位域的支持变为最小为char类型,我们可以很方便地用来定义位变量。
采用结构体来定义位变量:
struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}t;
然后就可以用以下位变量了。
t.bit0=1;
t.bit0=~t.bit0;
但是采用以上结构体做出来的位变量只可以访问t的位,不能够直接访问变量t,和标准的IAR位操作也不一样。采用联合体来定义效果更佳。
#i nclude<iom8.h>
union
{
unsigned char t;
struct
{unsigned char t_bit0:1,
t_bit1:1,
t_bit2:1,
t_bit3:1,
t_bit4:1,
t_bit5:1,
t_bit6:1,
t_bit7:1;
};
};
void main(void)
{
t_bit0=1;//访问变量t的位
t_bit0=~t_bit0;
PORTB=t;//直接访问变量t
}
位变量也可以直接定义在工作寄存器里。
3.4 bool 数据类型在C++语言里是默认支持的。
    如果你在C代码的头文件里包含stdbool.h, bool数据类型也可以使用在C语言里。也可以使用布尔值 false和 true。不过是占用8位1个字节。
#i nclude<iom8.h>
#i nclude<stdbool.h>
bool y=0;//定义位变量
void main(void)
{
y=!y;//取反位变量
PORTB_Bit3=y;//传递位变量


相关帖子

沙发
3B1105| | 2010-9-26 12:12 | 只看该作者
用位断看着好看,实则除了bug还不好找!

使用特权

评论回复
板凳
思行合一| | 2010-10-8 12:50 | 只看该作者
如何检查几个int类型数据的每一位是否被置位?

使用特权

评论回复
地板
huzixian| | 2010-10-8 19:02 | 只看该作者
位操作必须注意清零

使用特权

评论回复
5
zyz7| | 2016-8-22 18:26 | 只看该作者
谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

276

帖子

1

粉丝