728x90

728x90

Sunday, February 8, 2026

ATMega32 TWI and SH1106 128x64 OLED Example

The SH1106 is a 132 X 64 Dot Matrix OLED/PLED Segment/Common Driver with Controller manufactured by SINO WEALTH. This chip is applicable for many low cost display. A low cost monochrome OLED display for Arduino is very popular among student and electronic hobbyists. It cost around 2USD. This chip has many communication interface depend on the display manufacturers, 8-bit 6800-series parallel interface, 8-bit 8080-series parallel interface, 3-wire & 4-wire serial peripheral interface, 400KHz fast I2C bus interface. However an SPI or an I2C OLED display module is common due complexity of wiring. An SPI display yield a high speed data transmission and reception compares to the I2C communication interface.

ATMega32 TWI and SH1106 128x64 OLED Example 

 

 ATMega32 TWI and SH1106 128x64 OLED Example

This display is easy to control via an 8-bit micro-controller especially the Arduino. The SSD1306 is its equivalent display controller manufactured by solomon-systech. It contains command and data similar to the old KS0108 display controller.

ATMega32 TWI and SH1106 128x64 OLED Example 


I bought a cheap SH1106 1.3" OLED display from a local electronics component store. It works fine at lower I2C frequency around 100kHz. At higher data rate it become halted. I already tested it with Arduino and PIC16F887 micro-controller. For more detail about configuration and display data sending to this display module please visit this post.

In this example I use my ATMega32 to display text on the SH1106 display. At this time I have problem with the ATMega644P TWI. So I use this smaller memory micro-controller.

Source Code:

  1. /*
  2. * 10-twi_sh1106.c
  3. *
  4. * Created: 2/7/2026 5:21:04 PM
  5. * Author : Admin
  6. */

  7. #define F_CPU 16000000UL
  8. #include <avr/io.h>
  9. #include <util/delay.h>

  10. void show_text(void){
  11. display_xy(0,0);
  12. display_text("ATMega32 SH1106");
  13. display_xy(0,1);
  14. display_text("TWI Programming");
  15. display_xy(0,2);
  16. display_text("Microchip Studio");
  17. display_xy(0,3);
  18. display_text("v.7.0.2542");
  19. display_xy(0,4);
  20. display_text("1.3 I2C OLED ");
  21. display_xy(0,5);
  22. display_text("Display Module");
  23. display_xy(0,6);
  24. display_text("AKI-Technical");
  25. display_xy(0,7);
  26. display_text("2026/02/08 Sun");
  27. }

  28. int main(void)
  29. {
  30. /* Replace with your application code */
  31. _delay_ms(1000);
  32. display_init();
  33. display_clear(0);
  34. show_text();
  35. _delay_ms(5000);
  36. display_clear(0);
  37. while (1)
  38. {
  39. display_clear(0);
  40. show_text();
  41. _delay_ms(2500);
  42. display_clear(0);
  43. _delay_ms(2500);
  44. display_clear(0xFF);
  45. _delay_ms(2500);
  46. display_clear(0);
  47. show_text();
  48. _delay_ms(2500);
  49. display_clear(0xAA);
  50. _delay_ms(2500);
  51. }
  52. }


I place its twi.c and oled.c libraries in different files. Click here to download its source file.

ATMega32 TWI and SH1106 128x64 OLED Example
Schematic and Simulation

 The ATMega32 run very well at 16MHz and high SCL frequency.

ATMega32 TWI and SH1106 128x64 OLED Example
ATMega32 AVR Prototype Board

 

This PCB was offered by PCBWay (pcbway.com).

I have been using PCBWay for many years now. PCBWay fabricate PCBs at low cost, fast processing time for only 24 hours, and fast delivery time using any carrier options. This double side 10cmx10cm can be fabricate at only 5USD for 5 to 10pcs by PCBWay. It's a standard PCB with silk screen and solder mask.

A DIY dsPIC30F2010 and dsPIC30F1010 Prototype Board with Programmer
10 PCBs for only 5USD
 

For different size of PCB we can instantly quote on PCBWay website using a zip PCB Gerber file without account.

A DIY dsPIC30F2010 and dsPIC30F1010 Prototype Board with Programmer
PCBWay Instant Quote

 Now I create a bigger fonts function to make displaying text more visible.

  1. void display_char_8x16(unsigned char x, unsigned char y, char ch){
  2. y=y*2;
  3. display_xy(x,y);
  4. uint16_t temp;
  5. ch=ch-32;
  6. temp=ch*16;
  7. char i=0;
  8. for(i=0;i<8;i++) display_data(font_8x16[temp+i]);
  9. display_xy(x,y+1);
  10. for(i=8;i<16;i++) display_data(font_8x16[temp+i]);
  11. }

  12. void display_text_8x16(unsigned char x, unsigned char y, char *txt){
  13. while(*txt){ display_char_8x16(x,y,*txt++); x=x+8;}
  14. }

This example the SH1106 will display ASCII characters and numbers.

Source Code: 

 

  1. /*
  2. * 10-i2c_sh1106_2.c
  3. *
  4. * Created: 2/8/2026 7:59:35 PM
  5. * Author : Admin
  6. */

  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define F_CPU 16000000UL

  10. int main(void)
  11. {
  12. /* Replace with your application code */
  13. _delay_ms(1000);
  14. display_init();
  15. display_clear(0);
  16. display_text_8x16(0,0,"SH1106 I2C OLED");
  17. display_text_8x16(0,1,"And ATMega32");
  18. display_text_8x16(0,2,"Programming With");
  19. display_text_8x16(0,3,"Microchip Studio");
  20. _delay_ms(10000);
  21. display_clear(0x00);
  22. while (1)
  23. {
  24. display_text_8x16(0,0,"ATMega32 SH1106");
  25. _delay_ms(2500);
  26. uint8_t h=15;
  27. for(uint8_t i=0;i<10;i++) {
  28. display_char_8x16(h,1,'0'+i);
  29. h+=10;
  30. }
  31. _delay_ms(2500);
  32. h=0;
  33. for(uint8_t i=0;i<14;i++) {
  34. display_char_8x16(h,2,'A'+i);
  35. h+=10;
  36. }
  37. _delay_ms(2500);
  38. h=0;
  39. for(uint8_t i=0;i<14;i++) {
  40. display_char_8x16(h,3,'N'+i);
  41. h+=10;
  42. }
  43. _delay_ms(10000);
  44. display_clear(255);
  45. _delay_ms(10000);
  46. display_clear(0);
  47. _delay_ms(1000);
  48. }
  49. }


Click here to download this example. 

ATMega32 TWI and SH1106 128x64 OLED Example
Running Program on ATMega32 Prototype Board

The schematic is the same to previous example. 

There two on-board TWI devices, a ds1307 and a AT24L16B. So the MCU will read the RTC data from ds1307 and display it on the SH1106 OLED. Two ADC inputs, ADC0(PA0) connects to a POT, and ADC1(PA1) connects to the LM35 temperature sensor. However the LM35 was a fake TO-92 chip. Time to time it burned out due to heat dissipation.

ATMega32 TWI and SH1106 128x64 OLED Example 

Proteus has only a model for the SSD1306 that almost equivalent to the SH1106. However its simulation speed is very low compare to the parallel port base graphical LCD. But running this program using a real MCU and OLED it operate very well due to the high speed MCU  and SCL clock frequency.

To add any floating point value to a string we need to configure some parameters in the Microchip Studio IDE before compiling.

ATMega32 TWI and SH1106 128x64 OLED Example

ATMega32 TWI and SH1106 128x64 OLED Example 

ATMega32 TWI and SH1106 128x64 OLED Example 

The linker flag is  -lprintf_flt . Click save and close it before building the project.

Source Code:

  1. /*
  2. * twi.c
  3. *
  4. * Created: 2/4/2026 10:22:02 AM
  5. * Author: Admin
  6. */

  7. #define F_CPU 16000000UL

  8. #include <avr/io.h>
  9. #include <util/delay.h>

  10. void twi_init(void){
  11. TWSR|=0x01; //Prescaler Selection Bit
  12. TWBR=0x05; //Baud Rate Generator
  13. TWCR=(1<<TWEN); //Enable The TWI Module
  14. PORTC|=(1<<0);
  15. PORTC|=(1<<1);
  16. }

  17. void twi_start(void){
  18. TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  19. while((TWCR&(1<<TWINT))==0);
  20. }

  21. void twi_write(unsigned char data){
  22. TWDR=data;
  23. TWCR=(1<<TWINT)|(1<<TWEN);
  24. while((TWCR&(1<<TWINT))==0);
  25. }

  26. unsigned char twi_read(char ACK){
  27. if(ACK==0)
  28. TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
  29. else
  30. TWCR=(1<<TWINT)|(1<<TWEN);
  31. while((TWCR&(1<<TWINT))==0);
  32. return TWDR;
  33. }

  34. void twi_stop(){
  35. TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
  36. //_delay_us(10);
  37. }

I tested this firmware using the AMTega32 on my AVR Prototype Board. However it works on the ATMega16 or the ATMega644P with a proper software configurations. 

ATMega32 TWI and SH1106 128x64 OLED Example 


ATMega32 TWI and SH1106 128x64 OLED Example

 

Click here to download its source file




 

 


No comments:

Post a Comment

320x50

Search This Blog

tyro-728x90