用的是STM32F407ZET6。控制的LED灯的四个引脚分别是LED0 ->PF9,LED1 -> PF10,LED2-> PE13,LED3 -> PE14。按键的四个引脚分别是KEY0--> PA0,KEY1--> PE2,KEY2--> PE3,KEY3--> PE4。
在循环里判断按键是否按下(对应的引脚输入会变为0),如果按下,则对应的LED引脚输出低电平,即可点亮。
1,分别初始化LED灯和按键的寄存器。
初始化LED灯(设置各个寄存器):设置GPIO的时钟,配置模式寄存器(通用输出类型),配置输出类型(设为输出推免),设置控制输出速率的寄存器,最后配置输出数据寄存器(让LED灯默认是熄灭的)
初始化按键(设置各个寄存器):设置GPIO的时钟,配置密匙寄存器(设置为输入模式),设置控制输出速率的寄存器。
2,在主函数一直查询按键是否按下(相应的管脚电平是否为0即可)
函数实现如下:
#define rRCCAHB1CLKEN *((volatile unsigned long *)0x40023830)
#define rGPIOF_MODER *((volatile unsigned long *)0x40021400)
#define rGPIOF_OTYPER *((volatile unsigned long *)0x40021404)
#define rGPIOF_OSPEEDR *((volatile unsigned long *)0x40021408)
#define rGPIOF_IDR *((volatile unsigned long *)0x40021410)
#define rGPIOF_ODR *((volatile unsigned long *)0x40021414)
#define rGPIOE_MODER *((volatile unsigned long *)0x40021000)
#define rGPIOE_OTYPER *((volatile unsigned long *)0x40021004)
#define rGPIOE_OSPEEDR *((volatile unsigned long *)0x40021008)
#define rGPIOE_IDR *((volatile unsigned long *)0x40021010)
#define rGPIOE_ODR *((volatile unsigned long *)0x40021014)
#define rGPIOA_MODER *((volatile unsigned long *)0x40020000)
#define rGPIOA_OTYPER *((volatile unsigned long *)0x40020004)
#define rGPIOA_OSPEEDR *((volatile unsigned long *)0x40020008)
#define rGPIOA_IDR *((volatile unsigned long *)0x40020010)
#define rGPIOA_ODR *((volatile unsigned long *)0x40020014)
void key_init()
{
rRCCAHB1CLKEN |= 1 | (1 << 1);
rGPIOA_MODER&=~(1|(1<<1));
rGPIOF_OSPEEDR &= ~(1 | (1 << 1) );
rGPIOE_MODER&= ~(0x3f<<4);
rGPIOE_MODER &= ~(0x3f<<4);
}
void led_init()
{
rRCCAHB1CLKEN |= (1 << 5) | (1 << 4);
rGPIOF_MODER &= ~((0x3 << 18) | (0x3 << 20));
rGPIOF_MODER |= (1 << 18) | (1 << 20);
rGPIOF_OTYPER &= ~( (1 << 9) | (1 << 10));
rGPIOF_OSPEEDR &= ~((0x3 << 18) | (0x3 << 20) );
rGPIOF_ODR |= (1 << 9 | 1 << 10) ;
rGPIOE_MODER &= ~((0X3 << 26) | (0X3 << 28) );
rGPIOE_MODER |= (1 << 26) | (1 << 28);
rGPIOE_OTYPER &= ~( (1 << 13) | (1 << 14));
rGPIOE_OSPEEDR &= ~((0x3 << 26) | (0x3 << 28) );
rGPIOE_ODR |= (1 << 13 | 1 << 14) ;
}
void delay(int i)
{
int v = i;
while(v--);
}
void led_on(int i)
{
if (i == 0)
{
rGPIOF_ODR &= ~(1 << 9);
rGPIOF_ODR |= 1 << 10;
rGPIOE_ODR |= (1 << 13) | (1 << 14);
}
else if (i == 1)
{
rGPIOF_ODR |= (1 << 9);
rGPIOF_ODR &= ~(1 << 10);
rGPIOE_ODR |= (1 << 13) | (1 << 14);
}
else if (i == 2)
{
rGPIOF_ODR |= (1 << 9) | (1 << 10);
rGPIOE_ODR &= ~(1 << 13);
rGPIOE_ODR |= 1 << 14;
}
else if (i == 3)
{
rGPIOF_ODR |= (1 << 9) | (1 << 10);
rGPIOE_ODR &= ~(1 << 14);
rGPIOE_ODR |= 1 << 13;
}
}
int main()
{
int i = 0;
led_init();
key_init();
while(1)
{
if(!(rGPIOA_IDR&1))
{
delay(50);//消抖
if(!(rGPIOA_IDR&1))
{
led_on(0);
}
}
else
{
rGPIOF_ODR |= 1 << 9;//µÆÃð
}
if(!(rGPIOE_IDR&(1<<2)))
{
delay(50);
if(!(rGPIOE_IDR&(1<<2)))
{
led_on(1);
}
}
else
{
rGPIOF_ODR |= 1 << 10;
}
if(!(rGPIOE_IDR&(1<<3)))
{
delay(50);
if(!(rGPIOE_IDR&(1<<3)))
{
led_on(2);
}
}
else
{
rGPIOE_ODR |= 1 << 13;
}
if(!(rGPIOE_IDR&(1<<4)))
{
delay(50);
if(!(rGPIOE_IDR&(1<<4)))
{
led_on(3);
}
}
else
{
rGPIOE_ODR |= 1 << 14;
}
}
}
关键字:STM32 按键控制 LED 固件库『本文转载自网络,版权归原作者所有,如有侵权请联系删除』