具体代码及解析如下:
BMP的解码:
void show_bmp(char *fname,float a,float b) //显示BMP图像
{
FIL fp;
FRESULT ret;
char SD_Readbuf[640] = {0};
unsigned int wsbyte = 0;
char *filename;
filename = strtok(fname,"\0");
int x;
int i;
unsigned char picH,picL;
ret = f_open(&fp,filename,FA_READ); //打开BMP图像文件
if(FR_OK != ret)
{
printf("打开文件失败!ret:[%d]\r\n",ret);
while(1);
}
f_lseek(&fp,56); //跳过头信息字节
if(fabs(b) > fabs(a) && fabs(b) > 2) //Roll值大于Pitch值(控制前后)
{
if(b > 0) //Roll值大于0,低头
{
LCD_Scan_Dir(U2D_L2R); //改变显示方向
}
if(b < 0) //Roll值小于0,抬头
{
LCD_Scan_Dir(U2D_R2L); //改变显示方向
}
}
else //不属于以上的情况,就是平衡状态
{
LCD_Scan_Dir(U2D_L2R); //默认显示方向
}
LCD_Set_Window(0,0,320,240); //窗口设置
LCD->LCD_REG = 0x2c;
for(i=0;i<240;i++)
{
ret = f_read(&fp,SD_Readbuf,640,&wsbyte); //读出BMP图像文件数据
if(FR_OK != ret)
{
printf("读文件失败!ret:[%d]\r\n",ret);
while(1);
}
for(x=0;x<320*2;x++) //一个像素点两个字节
{
picL=((SD_Readbuf[x])) ; //像素点第一个字节,数据低位
x++;
picH=((SD_Readbuf[x])) ; //像素点第二个字节,数据高位
LCD->LCD_RAM = ((picH<<8)|picL); //低位在前,高位在后,传送到LCD显示
}
}
}
BMP的编码:https://blog.csdn.net/weixin_43793181/article/details/109520220
基于STM32F4开发板的简易照相机完整工程代码:https://download.csdn.net/download/weixin_43793181/13083116