STM32——库函数版——RGB8x8全彩点阵程序
RGB全彩点阵模块程序
先显示一下效果
程序实现亮红,蓝,绿,紫,白,青,黄,七种颜色的爱心
一下是展示四种颜色
RGB全彩点阵模块原理图如下:
RGB8x8点阵显示原理
每一个灯都相当于一个独立的点,通过行列进行控制灯的位置,从而让灯进行亮色,通过595移位寄存器进行控制要亮的灯(74HC595是串入并出带有锁存功能移位寄存器.)。
根据手册可知:
1.数据在 SCK 的上升沿输入,在 RCK 的上升沿
进入的存储寄存器中去。
2.SER是一个串行移位输入寄存器。
3.存储寄存器有一个并行 8 位的,具备三态的总线输出,
当使能时 G(为低电平),存储寄存器的数据输出到总线。
通俗的说就是:
1.在SRCK引脚出现上升沿时,从SER引脚输入一位数据,重复八次。(因为是8x8点阵所以要传输8位数据)
2.在RCK引脚出现上升沿时,将之前输入的8为数据分别从Q0-Q7引脚输出
3.要注意区分那个RCK引脚是控制行的,那个是控制列的
我的模块是RCK_A是控制行的,RCK_R,RCK_G,RCK_B是控制列的分别亮红,绿,蓝等颜色
SRCK是控制数据的存储的
SER是控制移位的
本模块使用SM74HC595D芯片进行驱动
有需要SM74HC595D使用手册的可留言邮箱发你们
接下来就是程序了
完整程序如下:
RGB全彩点阵引脚配置程序
led.c
#include "led.h"
/*2020.11.17
* RGB全彩点阵模块
*/
//RGB点阵引脚初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE); //使能PA端口时钟
GPIO_InitStructure.GPIO_Pin = RCK_A_PIN|RCK_R_PIN|RCK_G_PIN|RCK_B_PIN|SRCK_Pin|SER_Pin; //引脚配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化端口
GPIO_ResetBits(GPIOA, RCK_A_PIN|RCK_R_PIN|RCK_G_PIN|RCK_B_PIN|SRCK_Pin|SER_Pin); //置0
}
led.h
#include "sys.h"
#define RCK_A_PIN GPIO_Pin_0 //控制RCK_A,控制行
#define RCK_R_PIN GPIO_Pin_1 //控制RCK_R,控制列亮红灯
#define RCK_G_PIN GPIO_Pin_2 //控制RCK_G,控制列亮绿灯
#define RCK_B_PIN GPIO_Pin_3 //控制RCK_B,控制列亮蓝灯
#define SRCK_Pin GPIO_Pin_4 //控制SRCK
#define SER_Pin GPIO_Pin_5 //控制SER
//RGB点阵引脚初始化
void LED_Init(void);
595驱动程序
drive.c
#include "drive.h"
#include "led.h"
#include "delay.h"
/*2020.11.17
* 74CH595芯片驱动程序
*/
//595RCK_A驱动函数
void Display_HC595_A(uint8_t data)
{
uint8_t i;
for(i = 0;i< 8;i++)
{
if(((data>>7)&1) == 1) //检测最高位是否为1
{
GPIO_SetBits(GPIOA,SER_Pin); //置1
}
else
{
GPIO_ResetBits(GPIOA,SER_Pin); //置0
}
data<<=1;
/*当SRCLK出现上升沿时,从SER引脚输入一位数据,重复8次*/
GPIO_SetBits(GPIOA,SRCK_Pin); //置1
GPIO_ResetBits(GPIOA,SRCK_Pin); //置0
}
/*当RCK_A出现上升沿时,将输入的8位数据输出*/
GPIO_SetBits(GPIOA,RCK_A_PIN); //置1
GPIO_ResetBits(GPIOA,RCK_A_PIN); //置0
}
//595RCK_R红色驱动函数
void Display_HC595_R(uint8_t data)
{
uint8_t i;
for(i = 0;i< 8;i++)
{
if(((data>>7)&1) == 1) //检测最高位是否为1
{
GPIO_SetBits(GPIOA,SER_Pin); //置1
}
else
{
GPIO_ResetBits(GPIOA,SER_Pin); //置0
}
data<<=1;
/*当SRCLK出现上升沿时,从SER引脚输入一位数据,重复8次*/
GPIO_SetBits(GPIOA,SRCK_Pin); //置1
GPIO_ResetBits(GPIOA,SRCK_Pin); //置0
}
/*当RCK_R出现上升沿时,将输入的8位数据输出*/
GPIO_SetBits(GPIOA,RCK_R_PIN); //置1
GPIO_ResetBits(GPIOA,RCK_R_PIN); //置0
}
//595RCK_G绿色驱动函数
void Display_HC595_G(uint8_t data)
{
uint8_t i;
for(i = 0;i< 8;i++)
{
if(((data>>7)&1) == 1) //检测最高位是否为1
{
GPIO_SetBits(GPIOA,SER_Pin); //置1
}
else
{
GPIO_ResetBits(GPIOA,SER_Pin); //置0
}
data<<=1;
/*当SRCLK出现上升沿时,从SER引脚输入一位数据,重复8次*/
GPIO_SetBits(GPIOA,SRCK_Pin); //置1
GPIO_ResetBits(GPIOA,SRCK_Pin); //置0
}
/*当RCK_R出现上升沿时,将输入的8位数据输出*/
GPIO_SetBits(GPIOA,RCK_G_PIN); //置1
GPIO_ResetBits(GPIOA,RCK_G_PIN); //置0
}
//595RCK_B蓝色驱动函数
void Display_HC595_B(uint8_t data)
{
uint8_t i;
for(i = 0;i< 8;i++)
{
if(((data>>7)&1) == 1) //检测最高位是否为1
{
GPIO_SetBits(GPIOA,SER_Pin); //置1
}
else
{
GPIO_ResetBits(GPIOA,SER_Pin); //置0
}
data<<=1;
/*当SRCLK出现上升沿时,从SER引脚输入一位数据,重复8次*/
GPIO_SetBits(GPIOA,SRCK_Pin); //置1
GPIO_ResetBits(GPIOA,SRCK_Pin); //置0
}
/*当RCK_R出现上升沿时,将输入的8位数据输出*/
GPIO_SetBits(GPIOA,RCK_B_PIN); //置1
GPIO_ResetBits(GPIOA,RCK_B_PIN); //置0
}
/***********************************************
* 函数名 :595驱动RGB总函数
* 函数功能 :
* 输入参数 :
************************************************/
void HC595_RCK_RGB(uint8_t row,uint8_t red ,uint8_t green,uint8_t blue)
{
uint8_t i;
for(i = 0;i< 8;i++)
{
if(((row>>7)&1) == 1) //检测最高位是否为1
{
GPIO_SetBits(GPIOA,SER_Pin); //置1
}
else
{
GPIO_ResetBits(GPIOA,SER_Pin); //置0
}
row<<=1;
/*当SRCLK出现上升沿时,从SER引脚输入一位数据,重复8次*/
GPIO_SetBits(GPIOA,SRCK_Pin); //置1
GPIO_ResetBits(GPIOA,SRCK_Pin); //置0
}
/*当RCK_A出现上升沿时,将输入的8位数据输出*/
GPIO_SetBits(GPIOA,RCK_A_PIN); //置1
GPIO_ResetBits(GPIOA,RCK_A_PIN); //置0
/******************控制红灯的595驱动************************/
for(i = 0;i< 8;i++)
{
if(((red>>7)&1) == 1) //检测最高位是否为1
{
GPIO_SetBits(GPIOA,SER_Pin); //置1
}
else
{
GPIO_ResetBits(GPIOA,SER_Pin); //置0
}
red<<=1;
/*当SRCLK出现上升沿时,从SER引脚输入一位数据,重复8次*/
GPIO_SetBits(GPIOA,SRCK_Pin); //置1
GPIO_ResetBits(GPIOA,SRCK_Pin); //置0
}
/*当RCK_R出现上升沿时,将输入的8位数据输出*/
GPIO_SetBits(GPIOA,RCK_R_PIN); //置1
GPIO_ResetBits(GPIOA,RCK_R_PIN); //置0
/******************控制绿灯的595驱动************************/
for(i = 0;i< 8;i++)
{
if(((green>>7)&1) == 1) //检测最高位是否为1
{
GPIO_SetBits(GPIOA,SER_Pin); //置1
}
else
{
GPIO_ResetBits(GPIOA,SER_Pin); //置0
}
green<<=1;
/*当SRCLK出现上升沿时,从SER引脚输入一位数据,重复8次*/
GPIO_SetBits(GPIOA,SRCK_Pin); //置1
GPIO_ResetBits(GPIOA,SRCK_Pin); //置0
}
/*当RCK_R出现上升沿时,将输入的8位数据输出*/
GPIO_SetBits(GPIOA,RCK_G_PIN); //置1
GPIO_ResetBits(GPIOA,RCK_G_PIN); //置0
/******************控制蓝灯的595驱动************************/
for(i = 0;i< 8;i++)
{
if(((blue>>7)&1) == 1) //检测最高位是否为1
{
GPIO_SetBits(GPIOA,SER_Pin); //置1
}
else
{
GPIO_ResetBits(GPIOA,SER_Pin); //置0
}
blue<<=1;
/*当SRCLK出现上升沿时,从SER引脚输入一位数据,重复8次*/
GPIO_SetBits(GPIOA,SRCK_Pin); //置1
GPIO_ResetBits(GPIOA,SRCK_Pin); //置0
}
/*当RCK_R出现上升沿时,将输入的8位数据输出*/
GPIO_SetBits(GPIOA,RCK_B_PIN); //置1
GPIO_ResetBits(GPIOA,RCK_B_PIN); //置0
}
uint8_t code_TableH[] ={0xFF,0x99,0x66,0x7E,0xBD,0xDB,0xE7,0xFF};
//数组内容通过点阵取模得来
//uint8_t code_TableH[] ={0x16,0xD5,0x13,0x60,0x13,0xD5,0x92,0xD7};
//显示特效字符
void Display_HC595_Led(uint8_t data)
{
uint8_t i,j;
switch(data)
{
case 0: //红色
for(i=0;i<8;i++)
{
for(j=0;j<10;j++) //延时显示消隐,消隐非常重要不能省略
{
HC595_RCK_RGB(0x01<<i,code_TableH[i],0xff,0xff);
}
HC595_RCK_RGB(0x00,0xff,0xff,0xff);
}
break;
case 1: //绿色
for(i=0;i<8;i++)
{
for(j=0;j<10;j++) //延时显示消隐
{
HC595_RCK_RGB(0x01<<i,0xff,code_TableH[i],0xff);
}
HC595_RCK_RGB(0x00,0xff,0xff,0xff);
}
break;
case 2: //蓝色
for(i=0;i<8;i++)
{
for(j=0;j<10;j++) //延时显示消隐
{
HC595_RCK_RGB(0x01<<i,0xff,0xff,code_TableH[i]);
}
HC595_RCK_RGB(0x00,0xff,0xff,0xff);
}
break;
case 3: //紫色,红蓝结合
for(i=0;i<8;i++)
{
for(j=0;j<10;j++) //延时显示消隐
{
HC595_RCK_RGB(0x01<<i,code_TableH[i],0xff,code_TableH[i]);
}
HC595_RCK_RGB(0x00,0xff,0xff,0xff);
}
break;
case 4: //黄色,红绿结合
for(i=0;i<8;i++)
{
for(j=0;j<10;j++) //延时显示消隐
{
HC595_RCK_RGB(0x01<<i,code_TableH[i],code_TableH[i],0xff);
}
HC595_RCK_RGB(0x00,0xff,0xff,0xff);
}
break;
case 5: //青色,绿蓝结合
for(i=0;i<8;i++)
{
for(j=0;j<10;j++) //延时显示消隐
{
HC595_RCK_RGB(0x01<<i,0xff,code_TableH[i],code_TableH[i]);
}
HC595_RCK_RGB(0x00,0xff,0xff,0xff);
}
break;
case 6: //白色,红绿蓝结合
for(i=0;i<8;i++)
{
for(j=0;j<10;j++) //延时显示消隐
{
HC595_RCK_RGB(0x01<<i,code_TableH[i],code_TableH[i],code_TableH[i]);
}
HC595_RCK_RGB(0x00,0xff,0xff,0xff);
}
break;
}
}
drive.h
#include "sys.h"
//595RCK_A驱动函数
void Display_HC595_A(uint8_t data);
//595RCK_R红色驱动函数
void Display_HC595_R(uint8_t data);
//595RCK_G绿色驱动函数
void Display_HC595_G(uint8_t data);
//595RCK_B蓝色驱动函数
void Display_HC595_B(uint8_t data);
//显示任意颜色任意字符函数
void Display_HC595_Led(uint8_t data);
//595驱动RGB函数
void HC595_RCK_RGB(uint8_t row,uint8_t red ,uint8_t green,uint8_t blue);
主函数调用
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "drive.h"
/*2020.11.17*/
int main(void)
{
uint8_t i,j;
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //系统时钟设置PLL作为系统时钟
delay_init(); //初始化延时函数
LED_Init();
while(1)
{
/********************展示区*************************************/
for(i=0;i<7;i++)
{
for(j=150;j>0;j--)
{
Display_HC595_Led(i); //调用此函数实现亮七种颜色爱心的效果
}
}
}
}
有问题或者建议的可以留言进行交流
有实现全彩亮的可以分享一下想法