GPIO输出应用:流水灯

流水灯原理

  • 将开发板上的发光二极管的负极连接到主控芯片GPIO端口上(使用跳线帽),并连上限流电阻;发光二极管的阳极连接到一起形成公共端,最后将这个公共端经过接高电平(这称为共阳极结构,反之,将二极管的阴极连接到一起再接地就称为共阴极结构)
    一般在开发板的电路上已经做好了这些,我们只需要直接使用或者用跳线连接端口和发光二极管即可

  • 对于共阳极结构,当端口任一引脚输出低电平时,对应发光二极管会被点亮输出高电平则对应的发光二极管熄灭,共阴极结构则相反

  • 请看你所使用的开发板的原理图,根据电路结构不同,来决定点灯所需操作

  • 要点:

    1. 通过编程控制GPIO输出,实现流水灯左移、右移等花样
    2. 通过让单片机空转,实现延时操作

代码实现

  • 初始化函数

    //首先,准备一个将所有LED灯初始化配置的函数,常常命名为GPIO_init
    void GPIO_LED_init()
    {
    	PB_DDR = 0x0F; //0000 1111:PB0-3被配置为1:输出
        PB_CR1 = 0x0F; //控制寄存器CR1被配置为1:推挽输出
        PB_CR2 = 0x00; //控制寄存器CR2被配置0:低速输出
        PB_ODR = 0x0F; //全部配置为1输出高电平:先关灯
    }
    
  • 位操作控制GPIO输出

    通过按位运算,修改寄存器的数值,达到控制输出的目的

    void move_left()//让灯流水左移
    {
      for(i=0;i<4;i++)
      {
        //初始化状态:PB_ODR = 0000 1111
        PB_ODR &= ~(1<<i);
    	//1=0001 以i=1为例 左移<<:0010;取反~:1101;按位与&:1111与1101得1101
        delay(timeset);//延时函数
        PB_ODR |= (1<<i);//将刚刚配置打开的灯关上:或运算|:1101或0010得1111
      }
    }
    
  • 位定义控制GPIO

    在芯片头函数中,预先将常用的寄存器位进行定义,方便直接操作

    #include "iostm8105c6.h"
    //注意程序应包含芯片对应的头文件
    
    PB_ODR_ODR0 = 0;
    //这样,PB0引脚的输出数据寄存器PB_ODR就被修改为了0
    
  • 延时函数

    用于让单片机在设定好的时间后再执行相应操作

    void delay(unsigned int time)
    {
      unsigned int i,j;
      for(i=0;i<time;i++)
      {
        for(j=0;j<400;j++);//空转400次,对于STM8S芯片大致需要运转1ms
      }//原理:通过空操作来拖延时间,这种延时方法不太精确
    }
    

posted on   无术师  阅读(34)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

统计

点击右上角即可分享
微信分享提示