標(biāo)題: 單片機(jī)+16x16點(diǎn)陣,漢字滾動(dòng)顯示程序(帶仿真) [打印本頁(yè)]

作者: shige    時(shí)間: 2013-6-26 04:33
標(biāo)題: 單片機(jī)+16x16點(diǎn)陣,漢字滾動(dòng)顯示程序(帶仿真)
代碼寫(xiě)的有點(diǎn)啰嗦,不過(guò)用起來(lái)挺好用的, 漢字取模采用最普遍的 橫向左高位取模, 可以自己任意組合滾動(dòng)方式,
上下左右滾,想怎么滾就怎么滾,不會(huì)的就看看哈
 

源碼及其仿真文件下載: 16x16點(diǎn)陣滾動(dòng)51hei.com.rar (50.79 KB, 下載次數(shù): 1382)


下面是源代碼預(yù)覽:
#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,  //國(guó)
      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,  //隊(duì)
      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);

	}
}
/*************  子函數(shù)   ******************/
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是要移動(dòng)的漢字個(gè)數(shù)        移動(dòng)速度*/         
	unsigned char  i=0,  ib=0;
	unsigned int   tmp=0, speedm=0;
	unsigned char  buffer2[16];         //半個(gè)漢字的緩存

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

	if(dir == 1)     
	{
 /****     向左移動(dòng)    ****/
		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時(shí),將地址指向下一個(gè)漢字
					ptr+=32;
			}
			 
			for(tmp=8;tmp>0;tmp--)  //要移動(dòng)8列	
			{	                           
				ib=0;	
				for(i=0;i<16;i++)
				{                //要移16行,共16個(gè)字節(jié)
	               
					buffer[ib] <<=1; //移第一個(gè)半字
					if(buffer[ib+1] & 0x80)	
						buffer[ib]++;
					ib++;			
	
					buffer[ib]<<=1;	        //移后半字
					if(buffer2[ i] & 0x80)	   
						buffer[ib]++;
					ib++;
	
					buffer2[ i]<<=1;		//緩沖左半字向左移一位
				}
				
				speedm=speed;	//更新點(diǎn)陣
				while(speedm--)
					display();
			}
		}
	}
//--------------------------------------------------//
	else        
	{
   /******  向右移動(dòng)   ******/
		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時(shí),將地址指向下一個(gè)漢字
					ptr+=32;
			}
			 
			for(tmp=8;tmp>0;tmp--)  //要移動(dòng)8列	
			{	                           
				ib=0;	
				for(i=0;i<16;i++)
				{                //要移16行,共16個(gè)字節(jié)
	               
					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;		//下個(gè)漢字的右半字向右移一位
				}
				
				speedm=speed;	
				while(speedm--)  //更新點(diǎn)陣
					display();
			}
		
		}
	}

}
void ymove(char dir,unsigned char *ptr, char speed)
{                   //dir=1上移動(dòng),dir=0為下移動(dòng)
	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];	//將上一行的內(nèi)容復(fù)制到下一行
	
			if(ptr==0)
			{				//移空時(shí),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--)	  //更新點(diǎn)陣
				display();
		}
	}

/****** 向上移 *******/
	else
	{			
		ib=0;	  //數(shù)組元素序號(hào)
		for(i=0;i<16;i++)    //上移16行
		{	
			for(j=0;j<30;j++)	   //將下一行的內(nèi)容復(fù)制到上一行
				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;	//更新點(diǎn)陣
			while(speedm--)
				display();
	   	}
   	}
			
}

作者: 左左右右    時(shí)間: 2013-7-4 09:02
51Hei(51黑)論壇有你更精彩.
作者: 周鵬    時(shí)間: 2013-10-31 17:55
人才啊。!
作者: kid次    時(shí)間: 2013-11-5 01:17
很好 正是需要
作者: 用戶2111158    時(shí)間: 2013-12-15 20:14
學(xué)習(xí)學(xué)習(xí),謝謝無(wú)私奉獻(xiàn)
作者: 942770740    時(shí)間: 2013-12-29 20:39
學(xué)習(xí)了,謝謝樓主
作者: GZMNGZS    時(shí)間: 2014-1-14 16:55
很好 想問(wèn)下8x8點(diǎn)陣屏的字怎么計(jì)算代碼(16進(jìn)制數(shù)),16x16的又是怎么來(lái)計(jì)算的呢   就是: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 };這里面的代碼怎么計(jì)算出來(lái)的??????
作者: yhu168    時(shí)間: 2014-2-9 20:29
好好好!收了
作者: 青草漫風(fēng)    時(shí)間: 2014-2-25 21:30
怎么看不懂呢
作者: 鬼谷子    時(shí)間: 2014-3-14 13:16
謝謝樓主分享,學(xué)習(xí)了
作者: 鬼谷子    時(shí)間: 2014-3-14 13:17
分?jǐn)?shù)扣了,沒(méi)下載成
作者: zhouyubo163    時(shí)間: 2014-4-7 18:49
看看餓了就扣扣
作者: ironludwig    時(shí)間: 2014-4-7 19:37
不錯(cuò)不錯(cuò)!
作者: 930417801    時(shí)間: 2014-4-14 17:56
手中還有器材,也想做一個(gè),下來(lái)參考一下。
作者: 天下    時(shí)間: 2014-5-1 22:40
感覺(jué)還不錯(cuò)
作者: 奮斗的小草    時(shí)間: 2014-6-20 18:59
有你更精彩
作者: 璦    時(shí)間: 2014-6-27 10:44
我的怎么仿真,沒(méi)效果。。
作者: xiaozhi_cc    時(shí)間: 2014-7-4 22:33
好東西
作者: yxz1140    時(shí)間: 2014-8-12 18:52
謝謝~~~~~~~~~~~
作者: 天工    時(shí)間: 2014-8-13 04:42
給贊力贊
作者: 周安松    時(shí)間: 2014-9-13 07:53
謝謝樓主分享
作者: 周安松    時(shí)間: 2014-9-13 07:54
謝謝樓主分享
作者: xing3198    時(shí)間: 2014-9-18 23:46
很好的解釋
作者: 周安松    時(shí)間: 2014-9-19 09:29
謝謝樓主分享,學(xué)習(xí)了
作者: ljhn431    時(shí)間: 2014-10-2 16:58
牛人啊
作者: 我愛(ài)偷地瓜    時(shí)間: 2014-10-4 19:26
學(xué)學(xué)樓主怎么滾 哈哈
作者: wgh008    時(shí)間: 2014-10-11 19:35
好東西,在學(xué)習(xí)
作者: 15225963685    時(shí)間: 2014-10-12 21:34
非常好的東西,超級(jí)頂。。。
作者: p18712886438    時(shí)間: 2014-11-19 21:47
支持一個(gè)                                   
作者: fzg63031525    時(shí)間: 2014-11-20 14:31
你好!樓主!資料不錯(cuò)!收藏了!順便問(wèn)一下,你現(xiàn)在是顯示7個(gè)字,如果我要顯示10個(gè)字除了要改顯示的字外,程序還有哪里需要改動(dòng)嗎?謝謝!
作者: 流亖懵    時(shí)間: 2014-11-22 22:21
人才啊
作者: 隨風(fēng)雅客    時(shí)間: 2014-11-23 14:53
謝謝樓主的無(wú)私奉獻(xiàn)!
作者: HSL199345    時(shí)間: 2014-12-10 12:39
多謝分享~~~~~~~~~謝謝樓主
作者: lsw002233    時(shí)間: 2014-12-12 01:43
看看,,,,,,,
作者: program    時(shí)間: 2015-4-23 23:46
真好
作者: 右手寫(xiě)愛(ài)    時(shí)間: 2015-5-9 09:42
樓主好人!
作者: freshwater    時(shí)間: 2015-5-11 13:46
真厲害啊
作者: 蝴蝶花    時(shí)間: 2015-5-14 23:23
學(xué)習(xí)學(xué)習(xí)!
作者: wanghaiguang888    時(shí)間: 2015-5-20 09:23
這個(gè)得頂,就找他呢
作者: 念念念念念念    時(shí)間: 2015-5-21 10:05
學(xué)習(xí)一下
作者: 龍之骨    時(shí)間: 2015-5-23 23:15
好厲害!
作者: 東東東510    時(shí)間: 2015-5-24 23:38
里面有沒(méi)論文
作者: 2043530005@qq.c    時(shí)間: 2015-6-15 17:08
好厲害 頂一個(gè)
作者: cccao    時(shí)間: 2015-6-16 21:32
支持一個(gè)            
作者: icepoint    時(shí)間: 2015-6-23 20:26
是挺羅嗦的
作者: Asmodeus丶    時(shí)間: 2015-6-24 12:04
贊!。
作者: 532415834    時(shí)間: 2015-6-24 14:30
怎么可以不用黑幣就直接下載了
作者: 532415834    時(shí)間: 2015-6-24 14:31
贊贊贊
作者: kaixinjiuhaoha    時(shí)間: 2015-6-25 22:10
謝謝樓主的程序分享,收了
作者: 發(fā)晨不冥    時(shí)間: 2015-9-23 23:16
仿真在那里啊
作者: 發(fā)晨不冥    時(shí)間: 2015-9-23 23:16
哦哦,沒(méi)看到,原來(lái)在的
作者: 吳小楓    時(shí)間: 2015-9-23 23:57
大神,初學(xué)單片機(jī)小白,不知可否請(qǐng)教??
作者: Yx丷    時(shí)間: 2015-10-16 11:10
想問(wèn)你這個(gè)AT89C55能用AT89C51代替么
作者: 315616464    時(shí)間: 2015-10-16 15:06
求知  這個(gè)黑幣太難弄了  
作者: 油炸熱干面    時(shí)間: 2015-10-21 21:37
51Hei(51黑)論壇有你更精彩.
作者: 騰飛的龍    時(shí)間: 2015-10-22 12:22
用的什么型號(hào)單片機(jī)。晶振多大。驅(qū)動(dòng)芯片是什么型號(hào)?
作者: 邰夏留    時(shí)間: 2015-10-28 12:18
正在學(xué)習(xí)點(diǎn)陣。表示這個(gè)貼有用,不錯(cuò)
作者: gct125    時(shí)間: 2015-10-28 19:24
試下能不能用,先謝了。
作者: mhx321    時(shí)間: 2015-10-29 01:29
頂你,謝謝樓主了,學(xué)習(xí)學(xué)習(xí)
作者: 騰飛的龍    時(shí)間: 2015-10-29 10:49
GZMNGZS 發(fā)表于 2014-1-14 16:55
很好 想問(wèn)下8x8點(diǎn)陣屏的字怎么計(jì)算代碼(16進(jìn)制數(shù)),16x16的又是怎么來(lái)計(jì)算的呢   就是:code unsigned ch ...

不少計(jì)算,是用的取模軟件
作者: 騰飛的龍    時(shí)間: 2015-10-29 10:51
GZMNGZS 發(fā)表于 2014-1-14 16:55
很好 想問(wèn)下8x8點(diǎn)陣屏的字怎么計(jì)算代碼(16進(jìn)制數(shù)),16x16的又是怎么來(lái)計(jì)算的呢   就是:code unsigned ch ...

看看8*8的點(diǎn)陣怎么顯示的就知道這些碼是怎么出來(lái)的啦。
作者: 騰飛的龍    時(shí)間: 2015-10-29 10:52
樓主:你用的什么驅(qū)動(dòng)芯片驅(qū)動(dòng)點(diǎn)陣屏,是595嗎?
作者: 邰夏留    時(shí)間: 2015-10-29 12:40
新手表示,就算下載 了還是看不懂啊。
哎,感覺(jué)都沒(méi)信心了。學(xué)了半年了,連點(diǎn)陣都還沒(méi)學(xué)到。。。。。
作者: 落塵    時(shí)間: 2015-12-24 15:55
GZMNGZS 發(fā)表于 2014-1-14 16:55
很好 想問(wèn)下8x8點(diǎn)陣屏的字怎么計(jì)算代碼(16進(jìn)制數(shù)),16x16的又是怎么來(lái)計(jì)算的呢   就是:code unsigned ch ...

字模提取軟件就可以,在網(wǎng)上有好多
作者: 張無(wú)忌1987    時(shí)間: 2016-2-19 10:57
強(qiáng)烈頂一個(gè)
作者: 是懂得飛快哈佛    時(shí)間: 2016-3-20 17:21
好幫啊
作者: 北京方便面    時(shí)間: 2016-4-1 11:46
親,我黑幣不夠,急需查看資料,能給我一份嗎,qq2061964742@qq.com
作者: 風(fēng)中老炮    時(shí)間: 2016-4-18 12:59
學(xué)習(xí)了,樓主
作者: 12331054    時(shí)間: 2016-4-25 09:11
afasfwfqfs
作者: liu07611    時(shí)間: 2016-4-26 12:34
牛人啊
作者: 我的信仰    時(shí)間: 2016-5-5 13:01
應(yīng)該不錯(cuò)吧
作者: 莫名的月光    時(shí)間: 2016-5-6 23:06
那個(gè)大神教教我字模怎么提取的啊。我用的字模提取軟件提取出來(lái)跟樓主的不一樣啊
作者: haoshijie    時(shí)間: 2016-5-7 00:31
好厲害,學(xué)習(xí)學(xué)習(xí)
作者: wyl94    時(shí)間: 2016-5-11 20:08
正需要
作者: wyl94    時(shí)間: 2016-5-11 20:13
謝謝樓主
作者: 123啥電視v    時(shí)間: 2016-5-15 15:19
6666hg
作者: 123啥電視v    時(shí)間: 2016-5-15 15:39
為什么下載后打不開(kāi)
作者: trol    時(shí)間: 2016-6-11 15:01
很好,學(xué)習(xí)一下

作者: wen1993    時(shí)間: 2016-6-19 09:28
為什么沒(méi)有原理圖??
作者: wen1993    時(shí)間: 2016-6-19 09:29
來(lái)個(gè)原理圖??
作者: 1563257180    時(shí)間: 2016-6-25 22:24
感覺(jué)代碼不夠精煉
作者: MX安心    時(shí)間: 2016-6-26 19:20
這個(gè)有意思
作者: 我沒(méi)上過(guò)學(xué)    時(shí)間: 2016-8-17 07:58
學(xué)習(xí)學(xué)習(xí)
作者: 我是小勇    時(shí)間: 2016-10-17 22:43
樓主,有個(gè)畢業(yè)設(shè)計(jì)需要你幫忙 能否聯(lián)系
作者: lids    時(shí)間: 2016-10-26 12:13
下載了,學(xué)習(xí)學(xué)習(xí)
作者: 245059728    時(shí)間: 2016-10-30 09:48
看下一下高手水平
作者: lslzx63    時(shí)間: 2016-10-30 15:34
正需要,謝謝了!
作者: a1184569302    時(shí)間: 2016-11-28 14:25
不需要三極管嗎
作者: 軒漠陽(yáng)    時(shí)間: 2016-12-1 15:04
共陽(yáng)還是共陰的啊?
作者: yoou    時(shí)間: 2016-12-19 10:54
樓主 有匯編語(yǔ)言嗎?
作者: chong111    時(shí)間: 2017-1-4 16:53
好厲害
作者: yrkygdf    時(shí)間: 2017-1-14 17:59

學(xué)習(xí)學(xué)習(xí),謝謝無(wú)私奉獻(xiàn)
作者: 1130555300    時(shí)間: 2017-4-6 19:06
GZMNGZS 發(fā)表于 2014-1-14 16:55
很好 想問(wèn)下8x8點(diǎn)陣屏的字怎么計(jì)算代碼(16進(jìn)制數(shù)),16x16的又是怎么來(lái)計(jì)算的呢   就是:code unsigned ch ...

代碼是第一個(gè)點(diǎn)陣先掃描第一行,在掃描第二個(gè)點(diǎn)陣一一行,在掃描第一個(gè)點(diǎn)陣第二行,依次循環(huán)
作者: wangyufeng    時(shí)間: 2017-4-6 20:12
下載學(xué)習(xí)學(xué)習(xí)

作者: 單片機(jī)哎呀    時(shí)間: 2017-4-12 21:29
感謝分享,然而并沒(méi)有下載不知道是否可以直接套用在單片機(jī)上自帶的點(diǎn)陣?
作者: 單片機(jī)哎呀    時(shí)間: 2017-4-12 21:52
感謝樓主分享,然而并沒(méi)什么卵用
作者: mxa001    時(shí)間: 2017-5-5 16:58
很好 正是需要
作者: learning    時(shí)間: 2017-5-5 22:14
有點(diǎn)厲害啊,我只會(huì)會(huì)變匯編,這要怎么做?
作者: danpianjihi    時(shí)間: 2017-5-16 17:11
非常感謝樓主分享
作者: Zlover96    時(shí)間: 2017-5-25 20:58
支持樓主!!1




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1