教程:基于51单片机的LED点阵屏显示
2023-01-31
来源:滑小稽笔记
11.1 项目分析
11.1.1 点阵简介
LED点阵屏通过LED发光二极管组成,以灯珠亮灭来显示文字、图片、动画、视频等,是各部分组件都模块化的显示器件,通常由显示模块、控制系统和电源系统组成。 LED点阵屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。
LED点阵的显示原理很简单,以8×8点阵为例,8×8点阵具有64个像素点,可以显示数字和一些比较简单的汉字,但是显示汉字最好是用16×16以上的点阵,点阵的连接关系与矩阵键盘相似,将每一行的LED正极接在一起并引出接线端子,将每一列的LED负极接在一起并引出,这样8×8的点阵就会有16个端口被引出, 将行端口和列端口分别接在单片机的两个端口上,就可以控制点阵了。 点阵的显示主要是利用扫描实现的,可以扫描行也可以扫描列,以行扫描为例,假设单片机在八行中任选一“行”产生高电平,其余的“行”设为低电平,那么此时对于“列”只需要在任意一列产生低电平就可以点亮这一行的任意一个或多个发光二极管,然后当“行”不停地扫描,超过人眼的反应范围时,就会显示出对应的画面。 当一个点阵以三个发光二极管(R,G,B)组成一个像素,且发光二极管的体积足够小那就形成了彩色点阵,这种点阵可以利用像素点的R,G,B三种颜色混合成任意的颜色,只要像素点足够多,那么就可以显示彩色图像。
11.1.2 8×8单色点阵结构图
**11.2 **项目过程
11.2.1 项目需求
利用51单片机控制8*8点阵实现0~9的显示。
11.2.2 原理图
11.2.3 源代码
/*********************************************************************************************************
头 文 件 引 用
*********************************************************************************************************/
#include <reg51.h> //导入51单片机头文件
#include <intrins.h>
/*********************************************************************************************************
数 据 类 型 定 义
*********************************************************************************************************/
#define u8 unsigned char //定义无符号字符型数据(0~255)
#define u16 unsigned int //定义无符号整型数据(0~65535)
u8 code TAB_L[] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F } ; //扫描码
u8 code TAB_H[] = {
0x00, 0x00, 0x3C, 0x42, 0x42, 0x3C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x44, 0x7E, 0x40, 0x00, 0x00,
0x00, 0x00, 0x64, 0x52, 0x52, 0x4A, 0x44, 0x00,
0x00, 0x00, 0x44, 0x92, 0x92, 0x6C, 0x00, 0x00,
0x00, 0x18, 0x14, 0x12, 0x7E, 0x10, 0x00, 0x00,
0x00, 0x00, 0x86, 0x8A, 0x8A, 0x72, 0x00, 0x00,
0x00, 0x00, 0x00, 0x78, 0x94, 0x92, 0x62, 0x00,
0x00, 0x00, 0x02, 0x02, 0xF2, 0x0A, 0x06, 0x00,
0x00, 0x00, 0x6C, 0x92, 0x92, 0x92, 0x6C, 0x00,
0x00, 0x00, 0x4C, 0x92, 0x92, 0x7C, 0x00, 0x00,
} ; //数字码
u8 Picture_Num ;
u8 TIM0_Count ;
/********************************************************
Name :delay_ms
Function :毫秒级别延时函数
Paramater :
ms:延时的ms数
Return :None
********************************************************/
void delay_ms( u16 ms )
{
u8 i ;
while( ms-- )
for( i=0; i<110; i++ ) ;
}
/********************************************************
Name :Picture
Function :点阵扫描算法
Paramater :None
Return :None
********************************************************/
void Picture( u8 num )
{
u8 i ;
for( i=0 ; i<8 ; i++ )
{
P3 = TAB_L[ i ] ; //每一次扫描都会加入图片的 1/8
P2 = TAB_H[ num*8+i ]; //取数字码
delay_ms( 1 ) ;
}
}
/********************************************************
Name :TIM0_IRQHandler
Function :定时器中断
Paramater :None
Return :None
********************************************************/
void TIM0_IRQHandler() interrupt 1
{
TH0 = ( 65535-50000 )/256 ;
TL0 = ( 65535-50000 )%256 ;
TIM0_Count ++ ;
if( TIM0_Count==20 )
{
Picture_Num ++ ;
if( Picture_Num==10 )
Picture_Num = 0 ; //图像切换上限
TIM0_Count = 0 ;
}
}
/*********************************************************************************************************
主 函 数
*********************************************************************************************************/
void main()
{
IE = 0x82 ; //开启中断与定时器中断
TMOD = 0x01 ; //设定为16位定时器模式
TH0 = ( 65535-50000 )/256 ; //写入定时器初值
TL0 = ( 65535-50000 )%256 ;
TR0 = 1 ; //开启定时器
TIM0_Count = 0 ;
Picture_Num = 0 ;
while( 1 )
{
Picture( Picture_Num ) ;
}
}
11.2.4 仿真截图
更多信息可以来这里获取==>>电子技术应用-AET<<