基于51单片机时间和汉字在16X64点阵上显示仿真

目录

一、项目要求

二、仿真

三、代码

资料下载地址:基于51单片机时间和汉子在16X64点阵上显示仿真

一、项目要求

点阵上显示时间、汉子;通过按键切换左移和右移,串口打印显示信息。

二、仿真

显示内容:时间

移动方向:左移

 显示内容:汉字

 移动发现:左移

显示内容:时间

移动方向:右移

显示内容:汉字

移动方向:右移

三、代码

点阵显示代码

#include<reg52.h>
#include"MacroAndConst.h"
#include"delay.h"
#include"display.h"
#include"ziku.h"
#include "stdio.h"
#include "string.h"
char str[10];
extern bit fLeftFlag;  //声明外部变量
extern bit fRightFlag;	//声明外部变量
extern bit fLeftFlag1;  //声明外部变量
extern bit fRightFlag1;	//声明外部变量
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
uchar mode = 0;

extern unsigned char date[];

extern char b;
void send(uchar* state,uchar num);
/**********************************************************
函数名称:LeftflowDisplay 
函数功能:左移显示函数 
入口参数:无  
出口参数:无 
备  注: 
**********************************************************/
void LeftflowDisplay()		//逐行 阴码 逆向
{
	uchar sp,y=0;
	move=0;
	words=0;
	if(fLeftFlag == 1)
	{
		words = 0;
		line = 0;
		move = 0;
		memset(str,0,10);
		str[0] = date[0] + 0x30;
		str[1] = date[1] + 0x30;
		str[2] = date[2] + 0x30;
		str[3] = date[3] + 0x30;
		str[4] = date[4] + 0x30;
		//sprintf(str,"%d \r\n",(unsigned int)date);//不加强制转换,输出异常	
			send(str ,5);
		while(words<5*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,等待一段时间,产生视觉暂留
								}
							}
						}
						move=move+1;		//移动一步(一位)
					}

//				}
				move=0;
				words=words+32;	//下一个字
//			}


		}
	}
	else if(fRightFlag == 1)
	{
		words = 0;
		line = 0;
		move = 0;
		memset(str,0,10);
		str[0] = 0xB1;
		str[1] = 0xCF;
		str[2] =  0xD2;
		str[3] = 0xB5;
		str[4] = 0xBC;
		str[5] = 0xBE;
		str[6] =  0xBF;
		str[7] = 0xEC;
		str[8] = 0xC0;
		str[9] = 0xD6;
		send(str ,10);
		while(words<5*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,等待一段时间,产生视觉暂留
								}
							//}
						}
						move=move+1;		//移动一步(一位)
					}

//				}
				move=0;
				words=words+32;	//下一个字
//			}


		}
		
		
	}
		words=0;
	}

/**********************************************************
函数名称: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;
	
	if(fLeftFlag==1)//右移
	{
		words = 0;
		line = 0;
		move = 0;
		memset(str,0,10);
		str[0] = date[0] + 0x30;
		str[1] = date[1] + 0x30;
		str[2] = date[2] + 0x30;
		str[3] = date[3] + 0x30;
		str[4] = date[4] + 0x30;
		send(str ,5);
		while(words<=5*32)	  //数组元素。46组,每组32个
		{
			while(move<16)// 循环16次,点亮并移动一个汉字
			{	 
					for(i=0;i<speed;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
					{

							for(line=0;line<16;line++)//扫描16行			 
							{
								loadoneline();//装载一线点阵数据
								sendoneline();//发送一线点阵数据
								P2=line;                 
								ST= 0; 
								ST= 1; 
								delay_10us(50); //延时500us,等待一段时间,产生视觉暂留                                                              
							}


					}
					move++;	//列指针递增

		
			}
			move=0;
			words=words+32;// 一个汉字移动后,指向下一个汉字	  
		}
	}
    else if(fRightFlag == 1)
   {
	             
	    words = 0;
		line = 0;
		move = 0;
		memset(str,0,10);
		str[0] = 0xB1;
		str[1] = 0xCF;
		str[2] =  0xD2;
		str[3] = 0xB5;
		str[4] = 0xBC;
		str[5] = 0xBE;
		str[6] =  0xBF;
		str[7] = 0xEC;
		str[8] = 0xC0;
		str[9] = 0xD6;
		send(str ,10);
	    while(words<5*32)		//
		{	
			while(move<16)// 循环16次,点亮并移动一个汉字
			{
				for(i=0;i<speed;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
					{

							for(line=0;line<16;line++)//扫描16行			 
							{
								loadoneline();//装载一线点阵数据
								sendoneline();//发送一线点阵数据
								P2=line;                 
								ST= 0; 
								ST= 1; 
								delay_10us(50); //延时500us,等待一段时间,产生视觉暂留                                                              
							}


					}
					move++;	//列指针递增
			}
			move=0;
			words=words+32;	//下一个字
		}
   }

	words=0;
}

/**********************************************************
函数名称: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;
	  		}
	}
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

森旺电子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值