我目前在一个LPC3141开发板上学习。我试图关闭单个GPIO引脚,而让其他引脚保持相同的状态。我的问题是,我可以单独打开它们,但当我只想关闭一个pit时,它会进行“总线重置”,并将它们全部关闭。我不明白为什么当我使用位移位时,它会重置所有它们。下面是我的代码示例,它可以做到这一点:
#define PINS (*((volatile unsigned int *)0x130031C0))
#define MODE0 (*((volatile unsigned int *)0x130031D0))
#define MODE0_SET (*((volatile unsigned int *)0x130031D4))
#define MODE0_RESET (*((volatile unsigned int *)0x130031D8))
#define MODE1 (*((volatile unsigned int *)0x130031E0))
#define MODE1_SET (*((volatile unsigned int *)0x130031E4))
#define MODE1_RESET (*((volatile unsigned int *)0x130031E8))
void delay (void);
void c_entry(void){
//Prg gpio pins (glej user manual str 312-318
//Bit manipulation (spremenim samo 1 bit v registru inne celega)
MODE1 = MODE1 | (0x1 << 6);
MODE1 = MODE1 | (0x1 << 8);
while(1){
MODE0 = MODE0 | (0x1 << 6);
MODE0 = MODE0 | (0x1 << 8);
delay();
MODE1 = MODE1 | (0x1 << 6);
MODE1 = MODE1 | (0x1 << 8);
MODE0 = MODE0 & !(0b1000000);
delay();
}
}
void delay (void){
volatile int stej = 1000000;
while(stej){
stej = stej - 1;
}发布于 2015-06-12 18:34:22
当您想要清除位时,您使用了错误的运算符-您需要的是按位补码运算符~,而不是逻辑not运算符!。
注意:按位运算符,顾名思义,是对一个值中的单个位进行操作,而逻辑运算符将一个值视为单个true/false数量(0 = false,其他所有内容= true)。按位运算符:&、|、^、~。逻辑运算符:&&、||、!。
以你的代码为例:
MODE0 = MODE0 & !(0b1000000);应该是:
MODE0 = MODE0 & ~(0b1000000);或者更简洁/始终如一:
MODE0 &= ~(0x1 << 6);https://stackoverflow.com/questions/30800881
复制相似问题