×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-18 发布时间:
|

       用的是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  固件库

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义