基于51单片机的16x16点阵滚动广告牌仿真原理图程序

附:http://www.jh-tec.cn/archives/7536

硬件设计

原理图:
在这里插入图片描述

仿真图:
左右滚动:
在这里插入图片描述
上下滚动:
在这里插入图片描述

程序设计:

/*********************************************************************	
	功能:16*16LED点阵显示
	目的:用两种滚动模式显示“极寒钛科技创作”
	显示方式:列扫描方式
	取模软件:PCtoLCD2002完美版
**********************************************************************/
#include  <reg52.h>

#define uchar  unsigned char
#define uint  unsigned int 

sbit  datal595=P1^0;				  //列数据线
sbit  datah595=P1^1;	 			  //行数据线
sbit  clk595=P1^2;					  //数据输入时钟线
sbit  str595=P1^3;					  //输出存储器锁存时钟线
sbit  oe595=P1^4;					  //oe输出使能

//取模方式:阴码、逐列式、逆向、十六进制、C51格式自定义 (使用Pctolcd2002软件)
uchar  code  displaydata[]=              //在ROM中定义一个可变长度数组,供用户填充一定个数的字模
{										 //可填充的最大字模数取决于您所选用的单片机ROM空间大小
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,0x00,
//在以下位置插入字模


0x10,0x04,0x10,0x03,0xD0,0x00,0xFF,0xFF,0x90,0x00,0x10,0x43,0x02,0x30,0x02,0x8F,
0xFE,0x80,0x02,0x43,0x02,0x2C,0x62,0x10,0x5A,0x2C,0xC6,0x43,0x00,0x80,0x00,0x00,/*"极",0*/

0x10,0x11,0x0C,0x11,0x44,0x09,0x54,0x05,0x54,0x03,0xFC,0x21,0x55,0x25,0x56,0x45,
0x54,0x49,0xFC,0x91,0x54,0x03,0x54,0x05,0x44,0x09,0x14,0x11,0x0C,0x11,0x00,0x00,/*"寒",1*/

0x40,0x01,0x20,0x01,0x38,0x01,0xE7,0x7F,0x24,0x21,0x24,0x11,0x04,0x89,0x20,0x40,
0x20,0x30,0x20,0x2E,0xFF,0x41,0x20,0x0E,0x20,0x30,0x20,0x40,0x20,0x80,0x00,0x00,/*"钛",2*/

0x24,0x08,0x24,0x06,0xA4,0x01,0xFE,0xFF,0xA3,0x00,0x22,0x01,0x00,0x04,0x22,0x04,
0xCC,0x04,0x00,0x04,0x00,0x04,0xFF,0xFF,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,/*"科",3*/

0x10,0x04,0x10,0x44,0x10,0x82,0xFF,0x7F,0x10,0x01,0x90,0x80,0x08,0x80,0x88,0x40,
0x88,0x43,0x88,0x2C,0xFF,0x10,0x88,0x28,0x88,0x46,0x88,0x81,0x08,0x80,0x00,0x00,/*"技",4*/

0x40,0x00,0x50,0x00,0x4E,0x3E,0x48,0x02,0x48,0x02,0xFF,0xFF,0x48,0x12,0x48,0x22,
0x48,0x1E,0x40,0x00,0xF8,0x0F,0x00,0x40,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0x00,/*"制",5*/

0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,0x07,0x00,0x40,0x00,0x30,0x00,0x0F,0x00,
0xF8,0xFF,0x88,0x08,0x88,0x08,0x88,0x08,0x88,0x08,0x08,0x08,0x08,0x00,0x00,0x00,/*"作",6*/


//至此字模插入结束
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
};

/*----------------------------------
函数名字:delay_ms
形式参数:无字符整型 i:延时多少
函数功能:以1ms为单位的函数延时
返 回 值:无				 		
------------------------------------*/
void  delay_ms(uint i)	                     
{
    uint j;
	for(;i>0;i--)
		for(j=110;j>0;j--);
}

/*----------------------------------
函数名字:senddata 
形式参数:无字符整型 datah:行的数据 
		  无字符整型 datal:列的数据
函数功能:把数据发送给芯片74HC595
返 回 值:无				 		
------------------------------------*/
void  senddata(uint datah,uint datal)         //向行和列的4个595同时发送数据,显示其中的一列数据
{
    uchar i=0;
	uint m,n;
	oe595=0;
	str595=0;
	for(;i<16;i++)                       //行和列各有两片595驱动,所以行和列分别需要连续送两个字节数据                      
	{
	    clk595=0;
		m=datah;                         //行为高电平驱动
		n=~datal;                        //列为低电平驱动
		m&=0x8000;
		n&=0x8000;
		datah595=(bit)m;				 //在每个clk周期,同时送出行和列的1bit串行数据
		datal595=(bit)n;
		datah<<=1; 
		datal<<=1;
		clk595=1;
	}
	str595=1;                            //一列数据送完,锁存到输出端进行显示
	str595=0;
}
/*----------------------------------
函数名字:char_max 
形式参数:无字符字符型 *dat:两个8位数据的第一个数据的地址
函数功能:受到取模软件的限制,需要对字模表的数据进行重新排列
		  将两个8位的数据拼成显示所需16位的数据
返回值  :uint:返回排列好的值				 		
------------------------------------*/
uint char_max(uchar *dat)
{
	uint l,h;

	h = (uint)*(dat+1);		//16位中的高字节数据
	h <<= 8;				
	h &=0xff00;
	l = (uint)*dat;			//16位中的低字节数据
	l &= 0x00ff;
	
	return l|h;				
}
/*----------------------------------
函数名字:horizontal 
形式参数:无字符字符型 time:字符移动的速度
		  无字符字符型 counth:移动全部字符所需的列数
		  无符号字符型指针 p:字符显示数据的首地址
函数功能:显示字符水平移动
返回值  :无				 		
------------------------------------*/
void  horizontal(uchar time,uint count,uchar *p)    //垂直移动 
{
	uint datah,datal;  			 		 //datah是行数据,datal是列选通
    uchar  x,y;
	uint  z;
    for(z=0;z<count;z++)	             //显示字模表中的所有汉字(包括有用字模前后的的清屏数据)
	{
		for(y=0;y<time;y++)              //该屏数据重复显示time次后刷新,实际上这是水平移动的速度
		{
	        for(x=0;x<16;x++)            //发送一整屏数据,16个16位            
	        {
				p += 2;
				datah = char_max(p);
				datal = 0x0001<<x;		 //列选通位移到相应的列上进行选通
//				datah=~datah;	         //去掉此行前面的注释则水平移动程反白显示
				senddata(datah,datal);   //将行和列数据发送出去进行一列的显示
		    }
			p-=32;                       //指针恢复为这个汉字首地址,准备重复显示该屏数据time次
		}                                //该屏数据经过了time次的显示,显示数据准备更新
		p+=2;							 //指向了该汉字的下一列,左移一列汉字
	}									 //移动了字模表中的所有汉字,左移过程结束
	oe595=1;
}
  • 13
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值