基于51单片机的16X64点阵仿真

目录

一、项目需求

二、仿真图

 三、代码

四、资料清单

资料下载地址:基于51单片机的16X64点阵仿真

一、项目需求

16X64点阵上显示汉子,并且可以左右移动。

二、仿真图

左移

 右移

 三、代码

点阵显示代码

#include<reg52.h>
#include"MacroAndConst.h"
#include"delay.h"
#include"display.h"
#include"ziku.h"

extern bit fLeftFlag;  //声明外部变量
extern bit fRightFlag;	//声明外部变量
uchar scan; 
uchar speed=2;	//设定移动速度
uint words;		//字模计数器
uchar move;		//列指针
uchar line;		//行指针
uchar temp;
uchar BUFF[10];	//缓存数组
sbit ST=P3^5;	//595 STR
sbit SH=P3^6;  //595 CLK
sbit DATA=P3^7;	//595 DATAS

/**********************************************************
函数名称:LeftflowDisplay 
函数功能:左移显示函数 
入口参数:无  
出口参数:无 
备  注: 
**********************************************************/
void LeftflowDisplay()		//逐行 阴码 逆向
{
	uchar sp,y=0;
	move=0;
	words=0;
		while(words<46*32)		//
		{	
		 	if(fLeftFlag==1)
			{
				while(move<16)	//数据移位
				{	
					if(fLeftFlag==1)
					{	
					
						for(sp=0;sp<speed;sp++)	//移动速度
						{	
							if(fLeftFlag==1)
							{
								for(line=0;line<16;line++)	//行扫描
								{
									loadline1();	//装载一线点阵数据
									sendline1();	//发送一线移动数据
									scan=line;	//显示第line行
									P2=scan; 
									ST=1;		//锁存为高,595锁存信号
									ST=0;
									delay_10us(50);	//延时500us,等待一段时间,产生视觉暂留
								}
							}
							else
							break;
						}
						move=move+1;		//移动一步(一位)
					}
					else
					break;
				}
				move=0;
				words=words+32;	//下一个字
			}
			else
			break;
		}
		words=0;
	}
/**********************************************************
函数名称:loadline1 
函数功能:装载点阵数据	缓存
入口参数:无  
出口参数:无 
备  注: 
**********************************************************/

void loadline1()
{
	uchar s;
	for(s=0;s<5;s++)	//s为要显示的字数+1(显示4字+1=5)
	{
		BUFF[2*s]=zuoyi[words+ 32*s + 2*line];
		BUFF[2*s+1]=zuoyi[words+1+ 32*s + 2*line];
		
		
	}
}
/**********************************************************
函数名称:sendline1 
函数功能:发送点阵数据	缓存
入口参数:无  
出口参数:无 
备  注: 
**********************************************************/
void sendline1()
{
	uchar s;
	uchar inc,temp,tempcol;
	uchar  k;
	DATA=1;
	if(move<8) inc=0;
	else inc=1;
	for(s=0+inc;s<=7+inc;s++)
	{
		if(move<8) 
			tempcol=move;
		else 
			tempcol=move-8;
		temp=(BUFF[s]>>tempcol)|(BUFF[s+1]<<(8-tempcol));	//字模左边字节右移tempcol位,右边字节左移8-tempcol位,2者相或
		for(k=0;k<8;k++)
   	   {
      		SH=0;
			DATA=(bit)(temp&0x80);
       		temp=temp<<1;
      		SH=1;
	   }
	}
}
/**********************************************************
函数名称:RightflowDisplay 
函数功能:右移显示函数 
入口参数:无  
出口参数:无 
备  注: 
**********************************************************/
void RightflowDisplay()	//流动右移	 逐行 阴码 顺向
{
	uchar i;
	move=0;
	words=0;
	while(words<=46*32)	  //数组元素。46组,每组32个
	{	
		if(fRightFlag==1)
	    {
			while(move<16)// 循环16次,点亮并移动一个汉字
			{	 
				if(fRightFlag==1)
				{
					for(i=0;i<speed;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
					{
						if(fRightFlag==1)
						{
							for(line=0;line<16;line++)//扫描16行			 
							{
								loadoneline();//装载一线点阵数据
								sendoneline();//发送一线点阵数据
								P2=line;                 
					    		ST= 0; 
								ST= 1; 
						    	delay_10us(50); //延时500us,等待一段时间,产生视觉暂留                                                              
							}
						 }
					 	else
					 	break;
					}
					move++;	//列指针递增
				}
				else
				break;			
			}
			move=0;
			words=words+32;// 一个汉字移动后,指向下一个汉字	  
		}
		else
		break;

	}
	words=0;
}
/**********************************************************
函数名称:loadoneline 
函数功能:装载点阵数据	缓存
入口参数:无  
出口参数:无 
备  注: 
**********************************************************/
void loadoneline()
{
	uchar s;	
    for(s=0;s<5;s++)              //s为要显示的数字+1
		{
			BUFF[2*s+1]=youyi[words+32*s+2*line];
			BUFF[2*s]=youyi[words+1+32*s+2*line];//~
		}
}
/**********************************************************
函数名称:sendoneline 
函数功能:发送点阵数据	缓存
入口参数:无  
出口参数:无 
备  注: 
**********************************************************/
void sendoneline()
{
	char s;
	uchar inc,k,tempcol;
	if(move<8)
		inc=0;
	else 
		inc=1;      
	for(s=7+inc;s>=0+inc;s--)
		{
			if(move<8) 
				tempcol=move;
			else 
				tempcol=move-8;
				temp=(BUFF[s]>>tempcol)|(BUFF[s+1]<<(8-tempcol));
			for(k=0;k<8;k++)
   	  		{	
      			SH=0;
				DATA=(bit)(temp&0x01);
       			temp=temp>>1;
      			SH=1;
	  		}
		}
}

四、资料清单

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值