在内存较小又没有外置存储的情况下,有时为了节省单片机的flash空间,把图标做成单色的,在显示时再着不同的前景和背景颜色,变成简单的彩色。
这里用的是Image2Lcd v2.9 生成设置如下:
生产的C数据 说明
显示代码
/*-----------------------------------------LCD_DrawPicture_1bit-------------------------------------
scan: 扫描模式
Bit7: 0:自左至右扫描,1:自右至左扫描。
Bit6: 0:自顶至底扫描,1:自底至顶扫描。
Bit5: 0:字节内象素数据从高位到低位排列,1:字节内象素数据从低位到高位排列。
Bit4: 0:WORD类型高低位字节顺序与PC相同,1:WORD类型高低位字节顺序与PC相反。
Bit3~2: 保留。
Bit1~0: [00]水平扫描,[01]垂直扫描,[10]数据水平,字节垂直,[11]数据垂直,字节水平。
gray: 灰度值
灰度值,1:单色,2:四灰,4:十六灰,8:256色,12:4096色,16:16位彩色,24:24位彩色,32:32位彩色。
w: 图像的宽度。
h: 图像的高度。
*/
//图像信息结构体
typedef struct _HEADGRAY
{
unsigned char scan; //扫描方向
unsigned char gray; //灰度值
unsigned short w; //图像宽度
unsigned short h; //图像高度
}HEADGRAY;
/*---------------------------------------------------------------------------------------
@Function :LCD_DrawPicture_1bit
@Description:显示1位位深的图片,该图片由Image2Lcd v2.9软件生成
@Input :
pImg:指向图像数据的指针
x: 显示X位置
y: 显示Y位置
fr_color: 前景色
bk_color: 背景色
@Retrun :无
@Others :
注意: fr_color、bk_color这里是 565格式的16位颜色值,不能直接用EMWIN中定义的24位颜色值
Image2Lcd v2.9软件生成数据格式的设置:
1. 输出数据类型:C语言数组(*.c)
2. 扫描模式:水平扫描
3. 输出灰度:单色
4. 最大宽度和高度:根据屏幕设置
5. (选中)包含图像头数据
6. (不选)字节内像素数据反序
7. (不选)自右至左扫描
8. (不选)自底至顶扫描
9. (不选)高位在前(MSB First)
-----------------------------------------------------------------------------------------*/
void LCD_DrawPicture_1bit(const u8* pImg,int x,int y,int fr_color,int bk_color)
{
u16 wide; //宽
u16 hight; //高
u8 nBytes; //水平象素需用的字节数
u8 nMod; //最后一字节所用的位,图象宽度不是8的倍数时用到
u16 dy;
u16 dx;
u8 i,j,k;
const u8 *pPix;
u8 data;
//这里不做越界判断,使用时参数要自已控制
wide = ((HEADGRAY*)pImg)->w; //图像宽度
hight = ((HEADGRAY*)pImg)->h; //图像高度
nBytes = wide / 8;
nMod = wide % 8;
pPix = pImg + sizeof(HEADGRAY); //获得图像数据开始位置
dy = y;
for (k=0;k<hight;k++)
{
dx = x;
for(j=0;j<nBytes;j++) //像素显示
{
data = *pPix++;
for(i=0;i<8;i++)
{
if (data & 0x80)LCD_Fast_DrawPoint(dx,dy,fr_color); //填充前景色
else LCD_Fast_DrawPoint(dx,dy,bk_color);//填充背景色
data <<= 1; //左移
dx++;
}
}
if (nMod) //如果图像宽度不是8的倍数,显示最后一个Byte对应的像素
{
data = *pPix++;
for(i=0;i<nMod;i++)
{
if (data & 0x80)LCD_Fast_DrawPoint(dx,dy,fr_color); //填充前景色
else LCD_Fast_DrawPoint(dx,dy,bk_color);//填充背景色
data <<= 1; //左移
dx++;
}
}
dy++;
}
}
------------结束----------------------