lcd 12864液晶 显示图片

今天花了一整天时间才搞好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

你可能感兴趣的:(windows,工具,byte,compression)