1.設(shè)計要求:使用stm32f103zet6精英開發(fā)板? 采用SM16306SJ驅(qū)動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); //根據(jù)設(shè)定參數(shù)初始化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;//第一路數(shù)據(jù)
CLK_L;//時鐘
LE_L;
OE_H;//使能
for (j = 0; j < 16; j++)
{
//先準(zhǔn)備好數(shù)據(jù)
if (data &0x8000)
{
SDI_H; //數(shù)據(jù)1
}
else
{
SDI_L; //數(shù)據(jù)0
}
CLK_H;
data = (data << 1);//數(shù)據(jù)左移一位
CLK_L;
}
LE_H;//開始移位
LE_L;//拉低移位
OE_L;//使能輸出
}
main函數(shù)
int main(void)
{
MBI5020_Init();
whlie(1)
{
MBI5020_Driver(0x00FF);
}
}
4.實物效果圖
備注:1 硬件上有一個LED燈壞了,所以才亮了7個LED燈
???????????2 一個SM16306SJ最多可以驅(qū)動16個LED燈文章來源:http://www.zghlxwxcb.cn/news/detail-854730.html
???????????3 SM16306SJ跟MBI5020程序通用文章來源地址http://www.zghlxwxcb.cn/news/detail-854730.html
到了這里,關(guān)于基于STM32F103ZET6單片機驅(qū)動SM16306SJ控制8個LED燈的系統(tǒng)設(shè)計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!