static void userWake() { userState = USER_ACTIVE; buttons_clear(); display_startCRTAnim(DISPLAY_CRTANIM_OPEN); oled_power(OLED_PWR_ON); }
static void userSleep() { userState = USER_INACTIVE; oled_power(OLED_PWR_OFF); }
// Initializes and turns on screen void oled_init(void) { // Set initial pin states pin_clear(OLED_VEN); pin_set(ENABLE_2V8); pin_set(OLED_RESET); pin_set(OLED_A0); // SPI config { // Enable peripheral clock RCC_AHB1PeriphClockCmd(OLED_SPI_SCK->clock | OLED_SPI_MOSI->clock, ENABLE); // Enable SPI clock RCC_APB2PeriphClockCmd(OLED_SPI_CLK, ENABLE); //pinInit(OLED_SPI_SCK); //pinInit(OLED_SPI_MOSI); SPI_I2S_DeInit(OLED_SPI); SPI_InitTypeDef ConfigSPI; ConfigSPI.SPI_Direction = SPI_Direction_2Lines_FullDuplex; ConfigSPI.SPI_Mode = SPI_Mode_Master; ConfigSPI.SPI_DataSize = SPI_DataSize_8b; ConfigSPI.SPI_CPOL = SPI_CPOL_High; ConfigSPI.SPI_CPHA = SPI_CPHA_2Edge; ConfigSPI.SPI_NSS = SPI_NSS_Soft; ConfigSPI.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; ConfigSPI.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(OLED_SPI, &ConfigSPI); SPI_Cmd(OLED_SPI, ENABLE); } // DMA config { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); DMA_InitTypeDef ConfigDMA; ConfigDMA.DMA_Channel = DMA_Channel_3; ConfigDMA.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR; ConfigDMA.DMA_Memory0BaseAddr = 0; ConfigDMA.DMA_DIR = DMA_DIR_MemoryToPeripheral; ConfigDMA.DMA_BufferSize = 0; ConfigDMA.DMA_PeripheralInc = DMA_PeripheralInc_Disable; ConfigDMA.DMA_MemoryInc = DMA_MemoryInc_Enable; ConfigDMA.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; ConfigDMA.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; ConfigDMA.DMA_Mode = DMA_Mode_Normal; ConfigDMA.DMA_Priority = DMA_Priority_High; ConfigDMA.DMA_FIFOMode = DMA_FIFOMode_Enable; ConfigDMA.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; ConfigDMA.DMA_MemoryBurst = DMA_MemoryBurst_Single; ConfigDMA.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream3, &ConfigDMA); stream_cr = DMA2_Stream3->CR; repeat_cr = DMA2_Stream3->CR ^ (DMA_MemoryInc_Enable | DMA_MemoryDataSize_HalfWord); } // Cycle reset pin_clear(OLED_RESET); delay(10); pin_set(OLED_RESET); delay(10); // Do software reset oled_cmd(0x01, 0, 0); delay(10); // Initialization command list uint8_t init_cmds[] = { 0x03, 0x01, 0x00, // Stand-by OFF 0x07, 0x08, 0x00, 0x00, 0x07, 0x0F, 0x01, 0x0C, 0x09, 0x0C, // Set display size 0x05, 0x01, 0x0A, // Set RAM write "direction" 0x06, 0x01, 0x01, // Set RAM scanning "direction" 0x04, 0x01, 0x02, // Set internal oscillator to 90Hz 0x1F, 0x01, 0x30, // Set row scan operations = ALL 0x30, 0x01, 0x12, // Set regulator to ??? 0x1C, 0x01, 0x0F, // Set pre-charge width 0x1E, 0x01, 0x00, // Set peak pulse delay 0x0F, 0x03, 0x0A, 0x0A, 0x0A, // Set peak currents (RGB) 0x1D, 0x03, 0x05, 0x05, 0x05, // Set peak pulse widths (RGB) 0x08, 0x01, 0x01, // Set interface type to 8-bit 0x00 // END }; // Send initializiation commands uint8_t *p_cmds = init_cmds; while(*p_cmds != 0x00) { uint8_t cmd = *p_cmds++; uint8_t args = *p_cmds++; oled_cmd(cmd, args, p_cmds); p_cmds += args; } // Set initial power oled_power(40); // Clear screen uint16_t blank_line[128]; memset(blank_line, 0, sizeof(blank_line)); for(uint8_t y = 0; y < 128; y++) { oled_blit(0, y, 128, 1, blank_line); } // Turn on display uint8_t init_on[] = {0x01}; oled_cmd(0x02, 1, init_on); // Power up LEDs oled_vramp(); }
// Shut down display completely (lowest power mode) void oled_deinit(void) { oled_power(0); pin_clear(OLED_VEN); pin_clear(ENABLE_2V8); pin_clear(OLED_RESET); }