STM32F103+1.3“SH1106 IIC内容滚动显示示例
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103+1.3“SH1106 IIC内容滚动显示示例相关的知识,希望对你有一定的参考价值。
STM32F103+1.3"SH1106 IIC内容滚动显示示例
- ✨显示演示
- 🌿指定行区块滚动显示
本示例参考了:SSD1306指令集,驱动和ssd1306差不多,但是移植到SH1106 1.3寸屏幕需要修改个别地方。
- SSD1306指令集可以参考:
https://www.cnblogs.com/chengerccj/p/15004723.html
接线说明
GND---电源地
VCC 3.3v电源
SCL -> PA5(SCL)
SDA -> PA7(SDA)
📝0.96 ssd1306 和1.3 SH1106代码修改
📖滚动操作函数
📌在调试操作滚动移动速度时发现SH1106和ssd1306不同的地方是,设置滚动时间间隔命令是放在设置起始页前面,而不是后,这一点需要注意。
void oled_dir_scroll(unsigned char dir,unsigned char step,unsigned char page)
WriteCmd(0x2E); //关闭滚动
WriteCmd(dir ? 0x26:0x27); //水平向左或者右滚动 26/27
WriteCmd(0x00); //虚拟字节
WriteCmd(step & 0x07); /* 设置滚动步长时间间隔,帧为单位:0-7 */
WriteCmd(page & 0x07); //起始页 0
WriteCmd(0x07); //终止页 7
WriteCmd(0x00); //虚拟字节
WriteCmd(0xFF); //虚拟字节
WriteCmd(0x2F); //开启滚动
dir
:滚动方向:0-1step
:滚动步长时间间隔,移动速度:0-7page
:指定行区块移动对象。0-7
📝指定水平位置和方向移动函数
这部分内容是从
Arduino SSD1306
库当中移植过来的,勉强可以使用,具体还没有仔细参照指令表去优化,简单测试可以实现
void startscrolldiagleft(unsigned char start, unsigned char stop);
void startscrolldiagright(unsigned char start, unsigned char stop);
void startscrollright(unsigned char start, unsigned char stop);
void startscrollleft(unsigned char start, unsigned char stop);
- 移植的示例以及实现函数在
test.c
文件当中。
void startscrolldiagright(unsigned char start, unsigned char stop)
WriteCmd(0xa3);
WriteCmd(0X00);
WriteCmd(64);
WriteCmd(0X29);//向右
WriteCmd(0X00);//虚拟字节
WriteCmd(0x00);//滚动时间间隔:0-7
WriteCmd(start);//起始页 0
// WriteCmd(0x00);
WriteCmd(stop);//终止页 1
// WriteCmd(0x00); //虚拟字节
// WriteCmd(0xFF); //虚拟字节
WriteCmd(0x1f);//
WriteCmd(0x2f);//开启滚动
void startscrolldiagleft(unsigned char start, unsigned char stop)
WriteCmd(0xa3);
WriteCmd(0x00);
WriteCmd(64);
WriteCmd(0X2a);//向左
WriteCmd(0X00);
WriteCmd(0x00);//滚动时间间隔:0 - 7
WriteCmd(start);//起始页 0
// WriteCmd(0x00);
WriteCmd(stop);//终止页 1
// WriteCmd(0x00); //虚拟字节
// WriteCmd(0xFF); //虚拟字节
WriteCmd(0x01);//虚拟字节
WriteCmd(0x2f);//开启滚动
void testscrolltext(void)
ClearScreen();
SetFontSize(1);
DrawString(0,0,"scroll");
UpdateScreen(); // Show initial text
DelayMs(100);
//在不同的方向滚动,中间暂停:
// Scroll in various directions, pausing in-between:
startscrollleft(0x00, 0x07);
DelayMs(1000);
WriteCmd(0x2E); //关闭滚动
DelayMs(1000);
startscrollright(0x00, 0x07); //0x0f,水平向左或者右滚动 26/27
DelayMs(1000);
WriteCmd(0x2E);
DelayMs(1000);
startscrolldiagright(0x00, 0x07);
DelayMs(1000);
WriteCmd(0x2E);
startscrolldiagleft(0x00, 0x07);
DelayMs(1000);
WriteCmd(0x2E);
DelayMs(1000);
🎯所包含的画图功能函数
//功能:初始化图形库
void InitGraph(void);
//功能:将屏幕数据更新到设备上
void UpdateScreen(void);
//功能:清屏
void ClearScreen(void);
//请将此函数放入1ms中断里,为图形提供时基
void OledTimeMsFunc(void);
//图形库test.c的延时函数
void DelayMs(u16 ms);
//功能:设置字体的背景模式 0为透明,1为正常。
void SetTextBkMode(unsigned char value);
//功能:获取字体的背景模式 0为透明,1为正常。
unsigned char GetTextBkMode(void);
//功能:设置绘制的颜色 pix_black:黑色、pix_white:白色
extern void SetDrawColor(Type_color value);
//功能:获取当前设置的绘制颜色 pix_black:黑色、pix_white:白色
extern Type_color GetDrawColor(void);
//功能:设置填充的颜色 pix_black:黑色、pix_white:白色
extern void SetFillcolor(Type_color value);
//功能:获取当前设置的填充颜色 pix_black:黑色、pix_white:白色
extern Type_color GetFillColor(void);
/
//以下函数为oled.draw中直接供用户调用的函数
//功能:绘制一个点
extern void DrawPixel(int x,int y);
//功能:获取一个像素点的颜色
extern Type_color GetPixel(int x,int y);
//功能:绘制一条任意线
extern void DrawLine(int x1,int y1,int x2,int y2);
//功能:快速绘制一条水平线 w为长度
extern void DrawFastHLine(int x, int y, unsigned char w);
//功能:快速绘制一条垂直线
extern void DrawFastVLine(int x, int y, unsigned char h);
//功能:连续画线 折线 num为折点个数
void DrawPolyLineTo(const TypeXY *points,int num);
//功能:使用对角点绘制矩形
extern void DrawRect1(int left,int top,int right,int bottom);
//功能:使用对角点填充矩形
extern void DrawFillRect1(int left,int top,int right,int bottom);
//功能:使用顶点 宽高绘制矩形
extern void DrawRect2(int left,int top,int width,int height);
//功能:使用顶点 宽高填充矩形
extern void DrawFillRect2(int left,int top,int width,int height);
//功能:绘制一个圆
extern void DrawCircle( int usX_Center, int usY_Center, int usRadius);
//功能:绘制一个实心圆
extern void DrawFillCircle( int usX_Center, int usY_Center, int usRadius);
//功能:4份之一圆要画哪一份或哪几份
extern void DrawCircleHelper(int x0, int y0, unsigned char r, unsigned char cornername);
//功能://填充2个四分之一圆和中间的矩形 (专用函数 见函数注释)
extern void DrawFillCircleHelper(int x0, int y0, unsigned char r, unsigned char cornername, int delta);
//功能:绘制一个圆弧(需优化)
extern void DrawArc(int x,int y,unsigned char r,int angle_start,int angle_end);
//功能:填充一个圆弧(待补充)
extern void DrawFillArc(int x,int y,unsigned char r,int angle_start,int angle_end);
//功能:绘制一个圆角矩形
extern void DrawRoundRect(int x, int y, unsigned char w, unsigned char h, unsigned char r);
//功能:绘制一个填充圆角矩形
extern void DrawfillRoundRect(int x, int y, unsigned char w, unsigned char h, unsigned char r);
//功能:绘制一个椭圆
extern void DrawEllipse(int x0,int y0,int a,int b);
//功能:绘制一个填充椭圆
extern void DrawFillEllipse(int x0,int y0,int a,int b);
//功能:绘制一个矩形内切椭圆
extern void DrawEllipseRect( int x0, int y0, int x1, int y1);
//功能:绘制一个三角形
extern void DrawTriangle(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2);
//功能:绘制一个填充三角形
extern void DrawFillTriangle(int x0, int y0, int x1, int y1, int x2, int y2);
//功能:绘制一张图片 bitmap为图片数据(可通过取模获取)
extern void DrawBitmap(int x, int y, const unsigned char *bitmap, unsigned char w, unsigned char h);
extern void startscrollright(uint8_t start, uint8_t stop);
//功能:设置字体大小 0 1 2 3
extern void SetFontSize(unsigned char value);
//功能:获取字体大小
extern unsigned char GetFontSize(void);
//功能:绘制一个字符 特殊地:当size=0时 x为0-7大行 y为0-127列
extern void DrawChar(int x, int y, unsigned char c);
//功能:绘制字符串 特殊地:当size=0时 x为0-7大行 y为0-127列
extern void DrawString(int x, int y,char *str);
//功能:绘制数字 len为数字长度 特殊地:当size=0时 x为0-7大行 y为0-127列
extern void DrawNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len);
//显示汉字
void OLED_ShowCHinese(u8 x,u8 y,u8 *cn);
/
//以下函数为oled.basic中直接供用户调用的函数
//功能:可用于填充一个封闭图形(可能在填充圆弧中非常适合使用)
extern void FloodFill2(unsigned char x,unsigned char y,int oldcolor,int newcolor);
//功能:移动绘制坐标
extern void MoveTo(int x,int y);
//功能:线性绘制,并将绘制坐标移动到下一个坐标(在绘制折线中被调用)
extern void LineTo(int x,int y);
//功能:获取当前点绘制点的y坐标
extern int GetY(void);
//功能:获取当前点绘制点的X坐标
extern int GetX(void);
//功能:获取当前点绘制点的X、Y坐标
extern TypeXY GetXY(void);
//功能:设置旋转中心点
extern void SetRotateCenter(int x0,int y0);
//功能:设置旋转角度
extern void SetAngle(float angle);
//功能:设置旋转方向
extern void SetAnggleDir(int direction);
//功能:设置角度、旋转方向、旋转中心
extern void SetRotateValue(int x,int y,float angle,int direct);
//功能:将一个坐标旋转一定角度
extern TypeXY GetRotateXY(int x,int y);
//屏幕数据缓冲
extern void SetScreenBuffer(void);
//功能:设置新的缓冲作为屏幕数据,
extern void SetTempBuffer(void);
//功能:获取当前的缓冲buffer的系数 返回缓冲系数SCREEN_BUFFER或TEMP_BUFFER
extern unsigned char GetSelectedBuffer(void);
//功能:清除掉默认的屏幕缓冲数据
extern void ClearScreenBuffer(unsigned char val);
//功能:清除掉临时的屏幕缓冲数据
extern void ClearTempBuffer(void);
//功能:临时缓冲的功能
extern void TempBufferFunc(int func);
//功能:固定帧刷新
extern unsigned char FrameRateUpdateScreen(int value);
//功能:用以打印调试bug,功能和printf一致,不用使用ClearScreen方法也可打印出数据
extern int OledPrintf(const char *str,...);
📍如果想移植到SPI接口上面使用,也是可以的, 功能函数不受影响。在这里提供一个个开源的SPI驱动ssd1306滚动显示的github工程:
https://github.com/Sunlight-Dazzling/LEDORoll
⛳工程源码
链接:https://pan.baidu.com/s/16JBq1FL9D02f3L2TB2d4xA
提取码:x2sj
以上是关于STM32F103+1.3“SH1106 IIC内容滚动显示示例的主要内容,如果未能解决你的问题,请参考以下文章
STM32F103C8T6在Arduino框架下驱动SH1106 1.3“ IIC OLED显示
STM32F103C8T6 + 0.96“ I2C OLED显示3D_Cube