先上实物图:

一.LED显示屏的扫描方式

   LED显示屏的扫描方式有静态、1/2、1/4、1/8、1/16几种。

        这些扫描方式具体是什么意思呢?我们以1/16扫描方式为例来说明。因为LED显示屏是逐行刷新显示的,所以在任意时刻我们只能控制其任意一行的显示,每次刷新显示一行,16行为一个扫描周期,这就是1/16扫描方式。当然了,一个扫描周期的时间必须要小于人眼视觉暂留的时间(约0.05秒到0.2秒),否则,人眼会观察到LED显示屏所呈现的画面出现闪烁。

二.LED显示屏的接口形式

  LED显示屏的接口形式有04接口、08接口、12接口、HUB75接口等,这里只用到08接口

我们可以看到在实物图中有左右两个08接口,左边是输入接口,右边是输出接口(用于级联)。

        每块单元板都提供了两个接口,一个输入一个输出。多块单元板之间就是串联关系,上一块板子的输出对应连接在下一块板的输入即可。这样一连串单元板的时钟信号共用、数据信号串接,调整每行传输的数据长度,即可实现对不同数量单元板的驱动过程。

  08接口的管脚定义如图1所示。

         08 接口屏多用于室内屏,亮度低,间距小适合近距离观看,08 接口采用十六分之一扫描方式驱动。

        08 接口说明:

D、C、B、A:行线选择,一共组成16行; DCBA 0000~1111 分别代表0~15行;

R1: 红色LED数据串行数据输入口,如果屏只有16行,则只需要用到R1,如果超过16行,比如32行,则R1输入的是上半部分16行数据,下半部分16行数据,需要R2输入

R2: 红色LED数据串行数据输入口,如果屏只有16行,这个脚用不到,超过16行,比如32行,则是下半部分16行数据的输入

G1: 绿色数据上半部分,绿色LED数据串行数据输入口,如果屏只有16行,则只需要用到G1,如果超过16行,比如32行,则G1输入的是上半部分16行数据,下半部分16行数据,需要G2输入

G2: 绿色数据下半部分,绿色LED数据串行数据输入口,如果屏只有16行,这个脚用不到,超过16行,比如32行,则是下半部分16行数据的输入,

L: LAT       74HC595芯片的锁存脚,数据锁存控制口

S: SCK     74HC595芯片的时钟脉冲脚,移位芯片数据移位时钟

OE: 低电平使能LED显示, 74HC138芯片使能脚

N:  GND 

        总结:D、C、B、A、OE最总接到74HC138芯片;R1、R2、G1、G2、L、S引脚最总接到74HC595芯片。

        中间是电源接口,接5V电源,左边VCC,右边GND;左边是输入接口,右边是输出接口,用于级联,接下一块的输入接口,可实现两块或多块屏幕拼在一起。

三.LED显示屏的行驱动

         管脚A、B、C、D表示行信号,行线选择,一共组成16行。那么,它们是如何来控制行信号,从而实现1/16扫描方式的。其实很简单,这是通过两个3-8译码器74HC138芯片来实现,通过这两个芯片可以实现如下的功能:

   当管脚D、C、B、A的输出分别为0000时,LED显示屏的第一行被选中;

        当管脚D、C、B、A的输出分别为0001时,LED显示屏的第二行被选中;

        当管脚D、C、B、A的输出分别为0010时,LED显示屏的第三行被选中;

  ......

  当管脚D、C、B、A的输出分别为1111时,LED显示屏的第十六行被选中。 

        而08 接口屏大小为 32*64 即列 64 列,行 32 行,ABCD 引脚实现行选信号,因为是十六分之一扫描方式,所以选择一次行选信号则会选中单元板上半部分一行和下半部分一行共两行,D=0;C=0;B=0;A=0;则会选中 Y1,Y16 两行,D=0;C=0;B=0;A=1;则会选中 Y2,Y17两行。依此类推,扫描 16 次就选中了整块单元板的行数据。 

        通过对ABC三位二进制的译码,在Y0-Y7中对应的端口输出,低电平有效。其中E1#、E2#和E3为使能端,给相应的电平则使能芯片。利用使能端可以实现38译码器的拓展,这里就使用了这样的拓展方法,再加一D管脚接第一片的E1#,同时加一非门接第二片的E1#,这样当D管脚给高电平时使能第二片,低电平时使能第一片,就实现了4-16译码器。

        代码展示:

/**
 * @brief       行选
 * @param       Row: 行选信号(0-15),A,B,C,D行选,4位,2的4次方,总16行(0-15)	
 * @explain     //当Row等于0(0000)时,A=0;B=0;C=0;D=0;
				//当Row等于1(0001)时,A=1;B=0;C=0;D=0;
				//.......
				//当Row等于15(1111)时,A=1;B=1;C=1;D=1;
 * @retval      无
 */
void SendRow(u8 Row)		
{
	A = (Row >> 0) & 0x01;
	B = (Row >> 1) & 0x01;
	C = (Row >> 2) & 0x01;
	D = (Row >> 3) & 0x01;
}

四.LED显示屏的列驱动

        LED显示屏的列驱动使用了74HC595芯片,该芯片是一个串行输入,并行输出设备。其内部包括一个8位移位寄存器、一个存储器以及三态输出门电路,其中移位寄存器和存储器都有相互独立的时钟,每当移位寄存器输入时钟SHCP上升沿来临之时,数据被移出。

        对于64*32的LED显示屏来说,因为其总共有64列,所以通过对8个74HC595芯片进行级联,即可将其扩展为64位串行输入,64位并行输出,从而实现对64列信号进行控制。

        08接口中的管脚R1、R2、G1、G2就是用来输入64位串行数据的。其中,R1、G1分别用来控制上半屏(16行)的红、绿信号;R2、G2分别用来控制下半屏(16行)的红绿信号。因此,对于64*32的双色LED显示屏来说,总共需要使用32个74HC595芯片。

        显然,当红绿信号同时使能时(列信号低电平使能),就可以控制LED显示屏显示出黄色来了。

74HC595的最重要的功能就是:串行输入,并行输出。其次,74HC595里面有2个8位寄存器:移位寄存器、存储寄存器。74HC595的数据来源只有一个口,一次只能输入一个位,每来一个SCK信号,移位一次,那么连续输入8次,就可以积攒为一个字节了。配合LED08_Refresh_Gram()函数,总共移位64次,占满存储寄存器,然后LAT引脚高低电平变化,一次输出全部数据。

/**
 * @brief       写入红数据
 * @param       R1,R2: R1(上半屏),R2(下半屏)	
 * @explain     向一个小点阵屏写入8位红数据
 * @retval      无
 */
void SendDateR(u8 DataR1,u8 DataR2)
{
	u8 i;
	for(i = 0; i < 8; i++)//移位8次(一个小点阵屏,8个点)
	{
		R1=DataR1 & 0x01;   //从最低位开始写入
		R2=DataR2 & 0x01;
		CLK = 0;						
		CLK = 1;			//每来一个时钟脉冲,写入一次
		DataR1 >>= 1;		//右移一次
		DataR2 >>= 1;		
	}
}

五.LED显示屏的芯片介绍

74HC245

        74HC245芯片是一种双向缓冲器,兼容TTL器件引脚的高速CMOS总线收发器,典型的CMOS型三态缓冲门电路,八路信号收发器, 主要用于实现两个总线之间的数据传输。由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。主要应用于大屏显示,以及其它的消费类电子产品中增加驱动。

引脚功能介绍:

  • DIR(即图中AB/BA引脚): 方向引脚,控制数据的传输方向。当DIR引脚为高电平时,数据从A端传输到B端;当DIR引脚为低电平时,数据从B端传输到A端。
  • A1-A8:数据传输引脚
  • B1-B8:数据传输引脚
  • OE(图中CE引脚)高电平时,输出端口处于失能状态;OE为低电平时,输出端口处于使能状态。

详细可看:嵌入式硬件入门——74HC245三态收发器(方向可控,提供驱动)

74HC138芯片(38译码器)

        74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。

        74HC138是一种译码器,译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义“翻译”出来的过程叫做译码,实现译码操作的电路称为译码器。

        74HC138的功能:3位二进制(A0,A1和A2),译码成8种输出状态,并且一共有8个输出I/O,这8位输出的特点是:互斥(同时只有一位有效)、低有效(低电平表示有效,表示选中)。简单来说,74HC138实现了用3根线选择8根线(8选1)的功能。

        管脚主要分为:输入(A0、A1和A2)、输出(Y0-Y7)、使能(E1-E3)、电源(VDD)和(GND)。

真值表: 

详细可看:嵌入式硬件入门——74HC138译码器(三个IO实现8选1)

74HC595

        74HC595和74hc164一样是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的io口资源,用3个io就可以控制8个数码管的引脚,他还具有一定的驱动能力,可以免掉三极管等放大电路,所以这块芯片是驱动数码管的神器.应用非常广泛。
详细可看:74HC595移位寄存器

HC595级联原理及实例

管脚说明:

APM4953双P沟道MOSFET

内部电路如下图:


内部包括两个独立的、P沟道金属氧化物场效应管。它有超低的导通电阻RDS(ON),适合用LED显示屏,LED显示器驱动,也可用来做负载开关或PWM开关。

特点:耐用性和可靠性极强,耐高温,低稳等恶劣工作环境。

应用领域:LED显示屏,LED显示器等,负载开关或者PWM开关。

常见IC简单汇总

        74HC245的作用:信号功率放大,双向3态数据缓冲器(不带锁存),就是给低输出能力的芯片提供高带载能力.

        74HC138的作用:八位二进制译十进制译码器

        74HC595的作用:列驱动管,LED驱动芯片,8位移位锁存器(主用室内单元板)

        4953的作用:行驱动管,功率管

六.LED显示屏的部分代码展示

#include "led08.h"
#include "oledfont.h"
#include "zimo.h"
#define OE  PCout(5) //点阵屏片选信号
#define R1  PCout(6) //红色数据1
#define R2  PCout(7) //红色数据2
#define A   PCout(8)//行选
#define B   PCout(9)//行选
#define C   PCout(10)//行选
#define D   PCout(11)//行选
#define G1  PCout(12)//绿色数据1
#define G2  PCout(13)//绿色数据2
#define LAT PCout(14)//595锁存信号
#define SCK PCout(15)//595时钟信号
u8 LED08_GRAM[32][8];   //定义缓存数组,无符号8位整型,每行8个字节,一个字节8位
/**
 * @brief       GPIO初始化
 * @retval      无
 */
void LED08_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitLATucture;
	__HAL_RCC_GPIOC_SCK_ENABLE();
	GPIO_InitLATucture.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;	
	GPIO_InitLATucture.Mode = GPIO_MODE_OUTPUT_PP; 		 //推挽输出
	GPIO_InitLATucture.Speed = GPIO_SPEED_FREQ_HIGH;	 //IO口速度为高
	HAL_GPIO_Init(GPIOC, &GPIO_InitLATucture); 			 //GPIOC
}

/**
 * @brief       刷新显示
 * @param       color:颜色,0红,1绿, 2黄	
 * @explain     将LED08_GRAM数组内数据显示
 * @retval      无
 */
void LED08_Refresh_Gram(void)
{
	u8 h,l;	
	for(h=0;h<16;h++)  //半屏16行
	{  
		for(l=0;l<8;l++)
		{
			SendDateR(LED08_GRAM[h][l],LED08_GRAM[h+16][l]); //16行,第一个显示上半屏,第二个再加16显示下半屏
		}
		OE=1;	      //关显示屏片选
		LAT=1;        //输出锁存
		LAT=0;	      //输出锁存,高低电平变化时将数据存在锁存器
		SendRow(h);   //16行地址
		OE=0;         //开显示屏片选
	}
}

/**
 * @brief       行选
 * @param       Row: 行选信号(0-15),A,B,C,D行选,4位,2的4次方,总16行(0-15)	
 * @explain     //当Row等于0(0000)时,A=0;B=0;C=0;D=0;
				//当Row等于1(0001)时,A=1;B=0;C=0;D=0;
				//.......
				//当Row等于15(1111)时,A=1;B=1;C=1;D=1;
 * @retval      无
 */
void SendRow(u8 Row)		
{
	A = (Row >> 0) & 0x01;
	B = (Row >> 1) & 0x01;
	C = (Row >> 2) & 0x01;
	D = (Row >> 3) & 0x01;
}

/**
 * @brief       写入红数据
 * @param       R1,R2: R1(上半屏),R2(下半屏)	
 * @explain     向一个小点阵屏写入8位红数据
 * @retval      无
 */
void SendDateR(u8 DataR1,u8 DataR2)
{
	u8 i;
	for(i = 0; i < 8; i++)//移位8次(一个小点阵屏,8个点)
	{
		R1=DataR1 & 0x01;   //从最低位开始写入
		R2=DataR2 & 0x01;
		SCK = 0;						
		SCK = 1;			//每来一个时钟脉冲,写入一次
		DataR1 >>= 1;		//右移一次
		DataR2 >>= 1;		
	}
}

/**
 * @brief       清屏
 * @explain     将LED08_GRAM数组数据全等于1,全熄灭, 0(亮)  1(灭)
 * @retval      无
 */
void LED08_Clear(void)  
{  
	u8 h,l;	
	for(h=0;h<16;h++)  
	{  
		for(l=0;l<16;l++)
		{
			SendDateR(LED08_GRAM[h][l]=0xff,LED08_GRAM[h+16][l]=0xff); //16行,第一个显示上半屏,第二个再加16显示下半屏
		}
		OE=1;	      //关显示屏片选
		LAT=1;     
		LAT=0;	    //输出锁存
		SendRow(h); //16行地址
		OE=0; 
	} 
}

/**
 * @brief       画点
 * @param       x,y  : 起点坐标
 * @param       t:0,清空;1,填充	
 * @retval      无
 */
void LED08_DrawPoint(u8 x,u8 y,u8 t)
{
	u8 pos,bx,temp=0;
	if(x>(Length-1)||y>(Wide-1))
	return;//超出范围了.
	else{
	pos=x/8;				//得到在数组的位置,0~8
	bx=x%8;					//在8位中第几个
	temp=1<<(bx);		//移位bx
	if(!t)LED08_GRAM[y][pos]|=temp;
	else LED08_GRAM[y][pos]&=~temp;	
	}
}
Logo

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

更多推荐