135 lines
3.7 KiB
C
135 lines
3.7 KiB
C
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include "driver/i2c.h"
|
||
|
#include "esp_log.h"
|
||
|
#include "codetab.h"
|
||
|
|
||
|
#define Brightness 0xCF
|
||
|
#define X_WIDTH 128
|
||
|
#define Y_WIDTH 64
|
||
|
|
||
|
#define I2C_ADDRESS 0x78
|
||
|
|
||
|
#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
|
||
|
#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
|
||
|
#define I2C_MASTER_SDA_IO 9
|
||
|
#define I2C_MASTER_SCL_IO 10
|
||
|
#define I2C_MASTER_FREQ_HZ 400000 /*!< I2C master clock frequency */
|
||
|
#define I2C_MASTER_NUM I2C_NUM_0
|
||
|
|
||
|
void initI2c()
|
||
|
{
|
||
|
int i2c_master_port = I2C_MASTER_NUM;
|
||
|
|
||
|
i2c_config_t conf = {
|
||
|
.mode = I2C_MODE_MASTER,
|
||
|
.sda_io_num = I2C_MASTER_SDA_IO,
|
||
|
.scl_io_num = I2C_MASTER_SCL_IO,
|
||
|
.sda_pullup_en = GPIO_PULLUP_ENABLE,
|
||
|
.scl_pullup_en = GPIO_PULLUP_ENABLE,
|
||
|
.master.clk_speed = I2C_MASTER_FREQ_HZ,
|
||
|
};
|
||
|
i2c_param_config(i2c_master_port, &conf);
|
||
|
ESP_LOGI("I2C", "Enabling I2C");
|
||
|
ESP_ERROR_CHECK(i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0));
|
||
|
|
||
|
ESP_LOGI("SCR", "I2C initialized successfully");
|
||
|
}
|
||
|
|
||
|
void i2cWriteByte(uint8_t reg, uint8_t data)
|
||
|
{
|
||
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||
|
i2c_master_start(cmd);
|
||
|
i2c_master_write_byte(cmd, I2C_ADDRESS | I2C_MASTER_WRITE, true);
|
||
|
i2c_master_write_byte(cmd, reg, true);
|
||
|
i2c_master_write_byte(cmd, data, true);
|
||
|
i2c_master_stop(cmd);
|
||
|
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS);
|
||
|
i2c_cmd_link_delete(cmd);
|
||
|
}
|
||
|
|
||
|
void i2cWriteCommand(uint8_t data)
|
||
|
{
|
||
|
i2cWriteByte(0x00, data);
|
||
|
}
|
||
|
|
||
|
void i2cWriteData(uint8_t data)
|
||
|
{
|
||
|
i2cWriteByte(0x40, data);
|
||
|
}
|
||
|
|
||
|
void display_fill(uint8_t bmpData)
|
||
|
{
|
||
|
for (int y = 0; y < 8; y++)
|
||
|
{
|
||
|
i2cWriteCommand(0xB0 + y);
|
||
|
i2cWriteCommand(0x01);
|
||
|
i2cWriteCommand(0x10);
|
||
|
for (int x = 0; x < X_WIDTH; x++)
|
||
|
{
|
||
|
i2cWriteData(bmpData);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void display_set_pos(uint8_t x, uint8_t y)
|
||
|
{
|
||
|
i2cWriteCommand(0xB0 + y);
|
||
|
i2cWriteCommand(((x & 0xF0) >> 4) | 0x10);
|
||
|
i2cWriteCommand((x & 0x0F) | 0x01);
|
||
|
}
|
||
|
|
||
|
void display_print8_str(uint8_t x, uint8_t y, char str[])
|
||
|
{
|
||
|
uint8_t c;
|
||
|
for (uint8_t ch, ci = 0; ch = str[ci], ch != '\0'; ci++, x += 8)
|
||
|
{
|
||
|
c = ch - 0x20;
|
||
|
display_set_pos(x, y);
|
||
|
for(uint8_t cx = 0; cx < 8; cx++)
|
||
|
{
|
||
|
i2cWriteData(F8X16[c*16+cx]);
|
||
|
}
|
||
|
display_set_pos(x, y + 1);
|
||
|
for (uint8_t cx = 0; cx < 8; cx++)
|
||
|
{
|
||
|
i2cWriteData(F8X16[c * 16 + cx + 8]);
|
||
|
}
|
||
|
;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void initDisplay()
|
||
|
{
|
||
|
initI2c();
|
||
|
|
||
|
i2cWriteCommand(0xAE); // display off
|
||
|
i2cWriteCommand(0x00); // set lower column address
|
||
|
i2cWriteCommand(0x10); // set higher column address
|
||
|
i2cWriteCommand(0x40); // set start line address
|
||
|
i2cWriteCommand(0x81); // set contrast control register
|
||
|
i2cWriteCommand(0xCF); // set contrast
|
||
|
i2cWriteCommand(0xA1); // set segment re-map
|
||
|
i2cWriteCommand(0xC8); // set COM output scan direction
|
||
|
i2cWriteCommand(0xA6); // set normal display
|
||
|
i2cWriteCommand(0xA8); // set multiplex ratio(1 to 64)
|
||
|
i2cWriteCommand(0x3F); // 1/64 duty
|
||
|
i2cWriteCommand(0xD3); // set display offset
|
||
|
i2cWriteCommand(0x00); // not offset
|
||
|
i2cWriteCommand(0xD5); // set display clock divide ratio/oscillator frequency
|
||
|
i2cWriteCommand(0x80); // set divide ratio
|
||
|
i2cWriteCommand(0xD9); // set pre-charge period
|
||
|
i2cWriteCommand(0xF1); // set pre-charge voltage
|
||
|
i2cWriteCommand(0xDA); // set com pins hardware configuration
|
||
|
i2cWriteCommand(0x12);
|
||
|
i2cWriteCommand(0xDB); // set vcomh
|
||
|
i2cWriteCommand(0x40); // 0.77*vcc
|
||
|
i2cWriteCommand(0x20); // set memory addressing mode
|
||
|
i2cWriteCommand(0x02); // set page addressing mode
|
||
|
i2cWriteCommand(0x8D); // set charge pump enable/disable
|
||
|
i2cWriteCommand(0x14); // set(0x10) disable
|
||
|
i2cWriteCommand(0xAF); // display on
|
||
|
|
||
|
display_fill(0x00);
|
||
|
display_set_pos(0, 0);
|
||
|
}
|