OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3599|回复: 4

分享个LCD显示渐变色,和颜色叠加的算法

[复制链接]

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2018-6-20 21:15:59 | 显示全部楼层 |阅读模式
屏幕用的是ILI9341,渐变色只做了水平渐变,不过根据这个也可以改成 垂直渐变或者斜对角渐变,效果如图所示
typedef struct
{
        u16 x0,y0,w,h;
}GUI_WIN;

typedef union
{
        u16 color;
        struct{
        u16  b:5;
        u16  g:6;
        u16  r:5;
}RGB;
}GUI_COLOR;
/*
功能:绘制渐变色矩形
参数:Win:矩形窗口的位置
       colorBegin:起始颜色
       colorEnd: 结束颜色
*/
void GUI_FillGradientWin(GUI_WIN *win ,u16 colorBegin,u16 colorEnd)
{
        u16          i,j;
        float        rInc,gInc,bInc;
        GUI_COLOR    begin,end,colorNow;
       
        begin.color = colorBegin;
        end.color   = colorEnd;
       
        rInc=(float)(end.RGB.r-begin.RGB.r)/(float)win->w;                        //分别计算R,G,B值的增量
        gInc=(float)(end.RGB.g-begin.RGB.g)/(float)win->w;
        bInc=(float)(end.RGB.b-begin.RGB.b)/(float)win->w;
       
        LCD_SetWindow(win->x0,win->y0,win->x0+win->w-1,win->y0+win->h-1-1); //设置窗口
        TFTLCD->LCD_REG=0x2C;
       
        for(i=0;i<win->w;i++)
        {
                colorNow.RGB.r=begin.RGB.r+i*rInc+0.5;      //计算当前坐标下颜色值的R,G,B
                colorNow.RGB.g=begin.RGB.g+i*gInc+0.5;
                colorNow.RGB.b=begin.RGB.b+i*bInc+0.5;
                for(j=0;j<win->h;j++)
                {
                        GUI_DrawPixel(i+win->x0,j+win->y0,colorNow.color);                  //画点
                }
        }
}


/*
功能:绘制渐变色矩形
参数:Win:矩形窗口的位置
       colorTop:顶层颜色
       colorBottom 底层颜色
       percent:顶层颜色所实际颜色的百分比(0-100)
*/
void GUI_FillHybridWin(GUI_WIN *win ,u16 colorTop,u16 colorBottom,u8 percent)
{
        u16         i,j;
        GUI_COLOR   top,bottom,colorNow;
       
        top.color    = colorTop;
        bottom.color = colorBottom;
       
        colorNow.RGB.r=(top.RGB.r*percent+bottom.RGB.r*(100-percent))/100;
        colorNow.RGB.g=(top.RGB.g*percent+bottom.RGB.g*(100-percent))/100;
        colorNow.RGB.b=(top.RGB.b*percent+bottom.RGB.b*(100-percent))/100;
       
        LCD_SetWindow(win->x0,win->y0,win->x0+win->w-1,win->y0+win->h-1-1); //设置窗口
        TFTLCD->LCD_REG=0x2C;
       
        for(j=0;j<win->h;j++)
        {
                for(i=0;i<win->w;i++)
                {
                        TFTLCD->LCD_RAM=colorNow.color;                                                                                                                                                       
                }
        }
}



QQ图片20180620211524.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-6-20 21:36:09 来自手机 | 显示全部楼层
回复 支持 反对

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
 楼主| 发表于 2018-6-21 09:02:16 | 显示全部楼层

画图用啊。
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2019-5-30
在线时间
38 小时
发表于 2019-8-7 20:00:35 | 显示全部楼层
GUI_DrawPixel 哥们 这个函数 没写啊,至少得贴个demo上来啊
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2019-5-30
在线时间
38 小时
发表于 2019-8-7 20:00:58 | 显示全部楼层
GUI_DrawPixel
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表