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;
}
}
}
在循环里判断按键是否按下(对应的引脚输入会变为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
- STM32红牛开发板非固件库控制LED(2010/05/23)
- stm32 按键(中断)控制LED的亮灭,按一次亮,再按一次灭;
- Stm32按键输入控制LED灯
- 3.STM32中对EXTI_PE5_Config()函数的理解(自定义)之中断控制按键LED
- STM32_外部中断之按键控制点亮LED灯
- [置顶] ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示
- 基于STM32CT117E竞赛板(STM32f103RB)按键控制LED流水灯
- STM32_按键控制LED之轮询
- 2.STM32中对Key_GPIO_Config()函数的理解(自定义)之轮询控制按键LED
- STM32不用固件库容易产生的一个问题:Undefined symbol SystemInit
- 简单的按键控制LED
- 第三个实验 通过中断方式让按键控股按键控制LED
- 按键控制led驱动
- (17/06/25)STM32学习->GPIO输出控制LED
- CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)
- Arduino 用两个按键分别控制两个LED灯点亮
- ARM按键控制LED
- stm32学习的日子-构建库函数雏形(第1节)—寄存器结构体定义控制点亮G0Kitv2.1 LED2和LED4
- 树莓派 Learning 003 — GPIO 002 输入模式 — 按键控制LED