#include "ssd096_oled.h" static void i2c_start(void) { GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN); GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN); GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN); } static void i2c_stop(void) { GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN); GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN); } void i2c_write_byte(uint8_t data) { uint8_t i; for (i = 0; i < 8; i++) { if ((data & 0x80) >> i) GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN); else GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN); data <<= 1; GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN); } GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); // 额外的一个时钟,不处理应答信号 GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN); } /** * @brief 向I2C设备写入命令 * * 通过I2C接口向指定设备写入一个命令字节。 * * @param command 要写入的命令字节 */ static void i2c_write_command(uint8_t command) { i2c_start(); i2c_write_byte(0x78); i2c_write_byte(0x00); i2c_write_byte(command); i2c_stop(); } /** * @brief 向I2C设备写入一个字节的数据 * * 该函数通过I2C总线向指定设备写入一个字节的数据。 * * @param data 要写入的数据字节 */ static void i2c_write_data(uint8_t data) { i2c_start(); i2c_write_byte(0x78); i2c_write_byte(0x40); i2c_write_byte(data); i2c_stop(); } /** * @brief 设置SSD096 OLED显示屏上的光标位置 * * 设置SSD096 OLED显示屏上的光标位置到指定的x和y坐标。 * * @param x 横向位置,取值范围为0到127 * @param y 纵向位置,取值范围为0到63 */ void ssd096_set_position(uint8_t x, uint8_t y) { i2c_write_command(0xb0 | y); i2c_write_command(0x10 | ((x & 0xf0) >> 4)); i2c_write_command(0x00 | (x & 0x0f)); } /** * @brief 清空SSD096显示屏 * * 该函数将SSD096显示屏的内容清空,即将所有像素点设置为关闭状态。 * * @note 该函数通过I2C接口向SSD096发送数据,以实现清屏操作。 */ void ssd096_clear(void) { uint8_t i, j; for (i = 0; i < 8; i++) { ssd096_set_position(i, 0); for (j = 0; j < 128; j++) { i2c_write_data(0x00); } } } void ssd096_full(void) { uint8_t i, j; for (i = 0; i < 8; i++) { ssd096_set_position(i, 0); for (j = 0; j < 128; j++) { i2c_write_data(0xff); } } } /** * @brief 初始化SSD096显示驱动 * * 该函数用于初始化SSD096显示驱动,完成基本的配置和初始化工作。 */ void ssd096_init(void) { i2c_write_command(0xae); i2c_write_command(0xd5); i2c_write_command(0x80); i2c_write_command(0xa8); i2c_write_command(0x3f); i2c_write_command(0xd3); i2c_write_command(0x00); i2c_write_command(0x40); i2c_write_command(0xa1); i2c_write_command(0xc8); i2c_write_command(0xda); i2c_write_command(0x12); i2c_write_command(0x81); i2c_write_command(0xcf); i2c_write_command(0xd9); i2c_write_command(0xf1); i2c_write_command(0xdb); i2c_write_command(0x30); i2c_write_command(0xa4); i2c_write_command(0xa6); i2c_write_command(0x8d); i2c_write_command(0x14); i2c_write_command(0xaf); ssd096_clear(); ssd096_full(); }