论坛风格切换切换到宽版
  • 3935阅读
  • 2回复

为什么avr的io口的位操作,比起51要麻烦很多 [复制链接]

上一主题 下一主题
离线bd9cr
 
发帖
1202
只看楼主 倒序阅读 0楼 发表于: 2007-10-07
对51操作
只要#include<at89x51.h>,就可以直接p1_1=0;p1_1=1;~p1_1;
avr在icc下却要,portb |= (1<<pb2)//置高电平;portb &= ~(1<<pb2);//置低电平。取反就更困难了。

另一种方法
portb&=~bit(pb2);根本在icc下译不过去
离线BG4UVR
发帖
11288
只看该作者 1楼 发表于: 2007-10-07
出错是因为 bit() 没有被定义

另外,取反也相当简单,可以用

portb ^= (1<<pb2);
离线bd9cr
发帖
1202
只看该作者 2楼 发表于: 2007-10-07
'
出错是因为 bit() 没有被定义
另外,取反也相当简单,可以用
portb ^= (1<<pb2);
'

搞明白了,加上#include <macros.h>就可以用bit()这个函数了。

还有按位(异或)这个运算符用在取反,还真是它妈的巧妙。

和1异或才有取反的意思。假设本来为1,和1异或后为0
                        苯来为0,和1异或后为1(相同为0,相异为1)刚好取反。
和0异或就等于没有改变。假设本来为1,和0异或后为1,
              假设本来为0,和0异或后为0。(显然异或后没有改变)。

因此portb^=(1<<pb2)等同于portb=portb^0b00000100因此仅仅pb2位取反其他位不变化。
portb^=bit(pb2)其实也是一样的。