📄 drawing_line.c
字号:
#include"reg51.h"
#include<drive_functions.h>
#include<math.h>
#define Graphic_Clear 0x01 //檫除点
#define Graphic_Not 0x02 //反相点
#define Graphic_Draw 0x03 //画点
uchar j=0,i=0;
uchar r=32;
uchar xdata zhengxuan[]= {
0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32, 0x34,
0x36, 0x39, 0x3A, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F,
0x3F, 0x3F, 0x3F, 0x3E, 0x3D, 0x3B, 0x39, 0x37,
0x35, 0x33, 0x30, 0x2D, 0x2A, 0x27, 0x24, 0x21,
0x1E, 0x1A, 0x17, 0x14, 0x11, 0x0F, 0x0C, 0x09,
0x07, 0x05, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x02, 0x03, 0x05, 0x07, 0x09,
0x0B, 0x0E, 0x11, 0x14, 0x17, 0x1A, 0x1D, 0x20
} ;
/***********************在LCD上任意坐标画点********************************/
void DrawPoint(uchar X,uchar Y,uchar Type)
{ //X,Y化点的坐标Type画点的类型:反相点,檫除点,画点
uchar DX = (Y >> 3); //计算出属于哪个字节
uchar BX = Y - (DX << 3); //计算出属于字节哪一位
uchar TempData = 0;
if (X > 63)
{
chip_select=2;
X -= 64;
}
else
{
chip_select=1;
}
SetPage(DX); //设行地址
SetColumn(X); //设列地址
TempData = ReadData(); //读出所画点所在字节的内容
switch (Type) //对该字节进行相应操作
{
case Graphic_Clear:
TempData &= ~(1<< BX);
break;
case Graphic_Not:
TempData ^= (1<< BX);
break;
case Graphic_Draw:
TempData |= ( 1<< BX);
break;
default: break;
}
SetPage(DX); //设置行地址
SetColumn(X); //设置列地址
WriteData(TempData); //把修改后的字节送回LCD,达到画点目的
}
/********插值法画任意两点之间直线的函数,函数中只用加减法,程序运行效率很高**********/
DrawLine(uchar x1,uchar y1,uchar x2,uchar y2)
{ //x1,y1起点坐标;x2,y2终点坐标;
uchar x,y;
uchar d_x,d_y;
char err=0;
uchar temp=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,Graphic_Draw);
}
else
{
if(x2>=x1){temp=1;d_x=x2-x1;}else d_x=x1-x2;
x=x1;y=y1;DrawPoint(x,y,Graphic_Draw);
if(temp&&(d_y<=d_x))
while(x!=x2)
{if(err<0){x=x+1;err=err+(y2-y);}
else {x=x+1;y=y+1;err=err+(y2-y)-(x2-x);}
DrawPoint(x,y,Graphic_Draw);
}
else if(temp&&(d_y>d_x))
while(y!=y2)
{d_x=x2-x;d_y=y2-y;
if(err<0){x=x+1;y=y+1;err=err+d_y-d_x;}
else {y=y+1;err=err-d_x;}
DrawPoint(x,y,Graphic_Draw);
}
else if(!temp&&(d_y<=d_x))
while(x!=x2)
{d_x=x-x2;d_y=y2-y;
if(err<0){x=x-1;err=err+d_y;}
else {x=x-1;y=y+1;err=err+d_y-d_x;}
DrawPoint(x,y,Graphic_Draw);
}
else if(!temp &&(d_y>d_x))
while(y!=y2)
{d_x=x-x2;d_y=y2-y;
if(err<0){x=x-1;y=y+1;err=err+d_y-d_x;}
else {y=y+1;err=err-d_x;}
DrawPoint(x,y,Graphic_Draw);
}
}
}
/***********************************************************************/
void DrawLevel(void)
{
for(i=0;i<127;i++){DrawPoint(i,32,Graphic_Draw);}//画水平直线
}
/************************************************************************************/
void DrawSineWave(void)
{
uchar xn=0;
uchar yn=32;
uchar i,j;
uchar xi,yi;
P27=1;
for(i=0;i<127;i++)
{
xi=i;
j=i;
if(j>63)
{
ACC=zhengxuan[j-64];
yi=ACC;
}
else
{
ACC=zhengxuan[j];
yi=ACC;
}
P27=1;
DrawLine(xn,yn,xi,yi);
P27=1;
xn=i;
yn=yi;
}
}
/********************** main **********************************************************/
void main(void)
{
P2=0;
P27=1;
while(1)
{
DrawSineWave();
ClearLCD();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -