本章文章续上篇《独木带你玩转彩屏——应用1驱动彩屏(寄存器spi版)》如和使用彩屏显示文字图形 |
点击阅读上篇文章 (彩屏的引脚分配和注意事项参见上篇文章)
上篇文章已经将彩屏 驱动成功并且成功将五颜六色铺满了屏幕,那么如何才能用彩屏显示图形呢? |
回顾上篇文章将颜色铺满屏幕是用的函数LCD_Clear(); |
void LCD_Clear(u16 Color)
{
unsigned int i,m;
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);
LCD_CS_CLR;
LCD_RS_SET;
for(i=0;i<lcddev.height;i++)
{
for(m=0;m<lcddev.width;m++)
{
Lcd_WriteData_16Bit(Color);
}
}
LCD_CS_SET;
}
如上图所示,需要用for循环将彩屏的每个点都遍历到,然后给每个点写入颜色数据 |
那也就是说如果我想显示图形,只需要规定图形的坐标,然后再每个坐标写入对应的颜色,图形就显示出来了 |
unsigned int i,m;
LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-160);
LCD_CS_CLR;
LCD_RS_SET;
for(i=0;i<lcddev.height-160;i++)
{
for(m=0;m<lcddev.width-1;m++)
{
Lcd_WriteData_16Bit(BLACK);
}
}
LCD_CS_SET;
LCD_SetWindows(0,160,lcddev.width-1,lcddev.height-1);
LCD_CS_CLR;
LCD_RS_SET;
for(i=0;i<lcddev.height-160;i++)
{
for(m=0;m<lcddev.width-1;m++)
{
Lcd_WriteData_16Bit(GREEN);
}
}
LCD_CS_SET;
这页就意味着,我想显示三角形,就给它三角形的坐标,显示矩形就给它矩形的坐标,圆形就。。。。。。 |
然后 我们就可以放飞自我了,想画啥画啥,卖家给了几个基本图形,有兴趣的可以看看Stemwin,这里还有钟表等多种图形呢 |
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1;
delta_y=y2-y1;
uRow=x1;
uCol=y1;
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++ )
{
LCD_DrawPoint(uRow,uCol);
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
{
LCD_DrawLine(x1,y1,x2,y1);
LCD_DrawLine(x1,y1,x1,y2);
LCD_DrawLine(x1,y2,x2,y2);
LCD_DrawLine(x2,y1,x2,y2);
}
void LCD_DrawFillRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
{
LCD_Fill(x1,y1,x2,y2,POINT_COLOR);
}
void _draw_circle_8(int xc, int yc, int x, int y, u16 c)
{
GUI_DrawPoint(xc + x, yc + y, c);
GUI_DrawPoint(xc - x, yc + y, c);
GUI_DrawPoint(xc + x, yc - y, c);
GUI_DrawPoint(xc - x, yc - y, c);
GUI_DrawPoint(xc + y, yc + x, c);
GUI_DrawPoint(xc - y, yc + x, c);
GUI_DrawPoint(xc + y, yc - x, c);
GUI_DrawPoint(xc - y, yc - x, c);
}
void gui_circle(int xc, int yc,u16 c,int r, int fill)
{
int x = 0, y = r, yi, d;
d = 3 - 2 * r;
if (fill)
{
while (x <= y) {
for (yi = x; yi <= y; yi++)
_draw_circle_8(xc, yc, x, yi, c);
if (d < 0) {
d = d + 4 * x + 6;
} else {
d = d + 4 * (x - y) + 10;
y--;
}
x++;
}
} else
{
while (x <= y) {
_draw_circle_8(xc, yc, x, y, c);
if (d < 0) {
d = d + 4 * x + 6;
} else {
d = d + 4 * (x - y) + 10;
y--;
}
x++;
}
}
}
void Draw_Triangel(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
{
LCD_DrawLine(x0,y0,x1,y1);
LCD_DrawLine(x1,y1,x2,y2);
LCD_DrawLine(x2,y2,x0,y0);
}
、
到此彩屏显示图形已经ok,那么问题来了,如何显示文字呢? |
智慧如你,一个道理,每个字都有其独特的构造,所形成的图案就不一样,把每个文字都想成一个个的图案。通过文字取模软件设置文字的大小和字体,获得文字的数据,再将数据写入彩屏。 |
下面这段代码就是文件包中的gui.c 中的文字显示代码, 文字取模工具在工程里寻找,取模后加入相应的代码中就可以为所欲为了!!! |
void Show_Str(u16 x, u16 y, u16 fc, u16 bc, u8 *str,u8 size,u8 mode)
{
u16 x0=x;
u8 bHz=0;
while(*str!=0)
{
if(!bHz)
{
if(x>(lcddev.width-size/2)||y>(lcddev.height-size))
return;
if(*str>0x80)bHz=1;
else
{
if(*str==0x0D)
{
y+=size;
x=x0;
str++;
}
else
{
if(size>16)
{
LCD_ShowChar(x,y,fc,bc,*str,16,mode);
x+=8;
}
else
{
LCD_ShowChar(x,y,fc,bc,*str,size,mode);
x+=size/2;
}
}
str++;
}
}else
{
if(x>(lcddev.width-size)||y>(lcddev.height-size))
return;
bHz=0;
if(size==32)
GUI_DrawFont32(x,y,fc,bc,str,mode);
else if(size==24)
GUI_DrawFont24(x,y,fc,bc,str,mode);
else
GUI_DrawFont16(x,y,fc,bc,str,mode);
str+=2;
x+=size;
}
}
}
3. 结果展示
4. 获取资源
1.资源链接:待更新 2.关注微信公众号后台私信 或者 在CSDN私信笔者
资源中有彩屏文字显示测试、图片显示测试、还有图形显示测试。
·
|