找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 53852|回复: 121
打印 上一主题 下一主题
收起左侧

单片机+16x16点阵,汉字滚动显示程序(带仿真)

  [复制链接]
跳转到指定楼层
楼主
代码写的有点啰嗦,不过用起来挺好用的, 汉字取模采用最普遍的 横向左高位取模, 可以自己任意组合滚动方式,
上下左右滚,想怎么滚就怎么滚,不会的就看看哈
 

源码及其仿真文件下载: 16x16点阵滚动51hei.com.rar (50.79 KB, 下载次数: 1382)


下面是源代码预览:
#include <reg51.h>
#include <intrins.h>
#define  DATAOUT P2    //P2 use as data,  you can change
#define  SPEED  13

void ymove(char dir,unsigned char *ptr,char speed);
void xmove(char dir,unsigned char *ptr,char n,char speed);
void delay(unsigned int a);
void display();
void displaytime(char time);
void init164();

sbit  ADATA= DATAOUT^0;
sbit  ASCK=  DATAOUT^1;
sbit  LATCH= DATAOUT^2;
sbit  BDATA= DATAOUT^3;
sbit  BCLK=  DATAOUT^4;

code unsigned char xin[32]={
	0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x38,   //心
      0x1F,0x7C,0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,
      0x1F,0xFC,0x0F,0xF8,0x07,0xF0,0x03,0xE0,
      0x01,0xC0,0x00,0x80,0x00,0x00,0x00,0x00};

code unsigned char zhong[32]={  
	0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE,  //中
      0x41,0x04,0x41,0x04,0x41,0x04,0x41,0x04,
      0x7F,0xFC,0x41,0x04,0x01,0x00,0x01,0x00,
      0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00};
	
code unsigned char guo[32]={
	0x00,0x04,0x7F,0xFE,0x40,0x24,0x5F,0xF4,  //国
      0x41,0x04,0x41,0x04,0x41,0x44,0x4F,0xE4,
      0x41,0x04,0x41,0x44,0x41,0x24,0x41,0x04,
      0x5F,0xF4,0x40,0x04,0x7F,0xFC,0x40,0x04};

code unsigned char dui[32]={           
	0x7C,0x40,0x44,0x40,0x48,0x40,0x48,0x40,  //队
      0x50,0x40,0x48,0x40,0x48,0x40,0x44,0xA0,
      0x44,0xA0,0x44,0xA0,0x69,0x10,0x51,0x10,
      0x42,0x08,0x44,0x06,0x48,0x04,0x00,0x00};
 
code unsigned char jia[32]={ 					
	0x10,0x00,0x10,0x00,0x10,0x04,0x12,0x7E,  //加
      0xFF,0x44,0x12,0x44,0x12,0x44,0x12,0x44,
      0x12,0x44,0x22,0x44,0x22,0x44,0x22,0x44,
      0x22,0x44,0x4A,0x7C,0x84,0x44,0x00,0x00};

code unsigned char you[32]={
	0x00,0x40,0x40,0x40,0x30,0x40,0x10,0x44,  //油
      0x87,0xFE,0x64,0x44,0x24,0x44,0x0C,0x44,
      0x14,0x44,0x27,0xFC,0xE4,0x44,0x24,0x44,
      0x24,0x44,0x24,0x44,0x27,0xFC,0x24,0x04 };

code unsigned char gth[32]={
	0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,    //!
      0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,
      0x01,0x80,0x01,0x80,0x00,0x00,0x01,0x80,
      0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00};

unsigned char idata buffer[32];

void main(void)
{
	unsigned char i;
	init164();
	while(1)
	{	
		for(i=0;i<32;i++)
			buffer[ i]=xin[ i];

		displaytime(1);
		
		xmove(1,zhong,3,SPEED);
		displaytime(1);

		ymove(1,0,SPEED);
		ymove(1,jia,SPEED);
		ymove(1,you,SPEED);
		ymove(1,0,SPEED);
		xmove(0,jia,3,SPEED);
		ymove(0,gth,SPEED);
		ymove(0,0,SPEED);
		xmove(1,xin,1,SPEED);

	}
}
/*************  子函数   ******************/
void delay(unsigned int a)
{
	while(a--);
}

void display()
{
	unsigned char hang,ib,k,tmp;

    DATAOUT= 0x0;
	BDATA = 0;
	for(hang=0;hang<16;hang++)
	{
		ASCK =0;		
		LATCH=0;
		BCLK =0;
		for(ib=0;ib<2;ib++)
		{
			tmp = buffer[hang*2+ib];
			for(k=0;k<8;k++)
			{
				tmp <<=1;
				ASCK  =0;
				ADATA =CY;
				ASCK  =1;
			}
		}
		DATAOUT|=0x14;
		//LATCH=1;
		//BCLK=1;
		BDATA=1;
	}
	delay(64);
	ASCK =0;
	ASCK =1;
}

void displaytime(char time)
{
	unsigned char i;
	while(time--)
	{
		i=130;
		while(i--)
	 		display();
	}
}

void init164()
{
	char i;
	BDATA=1;
	for(i=0;i<16;i++)
	{
		BCLK =0;
		BCLK =1;
	}
}

void xmove(char dir,unsigned char *ptr,char n,char speed)																	
{      /*       方向                    n是要移动的汉字个数        移动速度*/         
	unsigned char  i=0,  ib=0;
	unsigned int   tmp=0, speedm=0;
	unsigned char  buffer2[16];         //半个汉字的缓存

	n*=2;     //左半字和右半字,所以要x2	     
	for(i=0;i<16;i++)   //清零
		buffer2[ i]=0;

	if(dir == 1)     
	{
 /****     向左移动    ****/
		for(n;n>0;n--)   
		{		
			if(ptr != 0)
			{
				tmp = n%2;	//判断是左半字还是右半字
				for(i=0;i<16;i++)
					buffer2[ i]=ptr[i*2+tmp];
	
				if(tmp)		//tmp为1时,将地址指向下一个汉字
					ptr+=32;
			}
			 
			for(tmp=8;tmp>0;tmp--)  //要移动8列	
			{	                           
				ib=0;	
				for(i=0;i<16;i++)
				{                //要移16行,共16个字节
	               
					buffer[ib] <<=1; //移第一个半字
					if(buffer[ib+1] & 0x80)	
						buffer[ib]++;
					ib++;			
	
					buffer[ib]<<=1;	        //移后半字
					if(buffer2[ i] & 0x80)	   
						buffer[ib]++;
					ib++;
	
					buffer2[ i]<<=1;		//缓冲左半字向左移一位
				}
				
				speedm=speed;	//更新点阵
				while(speedm--)
					display();
			}
		}
	}
//--------------------------------------------------//
	else        
	{
   /******  向右移动   ******/
		for(n;n>0;n--)
		{		
			if(ptr != 0)
			{
				tmp = (n+1) % 2  ;	//判断左半字还是右半字
				for(i=0;i<16;i++)
					buffer2[ i]=ptr[i*2+tmp];
								
				if(tmp == 0)		//tmp为0时,将地址指向下一个汉字
					ptr+=32;
			}
			 
			for(tmp=8;tmp>0;tmp--)  //要移动8列	
			{	                           
				ib=0;	
				for(i=0;i<16;i++)
				{                //要移16行,共16个字节
	               
					buffer[ib+1] >>= 1;	     //移右半字
					if(buffer[ib] & 0x01)	
						buffer[ib+1] |=0x80 ;			
	
					buffer[ib] >>= 1;	    //移左半字
					if(buffer2[ i] & 0x01)	   
						buffer[ib] |= 0x80;
					ib+=2;
	
					buffer2[ i] >>=1;		//下个汉字的右半字向右移一位
				}
				
				speedm=speed;	
				while(speedm--)  //更新点阵
					display();
			}
		
		}
	}

}
void ymove(char dir,unsigned char *ptr, char speed)
{                   //dir=1上移动,dir=0为下移动
	char i=0, j=0, ib=0;
	unsigned int  tmp=0, speedm=0;

	if(dir==0)      
	{	
   /****  向下移  ****/
		ib=31;		
		for(i=16;i>0;i--)   //下移16行
		{		
			for(j=29;j>-1;j--)
				buffer[j+2]=buffer[j];	//将上一行的内容复制到下一行
	
			if(ptr==0)
			{				//移空时,buffer的首行用0移入
				buffer[0]=0;
				buffer[1]=0;
			}
			else
			{				//否则,处理buffer的首行元素		
			    buffer[1]=ptr[ib];
				buffer[0]=ptr[ib-1];
				ib=ib-2;
			}
			speedm=speed;	
			while(speedm--)	  //更新点阵
				display();
		}
	}

/****** 向上移 *******/
	else
	{			
		ib=0;	  //数组元素序号
		for(i=0;i<16;i++)    //上移16行
		{	
			for(j=0;j<30;j++)	   //将下一行的内容复制到上一行
				buffer[j]=buffer[j+2];

			if(ptr==0)        //移入为空,buffer的末行用0移入
			{			
				buffer[30]=0;
				buffer[31]=0;
			}
			else
			{			//否则,处理buffer的末行元素
				buffer[30]=ptr[ib];
				buffer[31]=ptr[ib+1];
				ib=ib+2;			   
			}
			speedm=speed;	//更新点阵
			while(speedm--)
				display();
	   	}
   	}
			
}

评分

参与人数 3黑币 +15 收起 理由
WQL_X + 5 赞一个!
zhanghongyuanvg + 5 共享资料的黑币奖励!
QY-12345678 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏29 分享淘帖 顶8 踩
回复

使用道具 举报

来自 2#
ID:79544 发表于 2015-10-29 10:49 | 只看该作者
GZMNGZS 发表于 2014-1-14 16:55
很好 想问下8x8点阵屏的字怎么计算代码(16进制数),16x16的又是怎么来计算的呢   就是:code unsigned ch ...

不少计算,是用的取模软件
回复

使用道具 举报

来自 3#
ID:79544 发表于 2015-10-29 10:51 | 只看该作者
GZMNGZS 发表于 2014-1-14 16:55
很好 想问下8x8点阵屏的字怎么计算代码(16进制数),16x16的又是怎么来计算的呢   就是:code unsigned ch ...

看看8*8的点阵怎么显示的就知道这些码是怎么出来的啦。
回复

使用道具 举报

地板
ID:51343 发表于 2013-7-4 09:02 | 只看该作者
51Hei(51黑)论坛有你更精彩.
回复

使用道具 举报

5#
ID:37147 发表于 2013-10-31 17:55 | 只看该作者
人才啊!!!
回复

使用道具 举报

6#
ID:56580 发表于 2013-11-5 01:17 | 只看该作者
很好 正是需要
回复

使用道具 举报

7#
ID:57899 发表于 2013-12-15 20:14 | 只看该作者
学习学习,谢谢无私奉献
回复

使用道具 举报

8#
ID:58267 发表于 2013-12-29 20:39 | 只看该作者
学习了,谢谢楼主
回复

使用道具 举报

9#
ID:58188 发表于 2014-1-14 16:55 | 只看该作者
很好 想问下8x8点阵屏的字怎么计算代码(16进制数),16x16的又是怎么来计算的呢   就是:code unsigned char you[32]={
        0x00,0x40,0x40,0x40,0x30,0x40,0x10,0x44,  //油
      0x87,0xFE,0x64,0x44,0x24,0x44,0x0C,0x44,
      0x14,0x44,0x27,0xFC,0xE4,0x44,0x24,0x44,
      0x24,0x44,0x24,0x44,0x27,0xFC,0x24,0x04 };这里面的代码怎么计算出来的??????
回复

使用道具 举报

10#
ID:59072 发表于 2014-2-9 20:29 来自手机 | 只看该作者
好好好!收了
回复

使用道具 举报

11#
ID:59263 发表于 2014-2-25 21:30 | 只看该作者
怎么看不懂呢
回复

使用道具 举报

12#
ID:59668 发表于 2014-3-14 13:16 | 只看该作者
谢谢楼主分享,学习了
回复

使用道具 举报

13#
ID:59668 发表于 2014-3-14 13:17 | 只看该作者
分数扣了,没下载成
回复

使用道具 举报

14#
ID:60432 发表于 2014-4-7 18:49 来自手机 | 只看该作者
看看饿了就扣扣
回复

使用道具 举报

15#
ID:60414 发表于 2014-4-7 19:37 | 只看该作者
不错不错!
回复

使用道具 举报

16#
ID:52249 发表于 2014-4-14 17:56 | 只看该作者
手中还有器材,也想做一个,下来参考一下。
回复

使用道具 举报

17#
ID:61332 发表于 2014-5-1 22:40 | 只看该作者
感觉还不错
回复

使用道具 举报

18#
ID:63138 发表于 2014-6-20 18:59 | 只看该作者
有你更精彩
回复

使用道具 举报

19#
ID:63309 发表于 2014-6-27 10:44 | 只看该作者
我的怎么仿真,没效果。。
回复

使用道具 举报

20#
ID:63587 发表于 2014-7-4 22:33 | 只看该作者
好东西
回复

使用道具 举报

21#
ID:55219 发表于 2014-8-12 18:52 | 只看该作者
谢谢~~~~~~~~~~~
回复

使用道具 举报

22#
ID:65004 发表于 2014-8-13 04:42 | 只看该作者
给赞力赞
回复

使用道具 举报

23#
ID:47760 发表于 2014-9-13 07:53 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

24#
ID:47760 发表于 2014-9-13 07:54 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

25#
ID:66338 发表于 2014-9-18 23:46 | 只看该作者
很好的解释
回复

使用道具 举报

26#
ID:47760 发表于 2014-9-19 09:29 | 只看该作者
谢谢楼主分享,学习了
回复

使用道具 举报

27#
ID:65864 发表于 2014-10-2 16:58 | 只看该作者
牛人啊
回复

使用道具 举报

28#
ID:63176 发表于 2014-10-4 19:26 | 只看该作者
学学楼主怎么滚 哈哈
回复

使用道具 举报

29#
ID:59151 发表于 2014-10-11 19:35 | 只看该作者
好东西,在学习
回复

使用道具 举报

30#
ID:67289 发表于 2014-10-12 21:34 | 只看该作者
非常好的东西,超级顶!!!!
回复

使用道具 举报

31#
ID:69063 发表于 2014-11-19 21:47 | 只看该作者
支持一个                                   
回复

使用道具 举报

32#
ID:57317 发表于 2014-11-20 14:31 | 只看该作者
你好!楼主!资料不错!收藏了!顺便问一下,你现在是显示7个字,如果我要显示10个字除了要改显示的字外,程序还有哪里需要改动吗?谢谢!
回复

使用道具 举报

33#
ID:69235 发表于 2014-11-22 22:21 | 只看该作者
人才啊
回复

使用道具 举报

34#
ID:69044 发表于 2014-11-23 14:53 | 只看该作者
谢谢楼主的无私奉献!
回复

使用道具 举报

35#
ID:68421 发表于 2014-12-10 12:39 | 只看该作者
多谢分享~~~~~~~~~谢谢楼主
回复

使用道具 举报

36#
ID:70340 发表于 2014-12-12 01:43 来自手机 | 只看该作者
看看,,,,,,,
回复

使用道具 举报

37#
ID:77876 发表于 2015-4-23 23:46 | 只看该作者
真好
回复

使用道具 举报

38#
ID:78813 发表于 2015-5-9 09:42 | 只看该作者
楼主好人!
回复

使用道具 举报

39#
ID:79625 发表于 2015-5-11 13:46 | 只看该作者
真厉害啊
回复

使用道具 举报

40#
ID:73949 发表于 2015-5-14 23:23 | 只看该作者
学习学习!
回复

使用道具 举报

41#
ID:80569 发表于 2015-5-20 09:23 | 只看该作者
这个得顶,就找他呢
回复

使用道具 举报

42#
ID:79039 发表于 2015-5-21 10:05 | 只看该作者
学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表