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代码修改

  • 📢1.3寸oled屏幕和0.96寸屏幕显示使用区别:0.96屏幕oled_driver.c文件里的数据发送地址需要修改:0.96寸屏幕:从0x00开始写数据,1.3寸屏幕从0x02开始写数据,清屏函数改为132

📖滚动操作函数

📌在调试操作滚动移动速度时发现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-1
  • step:滚动步长时间间隔,移动速度:0-7
  • page:指定行区块移动对象。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

STM32F103VC+DS18B20温度+hc-sr04超声波测距+I2C OLED显示

stm32f407H库和stm32f103H库有区别吗

STM32F103的MCU简介

stm32 f103和f407的区别?