ssd1306/ssd1306.zig
2024-04-30 01:05:01 -04:00

64 lines
1.6 KiB
Zig

const micro = @import("microzig");
const SCREEN_HEIGHT: u16 = 64;
const SCREEN_WIDTH: u16 = 128;
const SCREEN_SIZE: u16 = SCREEN_HEIGHT * SCREEN_WIDTH / @bitSizeOf(u8);
const I2C_ADDR = 0x3C;
const Command = enum(u8) {
SET_LOW_COLUMN = 0x00,
SET_HIGH_COLUMN = 0x10,
MEMORY_MODE = 0x20,
COLUMN_ADDR = 0x21,
PAGE_ADDR = 0x22,
SET_START_LINE = 0x40,
DEFAULT_ADDRESS = 0x78,
SET_CONTRAST = 0x81,
CHARGE_PUMP = 0x8D,
SEG_REMAP = 0xA0,
DISPLAY_RESUME = 0xA4,
DISPLAY_ALL_ON = 0xA5,
NORMAL_DISPLAY = 0xA6,
INVERT_DISPLAY = 0xA7,
SET_MUX = 0xA8,
DISPLAY_OFF = 0xAE,
DISPLAY_ON = 0xAF,
SET_PAGE = 0xB0,
COM_SCAN_DIR = 0xC0,
SET_DISPLAY_OFFSET = 0xD3,
SET_DISPLAY_CLOCK_DIV = 0xD5,
SET_PRECHARGE = 0xD9,
SET_COM_PINS = 0xDA,
SET_VCOM_DESELECT = 0xDB,
SWITCH_CAP_VCC = 0x02,
NOP = 0xE3,
};
pub const Config = struct {
contrast: u8 = 127,
display_start_line: u6 = 0,
seg_remap: bool = false,
mux_ratio: u6 = 63, // can't go lower than 15
com_scan_dir: bool = 0,
display_offset: u6 = 0,
com_pin_config: bool = 1,
com_left_right_remap: bool = false,
display_clock_div_ratio: u4 = 0x0,
oscillator_freq: u4 = 0xF,
precharge_period_1: u4 = 0x2,
precharge_period_2: u4 = 0x2,
vcomh_deselect_level: u2 = 0b10, // can't be 0b01
};
pub const SSD1306 = struct {
i2c: *micro.hal.i2c.I2C,
pub fn init(self: *SSD1306, i2c_index: usize, pins: Pins, config: Config) SSD1306 {
}
}
pub const I2CConfig = struct {
index: ?u1 = 0,
scl: ?type = null,
sda: ?type = null,
};