51单片机【五】LED点阵屏

关于显示器的分辨率,像素,清晰度这些概念不再赘述

讲一下pitch这个比较陌生的概念:指的是两个像素点的圆心之间的距离,通常默认单位是毫米 例如:p10指的是间距10毫米的led点阵

51单片机【五】LED点阵屏_第1张图片

LED的P00-P07是直接接在处理器上但是因为处理器针脚有限所以需要下面的74HC595(处理器使用3个引脚经过这个芯片产生8个并行的信号等效于使用了8个引脚)

 

51单片机【五】LED点阵屏_第2张图片

J13如果跳线OE和GND HC595将无法工作也为没有电压 而跳线OE和VCC才可以工作

74HC595是一个移位寄存器74HC595是将串行信号转为并行信号 其中P34是处理器输入串行信号 P36是串行时钟 P35是工作时钟 然后经过这个芯片处理生成8个并行的信号 接在LED点阵的D0-D7上 

这里这个芯片还可以控制一排LED是通过将图中的J14跳线帽连接后 LED一端为高电压另一端为HC595输出的8个串行的高低电压将LED点亮

void Hc595SendByte(u8 dat)
{
	u8 i = 0, j = 0;

	SCK = 0;				// 将SCK置为初始状态
	RCK = 0;				// 将RCK置为初始状态

	for (i=0; i<8; i++)     //使用for循环将数字信号分8次发送出去也就是一个串行信号
	{
		SER = dat >> 7;
		dat <<= 1;

		SCK = 1;
		j++;			  	// 延时代码,等同于nop指令
		j++;				// 延时代码,等同于nop指令
		SCK = 0;	
	}

	RCK = 1;
	j++;					// 延时代码,等同于nop指令
	j++;					// 延时代码,等同于nop指令
}

LED点阵显示图像原理与数码管动态显示类似

首先选择出每个要点亮的LED像素点 然后反复循环刷新即可

链接:https://pan.baidu.com/s/1-RGR0v9WUH7LWmOaUTpSbQ 
提取码:pmw2 


这是字模提取软件 也就是帮你选择那些LED管需要去点亮

51单片机【五】LED点阵屏_第3张图片

注意的是:要管理员身份运行 
                  字模由光盘中:工具软件/88字模提取软件/LEDDOT V0.2.exe生成
                  注意取模软件菜单栏设置中,设置为:
                  字模显示方式:单行
                  字模提取方式:逐列
                  字模提取格式:C51格式

void main(void)
{
	MatrixDisplay(gZhu);		
}
void MatrixDisplay(u8 *zimo)
{
	u8 i = 0;

	while (1)
	{
		for(i=0;i<8;i++)
		{
			MATRIX_PORT = gLineCode[i];		  		// 位选
			Hc595SendByte(zimo[i]);		// 发送段选数据
			Hc595SendByte(0x00);  		// 消隐
		}	
	}
}


 

void Hc595SendByte(u8 dat)
{
	u8 i = 0, j = 0;

	SCK = 0;				// 将SCK置为初始状态
	RCK = 0;				// 将RCK置为初始状态

	for (i=0; i<8; i++)
	{
		SER = dat & (0x01);
		dat >>= 1;

		SCK = 1;
		j++;			  	// 延时代码,等同于nop指令
		j++;				// 延时代码,等同于nop指令
		SCK = 0;	
	}

	RCK = 1;
	j++;					// 延时代码,等同于nop指令
	j++;					// 延时代码,等同于nop指令
}

/*
// 由于取模软件只能选择横向纵向,但是不能选择纵向从上向下还是从下向上
// 实际测试取模软件的模式,适合先发LSB而不是MSB
void Hc595SendByte(u8 dat)
{
	u8 i = 0, j = 0;

	SCK = 0;				// 将SCK置为初始状态
	RCK = 0;				// 将RCK置为初始状态

	for (i=0; i<8; i++)
	{
		SER = dat >> 7;
		dat <<= 1;

		SCK = 1;
		j++;			  	// 延时代码,等同于nop指令
		j++;				// 延时代码,等同于nop指令
		SCK = 0;	
	}

这里和前面发送串行码的顺序不同 这个需要实际测试 因为这个顺序可能导致LED现实的字是反的

**********************************************************************
*                         头文件包含
**********************************************************************
*/
#include 
#include 
/*
**********************************************************************
*                         本地宏定义
**********************************************************************
*/
typedef unsigned char u8; 		// 重命名类型u8简化代码编写
typedef unsigned int u16;

#define MATRIX_PORT		P0		// 点阵LED负极端口

/*
**********************************************************************
*                         本地全局变量
**********************************************************************
*/
sbit SCK = P3^6; 			// SCK上升沿移位
sbit RCK = P3^5;			// RCK上升沿串行输出寄存器锁存
sbit SER = P3^4; 			// SER引脚送字节数据进去

// 点阵列选值,数组每个元素的值选中其中一列
u8 gLineCode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  

/* 字模
 * 字模由光盘中:工具软件/88字模提取软件/LEDDOT V0.2.exe生成
 * 注意取模软件菜单栏设置中,设置为:
 * 		字模显示方式:单行
 *		字模提取方式:逐列
 *		字模提取格式:C51格式
 */

u8 gZhu[] = {0x73,0xD6,0x58,0xFF,0x58,0x54,0x52,0x12};		// 汉字 朱
u8 gSi[]  = {0x0,0x4,0x1C,0x24,0x7E,0x4,0x0,0x0};			// 数字 4
u8 gK[]   = {0x0,0x0,0x7E,0x38,0x66,0x0,0x0,0x0};			// 字模 K

/*
**********************************************************************
*                         函数原型声明
**********************************************************************
*/
void Hc595SendByte(u8 dat);
void MatrixDisplay(u8 *zimo);

/*********************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 参数列表       : 无
* 函数输出    	 : 无
*********************************************************************/
void main(void)
{
	MatrixDisplay(gZhu);		
}


/*********************************************************************
* 函 数 名       : MatrixDisplay
* 函数功能		 : 循环刷新显示字模到点阵上
* 参数列表       : zimo - 待显示的字模数组
* 函数输出    	 : 无
*********************************************************************/
void MatrixDisplay(u8 *zimo)
{
	u8 i = 0;

	while (1)
	{
		for(i=0;i<8;i++)
		{
			MATRIX_PORT = gLineCode[i];		  		// 位选
			Hc595SendByte(zimo[i]);		// 发送段选数据
			Hc595SendByte(0x00);  		// 消隐
		}	
	}
}


/*********************************************************************
* 函 数 名       : Hc595SendByte
* 函数功能		 : 通过74HC595串行移位发送一个字节出去
* 参数列表       : dat - 待发送的字节数据
* 函数输出    	 : 无
*********************************************************************/
void Hc595SendByte(u8 dat)
{
	u8 i = 0, j = 0;

	SCK = 0;				// 将SCK置为初始状态
	RCK = 0;				// 将RCK置为初始状态

	for (i=0; i<8; i++)
	{
		SER = dat & (0x01);
		dat >>= 1;

		SCK = 1;
		j++;			  	// 延时代码,等同于nop指令
		j++;				// 延时代码,等同于nop指令
		SCK = 0;	
	}

	RCK = 1;
	j++;					// 延时代码,等同于nop指令
	j++;					// 延时代码,等同于nop指令
}

/*
// 由于取模软件只能选择横向纵向,但是不能选择纵向从上向下还是从下向上
// 实际测试取模软件的模式,适合先发LSB而不是MSB
void Hc595SendByte(u8 dat)
{
	u8 i = 0, j = 0;

	SCK = 0;				// 将SCK置为初始状态
	RCK = 0;				// 将RCK置为初始状态

	for (i=0; i<8; i++)
	{
		SER = dat >> 7;
		dat <<= 1;

		SCK = 1;
		j++;			  	// 延时代码,等同于nop指令
		j++;				// 延时代码,等同于nop指令
		SCK = 0;	
	}

	RCK = 1;
	j++;					// 延时代码,等同于nop指令
	j++;					// 延时代码,等同于nop指令
}
*/

 

你可能感兴趣的:(51单片机学习之路,玩转嵌入式)