• 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) 
    
    • 1
    • 2
    • 3
    • 4

    📝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);        //开启滚动	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 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);
    
    • 1
    • 2
    • 3
    • 4
    • 移植的示例以及实现函数在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);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    🎯所包含的画图功能函数

    //功能:初始化图形库
    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,...);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    📍如果想移植到SPI接口上面使用,也是可以的, 功能函数不受影响。在这里提供一个个开源的SPI驱动ssd1306滚动显示的github工程:https://github.com/Sunlight-Dazzling/LEDORoll

    ⛳工程源码

    链接:https://pan.baidu.com/s/16JBq1FL9D02f3L2TB2d4xA 
    提取码:x2sj
    
    • 1
    • 2
  • 相关阅读:
    springboot+vue职称评审管理系统
    Java中collections类常用方法介绍 (#将指定集合包装成线程同步的集合)
    7.nginx常用功能模块
    linux系统部署jar脚本编译
    Spring框架中有哪些不同类型的事件
    STM32CubeMX教程16 DAC - 输出3.3V内任意电压
    MySQL LIKE – 语法和用法示例教程
    分享一个卡片轮播
    Go 存储系列:B+树存储引擎 boltdb
    基于opencv答题卡识别基本处理_1
  • 原文地址:https://blog.csdn.net/weixin_42880082/article/details/126982745