GPIO输出应用:流水灯
流水灯原理
-
将开发板上的发光二极管的负极连接到主控芯片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/artlessist/p/18560231
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外
浙公网安备 33010602011771号