148 lines
3.4 KiB
C
148 lines
3.4 KiB
C
#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();
|
||
}
|