单片机显示Image2Lcd生成的单色图像

在内存较小又没有外置存储的情况下,有时为了节省单片机的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++;
	}
}

------------结束----------------------

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值