void oled_init(void) {
i2c_start();
i2c_send_byte(OLED_ADDR << 1);
i2c_send_byte(OLED_CMD);
i2c_send_byte(0xAE); // display off
i2c_send_byte(0xD5); // set display clock divide ratio/oscillator frequency
i2c_send_byte(0x80);
i2c_send_byte(0xA8); // set multiplex ratio
i2c_send_byte(0x3F);
i2c_send_byte(0xD3); // set display offset
i2c_send_byte(0x00);
i2c_send_byte(0x40); // set start line
i2c_send_byte(0x8D); // set charge pump
i2c_send_byte(0x14);
i2c_send_byte(0x20); // set memory mode
i2c_send_byte(0x00);
i2c_send_byte(0xA1); // set segment remap
i2c_send_byte(0xC8); // set com output scan direction
i2c_send_byte(0xDA); // set com pins hardware configuration
i2c_send_byte(0x12);
i2c_send_byte(0x81); // set contrast control
i2c_send_byte(0xCF);
i2c_send_byte(0xD9); // set pre-charge period
i2c_send_byte(0xF1);
i2c_send_byte(0xDB); // set vcomh deselect level
i2c_send_byte(0x40);
i2c_send_byte(0xA4); // set entire display on/off
i2c_send_byte(0xA6); // set normal/inverse display
i2c_send_byte(0xAF); // display on
i2c_stop();
}
void oled_clear_display(void) {
i2c_start();
i2c_send_byte(OLED_ADDR << 1);
i2c_send_byte(OLED_CMD);
i2c_send_byte(0x21); // set column address
i2c_send_byte(0);
i2c_send_byte(127);
i2c_send_byte(0x22); // set page address
i2c_send_byte(0);
i2c_send_byte(7);
for (int i = 0; i < 128 * 8; i++) {
i2c_send_byte(0x00); // clear all pixels
}
i2c_stop();
}
void oled_write_char(unsigned char c) {
i2c_start();
i2c_send_byte(OLED_ADDR << 1);
i2c_send_byte(OLED_DATA);
for (int i = 0; i < 6; i++) {
i2c_send_byte(pgm_read_byte(font6x8 + (c - 32) * 6 + i)); // read font data from program memory
}
i2c_send_byte(0x00); // add a space between characters
i2c_stop();
}
void oled_write_string(char* str) {
while (*str) {
oled_write_char(*str++);
}
}
int read_heart_rate(void) {
// 從心跳傳感器讀取心跳數值
// 略
}