[STM32F1] 基于stm32的OLED各种显示实现

[复制链接]
3529|34
 楼主| c17 发表于 2023-7-29 15:16 | 显示全部楼层
  1. unsigned char BMP1[] = { 0X32,0X01,0X00,0X3B,0X00,0X3B,
  2. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XF8,
  3. 0XFC,0X78,0X70,0X30,0X00,0X08,0X00,0X04,0X04,0X04,0X04,0X00,0X00,0X00,0X00,0X00,
  4. 0X00,0X00,0X00,0X00,0X00,0X80,0XC8,0XC8,0XE8,0XF0,0XF0,0XF0,0X00,0X20,0X40,0X40,
  5. 0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  6. 0X00,0X00,0X00,0X00,0X60,0X10,0X0C,0X02,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  7. 0X00,0X00,0X00,0X00,0X00,0X00,0X70,0X00,0X00,0X00,0X80,0X00,0X00,0X00,0X00,0X00,
  8. 0X00,0X01,0X01,0X03,0X03,0X07,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X06,0X08,0X30,
  9. 0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X13,0X10,
  10. 0X08,0X0C,0X0E,0X20,0X00,0X10,0X10,0X08,0X04,0X06,0X01,0X20,0X20,0X10,0X08,0X04,
  11. 0X01,0X00,0X00,0X00,0X00,0X01,0X06,0X18,0X20,0X60,0X78,0X00,0X00,0X00,0X40,0X00,
  12. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7E,0X00,0X00,0X00,
  13. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0X80,0X00,
  14. 0X00,0X00,0X00,0X00,0X07,0X07,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  15. 0X0C,0X1C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X01,0X01,
  16. 0X42,0X7C,0X00,0X80,0X20,0X10,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  17. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X06,0X04,0X08,0X10,0X30,0X20,
  18. 0X20,0X40,0X41,0XC0,0XC0,0X80,0X81,0X81,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  19. 0X00,0X20,0X20,0X18,0X08,0X04,0X00,0X00,0X0C,0X04,0X02,0X01,0X03,0X03,0X00,0X00,
  20. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  21. 0X80,0XC0,0X40,0X60,0X20,0X10,0X10,0X08,0X04,0X04,0X02,0X02,0X02,0X01,0X03,0X03,
  22. 0X02,0X03,0X03,0X02,0X02,0X04,0X04,0X0C,0X08,0X10,0X30,0X20,0X40,0X80,0X80,0X00,
  23. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X40,0X70,0XFC,0XF0,0X60,
  24. 0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X08,0X04,0X02,0X03,0X01,0X00,0X00,0X00,0X00,
  25. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  26. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X06,0X08,0X30,0X60,0XC0,
  27. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0X61,0X3F,0X0C,0X00,0X00,0X00,0X00,
  28. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  29. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  30. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,
  31. 0X01,0X01,0X00,0X00,0X00,0X00,0X00,0X00,};
 楼主| c17 发表于 2023-7-29 15:16 | 显示全部楼层
  1.   注意:Img2Lcd2.9可以处理的图片类型有限,如果大家图片不能被打开处理,可能是图片类型不对,可以借助PNG转JPG - 在线转换图像文件 (aconvert.com)进行处理转换。
 楼主| c17 发表于 2023-7-29 15:17 | 显示全部楼层
    显示图片的API函数:
  1. // Parameters     : x0,y0 -- 起始点坐标(x0:0~127, y0:0~7); x1,y1 -- 起点对角线(结束点)的坐标(x1:1~128,y1:1~8)
  2. // Description    : 显示BMP位图
  3. void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
  4. {
  5.         unsigned int j=0;
  6.         unsigned char x,y;

  7.   if(y1%8==0)
  8.                 y = y1/8;
  9.   else
  10.                 y = y1/8 + 1;
  11.         for(y=y0;y<y1;y++)
  12.         {
  13.                 OLED_SetPos(x0,y);
  14.     for(x=x0;x<x1;x++)
  15.                 {
  16.                         WriteDat(BMP[j++]);
  17.                 }
  18.         }
  19. }
 楼主| c17 发表于 2023-7-29 15:17 | 显示全部楼层
   main函数代码:

                OLED_DrawBMP(30,0,89,8,BMP1);
 楼主| c17 发表于 2023-7-29 15:17 | 显示全部楼层
       特别说明:值得注意的是函数的第一个(30)和第三个参数(89),起始列地址和终止列地址,如果和图片的分辨率对不上,那就会显示出来一坨散沙,看不出样子。(89-30=59)
 楼主| c17 发表于 2023-7-29 15:17 | 显示全部楼层
      显示效果: 7171064c4bd03f251d.png
 楼主| c17 发表于 2023-7-29 15:17 | 显示全部楼层
4.2.3 显示动态图片
        一般情况下GIF动态图片的大小都是不满足在OLED显示的,所以需要进行大小亦或是帧数变化操作。这里读者推荐使用:GiFResizerChs
 楼主| c17 发表于 2023-7-29 15:17 | 显示全部楼层
处理过程如下: 1406464c4bd1860407.png
 楼主| c17 发表于 2023-7-29 15:17 | 显示全部楼层
     之后采用GIF动态图片分批处理软件进行每张图片的提取,笔者这里使用的是:zhs9 5454764c4bd233df14.png
 楼主| c17 发表于 2023-7-29 15:18 | 显示全部楼层
      批量提取后的图片: 3490364c4bd2ee438d.png   之后就是反复枯燥的取模过程了,这里就给大家省略了。
 楼主| c17 发表于 2023-7-29 15:18 | 显示全部楼层
GIF动态图片显示API函数:
  1. /*
  2.         @brief                        显示动图
  3.         @param                        x0:起始列地址
  4.                                 y0:起始页地址
  5.                                 x1:终止列地址
  6.                                 y1:终止页地址
  7.                                 k: 帧个数
  8.                                 m: 单帧数组大小
  9.                                 BMP[][m]:存放动图代码的数组
  10.         @retval                        无
  11. */
  12. void OLED_DrawGIF(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1, unsigned char k, int m, unsigned char GIF[][m])
  13. {
  14.         unsigned int j=0; //定义变量
  15.         unsigned char x,y,i; //定义变量
  16.   
  17.         if(y1%8==0) y=y1/8;   //判断终止页是否为8的整数倍
  18.          else y=y1/8+1;
  19.         for (i=0;i<k;i++) //从第一帧开始画
  20.         {
  21.                 j = 0;
  22.                 for(y=y0;y<y1;y++) //从起始页开始,画到终止页
  23.                 {
  24.                         OLED_SetPos(x0,y); //在页的起始列开始画
  25.                           
  26.                         for(x=x0;x<x1;x++) //画x1 - x0 列
  27.                             {
  28.                                                
  29.                                     WriteDat(GIF[i][j++]);        //画图片的点           
  30.                             }
  31.                 }
  32.                 //delay_ms(80);//人为制造卡顿???

  33.         }
  34. }
 楼主| c17 发表于 2023-7-29 15:18 | 显示全部楼层
      main函数:

                OLED_DrawGIF(30,2,78,8,12,294,BMP2);       
 楼主| c17 发表于 2023-7-29 15:18 | 显示全部楼层
       这里取模的帧数过程笔者偷懒了,取模实在太烦了,所以就少取了很多帧数的模。如果诸位有批量取模的软件请务必告知,感谢!
 楼主| c17 发表于 2023-7-29 15:19 | 显示全部楼层
代码开源:
        源码地址:链接:https://pan.baidu.com/s/1nDVko8Iux71b2lnenUKy9g 提取码:83bi
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部