总结上文OLED的概念,OLED模块需要关注的点:
-
要驱动OLED模块的通信接口及控制一些OLED模块的控制引脚。
-
要通过修改SSD1309寄存器的值,初始化OLED模块(发命令的方式)
-
设置内存地址模式,这个会影响到字符串显示的驱动
-
熟悉SSD1309控制器的命令,有对比度,开关,滚屏等命令。//设置一些命令,可以实现滚屏的效果。
-
一般使用的内存地址模式是页地址模式,在显示 RAM 读写之后,列地址指针自动加一。如果列地址指针达到了列的结束地址,列地址指针重置为列开始地址并且页地址指针不会改变。
-
有128*64 bit 的显存,可以这样定义:uint8_t OLED_GRAM[128][8];
-
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的步骤:
-
确保OLED模块 与 STM32F1硬件接线方式正确。需要连接连接7个引脚,并且处理好限制引脚。
-
复位引脚RES#
-
4线SPI接口(SCLK, SDIN, CS#, D/C#) //D0充当SCLK,D1充当SDIN。
-
电源, 地
-
D2应该保持开路。从D3到D7的引脚,E和R / W#(WR#)#可以连接到外部接地。
-
-
设置STM32F1与 OLED模块相连接的IO。
-
设置RES#,D/C#, CS# , SCLK, SDIN 输出
-
-
初始化OLED显示屏模块
-
STM32F1通过SPI接口往OLED模块发送命令,来初始化OLED模块,一般使用厂商给的初始化参数,不需要过多修改。。。
-
往OLED模块发送命令,此命令就是修改OLED相关寄存器。
-
一般的设置:
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);
-
-
实现“字”,“字符串”,“数字”等的驱动,这些驱动可以被上层应用调用,便于项目分层。