GPIO输出应用:流水灯
1.前言与基础知识2.GPIO通用输入输出端口
3.GPIO输出应用:流水灯
4.GPIO输出应用:数码管5.GPIO输入应用:按键6.中断7.外部中断应用:按键8.时钟源9.基本计时器TIM4:STM8的定时器/计数器资源综述10.单片机线反转法实现矩阵键盘11.高级计时器TIM1:概述与外部时钟模式实现外部脉冲计数12.高级计时器TIM1:输入捕获功能功能实现信号周期与占空比测量13.高级计时器TIM1:STM8的PWM输出功能实现呼吸灯14.STM8的ADC模数转换器15.嵌入式串行通信导论16.UART异步串行通信协议17.SPI同步串行通信协议18.I2C同步串行通信协议19.STM8的看门狗20.单片机的系统功耗控制/电源模式管理/AWU自动唤醒21.STM8的储存器流水灯原理
-
将开发板上的发光二极管的负极连接到主控芯片GPIO端口上(使用跳线帽),并连上限流电阻;发光二极管的阳极连接到一起形成公共端,最后将这个公共端经过接高电平(这称为共阳极结构,反之,将二极管的阴极连接到一起再接地就称为共阴极结构)
一般在开发板的电路上已经做好了这些,我们只需要直接使用或者用跳线连接端口和发光二极管即可 -
对于共阳极结构,当端口任一引脚输出低电平时,对应发光二极管会被点亮,输出高电平则对应的发光二极管熄灭,共阴极结构则相反
-
请看你所使用的开发板的原理图,根据电路结构不同,来决定点灯所需操作
-
要点:
- 通过编程控制GPIO输出,实现流水灯左移、右移等花样
- 通过让单片机空转,实现延时操作
代码实现
-
初始化函数
//首先,准备一个将所有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 }//原理:通过空操作来拖延时间,这种延时方法不太精确 }
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/untit1ed/p/18560231
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
请注意: 特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?