motor_cs103/User/board/ssd096_oled.c

148 lines
3.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();
}