LCD12864画点画线画圆画正弦波Word文档下载推荐.docx
《LCD12864画点画线画圆画正弦波Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《LCD12864画点画线画圆画正弦波Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
{
LCD=0xff;
//P0设置为输入
e=1;
//给使能信号
dat=0x80&
LCD;
//只判断DB7位的状态
e=0;
}
while(dat==0x80);
//忙则继续检测
voidlcdWrite(bitml,ucharzifu)
checkBusy();
rs=ml;
rw=0;
P0=zifu;
e=1;
delay
(1);
e=0;
voidClearLCD(ucharzifu)
uchari,j;
lcdWrite(0,0x3f);
cs1=1;
cs2=1;
for(i=0;
i<
8;
i++)
lcdWrite(0,0xb8+i);
lcdWrite(0,0xc0);
lcdWrite(0,0x40);
for(j=0;
j<
64;
j++)
{
lcdWrite(1,zifu);
}
voidinitLCD()//初始化
lcdWrite(0,0x3e);
//关显示
//开显示
ClearLCD(0x0f);
//清屏
/*液晶显示函数*/
/*x和y来控制显示的位置,x为行,y为列,x1和y1为字的像素行数,x2为显示几行,y2为显示几个字数*/
voidjis(ucharx,uchary,ucharx1,uchary1,ucharx2,uchary2,ucharcode*hz)
uchari,j,k,l,a;
x2;
y2;
for(k=0;
k<
x1;
k++)
{
lcdWrite(0,0xb8+x+i*x1+k);
lcdWrite(0,0xc0);
lcdWrite(0,0x40+y+j*y1);
a=i*x1*y1*y2+j*x1*y1+k*y1;
for(l=0;
l<
y1;
l++)
{
lcdWrite(1,hz[a+l]);
}
}
/*****************************writedata************************/
voidWriteData(uchardsp_data)
if(chip_select==1)
cs1=1;
cs2=0;
else
cs1=0;
cs2=1;
lcdWrite(1,dsp_data);
/****************************readdata***********************/
ucharReadData(void)
uchardsp_data;
LCD=0xFF;
rs=1;
//E的下降沿,然后E持续拉高读才有效
dsp_data=LCD;
return(dsp_data);
ucharj=0,i=0;
ucharr=32;
ucharcodehz[]=
0x20,0x30,0xAC,0x63,0x10,0x00,0x40,0x20,0x58,0x47,0x44,0x48,0x50,0x20,0x20,0x00,
0x22,0x23,0x22,0x12,0x12,0x00,0x42,0x62,0x5A,0x46,0x42,0x42,0x52,0xE2,0x42,0x00,/*"
绘"
0*/
0x00,0xFE,0x42,0x42,0x22,0x1E,0xAA,0x4A,0xAA,0x9A,0x0A,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x42,0x42,0x41,0x41,0x48,0x72,0x54,0x40,0x41,0x43,0x41,0xFF,0x00,0x00,/*"
图"
1*/
0x10,0x21,0x86,0x60,0x00,0x0C,0xD4,0x54,0x55,0xF6,0x54,0x54,0xD4,0x0C,0x04,0x00,
0x04,0xFC,0x03,0x00,0x00,0x00,0x8F,0x69,0x09,0x0F,0x09,0x29,0xCF,0x00,0x00,0x00,/*"
演"
2*/
0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00,
0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00,/*"
示"
3*/
};
/***********************在LCD上任意坐标画点********************************/
voidDrawPoint(ucharX,ucharY,ucharType)
//X,Y化点的坐标Type画点的类型:
2反相点,0檫除点,1画点
ucharDX=(Y>
>
3);
//计算出属于哪个字节
ucharBX=Y-(DX<
<
//计算出属于字节哪一位
ucharTempData=0;
if(X>
63)
chip_select=2;
X-=64;
else
chip_select=1;
lcdWrite(0,0xb8+DX);
//设行地址
lcdWrite(0,0x40+X);
//设列地址
TempData=ReadData();
//读出所画点所在字节的内容
switch(Type)//对该字节进行相应操作
case0:
TempData&
=~(1<
BX);
//擦除
break;
case1:
TempData|=(1<
BX);
//画点
case2:
TempData^=(1<
//反相
lcdWrite(0,0xb8+DX);
WriteData(TempData);
//把修改后的字节送回LCD,达到画点目的
/********插值法画任意两点之间直线的函数,函数中只用加减法,程序运行效率很高**********/
DrawLine(ucharx1,uchary1,ucharx2,uchary2)
//x1,y1起点坐标;
x2,y2终点坐标;
ucharx,y;
uchard_x,d_y;
charerr=0;
uchartemp=0;
if(y2<
y1)
x=x1;
y=y1;
x1=x2;
y1=y2;
x2=x;
y2=y;
d_y=y2-y1;
if(d_y==0)
if(x1>
x2)
x=x1;
x1=x2;
x2=x;
for(x=x1;
x<
=x2;
x++)DrawPoint(x,y1,1);
if(x2>
=x1)
temp=1;
d_x=x2-x1;
elsed_x=x1-x2;
DrawPoint(x,y,1);
if(temp&
&
(d_y<
=d_x))
while(x!
=x2)
if(err<
0)
x=x+1;
err=err+(y2-y);
else
y=y+1;
err=err+(y2-y)-(x2-x);
DrawPoint(x,y,1);
elseif(temp&
(d_y>
d_x))
while(y!
=y2)
d_x=x2-x;
d_y=y2-y;
err=err+d_y-d_x;
err=err-d_x;
elseif(!
temp&
d_x=x-x2;
x=x-1;
err=err+d_y;
temp&
/***********************************************************************/
voidDrawLevel(void)
127;
DrawPoint(i,32,1);
//画水平直线
/************************************************************************************/
voidDrawSineWave(void)
ucharxn=0;
ucharyn=32;
uchari;
ucharxi,yi;
xi=i;
yi=(sin(i*0.1)*32)+32;
DrawLine(xn,yn,xi,yi);
//在一系列零散的点上,两点两点之间连线,从而得到一条曲线
xn=i;
yn=yi;
/*************************************************************************************/
voidDrawCircle(ucharx0,uchary0,ucharr)//x0,y0为圆心坐标,r为圆半径
ucharxn,yn,xi,yi;
unsignedintj;
xn=cos(0)*r+x0;
yn=sin(0)*r+y0;
for(j=0;
630;
xi=(cos(j*0.01)*r)+x0;
yi=(sin(j*0.01)*r)+y0;
xn=xi;
/**************************************************************************************************/
voidDrawRetic(ucharx0,uchary0,ucharx1,uchary1)//画正方形,x0,y0为左上角坐标,x1,y1为右下角坐标
DrawLine(x0,y0,x1,y0);
DrawLine(x0,y0,x0,y1);
DrawLine(x1,y0,x1,y1);
DrawLine(x0,y1,x1,y1);
/*uchari;
=x1-x0;
DrawPoint(x0+i,y0,1);
DrawPoint(x0+i,y1,1);
=y1-y0;
DrawPoint(x0,y0+i,1);
DrawPoint(x1,y0+i,1);
}*/
voidDrawTrigle(ucharx1,uchary1,ucharx2,uchary2,ucharx3,uchary3)//画三角形,三个坐标为三角形顶点
DrawLine(x1,y1,x2,y2);
DrawLine(x2,y2,x3,y3);
DrawLine(x1,y1,x3,y3);
/********************************main**********************************************************/
voidmain(void)
initLCD();
while
(1)
ClearLCD(0x00);
jis(0,32,2,16,1,2,hz);
cs2=1;
jis(0,0,2,16,1,2,hz+2*32);
DrawLine(0,63,127,0);
DrawRetic(10,10,100,50);
DrawTrigle(63,17,20,60,100,60);
DrawLevel();
DrawSineWave();
DrawCircle(63,32,r);
r-=4;
if(r<
8)
r=32;