作为一名爱坤人士当然想要通过现有及网上的资源来体现我“爱坤”的身份,下面就是整理的相关笔记,以及如何来实现坤坤代码。

一、硬件资源

1、74HC595 模块

74HC595是一种8位串行输入、并行输出的移位寄存器,常用于拓展单片机的IO口。595 是告诉的硅结构的 CMOS 器件,兼容低电压 TTL 电路,遵守 JEDEC 标准。 595 是具有 8 位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。 数据在 SCHcp 的上升沿输入,在 STcp 的上升沿进入的存储寄存器中去。 如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入(Ds) ,和一个串行输出(Q7非), 和一个异步的低电平复位,存储寄存器有一个并行 8 位的,具备三态的总线输出,当使能 OE 时(为低电平),存储寄存器的数据输出到总线。

主要有三个引脚:

DS(串行数据输入):用于输入串行数据。
SH_CP(移位寄存器时钟输入):在时钟上升沿时,数据移入移位寄存器。
ST_CP(存储寄存器时钟输入):在时钟上升沿时,移位寄存器中的数据被锁存到输出寄存器。

74HC595模块的使用步骤:
初始化:将SH_CP和ST_CP引脚初始化为低电平。
发送数据:通过DS引脚逐位发送数据,每发送一位后,给SH_CP一个上升沿脉冲,将数据移入移位寄存器。
锁存数据:当所有数据位都移入移位寄存器后,给ST_CP一个上升沿脉冲,将数据锁存到输出寄存器。

2、8X8LED 点阵模块

8*8 点阵共由 64 个发光二极管组成, 且每个发光二极管是放置在行线和列线的交叉点上, 当对应的某一行置 1 电平, 某一列置 0 电平, 则相应的二极管就亮;如要将第一个点点亮, 则 1 脚接高电平 a 脚接低电平, 则第一个点就亮了; 如果要将第一行点亮, 则第 1 脚要接高电平,  (a、 b、 c、 d、 e、 f、 g、 h ) 这些引脚接低电平, 那么第一行就会点亮; 如要将第一列点亮, 则第 a 脚接低电平,而(1、 2、 3、 4、 5、 6、 7、 8) 接高电平, 那么第一列就会点亮。 

3、看两个模块 

从上图中可以看出, 该电路是集成的, 电路中的 RE57~RE64 是 LED 点阵的第1-8 列, 通过 P0 IO 口控制。 RE8~RE64 是 LED 点阵的第 1-8 行, 通过 74HC595进行控制。 DPa-DPh 是 LED 点阵的 8 行控制管脚, 通过动态数码管模块中的74HC245 进行驱动, 这些行的引出端子都是 LED 的阴极。

根据前面介绍我们知道, 8*8LED 点阵共有 64 个 LED, 如果仅使用单片机 IO口来驱动可能效果不是很好, 为了能够有效驱动 8*8LED 点阵且最大减少 IO 口的占用, 我们使用前面介绍的 74HC595 模块。 74HC595 模块电路在前面已做介绍,通过较少的 IO 口即可控制较为复杂的电路。

由于 74HC595 模块电路是集成的, 所以使用单片机 P3^4~P3^6 管脚即可, 8X8LED 点阵模块电路也是集成的, 所以列控制使用单片机 P0 管脚控制即可。

二、实现程序

1、由于我并不会凭着感觉去写坤坤代码,但好在CSDN这个伟大的平台给了我Ctrl CV的机会。(别人是用字模提取软件去生成的坤坤点阵屏跳舞图案 V2.1 CopyLeft By Horse2000)会生成点阵屏的16进制代码,将生成的代码放在数组里面,就可以实现坤坤跳舞的姿态!

程序生成的坤坤跳舞数据:

0x00,0x00,0x1B,0x3C,0xF8,0xFC,0x3B,0x00,0x00,0x1B,0x3C,0xFC,0xFF,0x3A,0x00,0x00,
0x00,0x00,0x0B,0x1C,0x7C,0x7E,0x1B,0x00,0x00,0x1B,0x3C,0xFC,0xFF,0x3A,0x00,0x00,

main.c

#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
 
signed char code Animation[]=
{
	0x00,0x00,0x1B,0x3C,0xF8,0xFC,0x3B,0x00,0x00,0x1B,0x3C,0xFC,0xFF,0x3A,0x00,0x00,
	0x00,0x00,0x0B,0x1C,0x7C,0x7E,0x1B,0x00,0x00,0x1B,0x3C,0xFC,0xFF,0x3A,0x00,0x00,
    //铁山靠
};
 
void main()
{
	unsigned char i,offset=0,Count=0;
	
  MatrixLED_Init();
	while(1)
	{
		for(i = 0;i<8;i++)
		{
			MatrixLED_ShowColumn(i,Animation[i+offset]);}
			Count++;
			if(Count>20)
			{
				Count=0;
				offset+=8;
				if(offset>24)
					offset = 0;
			}
		}
}

2、其他模块

Delay.c      【延时函数可通过STC-ISP直接生成】

{
	unsigned char i, j;
  while(xms--)
	{	
		i = 2;
		j = 239;
		do
		{
				while (--j);
		} while (--i);
	}
}

MatrixLED.c    

#include <REGX52.H>
#include "Delay.h"
 
 
sbit RCK = P3^5;
sbit SCK = P3^6;
sbit SER = P3^4;
 
#define MATRIX_LED_PORT    P0
/**
	* @brief  74HC595写入一个字节
	* @param  需要写入的字节
	* @retval 
  */
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER = Byte&(0x80>>i);
		SCK = 1;
		SCK = 0;
	}
	RCK = 1;
	RCK = 0;
}
/**
	* @brief    LED点阵屏显示一列数据
	* @param    Column选择的列,范围:0~7,0在最左边
	* @param	Data选择列显示的数据,高位在上,1为亮,0为灭
	* @retval  无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);
	MATRIX_LED_PORT = ~(0x80>>Column);
	Delay(1);
	MATRIX_LED_PORT = 0xff;
}
 
void MatrixLED_Init()
{
	SCK = 0;
	RCK = 0;
}

3、其他模块化的程序

MatrixLED.h

#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__

	void _74HC595_WriteByte(unsigned char Byte);
	void MatrixLED_ShowColumn(unsigned char Column,Data);
	void MatrixLED_Init();
#endif

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

三、成品展示

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐