#include<at89x52.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sfr DB=0x90;
sbit LcdBusy=P2^0;
sbit LcdReq=P2^1;
sbit LcdRes=P2^2;
uchar code asc[]={
0xF0,0xF8,0x0C,0xC4,0x0C,0xF8,0xF0,0x00,0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00,
0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,
0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,
0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,
0x7C,0x7C,0x44,0x44,0x44,0xC4,0x84,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,
0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,
0xE0,0xF0,0x98,0x8C,0x98,0xF0,0xE0,0x00,0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,
0x04,0xFC,0xFC,0x44,0x44,0xFC,0xB8,0x00,0x08,0x0F,0x0F,0x08,0x08,0x0F,0x07,0x00,
0xF0,0xF8,0x0C,0x04,0x04,0x0C,0x18,0x00,0x03,0x07,0x0C,0x08,0x08,0x0C,0x06,0x00,
0x04,0xFC,0xFC,0x04,0x0C,0xF8,0xF0,0x00,0x08,0x0F,0x0F,0x08,0x0C,0x07,0x03,0x00,
0x04,0xFC,0xFC,0x44,0xE4,0x0C,0x1C,0x00,0x08,0x0F,0x0F,0x08,0x08,0x0C,0x0E,0x00,
0x04,0xFC,0xFC,0x44,0xE4,0x0C,0x1C,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00
};
uchar code px[]={40,65,40,15};
uchar code py[]={5,30,55,30};
uchar tt=0;
void LcdWrite(uchar Data);
void delay_nus(uchar n)
{
while(n--)
{_nop_();}
}
void delay_nms(uchar n)
{uchar i,j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}
void LcdClear()
{
LcdWrite(0xf4);
delay_nus(10);
}
void LcdInit()
{
LcdReq=0;
LcdBusy=1;
LcdClear();
LcdRes=0;
delay_nms(1);
LcdRes=1;
}
void LcdWrite(uchar Data)
{
while(LcdBusy);
DB=Data;
delay_nus(3);
LcdReq=1;
delay_nus(3);
while(!LcdBusy);
LcdReq=0;
}
void PrintStr8_16(uchar x,uchar y,uchar *s)
{ x=x+4;
while((*s)!=0)
{
LcdWrite(0xf9);
LcdWrite(x);
LcdWrite(y);
LcdWrite(*s);
s++;
if(x<19) x++;
else
{x=0x04;
y+=16;
}
}
}
void PrintCN(uchar x,uchar y,uchar *hanzi)
{
x+=2;
while((*hanzi)!=0)
{
LcdWrite(0xf0);
LcdWrite(x);
LcdWrite(y);
LcdWrite(*hanzi-0xa0);
hanzi++;
LcdWrite(*hanzi-0xa0);
hanzi++;
if(x<0x09) x++;
else
{
x=0x02;
y++;
}
}
}
void PrintStr8_8(uchar x,uchar y,uchar *s)
{
x+=4;
while((*s)!=0)
{
LcdWrite(0xf1);
LcdWrite(x);
LcdWrite(y);
LcdWrite(*s);
s++;
if(x<19) x++;
else
{x=0x04;
y+=8;
}
}
}
void Point(uchar x,uchar y)
{
LcdWrite(0xf2);
LcdWrite(x+0x20);
LcdWrite(y);
}
void Line(uchar x1,uchar y1,uchar x2,uchar y2)
{
uchar t;
signed int xerr=0,yerr=0;
signed int delta_x,delta_y,distance;
signed char incx,incy;
/* 计算两个方向的长度 */
delta_x=x2-x1;
delta_y=y2-y1;
/* 计算增量的方向,增量为"0"表示为垂直或水平线 */
if(delta_x>0)
incx=1;
else
{
if(delta_x==0)
incx=0;
else
{
incx=-1;
delta_x =-delta_x;
}
}
if(delta_y>0)
incy=1;
else
{
if( delta_y==0 )
incy=0;
else
{
incy=-1;
delta_y =-delta_y;
}
}
/* 确定画线的范围 */
if( delta_x > delta_y ) distance=delta_x;
else distance=delta_y;
/* 画线 */
for(t=0;t<= distance+1;t++)
{
LcdWrite(0xf2);
LcdWrite(x1+0x20);
LcdWrite(y1);
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
x1+=incx;
}
if( yerr > distance )
{
yerr-=distance;
y1+=incy;
}
}
}
void Displaybmp(uchar x,uchar y,uchar h,uchar w,uchar *bmp_p)
{
uchar i,j;
x+=4;
for(j=0;j<h;j++)
{
for(i=0;i<w;i++)
{
LcdWrite(0xf3);
LcdWrite(x);
LcdWrite(y);
LcdWrite(*bmp_p);
bmp_p++;
x++;
}
x-=w;
y++;
}
}
void Drawline(uchar x1,uchar y1,uchar x2,uchar y2)
{
uchar t;
uint a11,a21,a31,a12,a22,a32,b11,b21,b31,b12,b22,b32;
signed int xerr=0,yerr=0;
signed int delta_x,delta_y,distance;
signed char incx,incy;
uchar p[2][4];
int L1,L2,L3;
/* 计算两个方向的长度 */
delta_x=x2-x1;
delta_y=y2-y1;
/* 计算增量的方向,增量为"0"表示为垂直或水平线 */
if(delta_x>0)
incx=1;
else
{
if(delta_x==0)
incx=0;
else
{
incx=-1;
delta_x =-delta_x;
}
}
if(delta_y>0)
incy=1;
else
{
if( delta_y==0 )
incy=0;
else
{
incy=-1;
delta_y =-delta_y;
}
}
if( delta_x > delta_y ) distance=delta_x;
else distance=delta_y;
p[0][0]=x1;p[1][0]=y1;
p[0][1]=x1+incx; p[1][1]=y1;
p[0][2]=x1;p[1][2]=y1+incy;
p[0][3]=x1+incx;p[1][3]=y1+incy;
for(t=0;t<distance+1;t++)
{
LcdWrite(0xf2);
LcdWrite(p[0][0]+0x20);
LcdWrite(p[1][0]);
a11=abs(p[0][1]-x1);a21=abs(p[0][2]-x1);a31=abs(p[0][3]-x1);
b11=abs(p[1][1]-y1);b21=abs(p[1][2]-y1);b31=abs(p[1][3]-y1);
a12=abs(p[0][1]-x2);a22=abs(p[0][2]-x2);a32=abs(p[0][3]-x2);
b12=abs(p[1][1]-y2);b22=abs(p[1][2]-y2);b32=abs(p[1][3]-y2);
L1=a11*a11+b11*b11+a12*a12+b12*b12;
L2=a21*a21+b21*b21+a22*a22+b22*b22;
L3=a31*a31+b31*b31+a32*a32+b32*b32;
if((L1>L2)&&(L1>L3)) {p[0][0]=p[0][1];p[1][0]=p[1][1];}
else
{
if((L2>L1)&&(L2>L3)) {p[0][0]=p[0][2];p[1][0]=p[1][2];}
else {p[0][0]=p[0][3];p[1][0]=p[1][3];}
}
p[0][1]=p[0][0]+incx; p[1][1]=p[1][0];
p[0][2]=p[0][0];p[1][2]=p[1][0]+incy;
p[0][3]=p[0][0]+incx;p[1][3]=p[1][0]+incy;
}
}
void Circle(unsigned char x0,unsigned char y0,unsigned char r)
{
uchar x,y;
uint xx,rr,xt,yt,rs;
yt=r;
rr=r*r+1; //补偿 1 修正方形
rs=yt*3/4; //画8分之一圆弧
for (xt=0;xt<=rs;xt++)
{
xx=xt*xt;
while ((yt*yt)>(rr-xx)) yt--;
x=x0+xt; //第一象限
y=y0-yt;
Point(x,y);
x=x0-xt; //第二象限
Point(x,y);
y=y0+yt; //第三象限
Point(x,y);
x=x0+xt; //第四象限
Point(x,y);
/******45度镜象画另外8分之一圆弧******/
x=x0+yt; //第一象限
y=y0-xt;
Point(x,y);
x=x0-yt; //第二象限
Point(x,y);
y=y0+xt; //第三象限
Point(x,y);
x=x0+yt; //第四象限
Point(x,y);
}
}
void timer1() interrupt 1
{
uchar t=0;
TH0=0x3c;
TL0=0xb0;
t++;
if(t==20)
{t=0;
LcdClear();
// Point(40,30);
// Circle(40,30,25);
// Line(40,30,px[i],py[i]);
tt++;
if(tt>3) tt=0;
}
}
void main()
{
TMOD=0x01;
TH0=0X3c;
TL0=0Xb0;
EA=1;
ET0=1;
TR0=1;
LcdInit();
while(1)
{
//PrintStr8_16(0,0,"abcdswdsdfsdffsfsfsgwerqwer");
//PrintCN(0,2,"我的单片机");
//PrintStr8_8(0,0,"asdfdksldsdljfslkdjfsljsldsdfkj");
//Point(3,4);
//Line(0,0,127,63);
//Displaybmp(0,0,64,128,asc);
Drawline(0,0,63,60);
//Point(40,30);
// Circle(40,30,25);
// Line(40,30,px[tt],py[tt]);
}
}