This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Porting SSD1306 for Oled

I need to port ssd1306 library for oled to nrf51822.

so i tested following code. but it's not worked.

main(){
    if (!twi_master_init())
    {
        return false;
     }
     ssd1306_init();
}
static bool ssd1306_lcd_set_instruction(uint8_t instr)
{
    nrf_delay_us(10000);
    data_buffer[0] = 0x00;
    data_buffer[1] = instr;
    return twi_master_transfer(SSD1306_SA << 1, data_buffer, 2, TWI_ISSUE_STOP);
}
bool ssd1306_init(void)
{
if (!ssd1306_lcd_set_instruction(0xAE)) <- not worked , returns false
    return false;
	if (!ssd1306_lcd_set_instruction(0x00)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x10)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x40))
    return false;
	if (!ssd1306_lcd_set_instruction(0x81)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xCF)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xA1)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xC8))
    return false;
	if (!ssd1306_lcd_set_instruction(0xA6))
    return false;
	if (!ssd1306_lcd_set_instruction(0xA8)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x3F)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xD3)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x00)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xD5)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x80)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xD9)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xF1)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xDA)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x12)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xDB)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x40)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x20)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x02)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0x8D))
    return false;
	if (!ssd1306_lcd_set_instruction(0x14)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xA4)) 
    return false;
	if (!ssd1306_lcd_set_instruction(0xA6)) 
    return false;

return ssd1306_lcd_set_instruction(0xAF);               
}

Another question. How can I draw screen? Thank you all..

void ssd1306_fillscreen(uint8_t fill_Data)
 {
uint8_t m,n;
for(m=0;m<8;m++)
{
	ssd1306_lcd_set_instruction(0xb0+m);	//page0-page1
	ssd1306_lcd_set_instruction(0x00);		//low column start address
	ssd1306_lcd_set_instruction(0x10);		//high column start address
	
	nrf_delay_us(1000);
	data_buffer[0] = DATA_SET; // 0x40
	twi_master_transfer(SSD1306_SA << 1, data_buffer, 1, TWI_DONT_ISSUE_STOP);
	for(n=0;n<127;n++)
	{
		data_buffer[0] = fill_Data;
		twi_master_transfer(SSD1306_SA << 1, data_buffer, 1, TWI_DONT_ISSUE_STOP);
		//ssd1306_send_byte(fill_Data);
	}
	data_buffer[0] = fill_Data;
	twi_master_transfer(SSD1306_SA << 1, data_buffer, 1, TWI_ISSUE_STOP);
	
	//ssd1306_send_data_stop();
}
 }
Parents
  • If your hardware isn't fixed yet, save yourself some pain and use the SSD1306 based display with SPI not I2C. The SPI interface is so much faster and requires much less CPU time to feed.

    I'm using a SSD1306 based display with the SPI interface and I've been very happy with it (except for what seems to be a chip bug in the handling of writes to the start line register).

Reply
  • If your hardware isn't fixed yet, save yourself some pain and use the SSD1306 based display with SPI not I2C. The SPI interface is so much faster and requires much less CPU time to feed.

    I'm using a SSD1306 based display with the SPI interface and I've been very happy with it (except for what seems to be a chip bug in the handling of writes to the start line register).

Children
No Data
Related