Creating a Bit-Banged Library for an OLED Display with the CH32 Microcontroller
0:00 Introduction: The video continues the CH32 tutorial series, focusing on creating a custom library for an OLED display using a bit-banging approach.
1:17 Display: The specific OLED display used is a 72x40 pixel display.
1:24 External Resources: Two primary resources are used: the SSD1306 display driver datasheet (for 128x64 displays but applicable) and the specific datasheet for the 72x40 pixel display.
2:56 Implementation: The code implementation is based on the pseudo-code provided in the 72x40 display's datasheet.
3:42 Bit Banging: The technique involves manually controlling the I2C bus (SDA and SCL pins) bit by bit instead of using built-in I2C libraries.
4:16 Pin Definition: The same pins used for standard I2C communication (PC1 for SDA, PC2 for SCL) are redefined as general-purpose input/output (GPIO) pins.
6:14 Open Drain Configuration: The SDA pin (PC1) is configured as an open-drain output, while the SCL pin (PC2) is a push-pull output.
6:48 Bit-Banged I2C Function: A custom function i2c_bitbang is implemented to send data bit by bit to the display, following the timing diagrams in the datasheet.
10:49 Start, Stop, and Acknowledge: Functions i2c_start, i2c_stop, and i2c_ack are created to manage the I2C communication protocol, including start and stop conditions and acknowledgments.
13:31 Write Command and Data: Functions i2c_write_command and i2c_write_data are implemented to send commands and data to the display, respectively. These functions use the i2c_bitbang function for the actual bit manipulation.
16:12 Initialization: An init_oled function is created to initialize the display, following the initialization sequence in the SSD1306 datasheet. This involves sending a series of commands to set display parameters like contrast, display on/off, etc.
22:56 Erasing the Display: A function oled_erase is implemented to clear the display by writing zeros to all segments. This involves iterating through each page and segment of the display.
23:20 Display Structure: The display is organized into five pages (0-4), each with 72 segments. Each segment represents 8 pixels vertically.
27:24 ASCII Table: The ASCII table is used to map character codes to their visual representations on the display.
28:47 Character Representation: Each character is represented by 5 bytes, corresponding to 5 segments on the display. Each byte defines the 8 pixels within a segment.
34:33 Font Matrix: A large matrix stores the 5-byte representations for each character. The matrix is indexed based on the ASCII value of the character minus 0x20.
35:43 Printing a Character: The print_char function takes the page, segment, and character as input. It uses the font matrix to determine the 5 bytes for the given character and sends them to the display.
43:13 Printing Text: The print_text function takes a string as input and prints it to the display. It handles line breaks and ensures that text wraps to the next line if it exceeds the display width.
43:19 Using USART Interrupt: The code is modified to receive text via USART interrupt. A buffer is used to store the received characters, and a flag indicates when a complete line of text has been received.
51:43 Text Handling in Main Loop: In the main loop, the code checks for the USART flag and, when set, prints the received text to the display and then clears the buffer.
56:36 Character Positioning: The code calculates the position of each character on the display, ensuring that characters are printed sequentially and wrap to the next line when necessary.
1:02:48 Conclusion: The video demonstrates how to create a custom bit-banged library for controlling an OLED display with the CH32 microcontroller, including initializing the display, erasing, printing characters, and handling text input via USART.
1:03:08 Website Resources: The presenter mentions that additional resources, including code examples and product links, are available on their website.