2、STM8L151K4学习笔记--GPIO输入

实现按下复位键KEY1即可切换LED1灯的亮灭。KEY与PA4相连,通过PA4的引脚关联PD5引脚的LED1亮灭。

#include

void Delay(unsigned int ms)
{
  unsigned int x , y;
  for(x = ms; x > 0; x--)
    for(y = 2000; y > 0; y--);
}

int main(void)
{
  PA_DDR_bit.DDR4 = 0;    //配置PA4为输入模式
  PA_CR1_bit.C14 = 1;   //配置PA4为带上拉输入
  PA_CR2_bit.C24 = 0;   //配置PA4为禁止中断
  
  PD_DDR_bit.DDR5 = 1;    //配置PD5为输出模式
  PD_CR1_bit.C15 = 1;     //配置PD5为带上拉电阻的输出
  PD_CR2_bit.C25 = 1;     //配置PD5为高速输出模式
  
  while(1)
  {
    if(PA_IDR_bit.IDR4 == 0)    //判断PA4是 否已经 按下了
    {
      Delay(2);           //调用延时函数,进行按下消抖
      while(PA_IDR_bit.IDR4 == 0);   //等待松手
      Delay(2);           //调用延时函数,进行松手消抖
      PD_ODR ^= (1 << 5);    //通过异或取反控制LED1
    }
  }
}

根据电路图可知,KEY1按下,PA4=0为低电平
电路图:


2、STM8L151K4学习笔记--GPIO输入_第1张图片
image.png

最后一句代码的解释:
PD_ODR ^= (1 << 5); //通过异或取反控制LED1
等效于PD_ODR = PD_ODR ^(1 << 5)
^是异或运算,(1<<5)其实就是0x20,上面的意思是当PA4 == 0 时,PortD_ODR的第5位取反,其余位状态不变,即为1左移5位,二进制即为 0010 0000


image.png

相当于,每次按下KEY1,当PA4 == 0的之后,函数几对ODR5的状态进行翻转。因此实现了LED1的亮灭!

补充:
和 0 “与” A&0 = 0 清零操作,一般把低8位清零 A & FF00

和 1 “或” A|1 = 1 置一操作

和 1 “异或” A^ 1 = 0 取反操作

你可能感兴趣的:(2、STM8L151K4学习笔记--GPIO输入)