STM32F1驱动OLED的步骤

总结上文OLED的概念,OLED模块需要关注的点:

  1. 要驱动OLED模块的通信接口及控制一些OLED模块的控制引脚。

  2. 要通过修改SSD1309寄存器的值,初始化OLED模块(发命令的方式)

  3. 设置内存地址模式,这个会影响到字符串显示的驱动

  4. 熟悉SSD1309控制器的命令,有对比度,开关,滚屏等命令。//设置一些命令,可以实现滚屏的效果。

  5. 一般使用的内存地址模式是页地址模式,在显示 RAM 读写之后,列地址指针自动加一。如果列地址指针达到了列的结束地址,列地址指针重置为列开始地址并且页地址指针不会改变。

  6. 有128*64 bit 的显存,可以这样定义:uint8_t OLED_GRAM[128][8];

  7. OLED的显存,存放格式如下.

[0]0 1 2 3 ... 127    

[1]0 1 2 3 ... 127    

[2]0 1 2 3 ... 127    

[3]0 1 2 3 ... 127    

[4]0 1 2 3 ... 127    

[5]0 1 2 3 ... 127    

[6]0 1 2 3 ... 127    

[7]0 1 2 3 ... 127

结合自己的项目,驱动OLED的步骤:

  1. 确保OLED模块 与 STM32F1硬件接线方式正确。需要连接连接7个引脚,并且处理好限制引脚。

    1. 复位引脚RES# 

    2. 4线SPI接口(SCLK,  SDIN,  CS#, D/C#) //D0充当SCLK,D1充当SDIN。

    3. 电源, 地 

    4. D2应该保持开路。从D3到D7的引脚,E和R / W#(WR#)#可以连接到外部接地。

  2. 设置STM32F1与 OLED模块相连接的IO。

    1. 设置RES#,D/C#, CS# , SCLK, SDIN 输出

  3. 初始化OLED显示屏模块

    1. STM32F1通过SPI接口往OLED模块发送命令,来初始化OLED模块,一般使用厂商给的初始化参数,不需要过多修改。。。

    2. 往OLED模块发送命令,此命令就是修改OLED相关寄存器。

    3. 一般的设置:

      OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
      
          OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
      
          OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率
      
          OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
      
          OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)
      
          OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
      
          OLED_WR_Byte(0X00,OLED_CMD); //默认为0
      
          OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.                                            
      
          OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
      
          OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
      
          OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
      
          OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
      
          OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
      
          OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
      
          OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
      
          OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置    
      
          OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
      
          OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
      
          OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
      
          OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
      
          OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
      
          OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
      
          OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
      
          OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示                                   
      
          OLED_WR_Byte(0xAF,OLED_CMD); //开启显示    
      
          OLED_Clear();
      
      或者:
      
          OLED_WR_Byte(0xFD,OLED_CMD);    //Command Lock  ( SSD1309 use, SSD1305 no use )
      
          OLED_WR_Byte(0x12,OLED_CMD);    // Unlock Driver IC (0x12/0x16)       
      
          OLED_WR_Byte(0xAE,OLED_CMD);    // Set Display Off
      
          OLED_WR_Byte(0xD5,OLED_CMD);    //Set Display Clock Divide Ratio/Oscillator Frequency      设置时钟分频
      
          OLED_WR_Byte(0xA0,OLED_CMD);    //
      
          OLED_WR_Byte(0xA8,OLED_CMD);    //Set Multiplex Ratio        设置多路复用比率
      
          OLED_WR_Byte(0x3F,OLED_CMD);    //
      
          OLED_WR_Byte(0xD3,OLED_CMD);    //Set Display Offset
      
          OLED_WR_Byte(0x00,OLED_CMD);    //
      
          OLED_WR_Byte(0x40,OLED_CMD);    // Set Display Start Line
      
          OLED_WR_Byte(0xA1,OLED_CMD);    // Set SEG/Column Mapping (0xA0/0xA1)
      
          OLED_WR_Byte(0xC8,OLED_CMD);    // Set COM/Row Scan Direction (0xC0/0xC8)
      
          OLED_WR_Byte(0xDA,OLED_CMD);    //Set COM Pins Hardware Configuration
      
          OLED_WR_Byte(0x12,OLED_CMD);    // Set Alternative Configuration (0x02/0x12)    
      
          OLED_WR_Byte(0x81,OLED_CMD);    //Set Current Control
      
          OLED_WR_Byte(0xFF,OLED_CMD);    //     
      
          OLED_WR_Byte(0xD9,OLED_CMD);    //Set Pre-Charge Period
      
          OLED_WR_Byte(0x82,OLED_CMD);    //
      
          OLED_WR_Byte(0xDB,OLED_CMD);    //Set VCOMH Deselect Level
      
          OLED_WR_Byte(0x34,OLED_CMD);    //
      
          //OLED_WR_Byte(0x20,OLED_CMD);
      
          //OLED_WR_Byte(0x02,OLED_CMD);    // Set Page Addressing Mode (0x00/0x01/0x02)
      
          OLED_WR_Byte(0xA4,OLED_CMD);    // Set Entire Display On/Off (0xA4/0xA5)
      
          OLED_WR_Byte(0xA6,OLED_CMD);    // Set Normal/Inverse Display (0xA6/0xA7)
      
          OLED_Clear(); //清屏
      
          HAL_Delay(10);
      
          OLED_WR_Byte(0xAF,OLED_CMD);        //Set Display On
      
          HAL_Delay(200);
  4.  实现“字”,“字符串”,“数字”等的驱动,这些驱动可以被上层应用调用,便于项目分层。

发布了105 篇原创文章 · 获赞 30 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/happygrilclh/article/details/105640776