金樱子

首页 » 常识 » 诊断 » 一文彻底了解SSD驱动096寸
TUhjnbcbe - 2021/5/3 0:08:00
治疗白癜风最有效的医院 http://m.39.net/pf/a_4618897.html
点击上方[物联网思考],选择置顶,第一时间查看物联网分享!前言:整理东西的时候,翻出了一个OLED,驱动起来玩一玩。先上一张图,显示了字符串、汉字。本文驱动在esp2、stm8、efm2,es2上面均已验证通过过。

在淘宝上找了一些资料,但是要想彻底理解如何驱动,还是要看驱动芯片的手册。

这个模块默认是使用SPI通讯的,如果要使用I2C通讯,需要把R电阻取下来,焊接到R1的位置,如上图。

首先,需要说明的一点,显示屏都需要控制器;所谓显示,其实就是操作控制芯片,包括入门级别的LCD、LCD都是集成了控制芯片的,不同厂家用的控制芯片可能不同,像LCD、LCD这些的控制芯片基本上驱动都是一样的,这也是我们在驱动这些的时候,没有去研究所用的控制芯片的原因。

图中的0.96寸OLED,所用的控制芯片正是SSD,不同厂家可以用不同的驱动芯片,要让OLED显示,其实就是要驱动SSD。

SSD支持多种控制方式,I2C、、、4线SPI、线SPI,通过BS0、BS1、BS2引脚接不同的电平来选择控制方式,此次我们使用I2C来控制,那么需要BS0接GND、BS1接VCC、BS2接GND,如下datasheet中描述的:

针对本模块我们还需用到的其他引脚:

复位信号引脚,在显示的时候保持高电平。

1、I2C通讯

(1)通过D/C#(datasheet中的SA0)这个引脚来扩展I2C地址,这个引脚接VCC或者GND,对应不同的地址;

(2)需要将D1和D2接在一起作为SDA;

()D0为SCL;

(4)SCL和SDA需接外部上拉,这也是I2C通讯最基本的要求;

(5)RES#引脚用于初始化,需要在硬件设计上注意。

2、写I2C

(1)发送地址之后,发送控制数据或者命令数据字节;这个字节由Co位和D/C#位以及6个0组成;

(2)如果Co位为0,那么后续的信息都是数据;

()D/C#位决定了下一个数据是命令还是数据,如果D/C#位是0,那么后面的数据是命令,如果D/C#位是1,那么后面的数据是数据将被存储在GDDRAM中。

(4)基本控制规律就是,发送I2C地址,发送命令或者数据控制字节、发送数据或者命令。

、原理设计

模块带的原理图,可以看出来,通过R8将D1和D2连在了一起,这也符合手册中的要求,但是我们主要是向SSD写数据,所以这个R8也可以不接。如果需要读数据的话,就需要接上。

4、显存

显存大小*64,分8个页,PAGE0~PAGE7,列。

一次写8个像素点,即同一个page内的同一列8个点。一个字节的8个bit刚好对应D0到D7(根据这个特性,我们取模的时候,首先要按列取模)。

5、寻址模式

三种寻址模式:页寻址、水平寻址、垂直寻址。

寻址模式设置命令:

5.1、页寻址(默认的寻址方式,我们用这种寻址,综合上面的列式取模,因此我们用列行式的取模方式)

(1)列地址指针每次自动加1,如果列地址指针到达最后一个地址,将会自动复位到开始的地址,页地址指针不变;

(2)为了访问下一个页面RAM内容,用户必须设置新的页面和列地址;

()页地址的范围0-7,对应的命令是B0-B7;

(4)低列地址的设置命令是00-0FH,高列地址的设置命令是10h-1Fh。

页寻址模式设置命令:

5.2、水平寻址模式

列地址指针每次自动加1,如果列地址指针到达最后一个地址,将会自动复位到开始的地址,页地址指针也加1。

5.、垂直寻址模式

页地址指针每次自动加1,如果页地址指针到达最后一个地址,将会自动复位到开始的地址,列地址指针也加1。

水平或者垂直寻址模式设置命令:

6、代码实现

6.1、I2C写

voidSSD_WriteCmd(uint8cmd){I2C_Start();I2C_SendByte(SSD_I2C_ADDR

0x00);I2C_Ack();I2C_SendByte(0x00);//cmdI2C_Ack();I2C_SendByte(cmd);I2C_Ack();I2C_Stop();}voidSSD_WriteData(uint8data){I2C_Start();I2C_SendByte(SSD_I2C_ADDR

0x00);I2C_Ack();I2C_SendByte(0x40);//dataI2C_Ack();I2C_SendByte(data);I2C_Ack();I2C_Stop();}

6.2、OLED驱动

//SSD初始化voidOLED_Init(void){_delay_ms();//SSD复位之后,默认的是页寻址方式SSD_WriteCmd(0xAE);//--displayoffSSD_WriteCmd(0x00);//--setlowcolumnaddressSSD_WriteCmd(0x10);//--sethighcolumnaddressSSD_WriteCmd(0x40);//--setstartlineaddressSSD_WriteCmd(0xB0);//--setpageaddressSSD_WriteCmd(0x81);//contractcontrolSSD_WriteCmd(0xFF);//--SSD_WriteCmd(0xA1);//setsegmentre-map0toSSD_WriteCmd(0xA6);//setnormaldisplaySSD_WriteCmd(0xA8);//setmultiplexratio(1to64)SSD_WriteCmd(0xF);//--1/2dutySSD_WriteCmd(0xC8);//ComscandirectionSSD_WriteCmd(0xD);//setdisplayoffsetSSD_WriteCmd(0x00);//nooffsetSSD_WriteCmd(0xD5);//setdisplayclockdivideratio/oscillatorfrequencySSD_WriteCmd(0x80);//SSD_WriteCmd(0xD8);//setareacolormodeoffSSD_WriteCmd(0x05);//SSD_WriteCmd(0xD9);//SetPre-ChargePeriodSSD_WriteCmd(0xF1);//SSD_WriteCmd(0xDA);//set

1
查看完整版本: 一文彻底了解SSD驱动096寸