您的位置:首页 > 其它

STM32按键控制LED(不用固件库)

2017-10-19 19:11 423 查看
   用的是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;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: