STM32F207VCT6 中每个端口有 16 个引脚。此操作试图确定端口 A 的单个引脚(4 号)的状态。让我们扩展每个部分以更好地了解发生了什么。
我们从表达式开始:
if(!(GPIOA->IDR & (1<<4)))
我们正在使用 16 位数字来计算 16 个引脚。扩展这个我们得到:
if(!(GPIOA->IDR & ((0000 0000 0000 0001) << 4)))
您已经知道这<<
是按位左移。应用这个我们得到:
if(!(GPIOA->IDR & (0000 0000 0001 0000)))
扩展IDR
,我将X
's 用于我们不关心的位和 a?
用于我们正在测试的未知位:
if(!((XXXX XXXX XXX? XXXX) & (0000 0000 0001 0000)))
接下来我们有一个&
按位与运算符。如果你还记得你的 AND 真值表:
& 0 1
- -
0 | 0 0
1 | 0 1
所以我们有操作:
XXXX XXXX XXX? XXXX
& 0000 0000 0001 0000
---------------------
0000 0000 000? 0000
如果端口 A 中的第 4 位是 a 0
,则结果将是0000 0000 0000 0000
。如果端口 A 中的第 4 位是 a 1
,则结果将是0000 0000 0001 0000
。
如果按下开关,输入将被拉至 GND,位 4 将设置为0
。如果开关未按下,则内部上拉电阻会将输入拉高,位 4 将设置为1
。
所以我们有两种可能:
//Button is pressed
if(!(0000 0000 0000 0000))
或者:
//Button is not pressed
if(!(0000 0000 0001 0000))
现在重要的是要了解它!
是逻辑非运算符。在条件语句中反转true
和。在C 语言false
中理解这一点也很重要:
逻辑运算符(&&
, ||
,!
等)和条件测试语句(if
, while
)假定零为假,所有其他值为真。
强调我的
所以我们真正拥有的是:
//Button is pressed
if(!(false))
或者:
//Button is not pressed
if(!(true))
应用NOT:
//Button is pressed
if(true)
Key=1;
或者:
//Button is not pressed
if(false)
Key=1;