写代码实现
一盏台灯,一个按键,按一下亮一点,按第二下再亮一点,按第三下最亮,再按一下关闭
思想:
LED的亮度通过高电平的占空比实现控制,当同一单位时间下,增加高电平(亮起)时间,可增加亮度,所以我们可以通过延时函数控制每次LED亮起的时间
头文件:
#ifndef __KEY5_H__
#define __KEY5_H__
#include "./stm32mp1xx_gpio.h"
#include "./stm32mp1xx_rcc.h"
//初始化GPIO层
void gpio_init();
//写函数
void Open_LED1();
void Close_LED1();
#endif
初始化+开关灯函数
#include "key5.h"
//初始化gpio层
void gpio_init()
{
//rcc使能GPIOE\GPIOF寄存器
RCC->MP_AHB4ENSETR |= (0X1 << 5);
RCC->MP_AHB4ENSETR |= (0X1 << 4);
//设置GPIOE10为输出模式
GPIOE->MODER &= (~(0x3 <<20));
GPIOE->MODER |= (0x1 <<20);
//设置GPIOF9模式为输入模式,按键
GPIOF->MODER &= (~(0X3 << 18));
//设置GPIOE10的输出类型
GPIOE->OTYPER &= (~(0x1 <<10));
//设置GPIOE10的输出速度
GPIOE->OSPEEDR &= (~(0X3 <<20));
//设置GPIOE10上下拉
GPIOE->PUPDR &= (~(0X3 <<20));
}
//开灯
void Open_LED1()
{
GPIOE->ODR |= (0X1 <<10);
}
//关灯
void Close_LED1()
{
GPIOE->ODR &= (~(0X1 <<10));
}
主函数
#include "key5.h"
extern void printf(const char *fmt, ...);
//延时函数1
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
//毫秒级延时函数
void delay_nus(int time)
{
int i=0;
while(time--)
{
i=10;
while(i--);
}
}
//判断标志位,默认0
int flag=0;
int main()
{
//调用初始化函数
gpio_init();
while(1)
{
if(GPIOF->IDR &= (0x1<<9)) //当按键抬起时,执行LED亮的操作,根据Flag不同执行不同亮度
{
if(flag==1) //档位1
{
write_LED1();
delay_nus(200);
nowrite_led1();
delay_nus(800);
}else if(flag ==2) //档位2
{
write_LED1();
delay_nus(500);
nowrite_led1();
delay_nus(500);
}else if(flag==3) //档位3
{
write_LED1();
delay_nus(900);
nowrite_led1();
delay_nus(100);
}
}else //当按键按下时,修改档位
{
flag++;
if(flag==4)
{
flag=0;
}
delay_ms(300);
}
}
return 0;
}