您的位置:首页 > 其它

lcd 12864液晶 显示图片

2009-06-05 13:44 1276 查看
今天花了一整天时间才搞好LCD12863显示2色BMP图片(累啊 :) )。
自已还写了一个2色BMP图片到程序数组的转换小程序bmp2txt.exe
读取2色BMP图片,BMP的头结构我就不多说了,很多书上都有。
这里我们主要注意以下几个地方。
BMP文件偏移
0x0a 图像数据的开始位置
0x12 图像的宽度
0x16 图像的高度
0x1e 图像是否压缩
(这里我们只讨论不压缩的,用windows的画笔画一幅画存盘的时候选单色就行了)
BMP的2色图像是倒着存放的,即第一个数据字节表示是的图像最后一行的前8
个点"1"表示白色,"0"表示黑色(当然也可跟椐调色板来设置)
BMP图片数据每行要DWORD对齐,也是一行的字节数必须为4的倍数,如一行的数
据只有8个点为0xff 而BMP表示为 0xff 0x00 0x00 0x00

然后用bmp2txt.exe 将所画的2色图转为程序代码,copy到程序中编译就OK了。




关键代码:
/*
读BMP图像 2色 未压缩
*/

#define BMP_HEIGHT 0x16
#define BMP_WIDTH 0x12
#define BMP_COMPRESSION 0x1e
#define BMP_bfOffBits 0x0a
//COMPRESSION
#define BI_RGB 0
#define BI_RLE8 1
#define BI_RLE4 2
#define BI_BITFIELDS 3
const unsigned char Bitmap[1070] PROGMEM={ //bmp2txt.exe生成的图像数据
......
};

void drawBitmap(const uchar *bmp)
{ //画图像
signed char x,y;
uchar bmpHeight,bmpWidth,wByte;
uint lpOffset;
uchar dat;
uchar nx=0;
uchar i;
uint numb;
lpOffset=pgm_read_byte(bmp+BMP_COMPRESSION); //bmp[BMP_COMPRESSION];
if(lpOffset!=0) return; //只处理未压缩的图像
bmpHeight=pgm_read_byte(bmp+BMP_HEIGHT); //bmp[BMP_HEIGHT];
bmpWidth=pgm_read_byte(bmp+BMP_WIDTH); //bmp[BMP_WIDTH];
lpOffset=pgm_read_byte(bmp+BMP_bfOffBits); //bmp[BMP_bfOffBits] 得到图像数据的偏移量

/*
1.BMP图象为到着存放的:即最后一行的数据存放在最前面
2.2色为一个字节表示一行中的8个像素点
*/
if(bmpWidth%8!=0)
{
wByte=bmpWidth/8+1;
}
else
{
wByte=bmpWidth/8;
}
if(wByte%4!=0)
{
wByte=(wByte/4+1)*4; //DWORD对齐
}

numb=0;
for(y=(bmpHeight-1);y>=0;y--)
{
for(nx=0;nx<wByte;nx++)
{
dat=pgm_read_byte(bmp+lpOffset+numb);// bmp[lpOffset+numb];
numb++;
for(i=0;i<8;i++)
{
if(tstbit(dat,(7-i))==0)
{
x=nx*8+i;
if(x<bmpWidth)
{
pixel(x,y);
}
}
}
}
}
}

仿真图:




源程序&工具&说明:
点击此处下载armok01104908.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: