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。此值必须与硬件保持一致。
7.

例程说明


1. STM32F103xx OLED镜像显示图片带镜像。
2. 实现图片可实现左右镜像、上下镜像、上下左右镜像。
3. 提供两种图片取模方式的显示。

一、镜像显示样式


1. 左右镜像是相对原图左右镜像。
2. 上下镜像是相对原图上下镜像。
3. 上下左右镜像是相对原图上下左右镜像。

二、原图显示原理

  1. 横纵为图片的宽度,也是显示的实际宽度,纵轴为图片高度,需将其转化为8字节倍数来显示,超出图片高度部分不显示。
  2. 如图片高度9px转化为2字节显示,图片高度23px转化为3字节显示,图片高度32px转化为4字节显示,以此类推。
  3. 原图显示,先显示纵轴,每显示一个像素纵轴加一,直到纵轴加的数量为图片显示的高度为止,然后纵轴重新为初始值,横纵加一,依次内推。
  4. 图片的显示方式与其取模方式有关。

三、左右镜像原理

  1. 左右镜像原理与原图一致,只是每次纵轴重新为初始值时,横轴减一。

四、上下左右镜像原理

  1. 上下左右镜像原理,先显示纵轴,每显示一个像素纵轴减一,直到纵轴减的数量为图片显示的高度为止,然后纵轴重新为初始值,横纵减一,依次内推。

五、上下镜像原理

  1. 上下镜像原理,先显示纵轴,每显示一个像素纵轴减一,直到纵轴减的数量为图片显示的高度为止,然后纵轴重新为初始值,横纵加一,依次内推。

六、两种不同的取模方式

第一种取模方式


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

第二种取模方式


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


七、不同镜像模式横纵轴的处理方式

/* 加操作 */
static void vHandler_Inc(u16 * pDat, u8 n)
{*pDat += n;
}/* 减操作 */
static void vHandler_Sub(u16 * pDat, u8 n)
{*pDat -= n;
}/* 获取横纵轴的操作 */
static void vGet_xyHandler_Mirror(eMirrorMode mode, void (** xHand)(u16 * x, u8 n), void (** yHand)(u16 * y, u8 n))
{switch (mode){case MIR_MODE_NORMAL:{*xHand = &vHandler_Inc; //横轴加*yHand = &vHandler_Inc; //纵轴加}break;case MIR_MODE_LEFT_RIGHT:{*xHand = &vHandler_Sub; //横轴减*yHand = &vHandler_Inc; //纵轴加}break;case MIR_MODE_LEFT_RIGHT_UP_DOWN:{*xHand = &vHandler_Sub; //横轴减*yHand = &vHandler_Sub; //纵轴减}break;case MIR_MODE_UP_DOWN:{*xHand = &vHandler_Inc; //横轴加*yHand = &vHandler_Sub; //纵轴减}break;default: break;}
}

八、不同镜像模式


/* 镜像模式 */
typedef enum
{MIR_MODE_NORMAL             = 0,    /* 正常模式(0度) */MIR_MODE_LEFT_RIGHT         = 1,    /* 左右镜像(90度) */MIR_MODE_LEFT_RIGHT_UP_DOWN = 2,    /* 左右上下镜像(180度) */MIR_MODE_UP_DOWN            = 3,    /* 上下镜像(270度) */MIR_MODE_MAX
}eMirrorMode;

九、带镜像显示图片方式1

  1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 逐列式 + 逆向(低位在前)取模方式
  2. 此函数适用于Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)取模方式
  3. 取模方式为: 先从上到下,从左到右,按列取,先取完第一列,再取完第二列,直到取完最后一列
/*********************************************************************************************************************************************** 函数名 : vOLED_ShowPicture_Mirror* 描  述 : OLED显示图片带镜像* 输  入 : x       : 横轴坐标*          y       : 纵轴坐标*          xWidth  :图片宽度*          yHeight : 图片高度*          pImage  : 图片指针*          mode    : 镜像模式* 说  明 : 1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 逐列式 + 逆向(低位在前)取模方式*          2. 此函数适用于Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)取模方式*          3. 取模方式为: 先从上到下,从左到右,按列取,先取完第一列,再取完第二列,直到取完最后一列
***********************************************************************************************************************************************/
void vOLED_ShowPicture_Mirror(u16 x, u16 y, u16 xWidth, u16 yHeight, const u8 * pImage, eMirrorMode mode)
{// 1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 逐列式 + 逆向(低位在前)取模方式// 2. 此函数适用于Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)取模方式// 3. 取模方式为: 先从上到下,从左到右,按列取,先取完第一列,再取完第二列,直到取完最后一列void (* xHandler)(u16 * x0, u8 n) = NULL;void (* yHandler)(u16 * y0, u8 n) = NULL;u16 k = 0, j = 0, i = 0, n = 0;u16 yMax  = 0;u16 y0    = 0;u16 y1    = 0;u8  dat   = 0;//镜像模式越界if (MIR_MODE_MAX <= mode){return;}//横纵坐标的操作vGet_xyHandler_Mirror(mode, &xHandler, &yHandler);if ((NULL == xHandler) || (NULL == yHandler)){return;}//图片高度yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0);y0   = y;//图片宽度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);}}yHandler(&y, 1);//纵坐标处理}y1++;if (y1 == yMax){y1 = 0;y  = y0;xHandler(&x, 1);//横坐标处理}}}
}

十、带镜像显示图片方式2

  1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 列行式 + 逆向(低位在前)
  2. 此函数适用于mg2Lcd.exe ==> 数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)
  3. 取模方式为: 先从上到下,从左到右,按列取,先取第一列前8个像素,再取第二列前8个像素,直到最后一列前8个像素;然后再取先取第一列后8个像素,再取第二列后8个像素,直到最后一列后8个像素,以此类推
/*********************************************************************************************************************************************** 函数名 : vOLED_ShowImage_Mirror* 描  述 : OLED显示图片带镜像* 输  入 : x       : 横轴坐标*          y       : 纵轴坐标*          xWidth  :图片宽度*          yHeight : 图片高度*          pImage  : 图片指针*          mode    : 镜像模式* 说  明 : 1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 列行式 + 逆向(低位在前)*          2. 此函数适用于mg2Lcd.exe ==>  数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)*          3. 取模方式为: 先从上到下,从左到右,按列取,先取第一列前8个像素,再取第二列前8个像素,直到最后一列前8个像素;*             然后再取先取第一列后8个像素,再取第二列后8个像素,直到最后一列后8个像素,以此类推
***********************************************************************************************************************************************/
void vOLED_ShowImage_Mirror(u16 x, u16 y, u16 xWidth, u16 yHeight, const unsigned char * pImage, eMirrorMode mode)
{// 1. 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 列行式 + 逆向(低位在前)// 2. 此函数适用于mg2Lcd.exe ==>  数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)// 3. 取模方式为: 先从上到下,从左到右,按列取,先取第一列前8个像素,再取第二列前8个像素,直到最后一列前8个像素;//    然后再取先取第一列后8个像素,再取第二列后8个像素,直到最后一列后8个像素,以此类推void (* xHandler)(u16 * x0, u8 n) = NULL;void (* yHandler)(u16 * y0, u8 n) = NULL;u16 k = 0, j = 0, i = 0, n = 0;u16 yMax = 0;u16 y0   = 0, x0 = 0;u8  dat  = 0;//镜像模式越界if (MIR_MODE_MAX <= mode){return;}//横纵坐标的操作vGet_xyHandler_Mirror(mode, &xHandler, &yHandler);if ((NULL == xHandler) || (NULL == yHandler)){return;}//初始坐标y0   = y;x0   = x;//图片高度yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0);//图片宽度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);}}yHandler(&y, 1);//纵坐标处理}xHandler(&x, 1);//横坐标处理if (XABS2(x, x0) == xWidth){//下部分x  = x0;yHandler(&y0, 8);}y = y0;}}
}

十一、测试的图片取模

#if 1//Img2Lcd.exe ==> 数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)
const unsigned char Image_Flag_24x37[120] =
{0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X1C,0X1C,0X1C,0X1C,0X1F,0X1F,0X1F,0X1C,0X1C,0X1C,0X1C,0X1C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};
#endif#if 0
//Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)
const unsigned char Image_Flag_24x37[120] =
{0X00,0X00,0X00,0X00,0X1C,0X00,0X00,0X00,0X00,0X1C,0X00,0X00,0X00,0X00,0X1C,0X00,0X00,0X00,0X00,0X1C,0X00,0X00,0X00,0X00,0X1C,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0X1F,0XFE,0XFF,0XFF,0XFF,0X1F,0XFC,0XFF,0X03,0X00,0X1C,0XF8,0XFF,0X03,0X00,0X1C,0XF0,0XFF,0X03,0X00,0X1C,0XE0,0XFF,0X03,0X00,0X1C,0XC0,0XFF,0X03,0X00,0X1C,0X80,0XFF,0X03,0X00,0X00,0X00,0XFF,0X03,0X00,0X00,0X00,0XFE,0X03,0X00,0X00,0X00,0XFC,0X03,0X00,0X00,0X00,0XF8,0X03,0X00,0X00,0X00,0XF0,0X03,0X00,0X00,0X00,0XE0,0X03,0X00,0X00,0X00,0XC0,0X03,0X00,0X00,0X00,0X80,0X03,0X00,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X00,0X02,0X00,0X00,
};
#endif


//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,
};

十二、测试核心代码1


vOLED_ShowImage_Mirror(5,   5,  24, 37, Image_Flag_24x37, MIR_MODE_NORMAL);
vOLED_ShowImage_Mirror(55,  5,  24, 37, Image_Flag_24x37, MIR_MODE_LEFT_RIGHT);
vOLED_ShowImage_Mirror(60,  40, 24, 37, Image_Flag_24x37, MIR_MODE_UP_DOWN);
vOLED_ShowImage_Mirror(110, 40, 24, 37, Image_Flag_24x37, MIR_MODE_LEFT_RIGHT_UP_DOWN);

十三、测试核心代码2

vOLED_ShowPicture_Mirror(10, 10, 43, 47, Image_Tree_43x47, MIR_MODE_NORMAL);
vOLED_ShowPicture_Mirror(60, 10, 43, 47, Image_Tree_43x47, MIR_MODE_LEFT_RIGHT);
vOLED_ShowPicture_Mirror(10, 60, 43, 47, Image_Tree_43x47, MIR_MODE_UP_DOWN);
vOLED_ShowPicture_Mirror(80, 60, 43, 47, Image_Tree_43x47, MIR_MODE_LEFT_RIGHT_UP_DOWN);

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. android将控件镜像显示,Android重写ImageView实现图片镜像效果

    前两天朋友问我一个问题,如何实现从手机系统相册加载一张图片,实现拖拽.缩放功能并且能以屏幕中间为分界线镜像显示,当时我的第一反应是继承ImageView,重写onDraw方法,下面就按照这个思路逐步实 ...

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

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

  7. 如何使用OLED显示图片

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

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

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

  9. 0.96寸OLED显示 图片

    今天来讲解一下STM32驱动OLED显示图片,本次教程分为两部分: 1.BMP图片制作 2.程序讲解与调用 1.BMP图片制作(取模) BMP图片取模讲解两种方式:自己画图.普通图片制作. 1)自己画 ...

最新文章

  1. junit、hamcrest、eclemma的安装与使用
  2. js:点击button后返回值
  3. weex 安装过程中遇到的坑
  4. flink web ui提交任务时出现Server Respoonse Message-Internal server error
  5. spring-boot的spring-cache中的扩展redis缓存的ttl和key名
  6. Shell——文件包含
  7. Hyper-V passes Microsoft’s checkmarks exam: isn’t that always the case?
  8. php mysql rpm包_MYSQL RPM包安装
  9. 【报告分享】5G时代新型基础设施建设白皮书.pdf
  10. java 解析栅格数据_使用Rasterio读取栅格数据的实例讲解
  11. 十二月份找工作好找吗_人民大学在职研究生将来好找工作吗?
  12. 无线接入回传一体化关键技术及标准化进展
  13. 如何Word中修改Normal样式模板
  14. 实现一个二维码支持微信和支付宝同时收付款
  15. 面试智力题精选:扑克牌问题
  16. 基于Python的房价影响因素分析
  17. C# 通过Http获取网页内容
  18. 毛选-实践论-辩证唯物论的认识论-知行统一观
  19. 程序员如何告别肩颈疲劳
  20. 天龙八部服务器端 修改缥缈峰副本,[专题]聚焦缥缈峰全局攻略

热门文章

  1. cmake -fpic
  2. 【C++】栈中实例化对象与堆中实例化对象
  3. 网络通信和Web编程
  4. AEE-ADAPTIVE Emulation Environment
  5. androidpc模拟器!大厂offer手到擒来,挥泪整理面经
  6. java游戏boss是冰龙_炉石传说冒险模式冰龙区BOSS克尔苏加德打法攻略
  7. Linux 磁盘扩容
  8. 2015/12/30日-月总结(心很累,然而并没有暖用)
  9. “应该为在运行时可能编辑的任何文本嵌入字体,具有”使用设备字体”设置的文本除外。使用”文本” “字体嵌入”命令嵌入字体。”
  10. 51智能小车小车之循迹(一)