STM32F103xx OLED旋转显示图片

  • 编译器平台及例程说明
    • 编译器说明
    • 例程说明
  • 一、图片旋转显示样式
  • 二、图片旋转显示原理简述
  • 三、两种不同的取模方式
    • 第一种取模方式
    • 第二种取模方式
  • 四、不同的旋转模式
  • 五、不同旋转模式前后部分的处理方式
  • 六、带旋转显示图片方式1
  • 七、带旋转显示图片方式2
  • 八、图片取模测试
  • 九、测试核心代码1
  • 十、测试核心代码2

STM32F103xx OLED旋转显示图片源码下载

编译器平台及例程说明

编译器说明


1. Toolchain : MDK-ARM Community Version: 5.36.0.0(Kile V5)
2. Encoding  : Encode in UTF-8 without signature
3. Device Specific Packs : Keil.STM32F1xx_DFP.2.3.0.pack
4. C/C++ Preprocessor Symbols : STM32F10X_HD,USE_STDPERIPH_DRIVERUSE_STDPERIPH_DRIVER :允许使用标准外设驱动STM32F10X_HD         :STM32F10x大容量产品
5. Chip Type :ARM Cortex-M3 STM32F103RET6, 72MHZ, Flash:512KByte, ROM:64KByte, LQFP144
6. 在stm32hf10x.h文件中HSE_VALUE为外部高速振荡器,默认8MHZ。此值必须与硬件保持一致。

例程说明


1. STM32F103xx OLED旋转显示图片。
2. 显示图片可实现0度旋转、90度旋转、180度旋转、270度旋转。
3. 提供两种图片取模方式的显示。

一、图片旋转显示样式

二、图片旋转显示原理简述

原图(0度)显示 :
1. 横轴为图片实际宽度,纵轴为图片显示宽度,图片显示宽度大于等于图片实际宽度。
2. 按列显示,先显示第一列,在显示第二列,以此类推,每显示列中的一个像素纵轴加一,横轴不变,直到纵轴加的数量等于图片显示宽度为止,然后横轴加一,纵轴重设为初始值,开始显示第二列,依次类推,直到显示完最后一列。


90度显示 :

  1. 纵轴为图片实际高度,横轴为图片显示宽度,图片显示宽度大于等于图片实际宽度。
  2. 按行显示,先显示第一行,在显示第二行,以此类推,每显示行中的一个像素横轴加一,纵轴不变,直到横轴加的数量等于图片显示宽度为止,然后纵轴加一,横轴重设为初始值,开始显示第二行,依次类推,直到显示完最后一行。

180度显示 :
270度显示 :
180和270旋转显示原理月0度和90度相似。

注意: 图片的显示方式与其取模方式有关。

三、两种不同的取模方式

第一种取模方式


1. 先从上到下,从左到右,按列取,先取第一列前8个像素,再取第二列前8个像素,直到最后一列前8个像素;然后再取先取第一列后8个像素,再取第二列后8个像素,直到最后一列后8个像素,以此类推。
2. PCtoLCD2002完美版 ==> 阴码 + 列行式 + 逆向(低位在前)
3. mg2Lcd.exe ==>  数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)


第二种取模方式


1. 先从上到下,从左到右,按列取,先取完第一列,再取完第二列,直到取完最后一列
2. PCtoLCD2002完美版 ==> 阴码 + 逐列式 + 逆向(低位在前)取模方式
3. Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)取模方式


四、不同的旋转模式


/* 旋转模式 */
typedef enum
{ROTAT_MODE_DEG_0   = 0, /* 旋转0度 */ROTAT_MODE_DEG_90  = 1, /* 旋转90度 */ROTAT_MODE_DEG_180 = 2, /* 旋转180度 */ROTAT_MODE_DEG_270 = 3, /* 旋转270度 */ROTAT_MODE_MAX
}eRotateMode;

五、不同旋转模式前后部分的处理方式

/* 获取横纵轴的操作 */
static void vGet_xyHandler_Rotat(eRotateMode mode, void (** prevHand)(u16 * prev, u8 n), void (** backHand)(u16 * back, u8 n))
{switch(mode){case ROTAT_MODE_DEG_0:{*prevHand = &vHandler_Inc;*backHand = &vHandler_Inc;}break;case ROTAT_MODE_DEG_90:{*prevHand = &vHandler_Sub;*backHand = &vHandler_Inc;}break;case ROTAT_MODE_DEG_180:{*prevHand = &vHandler_Sub;*backHand = &vHandler_Sub;}break;case ROTAT_MODE_DEG_270:{*prevHand = &vHandler_Inc;*backHand = &vHandler_Sub;}break;default : break;}
}

六、带旋转显示图片方式1

  1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 逐列式 + 逆向(低位在前)取模方式
  2. 此函数适用于Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)取模方式
  3. 取模方式为: 先从上到下,从左到右,按列取,先取完第一列,再取完第二列,直到取完最后一列
/*********************************************************************************************************************************************** 函数名 : vOLED_ShowPicture_Rotate* 描  述 : OLED显示图片带旋转* 输  入 : x       : 横轴坐标*          y       : 纵轴坐标*          xWidth  :图片宽度*          yHeight : 图片高度*          pImage  : 图片指针*          mode    : 旋转模式* 说  明 : 1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 逐列式 + 逆向(低位在前)取模方式*          2. 此函数适用于Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)取模方式*          3. 取模方式为: 先从上到下,从左到右,按列取,先取完第一列,再取完第二列,直到取完最后一列
***********************************************************************************************************************************************/
void vOLED_ShowPicture_Rotate(u16 x, u16 y, u16 xWidth, u16 yHeight, const u8 * pImage, eRotateMode mode)
{// 1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 逐列式 + 逆向(低位在前)取模方式// 2. 此函数适用于Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)取模方式// 3. 取模方式为: 先从上到下,从左到右,按列取,先取完第一列,再取完第二列,直到取完最后一列void (* prevHandler)(u16 * prev, u8 n) = NULL;void (* backHandler)(u16 * back, u8 n) = NULL;u16 k = 0, j = 0, i = 0, n = 0;u16 yMax  = 0;u16 y0    = 0;u16 x0    = 0;u8  dat   = 0;u16 * xyPrev = NULL;u16 * xyBack = NULL;u16 * xyInitVal = NULL;u8 preCount = 0;/* 旋转模式越界 */if (mode >= ROTAT_MODE_MAX){return;}/* 前后部分处理,x y坐标变化 */vGet_xyHandler_Rotat(mode, &prevHandler, &backHandler);if ((prevHandler == NULL) || (backHandler == NULL)){return;}/* 前后部分值处理 xy初始值 */if((ROTAT_MODE_DEG_0 == mode) || (ROTAT_MODE_DEG_180 == mode)){xyPrev = &y;xyBack = &x;xyInitVal = &y0;}else if((ROTAT_MODE_DEG_90 == mode) || (ROTAT_MODE_DEG_270 == mode)){xyPrev = &x;xyBack = &y;xyInitVal = &x0;}//图片高度yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0);//初始位置y0 = y;x0 = x;//图片宽度for(k = 0; k < xWidth; k++){for(j = 0; j < yMax; j++){dat = pImage[n++];for(i = 0; i < BYTE_BIT; i++){if ((y < AppDevOLED.HeightMax) && (x < AppDevOLED.WidthMax)){//先显示低位 低位在前if((dat >> i) & 0x01){vOLED_DrawPoint(x, y, 1);}}/* 前部分处理,x y坐标变化 */prevHandler(xyPrev, 1);}/* 前部分累加直到图片高度 */preCount++;if (preCount == yMax){preCount = 0;/* 后部分处理,x y坐标变化 */backHandler(xyBack, 1);/* 更新初始坐标, x y初始坐标*/*xyPrev = *xyInitVal;}}}
}

七、带旋转显示图片方式2

  1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 列行式 + 逆向(低位在前)
  2. 此函数适用于mg2Lcd.exe ==> 数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)
  3. 取模方式为: 先从上到下,从左到右,按列取,先取第一列前8个像素,再取第二列前8个像素,直到最后一列前8个像素;然后再取先取第一列后8个像素,再取第二列后8个像素,直到最后一列后8个像素,以此类推。
/*********************************************************************************************************************************************** 函数名 : vOLED_ShowPicture_Rotate* 描  述 : OLED显示图片带旋转* 输  入 : x       : 横轴坐标*          y       : 纵轴坐标*          xWidth  :图片宽度*          yHeight : 图片高度*          pImage  : 图片指针*          mode    : 旋转模式* 说  明 :  1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 列行式 + 逆向(低位在前)*          2. 此函数适用于mg2Lcd.exe ==>  数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)*          3. 取模方式为: 先从上到下,从左到右,按列取,先取第一列前8个像素,再取第二列前8个像素,直到最后一列前8个像素;*             然后再取先取第一列后8个像素,再取第二列后8个像素,直到最后一列后8个像素,以此类推
***********************************************************************************************************************************************/
void vOLED_ShowImage_Rotate(u16 x, u16 y, u16 xWidth, u16 yHeight, const u8 * pImage, eRotateMode mode)
{// 1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 列行式 + 逆向(低位在前)// 2. 此函数适用于mg2Lcd.exe ==>  数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)// 3. 取模方式为: 先从上到下,从左到右,按列取,先取第一列前8个像素,再取第二列前8个像素,直到最后一列前8个像素;// 然后再取先取第一列后8个像素,再取第二列后8个像素,直到最后一列后8个像素,以此类推void (* prevHandler)(u16 * prev, u8 n) = NULL;void (* backHandler)(u16 * back, u8 n) = NULL;u16 k = 0, j = 0, i = 0, n = 0;u16 yMax  = 0;u16 y0    = 0;u16 x0    = 0;u8  dat   = 0;u16 * xyPrev    = NULL; //前半部分u16 * xyBack    = NULL; //后半部分u16 * xyInitVal = NULL; //初始值u16 * xyGapVal  = NULL; //间隔值/* 旋转模式越界 */if (mode >= ROTAT_MODE_MAX){return;}/* 前后部分处理,x y坐标变化 */vGet_xyHandler_Rotat(mode, &prevHandler, &backHandler);if ((prevHandler == NULL) || (backHandler == NULL)){return;}/* 前后部分值处理 xy初始值 间隔值处理 */if((ROTAT_MODE_DEG_0 == mode) || (ROTAT_MODE_DEG_180 == mode)){xyPrev = &y;xyBack = &x;xyInitVal = &x0;xyGapVal  = &y0;}else if((ROTAT_MODE_DEG_90 == mode) || (ROTAT_MODE_DEG_270 == mode)){xyPrev = &x;xyBack = &y;xyInitVal = &y0;xyGapVal  = &x0;}//图片高度yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0);//初始位置y0 = y;x0 = x;//图片宽度for(k = 0; k < xWidth; k++){for(j = 0; j < yMax; j++){dat = pImage[n++];for(i = 0; i < BYTE_BIT; i++){if ((y < AppDevOLED.HeightMax) && (x < AppDevOLED.WidthMax)){//先显示低位 低位在前if((dat >> i) & 0x01){vOLED_DrawPoint(x, y, 1);}}/* 前部分处理,x y坐标变化 */prevHandler(xyPrev, 1);}backHandler(xyBack, 1);if (XABS2(*xyBack, *xyInitVal) == xWidth){*xyBack = *xyInitVal;prevHandler(xyGapVal, 8);}*xyPrev = *xyGapVal;}}
}

八、图片取模测试


//Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)
const unsigned char Image_Tree_43x47[258] =
{0X00,0X00,0X00,0X80,0X00,0X00,0X00,0X00,0X00,0XC0,0X00,0X00,0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X20,0XF0,0X00,0X00,0X00,0X00,0X30,0XF8,0X00,0X00,0X00,0X00,0X38,0XFC,0X00,0X00,0X00,0X08,0X3C,0XFE,0X00,0X00,0X00,0X0C,0X3E,0XFF,0X00,0X00,0X00,0X0E,0XBF,0XFF,0X00,0X00,0X00,0X8F,0XFF,0XFF,0X00,0X00,0X80,0XCF,0XFF,0XFF,0X00,0X00,0XC0,0XEF,0XFF,0XFF,0X00,0X00,0XE0,0XFF,0XFF,0XFF,0X00,0X00,0XF0,0XFF,0XFF,0XFF,0XFF,0X1F,0XF8,0XFF,0XFF,0XFF,0XFF,0X1F,0XFC,0XFF,0XFF,0XFF,0XFF,0X1F,0XFC,0XFF,0XFF,0XFF,0XFF,0X1F,0XF8,0XFF,0XFF,0XFF,0XFF,0X1F,0XF0,0XFF,0XFF,0XFF,0XFF,0X1F,0XE0,0XFF,0XFF,0XFF,0X00,0X00,0XC0,0XEF,0XFF,0XFF,0X00,0X00,0X80,0XCF,0XFF,0XFF,0X00,0X00,0X00,0X8F,0XFF,0XFF,0X00,0X00,0X00,0X0E,0XBF,0XFF,0X00,0X00,0X00,0X0C,0X3E,0XFF,0X00,0X00,0X00,0X08,0X3C,0XFE,0X00,0X00,0X00,0X00,0X38,0XFC,0X00,0X00,0X00,0X00,0X30,0XF8,0X00,0X00,0X00,0X00,0X20,0XF0,0X00,0X00,0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XC0,0X00,0X00,0X00,0X00,0X00,0X80,0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X18,0X0C,0X00,0X00,0X00,0X00,0X18,0X0C,0X00,0X00,0X00,0X00,0X18,0X0C,0X00,0X00,0X00,0X00,0X18,0X0C,0X00,0X00,0X00,0X00,0X18,0X0C,0X00,0X00,0X00,0X00,0X18,0X1E,0X00,0X00,0X00,0X00,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X1E,0X00,0X00,0X00,0X00,0X3C,0X0C,0X00,0X00,0X00,0X00,0X18,
};//mg2Lcd.exe ==>  数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)
const unsigned char Image_Speed_50x39[250] =
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X38,0X78,0X7C,0X3C,0X3E,0X1E,0X1E,0X0F,0X0F,0X0F,0X0F,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X0F,0X0F,0X0F,0X1E,0X1E,0X3E,0X3C,0X7C,0X78,0X38,0X10,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XE0,0XF8,0XFC,0XFE,0X7C,0X30,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF0,0XFC,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X30,0X7C,0XFE,0XFC,0XF8,0XE0,0X80,0X00,0X3C,0X3F,0X3F,0X3F,0X0F,0X03,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X1F,0X3F,0X3F,0X3F,0X3C,0X38,0XF8,0XF8,0XF8,0XE0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0X0F,0X1F,0X1F,0X1F,0X1F,0X1F,0X0F,0X07,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XE0,0XF8,0XF8,0XF8,0X38,0X00,0X01,0X07,0X1F,0X3F,0X7F,0X3E,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X3E,0X7F,0X3F,0X1F,0X07,0X01,0X00,
};

九、测试核心代码1

 vOLED_ShowPicture_Rotate(10, 10, 43, 47, Image_Tree_43x47, ROTAT_MODE_DEG_0);vOLED_ShowPicture_Rotate(70, 0, 43, 47, Image_Tree_43x47, ROTAT_MODE_DEG_90);vOLED_ShowPicture_Rotate(60, 60, 43, 47, Image_Tree_43x47, ROTAT_MODE_DEG_180);vOLED_ShowPicture_Rotate(20, 60, 43, 47, Image_Tree_43x47, ROTAT_MODE_DEG_270);

十、测试核心代码2

 vOLED_ShowImage_Rotate(5, 5, 50, 39, Image_Speed_50x39, ROTAT_MODE_DEG_0);vOLED_ShowImage_Rotate(70, 5, 50, 39, Image_Speed_50x39, ROTAT_MODE_DEG_90);vOLED_ShowImage_Rotate(70, 50, 50, 39, Image_Speed_50x39, ROTAT_MODE_DEG_180);vOLED_ShowImage_Rotate(80, 50, 50, 39, Image_Speed_50x39, ROTAT_MODE_DEG_270);

STM32F103xx OLED旋转显示图片相关推荐

  1. STM32F103xx OLED镜像显示图片

    STM32F103xx OLED镜像显示图片 编译器平台及例程说明 编译器说明 例程说明 一.镜像显示样式 二.原图显示原理 三.左右镜像原理 四.上下左右镜像原理 五.上下镜像原理 六.两种不同的取 ...

  2. 程序默认在副屏显示_树莓派使用 OLED 屏显示图片及文字

    树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看.这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片 ...

  3. msp430f5529——OLED屏显示文字与图片

    目录 前言 一.效果展示 二.步骤 1.OLED.C文件 2.OLED.h文件 3.OLEDFONT.h文件 4.type.h文件 5.bmp.h文件 6.main.c 7.关于文字和图片的取模 总结 ...

  4. stm32单片机OLED显示图片 位图转换 Image2Lcd使用

    在OLED或其他单色屏上显示图片,为减小Flash占用,需要转换为单色的位图. 对于主控是sdd1306的oled的取模方式: 打开Image2Lcd. 按照如图左侧进行配置,将图片转换为 128x6 ...

  5. 利用51单片机+0.96寸iic接口oled显示图片或动图

    利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...

  6. 如何使用OLED显示图片

    以下文章来源于:公_众_号开源电子网 读取更多技术文章,请扫码关注 如何使用OLED显示图片 前言 这篇文章不过多描述OLED工作原理及驱动过程,仅从实用性出发,如何使用OLED显示图片.这里我们以正 ...

  7. 解决三星调用系统相机拍照显示图片旋转90度横着的问题

    最近项目有个功能是调用系统相机拍照上传图片的功能,发现别的手机都没有ok,只有三星的显示图片很明显是旋转了90度,横着的.后来百度了解是三星对android相机单独做了优化(android碎片化,各种 ...

  8. 选择相册图片上传后,客户端显示图片却是被旋转过角度

    我想某位大哥也遇到过这个问题,就是手机相册选择图片时,显示是正的(未被旋转角度的),但是上传该图片后,客户端却显示被旋转了xx度的.那这肯定是客户不想出现的问题,同样也是我们开发者不想出现bug.我想 ...

  9. 【Image2Lcd与PCtoLCD2002】实现stm32 上 接oled 显示图片

    文章目录 前言 先上效果图 一.oled?转成想要的分辨率 二.Image2Lcd(破解版) 三.PCtoLCD2002(完美版) 四.oled代码 OLED.c OLED.h OLED_Front. ...

最新文章

  1. jakarta_适用于Java EE / Jakarta EE开发人员的Micronaut
  2. 【转】快捷支付详解--比较详细
  3. Python四道面试题
  4. android 消息循环滚动条,Android ViewPager实现循环滚动
  5. 数据结构--图(Graph)详解(二)
  6. 【转】17.Qt界面布局管理详解
  7. python 类似wordpress_python,_python 有没有类似WordPress的这种库?,python - phpStudy
  8. [数据库] --- clickhouse
  9. html 页面重复度高,html – CSS背景渐变重复问题
  10. 为什么中国企业海外营销都选择Facebook?
  11. B站在美上市 A站却为融资心塞
  12. PAIP.MYSQL SLEEP 连接太多解决
  13. 电脑速度慢是什么问题导致的
  14. excel加密文档破解
  15. 代码中的软件工程:正则表达式十步通关
  16. docker安装和基本命令
  17. 利用filezilla下载文件,出现无法启动传输和严重文件错误
  18. openresty ngx.ctx表
  19. 我的世界服务器物品代码,我的世界指令代码大全 2021通用指令代码汇总[多图]...
  20. 【泛函分析】存在有可列个间断点的单调函数

热门文章

  1. iptables -j MARK --set-xmark 解析
  2. 利用matlab的interp1()对矩阵进行插值
  3. IDEA将项目打包成jar包
  4. yolov5训练模型
  5. html5border设置彩色,css中border颜色不同怎么设置?
  6. MIMO-OFDM无线通信技术及MATLAB实现
  7. 时光音乐会mp3全集
  8. 180821 逆向-周练babyre+Retdec配置
  9. Java程序性能优化-概述
  10. Android系统版本在6.0+以上需要动态申请权限