📄 12864.c
字号:
void set_white(unsigned char y,unsigned char x,unsigned char end_x,unsigned char clear)
{
unsigned char i, j, white_x, white_y,white_end_x,clr_x,clr_y; //
white_end_x = (end_x-x+1);
white_end_x <<= 1;
Write_Cmd(0x36); //打开绘图模式
if(y==1)
{
white_x = (0x80+x-1);
white_y = 0x80;
clr_x = 0x80;
clr_y = 0x80;
}
else if(y==2)
{
white_x = (0x80+x-1);
white_y = 0x90;
clr_x = 0x80;
clr_y = 0x90;
}
else if(y==3)
{
white_x = (0x88+x-1);
white_y = 0x80;
clr_x = 0x88;
clr_y = 0x80;
}
else if(y==4)
{
white_x = (0x88+x-1);
white_y = 0x90;
clr_x = 0x88;
clr_y = 0x90;
}
if(clear==0) //要反白时,先将整行的液晶全部清成不反白(此处行指y)
{
for(i=0;i<16;i++ ) //16行
{
Write_Cmd(clr_y++); //设置绘图区的Y地址坐标0
Write_Cmd(clr_x); //设置绘图区的X地址坐标0
for(j=0;j<16;j++) //
{
Write_Data(0x00); //清成不反白
//nop();
}
}
}
//nop();
for(i=0;i<16;i++ ) //16行,因为是16*16汉字
{
Write_Cmd(white_y++); //设置绘图区的Y地址坐标0
Write_Cmd(white_x); //设置绘图区的X地址坐标0
for(j=0;j<white_end_x;j++) //
{
if(clear==1)
{
Write_Data(0x00); //取消这一行的8个点的反白,液晶地址自动加1
//(此处行指一个一个液晶点所组成的行)
}
else
{
Write_Data(0xff); //反白这一行的8个点,液晶地址自动加1
//(此处行指一个一个液晶点所组成的行)
}
// nop();
}
}
Write_Cmd(0x30); //回到基本模式
}
/**************************************************
函数名称:draw_dot
功 能:任意位置打点
参 数:坐标xy color 0反白 1复原
返回值 :无
**************************************************/
void draw_dot(unsigned char x,unsigned char y,unsigned char color)
{
unsigned char row,tier,tier_bit;
unsigned char read_old_h,read_old_l;
Write_Cmd(0x34);
Write_Cmd(0x36);
tier=x>>4;
tier_bit=x&0x0f;
if(y<32)
row=y;
else
{
row=y-32;
tier+=8;
}
Write_Cmd(row+0x80);
Write_Cmd(tier+0x80);
lcd_read_data();
read_old_h=lcd_read_data();
read_old_l=lcd_read_data();
Write_Cmd(row+0x80);
Write_Cmd(tier+0x80);
if(tier_bit<8)
{
switch(color)
{
case 0:read_old_h&=(~(0x01<<(7-tier_bit)));break;
case 1:read_old_h|=(0x01<<(7-tier_bit)) ;break;
case 2:read_old_h^=(0x01<<(7-tier_bit)) ;break;
default:break;
}
Write_Data(read_old_h);
Write_Data(read_old_l);
}
else
{
switch(color)
{
case 0:read_old_l&=(~(0x01<<(15-tier_bit)));break;
case 1:read_old_l|=(0x01<<(15-tier_bit)) ;break;
case 2:read_old_l^=(0x01<<(15-tier_bit)) ;break;
default:break;
}
Write_Data(read_old_h);
Write_Data(read_old_l);
}
Write_Cmd(0x30);
}
/**************************************************
函数名称:draw_level_line
功 能:水平线
参 数:起始x0 x1 和y坐标 color 0反白 1复原
返回值 :无
**************************************************/
void draw_level_line(unsigned char x0,unsigned char x1,unsigned char y,unsigned char color)
{
unsigned char temp;
if(x0>x1)
{
temp=x1;
x1=x0;
x0=temp;
}
for(;x0<=x1;x0++)
{
draw_dot(x0,y,color);
}
}
/**************************************************
函数名称:draw_vertical_line
功 能:垂直线
参 数:起始y0 y1 和x坐标 color 0 1
返回值 :无
**************************************************/
void draw_vertical_line(unsigned char y0,unsigned char y1,unsigned char x,unsigned char color)
{
unsigned char temp;
if(y0>y1)
{
temp=y1;
y1=y0;
y0=temp;
}
for(;y0<=y1;y0++)
draw_dot(x,y0,color);
}
/**************************************************
函数名称:draw_line
功 能:画任意直线
参 数:startx starty endx endy color
返回值 :无
**************************************************/
void draw_line(unsigned char startx,unsigned char starty
,unsigned char endx,unsigned char endy,unsigned char color)
{
int t,distance;
int x=0,y=0,delta_x,delta_y;
int incx,incy;
delta_x=endx-startx;
delta_y=endy-starty;
if(delta_x>0)
{
incx=1;
}
else if(delta_x==0)
{
draw_vertical_line(startx,starty,endy,color);
return;
}
else
{
incx= -1;
}
if(delta_y>0)
{
incy=1;
}
else if(delta_y==0)
{
draw_level_line(startx,endx,starty,color);
return;
}
else
{
incy=-1;
}
delta_x=my_abs(delta_x);
delta_y=my_abs(delta_y);
if(delta_x>delta_y)
{
distance=delta_x;
}
else
{
distance=delta_y;
}
draw_dot(startx,starty,color);
for(t=0;t<=distance+1;t++)
{
draw_dot(startx,starty,color);
x+=delta_x;
y+=delta_y;
if(x>distance)
{
x-=distance;
startx+=incx;
}
if(y>distance)
{
y-=distance;
starty+=incy;
}
}
}
/**************************************************
函数名称:contin_line
功 能:连续输入Y 连成线,Y为0-63注意输入进来时做转换 线从startx至endx 0-127为最大范围
参 数:startx endx endy color
返回值 :无
**************************************************/
void contin_line(unsigned char startx ,unsigned char endx ,unsigned char Y)
{
static unsigned char i=0,y0=0,y1=0,f=1; //i连线开始坐标
if(f) //用于将startx只在第一次传递给i
{
f=0;
i = startx;
}
// x0=i;
y1=Y; //画该函数的图形,完全连接了,
if(i!=startx) //保证不与00坐标连到一起
draw_line(i-1,y0,i,y1,1);
//x1=x0;
y0=y1;
if(i++>=endx) //连线结束坐标
{
i=startx;
Clear_GDRAM();
}
}
/**************************************************
函数名称:draw_curve
功 能:将一系列无符号字符数组str的数 大小0-63注意传递前做处理,曲线开始位置 xstart 数组大小size
参 数:起点startx size *str
返回值 :无
**************************************************/
void draw_curve(unsigned char xstart, unsigned char size ,unsigned char *str)
{
static unsigned char i=0,endx=0,y0=0,y1=0,f=1;
if(f) //只传递一次
{
f=0;
i = xstart;
}
endx = xstart + size;
if(endx>=128) //保证图形不溢出
endx =127;
for(;i<endx;i++)
{
y1 = str[i-xstart];
if(i!=xstart)
draw_line(i-1,y0,i,y1,1);
y0 = y1;
}
i = xstart;
//Clear_GDRAM();
}
/**************************************************
函数名称:draw_circle
功 能:画任意圆
参 数:圆心坐标xy 半径r color
返回值 :无
**************************************************/
void draw_circle(unsigned char x,unsigned char y,unsigned char r,unsigned char color)
{
unsigned char a,b;
float c;
a = 0;
b = r;
// c = 1.25 - r;
c = 3 - 2*r;
while(a < b)
{
draw_dot(x+a,y+b,color);
draw_dot(x-a,y+b,color);
draw_dot(x+a,y-b,color);
draw_dot(x-a,y-b,color);
draw_dot(x+b,y+a,color);
draw_dot(x-b,y+a,color);
draw_dot(x+b,y-a,color);
draw_dot(x-b,y-a,color);
if(c < 0)
{
c = c+4*a + 6;
}
else
{
c= c + 4*(a - b) + 10;
b-=1;
}
a = a + 1; //控制打点间隔
}
if(a == b)
{
draw_dot(x+a,y+b,color);
draw_dot(x-a,y+b,color);
draw_dot(x+a,y-b,color);
draw_dot(x-a,y+b,color);
draw_dot(x+b,y+a,color);
draw_dot(x-b,y+a,color);
draw_dot(x+b,y-a,color);
draw_dot(x-b,y-a,color);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -