STM32F103xx OLED镜像显示图片
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. 上下左右镜像是相对原图上下左右镜像。
二、原图显示原理
- 横纵为图片的宽度,也是显示的实际宽度,纵轴为图片高度,需将其转化为8字节倍数来显示,超出图片高度部分不显示。
- 如图片高度9px转化为2字节显示,图片高度23px转化为3字节显示,图片高度32px转化为4字节显示,以此类推。
- 原图显示,先显示纵轴,每显示一个像素纵轴加一,直到纵轴加的数量为图片显示的高度为止,然后纵轴重新为初始值,横纵加一,依次内推。
- 图片的显示方式与其取模方式有关。
三、左右镜像原理
- 左右镜像原理与原图一致,只是每次纵轴重新为初始值时,横轴减一。
四、上下左右镜像原理
- 上下左右镜像原理,先显示纵轴,每显示一个像素纵轴减一,直到纵轴减的数量为图片显示的高度为止,然后纵轴重新为初始值,横纵减一,依次内推。
五、上下镜像原理
- 上下镜像原理,先显示纵轴,每显示一个像素纵轴减一,直到纵轴减的数量为图片显示的高度为止,然后纵轴重新为初始值,横纵加一,依次内推。
六、两种不同的取模方式
第一种取模方式
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
- 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 逐列式 + 逆向(低位在前)取模方式
- 此函数适用于Img2Lcd.exe ==> 垂直扫描 + 单色 + 字节内像素数据反序(低位在前)取模方式
- 取模方式为: 先从上到下,从左到右,按列取,先取完第一列,再取完第二列,直到取完最后一列
/*********************************************************************************************************************************************** 函数名 : 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
- 此函数适用于PCtoLCD2002完美版 ==> 阴码 + 列行式 + 逆向(低位在前)
- 此函数适用于mg2Lcd.exe ==> 数据水平,字节垂直 + 单色 + 字节内像素数据反序(低位在前)
- 取模方式为: 先从上到下,从左到右,按列取,先取第一列前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镜像显示图片相关推荐
- STM32F103xx OLED旋转显示图片
STM32F103xx OLED旋转显示图片 编译器平台及例程说明 编译器说明 例程说明 一.图片旋转显示样式 二.图片旋转显示原理简述 三.两种不同的取模方式 第一种取模方式 第二种取模方式 四.不 ...
- 程序默认在副屏显示_树莓派使用 OLED 屏显示图片及文字
树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看.这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片 ...
- msp430f5529——OLED屏显示文字与图片
目录 前言 一.效果展示 二.步骤 1.OLED.C文件 2.OLED.h文件 3.OLEDFONT.h文件 4.type.h文件 5.bmp.h文件 6.main.c 7.关于文字和图片的取模 总结 ...
- stm32单片机OLED显示图片 位图转换 Image2Lcd使用
在OLED或其他单色屏上显示图片,为减小Flash占用,需要转换为单色的位图. 对于主控是sdd1306的oled的取模方式: 打开Image2Lcd. 按照如图左侧进行配置,将图片转换为 128x6 ...
- android将控件镜像显示,Android重写ImageView实现图片镜像效果
前两天朋友问我一个问题,如何实现从手机系统相册加载一张图片,实现拖拽.缩放功能并且能以屏幕中间为分界线镜像显示,当时我的第一反应是继承ImageView,重写onDraw方法,下面就按照这个思路逐步实 ...
- 利用51单片机+0.96寸iic接口oled显示图片或动图
利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...
- 如何使用OLED显示图片
以下文章来源于:公_众_号开源电子网 读取更多技术文章,请扫码关注 如何使用OLED显示图片 前言 这篇文章不过多描述OLED工作原理及驱动过程,仅从实用性出发,如何使用OLED显示图片.这里我们以正 ...
- 【Image2Lcd与PCtoLCD2002】实现stm32 上 接oled 显示图片
文章目录 前言 先上效果图 一.oled?转成想要的分辨率 二.Image2Lcd(破解版) 三.PCtoLCD2002(完美版) 四.oled代码 OLED.c OLED.h OLED_Front. ...
- 0.96寸OLED显示 图片
今天来讲解一下STM32驱动OLED显示图片,本次教程分为两部分: 1.BMP图片制作 2.程序讲解与调用 1.BMP图片制作(取模) BMP图片取模讲解两种方式:自己画图.普通图片制作. 1)自己画 ...
最新文章
- junit、hamcrest、eclemma的安装与使用
- js:点击button后返回值
- weex 安装过程中遇到的坑
- flink web ui提交任务时出现Server Respoonse Message-Internal server error
- spring-boot的spring-cache中的扩展redis缓存的ttl和key名
- Shell——文件包含
- Hyper-V passes Microsoft’s checkmarks exam: isn’t that always the case?
- php mysql rpm包_MYSQL RPM包安装
- 【报告分享】5G时代新型基础设施建设白皮书.pdf
- java 解析栅格数据_使用Rasterio读取栅格数据的实例讲解
- 十二月份找工作好找吗_人民大学在职研究生将来好找工作吗?
- 无线接入回传一体化关键技术及标准化进展
- 如何Word中修改Normal样式模板
- 实现一个二维码支持微信和支付宝同时收付款
- 面试智力题精选:扑克牌问题
- 基于Python的房价影响因素分析
- C# 通过Http获取网页内容
- 毛选-实践论-辩证唯物论的认识论-知行统一观
- 程序员如何告别肩颈疲劳
- 天龙八部服务器端 修改缥缈峰副本,[专题]聚焦缥缈峰全局攻略
热门文章
- cmake -fpic
- 【C++】栈中实例化对象与堆中实例化对象
- 网络通信和Web编程
- AEE-ADAPTIVE Emulation Environment
- androidpc模拟器!大厂offer手到擒来,挥泪整理面经
- java游戏boss是冰龙_炉石传说冒险模式冰龙区BOSS克尔苏加德打法攻略
- Linux 磁盘扩容
- 2015/12/30日-月总结(心很累,然而并没有暖用)
- “应该为在运行时可能编辑的任何文本嵌入字体,具有”使用设备字体”设置的文本除外。使用”文本” “字体嵌入”命令嵌入字体。”
- 51智能小车小车之循迹(一)