编写按键的代码用到的是I/O端口的输入寄存器,与输出寄存器有所区别
输入:
/*
Function name:Key_Config
Description:按键的初始化
param:None
retval:None
Remarks:PA0,PE2,PE3,PE4 输出高KEY1;输出低KEY2,KEY,KEY4有反应
*/
void Key_Config(void)
{
RCC->AHB1ENR |=(1<<0);//打开PA时钟
GPIOA->MODER &=~(3<<0);//清零 输入
GPIOA->PUPDR &=~(3<<0);//无上下拉
RCC->AHB1ENR |=(1<<4);//打开PE时钟
GPIOE->MODER &=~(0x3f<<4);//清零 输入
GPIOE->PUPDR &=~(0x3f<<4);//无上下拉
}
输出:
/*
Function name:Led_Config
Description:灯的初始化
param:None
retval:None
Remarks:
PC4、PC5、PC6、PC7输出低 LED1、LED2、LED3、LED4亮
*/
void Led_Config(void)
{
RCC->AHB1ENR |=(1<<2);//打开PC时钟
GPIOC->MODER &=~(0xff<<8);//清零
GPIOC->MODER |=(0x55<<8);//通用输出
GPIOC->OTYPER &=~(0xf<<4);//推挽
GPIOC->OSPEEDR |=(0xaa<<8);//输出速度
GPIOC->PUPDR &=~(0xff<<8);//无上下拉
GPIOC->ODR |=(0xf<<4);//默认灭
}
与输出相比输入用的寄存器更少,更重要的是输出是给I/O端口置一和清零,而输入是从I/O口获取高低电平
输入:
#define KEY1 (GPIOA->IDR &(1<<0))
#define KEY2 !(GPIOE->IDR &(1<<2))
#define KEY3 !(GPIOE->IDR &(1<<3))
#define KEY4 !(GPIOE->IDR &(1<<4))
输出:
#define LED1_ON GPIOC->ODR &=~(1<<4)
#define LED1_OFF GPIOC->ODR |=(1<<4)
#define LED2_ON GPIOC->ODR &=~(1<<5)
#define LED2_OFF GPIOC->ODR |=(1<<5)
#define LED3_ON GPIOC->ODR &=~(1<<6)
#define LED3_OFF GPIOC->ODR |=(1<<6)
#define LED4_ON GPIOC->ODR &=~(1<<7)
#define LED4_OFF GPIOC->ODR |=(1<<7)
图1.按键原理图