搜索
bottom↓
回复: 10

avr位操作

[复制链接]

出0入0汤圆

发表于 2012-10-26 10:02:16 | 显示全部楼层 |阅读模式
PORTB |= (1 << PB3)
PORTB = (1 << PB3)
这两个语句意思
区别

PORTB &= ~BIT(3), PB3置0
PORTB |= BIT(3), PB3置1
这又是怎么回事

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-28 16:28:36 | 显示全部楼层
PORTB  = (1 << PB3) :  PB3在头文件宏定义为3,1<<3 = 0x08,所以实现的是PORTB = 0x08,即PB3置1,其他位清0;
PORTB |= (1 << PB3) :  实现的是PORTB |= 0x08,是C语言中的简写方式。展开就是PORTB = PORTB | 0x08,即将PB3置1,其他位保持不变。

PORTB &= ~BIT(3):   其中BIT(3)在头文件定义为1 << PB3。所以 原始展开就是PORTB = PORTB & (~ (1 << 3) ) = PORTB & 0xf7,即将PB3清0,其他位置1;
PORTB |= BIT(3):    与PORTB |= (1 << PB3)相同。

出0入0汤圆

发表于 2012-10-26 10:02:17 | 显示全部楼层
PORTB |= (1 << PB3)   :保持PB口其它位不变,仅把PB3置位。
PORTB = (1 << PB3)    :PB口的PB3置位,其它清零。
PB3在IAR的头文件中已经宏定义为3。
相同处:PB3置位;
不同处:除PB3外的其它位操作不同。

PORTB &= ~BIT(3), PB3置0  :PB3清零,PB口其它位保持不变。
PORTB |= BIT(3), PB3置1   :PB3置位,PB口其它位保持不变。
BIT(x)是宏定义好的操作,字母理解应该是1的第x位置位。
BIT(3)的值是0x08,~BIT(3)的值就是0xF7。其它的自行演算吧。

出0入296汤圆

发表于 2012-10-26 10:38:44 | 显示全部楼层
#define BIT(__N)    (1<<(__N))

出0入0汤圆

发表于 2012-10-26 14:53:12 | 显示全部楼层
刘明马克。

出0入0汤圆

发表于 2012-10-26 15:25:54 | 显示全部楼层
这是AVR的总线式位操作,因为AVR不像51可以用sbit,所以只能这样做啦

出0入0汤圆

发表于 2012-10-26 16:16:26 | 显示全部楼层
这么多人都给解答对了,LZ还不给钱啊

出0入0汤圆

发表于 2012-10-28 08:45:56 | 显示全部楼层
MARK.......

出0入0汤圆

发表于 2012-10-28 20:10:43 | 显示全部楼层
/**********位段**************/
typedef struct
{   unsigned bit0: 1;
    unsigned bit1: 1;
    unsigned bit2: 1;
    unsigned bit3: 1;
    unsigned bit4: 1;
    unsigned bit5: 1;
    unsigned bit6: 1;
    unsigned bit7: 1;
}PBIT;
/* Port A */
#define PINAB        (*(volatile PBIT *)&PINA)
#define DDRAB        (*(volatile PBIT *)&DDRA)
#define PORTAB        (*(volatile PBIT *)&PORTA)

#define          PA_0         PORTAB.bit0
#define          PA_1         PORTAB.bit1
#define          PA_2          PORTAB.bit2
#define          PA_3          PORTAB.bit3
#define          PA_4           PORTAB.bit4
#define          PA_5         PORTAB.bit5
#define          PA_6         PORTAB.bit6
#define          PA_7         PORTAB.bit7


置位直接PA_0=1就行了

出0入0汤圆

发表于 2012-10-28 21:04:40 | 显示全部楼层
Something like this can be helpful in porting code. However, compare to a more generic PORTB |= (1<<0); for example, you will be surprised which is faster.

出0入0汤圆

发表于 2015-4-17 17:33:29 | 显示全部楼层
mark!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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