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

📄 12864_parellel.c

📁 用单片机控制液晶12864显示波形,采用并口传输方式
💻 C
字号:
#include "reg52.h"
#include "intrins.h"
#include "string.h"
#include "math.h"

#define uchar unsigned char
#define uint unsigned int

sbit rst=P2^5;
sbit e=P2^2;
sbit rw=P2^1;
sbit rs=P2^0;
sbit busy=P0^7;
//sbit psb=P3^2;
sbit tleft=P3^2;//时间线、电压线的控制按键
sbit tright=P3^3;
sbit vup=P3^4;
sbit vdown=P3^5;

bit fbusy();
void write_code(uchar co);
void write_data(uchar da);
void locate(uchar address);//写字时定位
void locatexy(uchar x,uchar y);//画图时定位(不是以点为单位)
void ini();
void write_str(char * str);
void delay500us(uint t);
void clrscreen();//清图形屏
uint readgdram(uchar x,uchar y);//从RAM里读数据

uint r_power2(uchar n);
void scalewave();//使波形数据到合适的范围
void showwave();
void storewave();
void dot(uchar x,uchar y);//画一点
void wipedot(uchar x,uchar y);//擦除一点
void drawtline();//画时间线
void wipetline();//擦除时间线
void drawvline();//画电压线
void wipevline();//擦除电压线
void drawline(uchar x1,uchar y1,uchar x2,uchar y2);//在任两点间画线

void sininterpolation();//正弦插值
void lininterpolation();//线性插值
float power(float x,uchar n);//指数函数

xdata uchar wave[256];
idata uchar tline,vline;

void main()
{
//	uchar c1,c2;
	rst=0;
	delay500us(1);
	rst=1;
	e=0;
//	psb=1;
	rst=1;
	ini();

	locate(24);
	write_str("1000 1000 100000");

	clrscreen();

//	storewave();
	sininterpolation();
//	lininterpolation();
	scalewave();
	showwave();

//	tline=0;
//	drawtline();

//	vline=47;
//	drawvline();

	while(1);
/*	while(1)
	{

		if(!tleft)
		{
			delay500us(20);
			if(!tleft)
			{
				wipetline();
				if(tline<=0)
					tline=0;
				else
					tline--;
				drawtline();
			}
		}
		if(!tright)
		{
			delay500us(20);
			if(!tright)
			{
				wipetline();
				tline++;
				if(tline>=127)
					tline=127;
				drawtline();
			}
		}
		if(!vdown)
		{
			delay500us(20);
			if(!vdown)
			{
				wipevline();
				if(vline<=0)
					vline=0;
				else
					vline--;
				drawvline();
			}
		}
		if(!vup)
		{
			delay500us(20);
			if(!vup)
			{
				wipevline();
				vline++;
				if(vline>=47)
					vline=47;
				drawvline();
			}
		}
	}*/
}


bit fbusy()
{
	bit isbusy;
	P0=0xff;
	rs=0;
	rw=1;
	e=1;
	isbusy=busy;
	e=0;
	return isbusy;
}

void write_code(uchar co)
{
	while(fbusy());
	P0=co;
	rs=0;
	rw=0;
	_nop_();
	e=1;
	e=0;
}

void write_data(uchar da)
{
	while(fbusy());
	P0=da;
	rs=1;
	rw=0;
	_nop_();
	e=1;
	e=0;
}

void ini()
{
	delay500us(80);
	write_code(0x34);
	write_code(0x01);
	write_code(0x30);
	write_code(0x01);
	write_code(0x06);
	write_code(0x0c);
}


void delay500us(uint t)
{
	idata uchar tt;
	for(;t>0;t--)
		for(tt=243;tt>0;tt--);
}


void locate(uchar address)
{
	write_code(address|0x80);
}

void write_str(char * str)
{
	idata uchar i;
	for(i=0;i<strlen(str);i++)
		write_data(*(str+i));
}

uint r_power2(uchar n)
{
	switch(n)
	{
		case 15:return 1;break;
		case 14:return 2;break;
		case 13:return 4;break;
		case 12:return 8;break;			
		case 11:return 16;break;
		case 10:return 32;break;
		case 9:return 64;break;
		case 8:return 128;break;	
		case 7:return 256;break;
		case 6:return 512;break;
		case 5:return 1024;break;
		case 4:return 2048;break;			
		case 3:return 4096;break;
		case 2:return 8192;break;
		case 1:return 16384;break;
		case 0:return 32768;break;
		default:break;
	}
}

void scalewave()
{
	idata uchar i=0;
	do
	{
//		wave[i]=wave[i]*3/16;
		wave[i]=(uchar)(wave[i]*3.0/16.0);
		i--;
	}
	while(i!=0);
}

void showwave()
{
	idata uchar i,c2;
	write_code(0x36);
	for(i=0;i<128;i++)
	{
		dot(i,wave[i]);
		if(i%2==1)
			dot(i,0);
		if(i>0&&wave[i]>wave[i-1])
		{
			for(c2=wave[i]-wave[i-1];c2>0;c2--)
				dot(i-1,wave[i-1]+c2);
		}
		else if(i>0&&wave[i]<wave[i-1])
		{
			for(c2=wave[i-1]-wave[i];c2>=0&&c2!=255;c2--)
				dot(i-1,wave[i]+c2);
		}		
	}

}

void storewave()
{
	idata uchar i;
	for(i=0;i<128;i++)
	{
		wave[i]=127*sin(i/32.0*3.1416)+127;//正弦波
//		wave[i]=i%20/10*160+30;
	}
}


void clrscreen()
{
	idata uchar i,j;
	write_code(0x36);
	for(i=0;i<16;i++)
	{
		for(j=0;j<32;j++)
		{
			write_code(0x80+j);
			write_code(0x80+i);
			write_data(0);
			write_data(0);
		}
	}
}

uchar read()
{
  	idata uchar dat;
	while(fbusy());   
	rs=1;;
    rw=1; 
	_nop_();
  	e=1;  
	_nop_();	
  	dat=P0;
  	e=0;
  	return dat;
}

uint readgdram(uchar x,uchar y)
{
  	idata uint dat= 0;
   	write_code(0x34);
	locatexy(x,y);
  	read();                                     //先预读一次
  	dat=read();               //读设定地址高字节数据
  	dat=dat<<8|read();          //读设定地址低字节数据
  	write_code(0x36);          
//  	write_code(0x30);
  	return dat;  
} 

void locatexy(uchar x,uchar y)
{
  	write_code(y|0x80);          //设定GDRAM地址
	write_code(x|0x80);
}

void dot(uchar x,uchar y)
{
	idata uchar low;
	idata uint pre;

	write_code(0x36);
	if(y<16)
		low=1;
	else
		low=0;
	write_code(0x80+(47-y)%32);
	write_code(0x80+x/16+8*low);
	pre=readgdram(0x80+x/16+8*low,0x80+(47-y)%32);
	write_code(0x80+(47-y)%32);
	write_code(0x80+x/16+8*low);
	write_data((char)((r_power2(x%16)|pre)>>8));
	write_data((char)r_power2(x%16)|pre);
}
	
void wipedot(uchar x,uchar y)
{
	idata uchar low;
	idata uint pre;

	write_code(0x36);
	if(y<16)
		low=1;
	else
		low=0;
	write_code(0x80+(47-y)%32);
	write_code(0x80+x/16+8*low);
	pre=readgdram(0x80+x/16+8*low,0x80+(47-y)%32);
	write_code(0x80+(47-y)%32);
	write_code(0x80+x/16+8*low);
	write_data((~(char)(r_power2(x%16)>>8))&(pre>>8));
	write_data((~(char)r_power2(x%16))&pre);
}

void drawtline()
{
	uchar i;
	for(i=1;i<48;i++)
		if(i%2==1)
			dot(tline,i);
}
void wipetline()
{
	uchar i,c2;
	for(i=1;i<48;i++)
		wipedot(tline,i);
	dot(tline,wave[tline]);

	for(i=tline-1;i<=tline+1;i++)
	{
		dot(i,wave[i]);
		if(i%2==1)
			dot(i,0);
		if(i>0&&wave[i]>wave[i-1])
		{
			for(c2=wave[i]-wave[i-1];c2>0;c2--)
				dot(i-1,wave[i-1]+c2);
		}
		else if(i>0&&wave[i]<wave[i-1])
		{
			for(c2=wave[i-1]-wave[i];c2>=0&&c2!=255;c2--)
				dot(i-1,wave[i]+c2);
		}		
	}
}


void drawvline()
{
	uchar i;
	for(i=0;i<128;i++)
		if(i%2==1)
			dot(i,vline);
}
void wipevline()
{
	uchar i,c2,i2;
	for(i=0;i<128;i++)
	{
		wipedot(i,vline);
		if(wave[i]==vline||(i-vline)==1||(vline-i)==1)
		{
			dot(i,wave[i]);
			for(i2=i-1;i2<=i+1;i2++)
			{
				dot(i2,wave[i2]);
				if(i2%2==1)
					dot(i,0);
				if(i>0&&wave[i2]>wave[i2-1])
				{
					for(c2=wave[i2]-wave[i2-1];c2>0;c2--)
						dot(i2-1,wave[i2-1]+c2);
				}
				else if(i2>0&&wave[i2]<wave[i2-1])
				{
					for(c2=wave[i2-1]-wave[i2];c2>=0&&c2!=255;c2--)
						dot(i2-1,wave[i2]+c2);
				}		
			}
		}
	}
}

void sininterpolation()
{
	const uchar N=20; 
//	const uchar N=10; 
	const float pi=3.14159265358;
//	const float x[20]={0,0.8,0.9,0.7,0.75,0.85,0.75,0.7,0.9,0.75,0,-0.8,-0.9,-0.7,-0.75,-0.85,-0.75,-0.7,-0.9,-0.8}; 
//	const float x[20]={0.049,0.38,0.671,0.8819,0.989,0.98,0.8577,0.634,0.3368,0,-0.3368,-0.634,-0.857,-0.98,-0.989,-0.88,-0.67,-0.3826,-0.0490,0}; 
//	const float x[10]={0.049,0.671,0.989,0.8577,0.3368,-0.3368,-0.857,-0.989,-0.67,-0.0490}; 
	uchar x[20]={127,197,244,251,216,151,78,21,0,21,78,151,216,251,244,197,126,56,9,2};

	idata float t=0.01;
	idata float xt;
	idata uint i2,i1;

	for (i2=0;i2<128;i2++)
	{
    	xt=0;
		for(i1=0;i1<N;i1++)
		{
			if(x[i1]==0)
				x[i1]=1;//本不应如此,但可避免当它为0时产生的突变。
  			xt=xt+(float)x[i1]*power((-1),i1)*(sin(t*pi)/(N*2)*power((-1),(N+1))*tan(pi*(t-(i1))/(N*2))+sin(t*pi)/(N*2)/tan(pi*(t-i1)/(N*2)));
		}
//      xx(i2)=t;
//     	wave[i2]=(uchar)(xt*127.0+127);
     	wave[i2]=xt;
     	t=t+N/128.0; 
	}
}


void lininterpolation()
{
//	const uchar N=20; 
//	const float x[20]={0.049,0.38,0.671,0.8819,0.989,0.98,0.8577,0.634,0.3368,0,-0.3368,-0.634,-0.857,-0.98,-0.989,-0.88,-0.67,-0.3826,-0.0490}; 
//	idata float t=0.01;
//	const float x[20]={0,0.8,0.9,0.7,0.75,0.85,0.75,0.7,0.9,0.75,0,-0.8,-0.9,-0.7,-0.75,-0.85,-0.75,-0.7,-0.9,-0.8}; 
//	idata uchar x[20]={128,165,199,226,246,255,253,240,218,188,152,115,79,46,21,5,1,5,21,46};
	idata uchar x[20]={128,165,199,226,246,255,253,240,218,188,152,115,79,46,21,5,1,5,21,46};
	
//	idata uchar x[10]={128,199,246,253,218,152,79,21,1,21};
//	idata uchar x[11]={127,244,216,78,0,78,216,244,126,9,37};
	idata uchar i2;
//	idata uchar x[20];
//	for(i2=0;i2<20;i2++)
//		x[i2]=x[i2]*127.0+127;
	for (i2=0;i2<114;i2++)//一周期20个点
	{
		if(i2%6==0)
			wave[i2]=x[i2/6];
	    else if(x[i2/6]<=x[i2/6+1])
			wave[i2]=x[i2/6]+(float)((x[i2/6+1]-x[i2/6])*(i2%6)/6.0);
		else if(x[i2/6]>x[i2/6+1])
			wave[i2]=x[i2/6]-(float)((x[i2/6]-x[i2/6+1])*(i2%6)/6.0);
	}

/*	for (i2=0;i2<120;i2++)//一周期10个点
	{
		if(i2%12==0)
			wave[i2]=x[i2/12];
	    else if(x[i2/12]<=x[i2/12+1])
			wave[i2]=x[i2/12]+(float)((x[i2/12+1]-x[i2/12])*(i2%12)/12.0);
		else if(x[i2/12]>x[i2/6+1])
			wave[i2]=x[i2/12]-(float)((x[i2/12]-x[i2/12+1])*(i2%12)/12.0);
	}*/

//	wave[115]=wave[114]=wave[116]=wave[117]=wave[118]=wave[119]=wave[120]=wave[121]=wave[122]=wave[123]=wave[124]=wave[125]=wave[126]=wave[127]=128;
}


float power(float x,uchar n)
{
	idata float y=1;
	uchar i;
	for(i=0;i<n;i++)
		y*=x;
	return y;
}

void drawline(uchar x1,uchar y1,uchar x2,uchar y2)
{
	uchar x;
	if(x1>=x2&&y1>=y2)
		for(x=x2;x<=x1;x++)
			dot(x,y1-(float)(y1-y2)*(x-x2)/(x1-x2));
	else if(x1>=x2&&y1<y2)
		for(x=x2;x<=x1;x++)
			dot(x,y2-(float)(y2-y1)*(x-x2)/(x1-x2));
	else if(x1<x2&&y1>=y2)
		for(x=x1;x<=x2;x++)
			dot(x,y2+(float)(y1-y2)*(x-x1)/(x2-x1));
	else if(x1<x2&&y1<y2)
		for(x=x1;x<=x2;x++)
			dot(x,y1+(float)((y2-y1)*(x-x1))/(x2-x1));
}


//	i=readgdram(8,14);
//	locatexy(8,14);
//	i|=0xffff;	
//	write_data((char)(i>>8));
//	write_data((char)i);


//	drawline(0,0,127,47);
//	drawline(127,47,0,0);		drawline(0,20,20,0);	drawline(20,0,0,20);

⌨️ 快捷键说明

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