728x90

Showing posts with label SH1106. Show all posts
Showing posts with label SH1106. Show all posts

Friday, February 13, 2026

ATMega644P Software TWI SH1106 OLED and DS1307 RTC

In previous example the ATMega644P emulate the TWI via software bit-banging that able to communicate to various slave TWI devices on a single bus. In this example the ATMega644P master MCU send display data to the SH1106 128x64 OLED display and read calendar data from the DS1307 RTC. For more information about using the SH1106 128x64 OLED display please visit this post.

ATMega644P Software TWI SH1106 OLED and DS1307 RTC
ATMega644P Software TWI SH1106 OLED 

 

ATMega644P Software TWI SH1106 OLED 

For an introductory example the master MCU send display data to the SH1106 128x64 OLED module. 

Source Code "main.c":

  1. /*
  2. * 11-soft_twi_sh1106.c
  3. *
  4. * Created: 2/10/2026 12:03:22 AM
  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 ATMega644P");
  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,"Software TWI");
  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. }

Schematic:

Schematic
Schematic

Proteus only has a model for the SSD1306. Simulating this part is very slow.

AVR Prototype Board:

ATMega644P Software TWI SH1106 OLED and DS1307 RTC
ATMega644P AVR Prototype Board

 

ATMega644P Software TWI SH1106 OLED and DS1307 RTC 

 

ATMega644P Software TWI SH1106 OLED and DS1307 RTC
ATMega644P AVR Prototype Board

 

Click here to download this example. 

ATMega644P Software TWI SH1106 OLED 

Here the ATMega644P read the calendar from DS1307 RTC that will display on the SH1106 128x64 OLED display.

Source Code "main.c":

  1. /*
  2. * 11-soft_twi_ds1307_sh1106.c
  3. *
  4. * Created: 2/9/2026 7:34:19 PM
  5. * Author : Admin
  6. */


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

  11. #include "twi_device.h"

  12. void rtc_init(void){
  13. char rtc[8]={0x30,0x35,0x13,0x07,0x31,0x01,0x26,1<<4};
  14. for (char i=0;i<8;i++)
  15. {
  16. twi_start();
  17. //D0 is DS1307 Write Address
  18. twi_write(DS1307_W);
  19. //Select Control Register
  20. twi_write(i);
  21. //Enable SQWE bit blinks at 1 Hz
  22. twi_write(rtc[i]);
  23. twi_stop();
  24. _delay_ms(10);
  25. }
  26. }

  27. unsigned char rtc[50], msg[20];
  28. float voltage;
  29. unsigned int temp;

  30. void rtc_read(void){
  31. for(char i=0;i<50;i++){
  32. /*Second Register*/
  33. twi_start();
  34. twi_write(DS1307_W);
  35. /*Select Second register*/
  36. twi_write(i);
  37. twi_stop();
  38. _delay_us(100);
  39. twi_start();
  40. twi_write(DS1307_R);
  41. rtc[i]=twi_read();
  42. twi_stop();
  43. _delay_us(100);
  44. }
  45. }
  46. int main(void)
  47. {
  48. /* Replace with your application code */
  49. _delay_ms(1000);
  50. display_init();
  51. adc_init();
  52. //rtc_init();
  53. display_clear(0);
  54. display_text_8x16(0,0,"Software TWI");
  55. display_text_8x16(0,1,"ATMega644P OLED");
  56. display_text_8x16(0,2,"SH1106 DS1307");
  57. display_text_8x16(0,3,"RTC Example");
  58. _delay_ms(10000);
  59. display_clear(0);
  60. while (1)
  61. {
  62. rtc_read();
  63. sprintf(msg,"Time: %02X:%02X:%02X",rtc[2],rtc[1],rtc[0]);
  64. display_text_8x16(0,0,msg);
  65. sprintf(msg,"Date: %02X/%02X/20%02X",rtc[4],rtc[5],rtc[6]);
  66. display_text_8x16(0,1,msg);
  67. //Read POT
  68. temp=read_adc(0);
  69. //Convert To Voltage
  70. voltage=temp*5.0/1023;
  71. sprintf(msg,"ADC0: %4d %.2fV",temp,voltage);
  72. display_text_8x16(0,2,msg);
  73. //Read LM35
  74. temp=read_adc(1);
  75. voltage=temp*5.0/1023;
  76. voltage*=100;
  77. sprintf(msg,"Temp: %.2f C",voltage);
  78. display_text_8x16(0,3,msg);
  79. _delay_us(500);
  80. }
  81. }


The schematic is the one's above.

 

AVR Experiment Board: 

I tested this program on my DIY AVR ATMega644P Prototype Board. It worked fine. 

ATMega644P Software TWI SH1106 OLED and DS1307 RTC
ATMega644P Software TWI SH1106 OLED 
ATMega644P Software TWI SH1106 OLED and DS1307 RTC
ATMega644P Software TWI SH1106 OLED

 Click here to download this example.

 

 

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




 

 


Tuesday, January 9, 2024

PIC16F887 SH1106 I2C OLED Display Example using XC8

Overview

An SH1106 is a 132x64 LED display driver with controller. This chip support 8-bit 6800-series parallel interface, 8-bit 8080-series parallel interface, Serial Peripheral Interface (SPI), and Inter Integrated Circuit (I2C) bus interface. It usually come with an 1.3 inches 128x64 OLED display module with an SPI or an I2C interface. 

PIC16F887 SH1106 I2C OLED Display Example using XC8
PIC16F887 OLED Display

Using this module with an Arduino is very popular. Some programmer creates a simple game console using this display. Arduino platform has a lot of libraries and graphic for this LCD module. 

PIC16F887 SH1106 I2C OLED Display Example using XC8

PIC16F887 SH1106 I2C OLED Display Example using XC8

PIC16F887 SH1106 I2C OLED Display Example using XC8
1.3 Inches 1106 128x64 IIC OLED Module

PIC16F887 SH1106 I2C OLED Display Example using XC8
1.3 Inches 1106 128x64 IIC OLED Module

 

Without Arduino we can check the LCD Wiki website for programming and interfacing with this device using different micro-processor.

PIC16F887 SH1106 I2C OLED Display Example using XC8
For full specification please check product datasheet. The LCD is mounted on a PCB with a ready to use I2C interface. Its supply voltage is 5VDC by default.

Here we will use a two-wire I2C bidirectional bus interface. This module has an on-board 10kΩ pull-up resistors. Its I2C write address is 0x78 by default. This chip could handle up to 40kHz serial clock frequency. But I use only 200kHz with PIC16F887 I2C module to prevent it from being halted.

PIC16F887 SH1106 I2C OLED Display Example using XC8
I2C System Configuration

Using only two-wire data bus the controller can communicate with multiple devices. This I2C display is writable and readable.

PIC16F887 SH1106 I2C OLED Display Example using XC8

The micro-processor writes command or data to this display. It begin by an I2C start bit, device address (eg. 0x78), Acknowledge bit (A), Control Byte, Data Byte, and an I2C stop bit. 

Data/Command (D/C) bit of the control byte determine between display RAM data and command as it's shown in the picture above.

Display RAM Data can also be read from this display module.

To use it properly we need to set its display commands using a command set below.

  1. Set Low Column Address: (00H - 0FH)
  2. Set Higher Column Address: (10H - 1FH)
  3. Set Pump voltage value: (30H - 33H)
  4. Set Display Start Line: (40H - 7FH)
  5. Set Contrast Control Register: (Double Bytes Command), The Contrast Control Mode Set (81H), Contrast Data Register Set (00H - FFH)
  6. Set Segment Re-map: (A0H - A1H)
  7. Set Entire Display OFF/ON: (A4H - A5H)
  8. Set Normal/Reverse Display: (A6H - A7H)
  9. Set Multiplex Ration: (Double Bytes Command), Multiplex Ration Mode Set: (A8H), Multiplex Ration Data Set: (00H - 3FH).
  10. Set DC-DC OFF/ON: (Double Bytes Command), DC-DC Control Mode Set: (ADH), DC-DC ON/OFF Mode Set: (8AH - 8BH).
  11. Display OFF/ON: (AEH - AFH)
  12. Set Page Address: (B0H - B7H)
  13. Set Common Output Scan Direction: (C0H - C8H)
  14. Set Display Offset: (Double Bytes Command), Display Offset Mode Set: (D3H), Display Offset Data Set: (00H - 3FH)
  15. Set Display Clock Divide Ratio/Oscillator Frequency: (Double Bytes Command), Divide Ratio/Frequency Mode Set: (D5H), Divide Ratio/Oscillator Frequency Data Set: (00H - FFH).
  16. Set Dis-Charge/Pre-Charge Period: (Double Bytes Command), Pre-charge Period Mode Set: (D9H), Dis-charge/Pre-charge Period Data Set: (00H - FFH)
  17. Set Common pads hardware configuration: (Double Bytes Command), Common Pads Hardware Configuration Mode Set: (DAH), Sequential/Alternative Mode Set: (02H - 12H).
  18. Set VCOM Deselect Level: (Double Bytes Command), VCOM Deselect Level Mode Set: (DBH), VCOM Deselect Level Data Set: (00H - FFH).
  19. Read-Modify-Write: (E0H)
  20. End: (EEH)
  21. NOP: (E3H)
  22. Write Display Data
  23. Read Status
  24. Read Display Data

For a fully explained text, you can check its datasheet. These command are summerized in a command table below.

PIC16F887 SH1106 I2C OLED Display Example using XC8
Command Table 1

PIC16F887 SH1106 I2C OLED Display Example using XC8
Command Table 2

We can see its user's manual include programming tutorial to get used to this display controller.

PIC16F887 MPLABX IDE and XC8 Programming

An 8-bit PIC16F887 is suitable for this display controller since it has a high speed I2C module inside. I configure this module with a clock frequency of 200kHz. The program will send a 8x16 character text to the display.

  1. /*
  2.  * File: main.c
  3.  * Author: Admin
  4.  *
  5.  * Created on January 8, 2024, 8:50 PM
  6.  */
  7.  
  8. #include <xc.h>
  9. #include "config.h"
  10. #include "sh1106.h"
  11.  
  12. #define _XTAL_FREQ 20000000UL
  13.  
  14. void main(void) {
  15. display_init();
  16. __delay_ms(100);
  17. display_clear(0);
  18. display_text_8x16(0,0,"SH1106 I2C OLED");
  19. display_text_8x16(0,1,"And PIC16F887");
  20. display_text_8x16(0,2,"Programming With");
  21. display_text_8x16(0,3,"MPLABX IDE XC8");
  22. __delay_ms(5000);
  23. display_clear(0);
  24. while(1){
  25. display_text_8x16(0,0,"PIC16F887 SH1106");
  26. __delay_ms(2500);
  27. uint8_t h=15;
  28. for(uint8_t i=0;i<10;i++) {
  29. display_char_8x16(h,1,'0'+i);
  30. h+=10;
  31. }
  32. __delay_ms(2500);
  33. h=0;
  34. for(uint8_t i=0;i<14;i++) {
  35. display_char_8x16(h,2,'A'+i);
  36. h+=10;
  37. }
  38. __delay_ms(2500);
  39. h=0;
  40. for(uint8_t i=0;i<14;i++) {
  41. display_char_8x16(h,3,'N'+i);
  42. h+=10;
  43. }
  44. __delay_ms(10000);
  45. display_clear(255);
  46. __delay_ms(10000);
  47. display_clear(0);
  48. __delay_ms(1000);
  49. }
  50. return;
  51. }
  52.  

Only text fonts requires a lot of program space. To get additional fonts and graphic we can add an SPI or an I2C EEPROM or even a Flash memory to store those data.

PIC16F887 SH1106 I2C OLED Display Example using XC8
Protues Simulation
Protues has an LCD module for SSD1306. It's very similar to the SH1106. However simulating this module in Protues is slower than a physical hardware.


PIC16F887 SH1106 I2C OLED Display Example using XC8
Running Program

PIC16F887 SH1106 I2C OLED Display Example using XC8
Running Program


 

Click here to download its source file.

We can use the ATMega32 or ATMega644P TWI or even software TWI to interface with this chip.



Search This Blog

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (34) Analog Comparator (1) Arduino (16) ARM (13) AT89C52 (7) ATMega32 (58) ATMega644P (27) AVR (87) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (4) Display (133) Distance Sensor (3) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (5) ESP32 (1) esp8266 (1) Graphical LCD (2) I2C (38) ILI9341 (1) Input/Output (75) Interrupt (22) Keil (5) Keypad (16) KS0108 (2) LCD (75) LM35 (3) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (10) PCD8544 (3) PCF8574 (10) PIC (108) PIC12F (3) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (13) SH1106 (3) Shift Register (13) Shift Registers (10) Software TWI (2) SPI (39) ST7735 (1) STM32 (11) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (5) STM32CubeIDE (13) STM32F103C8T6 (9) STM32F401CCU6 (1) SysTick (4) temperature sensor (13) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (8) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)