【Proteus仿真】【51单片机】LED点阵广告牌设计


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用16*16LED点阵、按键、74HC595D等。

系统运行后,默认以静态模式显示,此时点阵左右循环切换图像。
当按下K1键,点阵从下往上滚动显示图像;
当再次按下K1键,点阵从上往下滚动显示图像;
当再次按下K1键,点阵从右往左滚动显示图像;
当再次按下K1键,点阵从左往右滚动显示图像;
如此循环。
当按下K2键,点阵滚动速度增加。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)
*/


//LED点阵显示汉字数据--上下滚动
//字模提取软件,字体:常规宋体小四,横向取模,字节倒序,保留
code u8 gled_col[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  新  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x00,0x10,0x20,0xFE,0x1E,0x00,0x02,0x44,0x02,0x28,0x02,0xFF,0x7E,0x10,0x12,
0x10,0x12,0xFE,0x12,0x10,0x12,0x54,0x12,0x92,0x12,0x11,0x11,0x14,0x11,0x88,0x10,

/*--  文字:  年  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x00,0x08,0x00,0xF8,0x3F,0x04,0x01,0x04,0x01,0x02,0x01,0xF8,0x1F,0x08,0x01,
0x08,0x01,0x08,0x01,0xFF,0x7F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,

/*--  文字:  快  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x02,0x08,0x02,0x08,0x02,0xC8,0x1F,0x18,0x12,0x2A,0x12,0x0A,0x12,0x0A,0x12,
0xE9,0x7F,0x08,0x02,0x08,0x05,0x08,0x05,0x88,0x08,0x88,0x08,0x48,0x10,0x28,0x60,

/*--  文字:  乐  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x04,0x00,0x0F,0xF8,0x00,0x08,0x00,0x88,0x00,0x84,0x00,0x84,0x00,0xFC,0x3F,
0x80,0x00,0x90,0x04,0x90,0x08,0x88,0x10,0x84,0x20,0x82,0x20,0xA0,0x00,0x40,0x00,


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

//定时器0中断函数
void time0() interrupt 1
{
	static u8 i=0;
	u8 key=0;

	TH0=0XDC;	//给定时器赋初值,定时10ms
	TL0=0X00;

	i++;
	if(i==5)//间隔50mS
	{
		i=0;
		key=key_scan(0);
		//模式切换
		if(key==KEY1_PRESS)
		{
			sys_ctrl.mode++;
			if(sys_ctrl.mode>=5)sys_ctrl.mode=0;
		}
		//速度调节
		else if(key==KEY2_PRESS)
		{
			sys_ctrl.speed-=5;
			if(sys_ctrl.speed<5)sys_ctrl.speed=20;
		}
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	u8 i=0;
	u16 time=0;

	while(1)
	{
		//静态显示
		if(sys_ctrl.mode==MODE_STATIC_SHOW)
		{	
			for(time=0;time<sys_ctrl.speed;time++)
			{
				for(i=0;i<16;i++)
				{
					hc595_write_data(gled_row[i],gled_row[i+16],~gled_col_static[i*2],~gled_col_static[i*2+1]);//传送行列选数据
					delay_10us(10);//延时一段时间,等待显示稳定
					hc595_write_data(0x00,0x00,0x00,0x00);//消影	
				}	
			}
			for(time=0;time<sys_ctrl.speed;time++)
			{
				for(i=0;i<16;i++)
				{
					hc595_write_data(gled_row[i],gled_row[i+16],~gled_col_static[i*2+32],~gled_col_static[i*2+1+32]);//传送行列选数据
					delay_10us(10);//延时一段时间,等待显示稳定
					hc595_write_data(0x00,0x00,0x00,0x00);//消影	
				}	
			}				
		}
		//从下往上滚动显示
		else if(sys_ctrl.mode==MODE_DOWN_UP_SHOW)
		{
			for(time=0;time<sys_ctrl.speed;time++)
			{
				for(i=0;i<16;i++)
				{
					hc595_write_data(gled_row[i],gled_row[i+16],~gled_col[i*2+sys_ctrl.cnt*2],~gled_col[i*2+1+sys_ctrl.cnt*2]);//传送行列选数据
					delay_10us(10);//延时一段时间,等待显示稳定
					hc595_write_data(0x00,0x00,0x00,0x00);//消影	
				}			
			}
			sys_ctrl.cnt++;	
			if(sys_ctrl.cnt>=16*5)sys_ctrl.cnt=0;
		}
		//从上往下滚动显示
		else if(sys_ctrl.mode==MODE_UP_DOWN_SHOW)
		{
			for(time=0;time<sys_ctrl.speed;time++)
			{
				for(i=0;i<16;i++)
				{
					hc595_write_data(gled_row[i],gled_row[i+16],~gled_col[i*2+sys_ctrl.cnt*2],~gled_col[i*2+1+sys_ctrl.cnt*2]);//传送行列选数据
					delay_10us(10);//延时一段时间,等待显示稳定
					hc595_write_data(0x00,0x00,0x00,0x00);//消影	
				}			
			}
			sys_ctrl.cnt--;	
			if(sys_ctrl.cnt<=0)sys_ctrl.cnt=16*5;
		}
		//从右往左滚动显示
		else if(sys_ctrl.mode==MODE_RIGHT_LEFT_SHOW)
		{
			for(time=0;time<sys_ctrl.speed;time++)
			{
				for(i=0;i<16;i++)
				{
					hc595_write_data(gled_col_right_left[i*2+sys_ctrl.cnt*2],gled_col_right_left[i*2+1+sys_ctrl.cnt*2],~gled_row[i],~gled_row[i+16]);//传送行列选数据
					delay_10us(10);//延时一段时间,等待显示稳定
					hc595_write_data(0x00,0x00,0x00,0x00);//消影	
				}	
			}
			sys_ctrl.cnt++;	
			if(sys_ctrl.cnt>=16*5)sys_ctrl.cnt=0;	
		}
		//从左往右滚动显示
		else if(sys_ctrl.mode==MODE_LEFT_RIGHT_SHOW)
		{
			for(time=0;time<sys_ctrl.speed;time++)
			{
				for(i=0;i<16;i++)
				{
					hc595_write_data(gled_col_right_left[i*2+sys_ctrl.cnt*2],gled_col_right_left[i*2+1+sys_ctrl.cnt*2],~gled_row[i],~gled_row[i+16]);//传送行列选数据
					delay_10us(10);//延时一段时间,等待显示稳定
					hc595_write_data(0x00,0x00,0x00,0x00);//消影	
				}	
			}
			sys_ctrl.cnt--;	
			if(sys_ctrl.cnt<=0)sys_ctrl.cnt=16*5;	
		}		
	}
}


//应用控制系统
void app_control_sys(void)
{
	sys_parm_init();//系统参数初始化
	time0_init();//初始化定时器0
	time0_start();//开启定时器0

	while(1)
	{
		sys_fun_ctrl();//系统功能控制												
	}	
}




三、实验现象

演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值