当前位置: 首页 > article >正文

STM32 流水灯与跑马灯的实现

基于STM32F407实现流水灯与跑马灯

上一章实现了点亮LED灯的实验

添加引脚

根据电路图将LED灯的其他引脚加进来

然后进行宏定义,简化代码

之后我们就将LED1_PIN代替GPIO_Pin_14.........LED4_PIN代替GPIO_Pin_7

三目运算符

我们将LED(0)使LED灯亮  LED(1)使LED灯灭

三目运算符:  X?表达式1:表达式2     当x为零时执行表达式2   非零时执行表达式1

#define LED1(x)    x?(GPIO_SetBits(GPIOG,LED1_PIN)):(GPIO_ResetBits(GPIOG,LED1_PIN))
#define LED2(x)    x?(GPIO_SetBits(GPIOG,LED2_PIN)):(GPIO_ResetBits(GPIOG,LED2_PIN))
#define LED3(x)    x?(GPIO_SetBits(GPIOG,LED3_PIN)):(GPIO_ResetBits(GPIOG,LED3_PIN))
#define LED4(x)    x?(GPIO_SetBits(GPIOG,LED4_PIN)):(GPIO_ResetBits(GPIOG,LED4_PIN))

delay函数

实现流水灯需要用到延时函数,最简单的延时函数是通过循环将其卡住,实现延时的效果。

想要做到精准的延时需要用到滴答定时器,这里就先复制了(延时函数所有文件都能用得上且代码不变)

//延时函数 us级别
void delay_us(uint32_t us)
{
    SysTick->CTRL = 0;          //关闭嘀嗒定时器
    SysTick->LOAD = 21*us-1;   //设置计数21*us-1~0,计数周期是21us-1+1
    SysTick->VAL = 0;          //计数器值清零,会被重装载值覆盖
    SysTick->CTRL = 1;         //清除计算器标志位,设置时钟源是21MH,关闭中断,开启嘀嗒定时器
    while((SysTick->CTRL & 0X00010000) == 0);   //等待标志位从0--》1
    SysTick->CTRL = 0;          //关闭嘀嗒定时器
}


// 普通延迟函数 ms级别
void delay_ms(uint32_t ms)
{
    SysTick->CTRL = 0;
    SysTick->LOAD = 21000*ms-1;
    SysTick->VAL = 0;
    SysTick->CTRL = 1;
    while((SysTick->CTRL & 0X00010000) == 0);
    SysTick->CTRL = 0;
}


// 普通延迟函数 s级别
void delay_s(uint32_t s)
{
    while(s--)
    {
        delay_ms(500);
        delay_ms(500);
    }
}

流水灯操作

方法一:最直接的方法,使灯一个接着一个亮中间加延时

这种方法很麻烦,如果遇到灯组多的情况下需要一直写。

方法二:建立数组用循环实现。

主函数:

同理可以实现跑马灯:


http://www.kler.cn/a/518880.html

相关文章:

  • 「 机器人 」系统辨识实验浅谈
  • 基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测
  • 将Deepseek接入本地Vscode
  • 上位机知识篇---return环境变量.bashrc
  • 【JavaEE进阶】Spring留言板实现
  • 【0x0012】HCI_Delete_Stored_Link_Key命令详解
  • Apache Airflow 全面解析
  • 飞牛 fnOS 安装8852be网卡驱动并成功连接
  • CVE-2024-23897-Jenkins任意文件读取漏洞复现
  • 动动小手之消失的水印
  • Oracle 普通用户连接hang住处理方法
  • 【Linux】20.基础IO(2)
  • React Router v6配置路由守卫
  • Linux的udev详解、安装和使用(dev下的设备每次开机的名称不固定怎么办?)
  • 如何将手机的画面和音频全部传输到电脑显示和使用电脑外放输出
  • 九、CSS工程化方案
  • drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程
  • Orgill EDI需求分析
  • 需求分析的
  • 斯坦福:LLM混合量化方法BlockDialect
  • 性能测试JVM监控有哪些?
  • Keepalived实现HAProxy高可用搭建
  • FreeBSD里制作ubuntu22 jammy兼容环境的脚本
  • FAST-DDS and ROS2 RQT connect
  • npm启动前端项目时报错(vue) error:0308010C:digital envelope routines::unsupported
  • 代码练习2