#include "tft.h"
/*函数的功能是从上向下显示一幅图片*/
void pic_up_to_dowm(uint x_start,uint y_start,uint x_end,uint y_end,uchar *p)
{
uint i;
/*设置GRAM的大小*/
tft_set_ram_addr(x_start,y_start,x_end,y_end);
wr_reg_data(0x0003,0x1030); //SRAM contrl,从上向下扫描
wr_reg_data(0x0020,x_start); //设定写第一个数据的起始x坐标
wr_reg_data(0x0021,y_start); //设定写第一个数据的起始y坐标
wr_cmd_data(TFT_COMD,0x0022);
for(i=0;i<(x_end-x_start+1)*(y_end-y_start+1);i++)
{
wr_onebyte_data(p[2*i+1]);
wr_onebyte_data(p[2*i]);
}
}
/*函数的功能是从左向右显示一幅图片*/
void pic_left_to_right(uint x_start,uint y_start,uint x_end,uint y_end,uchar *p)
{
uint i;
/*设置GRAM的大小*/
tft_set_ram_addr(x_start,y_start,x_end,y_end);
wr_reg_data(0x0003,0x1038); //SRAM contrl,从左向右扫描
wr_reg_data(0x0020,x_start); //设定写第一个数据的起始x坐标
wr_reg_data(0x0021,y_start); //设定写第一个数据的起始y坐标
wr_cmd_data(TFT_COMD,0x0022);
for(i=0;i<(x_end-x_start+1)*(y_end-y_start+1)*2;i++)
wr_onebyte_data(p[256*((i/2)%128)+2*(i/256)+(i+1)%2]);
}
/*函数的功能是从下向上显示一幅图片*/
void pic_down_to_up(uint x_start,uint y_start,uint x_end,uint y_end,uchar *p)
{
uint i;
/*设置GRAM的大小*/
tft_set_ram_addr(x_start,y_start,x_end,y_end);
wr_reg_data(0x0003,0x1000); //SRAM contrl,从下向上扫描
wr_reg_data(0x0020,x_end); //设定写第一个数据的起始x坐标
wr_reg_data(0x0021,y_end); //设定写第一个数据的起始y坐标
wr_cmd_data(TFT_COMD,0x0022);
for(i=0;i<(x_end-x_start+1)*(y_end-y_start+1)*2;i++)
{
wr_onebyte_data(p[(x_end-x_start+1)*(y_end-y_start+1)*2-i-1]);
}
}
/*函数的功能是从右向左显示一幅图片*/
void pic_right_to_left(uint x_start,uint y_start,uint x_end,uint y_end,uchar *p)
{
uint i;
/*设置GRAM的大小*/
tft_set_ram_addr(x_start,y_start,x_end,y_end);
wr_reg_data(0x0003,0x1028); //SRAM contrl,从右向左扫描
wr_reg_data(0x0020,x_end); //设定写第一个数据的起始x坐标
wr_reg_data(0x0021,y_start); //设定写第一个数据的起始y坐标
wr_cmd_data(TFT_COMD,0x0022);
for(i=0;i<(x_end-x_start+1)*(y_end-y_start+1)*2;i++)
{
wr_onebyte_data(p[256-2*(i/256)+256*((i/2)%128)-2+(i+1)%2]);
}
}
/*函数的功能是在特定的位置显示一个点,(x,y)是点的位置*/
void get_point(uint x,uint y,uint colour)
{
tft_set_ram_addr(x,y,x,y); //设置点的位置
wr_reg_data(0x0020,x); //设定写第一个数据的起始x坐标
wr_reg_data(0x0021,y); //设定写第一个数据的起始y坐标
wr_cmd_data(TFT_COMD,0x0022);
wr_cmd_data(TFT_DATA,colour); //设置点的颜色
}
/*函数的功能是绘制横线,(x,y)是横线的起始
坐标,L是横线的长度,colour是横线的颜色*/
void h_line(uint x,uint y,uint L,uint colour)
{
tft_set_ram_addr(x,y,L+x-1,y);
wr_reg_data(0x0020,x); //设定写第一个数据的起始x坐标
wr_reg_data(0x0021,y); //设定写第一个数据的起始y坐标
wr_cmd_data(TFT_COMD,0x0022);
while((L--)!=0)
wr_cmd_data(TFT_DATA,colour); //设置线的颜色
}
/*函数的功能是绘制竖线,(x,y)是竖线的起始
坐标,L是横线的长度,colour是数线的颜色*/
void v_line(uint x,uint y,uint L,uint colour)
{
tft_set_ram_addr(x,y,x,y+L-1);
wr_reg_data(0x0020,x); //设定写第一个数据的起始x坐标
wr_reg_data(0x0021,y); //设定写第一个数据的起始y坐标
wr_cmd_data(TFT_COMD,0x0022);
while((L--)!=0)
wr_cmd_data(TFT_DATA,colour); //设置线的颜色
}
/*函数的功能是在两点之间画一条直线*/
void line(uint x_start,uint y_start,uint x_end,uint y_end,uint colour)
{
uint t,row,col,xerr=0,yerr=0,distance;
int dx,dy;
char incx,incy;
dx=x_end-x_start; //计算横坐标增量
dy=y_end-y_start; //计算纵坐标增量
col=x_start;
row=y_start;
if(dx>0) incx=1; //设置单步方向
else
{
if(dx==0) incx=0; //垂直线
else
{
incx=-1;
dx=-dx;
}
}
if(dy>0)incy=1;
else
{
if(dy==0) incy=0;//水平线
else
{
incy=-1;
dy=-dy;
}
}
if(dx>dy) distance=dx;//选取基本增量坐标轴
else distance=dy;
for(t=0;t<=distance+1;t++)
{
xerr+=dx;
yerr+=dy;
if(xerr>distance)
{
xerr-=distance;
col+=incx;
}
if(yerr>distance)
{
yerr-=distance;
row+=incy;
}
get_point(col, row, colour); //画点连线
}
}
/*******************************************
bresenham算法画直线,(x_start,y_start)是直
线的起点坐标,(x_end,y_end)是直线的终点坐标
*******************************************/
void draw_line(uint x_start,uint y_start,uint x_end,uint y_end,uint colour)
{
bit change;
char incx,incy;
uint i,x,y,temp;
int p,dx,dy;
x=x_start;
y=y_start;
dx=x_end-x_start;
dy=y_end-y_start;
if(dx<0) dx=-dx;
if(dy<0) dy=-dy;
if(x_end>x_start) incx=1;
else incx=-1;
if(y_end>y_start) incy=1;
else incy=-1;
if(dy>dx)
{
temp=dx;
dx=dy;
dy=temp;
change=1;
}
else change=0;
p=2*dy-dx;
for(i=1;i<=dx;i++)
{
get_point(x,y,colour);
if(p>=0)
{
if(change==0) y=y+incy;
else x=x+incx;
p=p-2*dx;
}
if(change==0) x=x+incx;
else y=y+incy;
p=p+2*dy;
}
}
/*函数的功能是显示一个矩形,colour为矩形框的背景色*/
void rectengle(uint x_start,uint y_start,uint x_end,uint y_end,uint colour)
{
uint i;
/*设置GRAM的大小*/
tft_set_ram_addr(x_start,x_end,y_start,y_end);
wr_reg_data(0x0003,0x1030); //SRAM contrl,从下向上扫描
wr_reg_data(0x0020,x_start); //设定写第一个数据的起始x坐标
wr_reg_data(0x0021,y_start); //设定写第一个数据的起始y坐标
wr_cmd_data(TFT_COMD,0x0022);
for(i=0;i<(x_end-x_start+1)*(y_end-y_start+1);i++)
wr_cmd_data(TFT_DATA,colour);
}
/********************************************************
bresenham算法画实心圆,(x,y)是圆心的坐标,r是圆的半径
surround_colour是圆边沿的颜色,fill_colour是圆的填充颜色
*********************************************************/
void fill_circle(uint x,uint y,uchar r,uint surround_colour,fill_colour)
{
uchar yi=r,j,k;
uint i=0;
int dh,dl;
for(j=0;j<r;j++)
{
for(k=0;k<r;k++)
{
if((j*j+k*k)<r*r)
{
get_point(x-j,y+k,fill_colour);
get_point(2*x-(x-j),y+k,fill_colour);
get_point(2*x-(x-j),2*y-(y+k),fill_colour);
get_point(x-j,2*y-(y+k),fill_colour);
}
}
}
while(i<=yi)
{
dh=i*i+yi*yi-r*r;
if(dh<0) dh=-dh;
dl=i*i+(yi-1)*(yi-1)-r*r;
if(dl<0) dl=-dl;
if(dh>=dl) yi--;
get_point(x+i,y+yi,surround_colour);
get_point(y+yi+x-y,x+i+y-x,surround_colour);
get_point(y+yi+x-y,x+y-(x+i),surround_colour);
get_point(x+i,2*y-(y+yi),surround_colour);
get_point(2*x-(x+i),2*y-(y+yi),surround_colour);
get_point(x+y-(y+yi),x+y-(x+i),surround_colour);
get_point(x+y-(y+yi),y-x+x+i,surround_colour);
get_point(2*x-(x+i),y+yi,surround_colour);
i++;
}
}
/********************************************************
bresenham算法画空心圆,(x,y)是圆心的坐标,
r是圆的半径,surround_colour是圆的填充边沿颜色
*********************************************************/
void empty_circle(uint x,uint y,uchar r,uint surround_colour,fill_colour)
{
uchar yi=r;
uint i=0;
int dh,dl;
while(i<=yi)
{
dh=i*i+yi*yi-r*r;
if(dh<0) dh=-dh;
dl=i*i+(yi-1)*(yi-1)-r*r;
if(dl<0) dl=-dl;
if(dh>=dl) yi--;
get_point(x+i,y+yi,surround_colour);
get_point(y+yi+x-y,x+i+y-x,surround_colour);
get_point(y+yi+x-y,x+y-(x+i),surround_colour);
get_point(x+i,2*y-(y+yi),surround_colour);
get_point(2*x-(x+i),2*y-(y+yi),surround_colour);
get_point(x+y-(y+yi),x+y-(x+i),surround_colour);
get_point(x+y-(y+yi),y-x+x+i,surround_colour);
get_point(2*x-(x+i),y+yi,surround_colour);
i++;
}
}
/****