📄 12864_parellel.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 + -