⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dian.c

📁 64X16点阵的PROTUES仿真,六种显示效果切换,对点阵爱好者有很大的研究价值,拿来分享...
💻 C
字号:
/*
________________________________________________________________________
     这个是在别人的基础上改的,别人只给出了左右移的程序,其他是
	 自己写的,共六种显示模式,按了键立即改变模式(实时性,呵呵)
	 程序有许不足(最突出的是时间没设置好),感觉时间不好设置.
	 希望大家提出宝贵的意见,大家共同交流.

*/
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
uchar speed=15;
sbit ST=P3^5;
sbit SH=P3^6;
sbit DATA=P3^7;
sbit EN=P2^4;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
bit LeftFlag;
bit RightFlag;
bit UpFlag;
bit DownFlag;
bit ZJ1Flag;
bit ZJ2Flag=1;		//开始显示模式6
void delay(uchar ms)
{
	uchar y;
	for(;ms>0;ms--)
		for(y=120;y>0;y--);
}
uchar code hanzi[][32]={
/*宜   CB4FA */
{0x01,0x00,0x00,0x80,0x3F,0xFE,0x20,0x04,0x40,0x08,0x0F,0xE0,0x08,0x20,0x08,0x20,
0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0x7F,0xFE,0x00,0x00,},

/*春   CB4BA */
{0x01,0x00,0x01,0x00,0x3F,0xFC,0x01,0x00,0x1F,0xF8,0x02,0x00,0xFF,0xFE,0x04,0x20,
0x08,0x18,0x3F,0xEE,0xC8,0x24,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,0x00,0x00,},

/*学   CD1A7 */
{0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,
0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00,},

/*院   CD4BA */
{0x00,0x80,0xF8,0x40,0x8F,0xFE,0x94,0x04,0xA0,0x00,0xA3,0xF8,0x90,0x00,0x88,0x00,
0x8F,0xFE,0xA9,0x20,0x91,0x20,0x81,0x20,0x82,0x22,0x82,0x22,0x84,0x22,0x88,0x1E,},

/*欢   CBBB6 */
{0x00,0x80,0x00,0x80,0xFC,0x80,0x05,0xFE,0x85,0x04,0x4A,0x48,0x28,0x40,0x10,0x40,
0x18,0x40,0x18,0x60,0x24,0xA0,0x24,0x90,0x41,0x18,0x86,0x0E,0x38,0x04,0x00,0x00,},

/*迎   CD3AD */
{0x40,0x00,0x21,0x80,0x36,0x7C,0x24,0x44,0x04,0x44,0x04,0x44,0xE4,0x44,0x24,0x44,
0x25,0x44,0x26,0x54,0x24,0x48,0x20,0x40,0x20,0x40,0x50,0x00,0x8F,0xFE,0x00,0x00,},

/*您   CC4FA */
{0x08,0x00,0x09,0x00,0x11,0xFE,0x12,0x04,0x34,0x40,0x32,0x50,0x52,0x48,0x94,0x44,
0x11,0x44,0x10,0x80,0x00,0x00,0x29,0x04,0x28,0x92,0x68,0x12,0x07,0xF0,0x00,0x00},
//"!"
{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},

{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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}

};
void SendByte(uchar a)
{
	uchar byte,i;
	byte=~a;
	for(i=0;i<8;i++)
	{
		SH=0;
		if(byte&0X80)
		DATA=1;
		else
		DATA=0;
		SH=1;
		byte<<=1;
	}
}
void LeftDisplay(void)	//左移,半个字一移
{
	uchar i,j,scan,k;
	for(i=0;i<6;i++)	//hanzi中10个字,因一下显示四个字,所以j最大为j=10-4=6;	
	{
		if(LeftFlag==1)		//使之按了其他的键立即退出,转到其他模式
		{
			for(k=0;k<speed;k++)	//移动速度
			{
				scan=0;		//154译码
				if(LeftFlag==1)	//这里同样做处理
				{
					for(j=0;j<31;j+=2)
					{
						ST=0;
						SendByte(hanzi[i+3][j+1]);
						SendByte(hanzi[i+3][j]);
						SendByte(hanzi[i+2][j+1]);
						SendByte(hanzi[i+2][j]);
						SendByte(hanzi[i+1][j+1]);
						SendByte(hanzi[i+1][j]);
						SendByte(hanzi[i][j+1]);
						SendByte(hanzi[i][j]);
						ST=1;	//一个上升沿送数据
						EN=0;	
						P2=scan;
						delay(5);
						EN=1;
						scan++;
					}
				}
				else
				break;
			}
			for(k=0;k<speed;k++)
			{
				scan=0;
				if(LeftFlag==1)
				{
					for(j=0;j<31;j+=2)
					{
						ST=0;
						SendByte(hanzi[i+4][j]);	//另外半个字,注意这里,下面同理
						SendByte(hanzi[i+3][j+1]);
						SendByte(hanzi[i+3][j]);
						SendByte(hanzi[i+2][j+1]);
						SendByte(hanzi[i+2][j]);
						SendByte(hanzi[i+1][j+1]);
						SendByte(hanzi[i+1][j]);
						SendByte(hanzi[i][j+1]);
						ST=1;
						EN=0;
						P2=scan;
						delay(5);
						EN=1;
						scan++;
					}
				}
				else
				break;
			}
		}
		else
		break;
	}
}
void RightDisplay(void)		//右移
{
	uchar i,j,k,scan;
	for(i=0;i<6;i++)	//字加一
	{
		if(RightFlag==1)
		{
			for(k=0;k<speed;k++)
			{
				scan=0;
				if(RightFlag==1)
				{
					for(j=0;j<31;j+=2)
					{
						ST=0;
						SendByte(hanzi[i][j+1]);
						SendByte(hanzi[i][j]);
						SendByte(hanzi[i+1][j+1]);
						SendByte(hanzi[i+1][j]);
						SendByte(hanzi[i+2][j+1]);
						SendByte(hanzi[i+2][j]);
						SendByte(hanzi[i+3][j+1]);
						SendByte(hanzi[i+3][j]);
						ST=1;
						EN=0;
						P2=scan;
						delay(5);
						EN=1;
						scan++;
					}
				}
				else
				break;
			}
			for(k=0;k<speed;k++)
			{
				scan=0;
				if(RightFlag==1)
				{
					for(j=0;j<31;j+=2)
					{
						ST=0;
						SendByte(hanzi[i][j]);
						SendByte(hanzi[i+1][j+1]);
						SendByte(hanzi[i+1][j]);
						SendByte(hanzi[i+2][j+1]);
						SendByte(hanzi[i+2][j]);
						SendByte(hanzi[i+3][j+1]);
						SendByte(hanzi[i+3][j]);
						SendByte(hanzi[i+4][j+1]);
						ST=1;
						EN=0;
						P2=scan;
						delay(5);
						EN=1;
						scan++;
					}
				}
				else
				break;
			}
		}
		else
		break;
	}
}
void UpDisplay(void)	//上移
{
	uchar i,j,k,scan;
	char temp=0;
	for(i=0;i<6;)
	{
		if(UpFlag==1)
		{
			for(k=0;k<speed;k++)
			{
				scan=15-temp;	//译码从最底下开始
				if(UpFlag==1)
				{
					for(j=0;j<2*temp+1;j+=2)
					{
						ST=0;
						SendByte(hanzi[i+3][j+1]);
						SendByte(hanzi[i+3][j]);
						SendByte(hanzi[i+2][j+1]);
						SendByte(hanzi[i+2][j]);
						SendByte(hanzi[i+1][j+1]);
						SendByte(hanzi[i+1][j]);
						SendByte(hanzi[i][j+1]);
						SendByte(hanzi[i][j]);
						ST=1;
						EN=0;
						P2=scan;
						delay(5);
						EN=1;
						scan++;
					}
				}
				else
				break;
			}
			temp++;		//控制译码的
			if(temp==16)	
			{
				temp=0;	//temp复位
				i+=4;	//显示下四个字
			}
		}
		else
		break;
	}
}
void DownDisplay(void)	//下移
{
	uchar i,j,k,scan;
	char temp=30;
	for(i=0;i<6;)
	{
		if(DownFlag==1)
		{
			for(k=0;k<speed;k++)
			{
				scan=0;
				if(DownFlag==1)
				{
					for(j=temp;j<31;j+=2)	//开始j=30
					{
						ST=0;
						SendByte(hanzi[i+3][j+1]);
						SendByte(hanzi[i+3][j]);
						SendByte(hanzi[i+2][j+1]);
						SendByte(hanzi[i+2][j]);
						SendByte(hanzi[i+1][j+1]);
						SendByte(hanzi[i+1][j]);
						SendByte(hanzi[i][j+1]);
						SendByte(hanzi[i][j]);
						ST=1;
						EN=0;
						P2=scan;
						delay(5);
						EN=1;
						scan++;
					}
				}
				else
				break;
			}
			temp-=2;
			if(temp==-2)	
			{
				temp=30;
				i+=4;
			}
		}
		else
		break;
	}
}
void ZJDisplay1(void)	 //只在下移基础上稍微改下(综合上移和下移)
{
	uchar i,j,k,scan,temp;
	for(i=0;i<6;)
	{
		if(ZJ1Flag==1)
		{
			for(k=0;k<speed;k++)
			{
				scan=0;
				if(ZJ1Flag==1)
				{
					for(j=0;j<2*temp+1;j+=2)
					{
						ST=0;
						SendByte(hanzi[i+3][j+1]);
						SendByte(hanzi[i+3][j]);
						SendByte(hanzi[i+2][j+1]);
						SendByte(hanzi[i+2][j]);
						SendByte(hanzi[i+1][j+1]);
						SendByte(hanzi[i+1][j]);
						SendByte(hanzi[i][j+1]);
						SendByte(hanzi[i][j]);
						ST=1;
						EN=0;
						P2=scan;
						delay(5);
						EN=1;
						scan++;
					}
				}
				else
				break;
			}
			temp++;
			if(temp==16)
			{
				temp=0;
				i+=4;
			}
		}
		else
		break;
	}
}
void ZJDisplay2(void)	//只在下移基础上稍微改下(综合上移和下移)
{
	uchar i,j,k,scan,z=0;
	char temp=30;
	for(i=0;i<6;)
	{
		if(ZJ2Flag==1)
		{
			for(k=0;k<speed;k++)
			{
				scan=15-z;		//z作译码控制
				if(ZJ2Flag==1)
				{
					for(j=temp;j<31;j+=2)
					{
						ST=0;
						SendByte(hanzi[i+3][j+1]);
						SendByte(hanzi[i+3][j]);
						SendByte(hanzi[i+2][j+1]);
						SendByte(hanzi[i+2][j]);
						SendByte(hanzi[i+1][j+1]);
						SendByte(hanzi[i+1][j]);
						SendByte(hanzi[i][j+1]);
						SendByte(hanzi[i][j]);
						ST=1;
						EN=0;
						P2=scan;
						delay(5);
						EN=1;
						scan++;
					}
				}
				else
				break;
			}
			temp-=2;
			z++;
			if(temp==-2)
			{
				temp=30;
				i+=4;
				z=0;	//z=15时就复位了
			}
		}
		else
		break;
	}
}
void ClearFlag(void)	//清标志位,调用子程序方便
{
	LeftFlag=0;
	RightFlag=0;
	UpFlag=0;
	DownFlag=0;
	ZJ1Flag=0;
	ZJ2Flag=0;
}
void KeyScan(void)
{
	if(K1==0)
	{
		delay(10);
		if(K1==0)
		{
			while(!K1);
			ClearFlag();
			LeftFlag=1;
		}
	}
	if(K2==0)
	{
		delay(10);
		if(K2==0)
		{
			while(!K2);
			ClearFlag();
			RightFlag=1;
		}
	}
	if(K3==0)
	{
		delay(10);
		if(K3==0)
		{
			while(!K3);
			ClearFlag();
			UpFlag=1;
		}
	}
	if(K4==0)
	{
		delay(10);
		if(K4==0)
		{
			while(!K4);
			ClearFlag();
			DownFlag=1;
		}
	}
	if(K5==0)
	{
		delay(10);
		if(K5==0)
		{
			while(!K5);
			ClearFlag();
			ZJ1Flag=1;
		}
	}
	if(K6==0)
	{
		delay(10);
		if(K6==0)
		{
			while(!K6);
			ClearFlag();
			ZJ2Flag=1;
		}
	}
}
void main(void)
{
	TMOD=0X01;
	TH0=(65535-1000)/256;
	TL0=(65535-1000)%256;
	ET0=1;
	EA=1;
	TR0=1;
	while(1)
	{
		if(LeftFlag==1)
		{
			LeftDisplay();
		}
		if(RightFlag==1)
		{
			RightDisplay();
		}
		if(UpFlag==1)
		{
			UpDisplay();
		}
		if(DownFlag==1)
		{
			DownDisplay();
		}
		if(ZJ1Flag==1)
		{
			ZJDisplay1();
		}
		if(ZJ2Flag==1)
		{
			ZJDisplay2();
		}
	}
}
void timer0(void) interrupt 1
{
	TH0=(65535-1000)/256;
	TL0=(65535-1000)%256;
	KeyScan();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -