STM32——库函数版——RGB8x8全彩点阵程序

RGB全彩点阵模块程序

先显示一下效果

程序实现亮红,蓝,绿,紫,白,青,黄,七种颜色的爱心
一下是展示四种颜色
在这里插入图片描述

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);    //调用此函数实现亮七种颜色爱心的效果
			
			}		
		}		
	}

}

有问题或者建议的可以留言进行交流
有实现全彩亮的可以分享一下想法