51单片机-驱动LED点阵模块教程
本章概述思维导图:
51单片机驱动LED点阵模块教程
LED点阵简介
LED点阵是由多个发光二极管(LED)按矩阵形式排列组成的显示设备,常见规格包括8×8、16×16、32×32等。在我们日常生活的电器中随处可见。LED点阵实物图如下:
应用场景:
信息显示:广告牌、公告牌、交通标识、电子钟表、计时器(如体育赛事倒计时)。
设备交互:家电温度显示、工业设备状态指示、智能仪表数据可视化。
动态效果:结合传感器实现实时数据更新,或通过滚动显示、动画增强视觉效果。
特殊应用:全彩LED点阵用于舞台灯光、艺术装置,支持PWM调光实现色彩混合。
典型驱动LED点阵模块电路示例:以16×16点阵为列:
行驱动:两片74HC138级联,生成16路低电平信号选择行。
列驱动:两片74HC595级联,串行输入转为16路并行输出控制列。
流程:单片机发送行地址至74HC138,同时通过74HC595输出列数据,逐行扫描刷新显示。
总结:LED点阵通过灵活的矩阵设计和驱动方案,成为信息展示与交互的核心元件,其性能与成本平衡需根据具体需求选择合适规格和控制方式。
LED8*8点阵硬件电路原理图分析
电路原理图分析:
LED8*8点阵一共有16个引脚控制,行(DPa~DPh)引脚由74HC595并行输出脚(QA~QH)控制,列(K1~K8)引脚由STC51单片机P0 I/O端口控制;
74HC595芯片的VCC引脚、GND引脚、OE引脚引出一个编号为J24的座子,这是为了方便驱动74HC595芯片,要使74HC595芯片工作需使跳线帽将OE引脚和GND引脚进行连接;不工作时,需使跳线帽将OE引脚与VCC引脚进行连接;原理:OE使能引脚(低电平有效);
74HC595芯片的SRCLR复位引脚与VCC进行连接;原理:SRCLR是低电平复位,为了防止误触,通常与VCC进行连接;
74HC595芯片的RCLK存储寄存器时钟引脚与MCU的P35引脚进行连接,分析P35引脚为74HC595芯片提供一个存储寄存器的时钟信号;
74HC595芯片SRCLK移位寄存器时钟引脚与MCU的P36引脚进行连接,分析P36引脚为74HC595芯片提供一个移位寄存器的时钟信号;
74HC595芯片的QA~QH为并行输出脚与开发板的8*8点阵LED灯DPa~DPh行引脚进行连接实现阳极控制;
74HC595芯片的QH'为串行输出脚,功能用于级联下一级74HC595芯片实现控制;(本电路不需要使用);
MCU的P0端口(P00~P07)引脚连接8*8点阵LED灯的列引脚实现LED灯阴极控制;
(本章的内容主要是讲解8*8LED点阵灯模块的,但是跟上一章的内容是息息相关的。所有会有大部分知识点重合,小伙伴们就当复习啦!)
驱动8*8LED点阵软件编程设计
驱动8*8LED点阵第一个灯步骤
第一步:实现第一列点亮,需给P0端口写入高低电平控制LED阴极。第一列点亮,其余列不点亮。我们应给P07写入低电平,(P00~P06)写入高电平。十六进制表达方式为:0x7f;
第二步:实现第一行点亮,74HC595需串行输入并行输出控制LED阳极,第一行点亮,其余行不点亮。我们应给DPh写入高电平,(DPa~DPg)写入低电平。十六进制表达方式为:0x80;
第三步:在主函数中将第一步和第二步结合起来实现点亮第一个LED灯操作
代码示例:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit SER=P3^4; //74HC595串行输入
sbit TRCLK=P3^5; //74HC595存储寄存器时钟
sbit SRCLK=P3^6; //74HC595移位寄存器时钟
#define LED_DZ P0 //宏定义LED点阵阴极端口
void HC595_out(u8 temp)//函数封装:74HC595芯片IO口扩展输出
{u8 i=0;for(i=0;i<8;i++){SER=temp>>7; //取最高位temp<<=1; //左移一位SRCLK=0; //移位时钟为低电平Delay_10us(1); //延时10us(上升沿触发)SRCLK=1; //移位时钟为高电平,一位数据发送完成Delay_10us(1);}TRCLK=0; //存储时钟为低电平Delay_10us(1); //延时:上升沿的过程TRCLK=1; //存储时钟为高电平,一字节数据传输完成Delay_10us(1);
}
int main()
{ LED_DZ=0x00;while(1){LED_DZ=~(0x80);//第一列点亮HC595_out(0x80);//第一行点亮}
}
8*8点阵LED点亮第一个灯效果展示图:
驱动8*8点阵LED灯显示笑脸步骤
第一步:首先我们在取模软件上进行输出内容的取模,步骤为:1、基本操作-新建图像设置8行8列的空白图像;2、参数设置-其它选项-选择纵向取模,不需要字节倒序,确定;3、开始在新建图像中设置要显示的图形,用鼠标单击空白小格就可点亮,双击就可取消点亮;4、取模方式-选择C51方式,就顺利输出点阵取模啦
第二步:将输出点阵取模存放到缓存区数组中,每个元素表示每一列中显示所有行的LED灯的个数。再将每一列点亮的状态存到到另一个缓冲区数组中。在主函数中利用人体视觉暂留(>24ms)实现稳定显示。
代码示例:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void Delay_10us(u16 us)//微秒延时函数:输入1大概延时时间为10us
{while(us--);
}
void Delay_ms(u16 ms) //毫秒延时函数:输入1大概延时时间为1ms
{u16 i,j;for(i=ms;i>0;i--){for(j=110;j>0;j--){}}
}
sbit SER=P3^4; //74HC595串行输入
sbit TRCLK=P3^5; //74HC595存储寄存器时钟
sbit SRCLK=P3^6; //74HC595移位寄存器时钟
#define LED_DZ P0 //宏定义LED点阵阴极端口void HC595_out(u8 temp)//函数封装:74HC595芯片IO口扩展输出
{u8 i=0;for(i=0;i<8;i++){SER=temp>>7; //取最高位temp<<=1; //左移一位SRCLK=0; //移位时钟为低电平Delay_10us(1); //延时10us(上升沿触发)SRCLK=1; //移位时钟为高电平,一位数据发送完成Delay_10us(1);}TRCLK=0; //存储时钟为低电平Delay_10us(1); //延时:上升沿的过程TRCLK=1; //存储时钟为高电平,一字节数据传输完成Delay_10us(1);
}
u8 LED_zl[]={0x70,0x54,0x72,0x02,0x02,0x72,0x54,0x70};//纵向取模:一列中所有行的状态
u8 LED_Zh[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//每一列选中状态
int main()
{ while(1){u8 i=0;for(i=0;i<8;i++){HC595_out(LED_zl[i]);LED_DZ=LED_Zh[i];Delay_ms(1); //延时1ms,等待显示HC595_out(0x00); //消隐}}
}
8*8LED点阵笑脸显示效果:
8*8点阵LED灯显示笑脸展示
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!