1.设计要求:使用stm32f103zet6精英开发板 采用SM16306SJ驱动8个LED灯。
2.原理图
3.代码
.H文件
#ifndef __MBI5020_H
#define __MBI5020_H
#include "sys.h"
#define OE_H GPIO_SetBits(GPIOD, GPIO_Pin_2)
#define OE_L GPIO_ResetBits(GPIOD,GPIO_Pin_2)
#define LE_H GPIO_SetBits(GPIOB, GPIO_Pin_5)
#define LE_L GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define CLK_H GPIO_SetBits(GPIOB, GPIO_Pin_4)
#define CLK_L GPIO_ResetBits(GPIOB,GPIO_Pin_4)
#define SDI_H GPIO_SetBits(GPIOB, GPIO_Pin_3)
#define SDI_L GPIO_ResetBits(GPIOB,GPIO_Pin_3)
void MBI5020_Init(void);//初始化
void MBI5020_Driver(uint16_t data);
#endif
.C文件
#include "MBI5020.h"
void MBI5020_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //CLK 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.4
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //SDI 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LE
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //OE
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
void MBI5020_Driver(uint16_t data)
{
uint8_t j;
//第一组
SDI_L;//第一路数据
CLK_L;//时钟
LE_L;
OE_H;//使能
for (j = 0; j < 16; j++)
{
//先准备好数据
if (data &0x8000)
{
SDI_H; //数据1
}
else
{
SDI_L; //数据0
}
CLK_H;
data = (data << 1);//数据左移一位
CLK_L;
}
LE_H;//开始移位
LE_L;//拉低移位
OE_L;//使能输出
}
main函数
int main(void)
{
MBI5020_Init();
whlie(1)
{
MBI5020_Driver(0x00FF);
}
}
4.实物效果图
备注:1 硬件上有一个LED灯坏了,所以才亮了7个LED灯
2 一个SM16306SJ最多可以驱动16个LED灯文章来源:https://www.toymoban.com/news/detail-854730.html
3 SM16306SJ跟MBI5020程序通用文章来源地址https://www.toymoban.com/news/detail-854730.html
到了这里,关于基于STM32F103ZET6单片机驱动SM16306SJ控制8个LED灯的系统设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!