Google Chat:---
+86-0755-88291180
sales@spotpear.com
dragon_manager@163.com
tech-support@spotpear.com
zhoujie@spotpear.com
WhatsApp:13246739196
WhatsApp:13424403025
The 0.71inch binocular LCD module features two 0.71inch round IPS screens with 160 x 160 pixels, equipped with a GC9D01 driver chip, and utilizes SPI interface communication. It is suitable for integration into controllers such as ESP32, Raspberry Pi Pico, Arduino, etc., and can be used in creative applications like simulated electronic eyes or wearable devices.
| Operating voltage | Communication interface | Display panel | Control chip |
|---|---|---|---|
| 3.3V/5V | 4-wire SPI | IPS | GC9D01 |
| Resolution | Display size | Pixel pitch | Dimensions |
| 160 × 160 pixels | 18 × 18 (mm) | 37.5 × 112.5 (μm) | 20.00 × 51.00 (mm) |

This LCD uses the built-in GC9D01 driver, with a resolution of 160×160. It has an internal GRAM and supports 12/16/18-bit data bus MCU interfaces, i.e., RGB444, RGB565, RGB666 three color formats, which are common RGB formats.
For most LCD controllers, the communication interface can be configured, including 8080 parallel, 3-wire SPI, 4-wire SPI, etc. This LCD uses a 4-wire SPI interface, which saves GPIO pins and increases communication speed.

Note: The difference from the traditional SPI protocol is that the data line sent from the slave to the host is hidden because it only needs to be displayed.
RESX is the reset pin, it is pulled low when the module is powered on, usually set to 1;
CSX is the slave chip select pin, and the chip is enabled only when CS is low.
D/CX is the data/command control pin of the chip, when DC = 0 a command is written; when DC = 1, data is written
SDA is the data transmitted data, that is, RGB data;
SCL is the SPI communication clock pin.
For SPI communication, the data transmission has timing sequences involving clock phase (CPHA) and clock polarity (CPOL):
CPHA determines whether data is captured on the first or second clock transition edge. When CPHA = 0, data is captured on the first clock transition edge;
CPOL determines the idle level of the clock, CPOL = 0 means low.
From the diagram, it can be seen that when SCLK falls on the first edge, data transmission starts. One clock cycle transmits 8 bits, using SPI0, bitwise transmission, high bit first, and low bit last.

| LCD Pin | ESP32C3 |
| VCC | 3V3 |
| GND | GND |
| DIN | GPIO4 |
| CLK | GPIO7 |
| CS1 | GPIO6 |
| CS2 | GPIO2 |
| DC | GPIO9 |
| RST1 | GPIO8 |
| RST2 | GPIO5 |
| BL1 | GPIO1 |
| BL2 | GPIO3 |

0.71inch-LCD-Module-Demo\ESP32-C3\libraries\, with library instructions detailed below| Library Name | Description | Library Installation Requirement |
|---|---|---|
| TFT_eSPI | LCD driver library | "Install Offline" |
| LVGL | LVGL library | "Install Offline" |
| Demo | Description | Dependency Library |
|---|---|---|
| 1.Text_and_Number_Display | Text and nymber display | TFT_eSPI |
| 2.Shapes_on_Circular_Display | Drawing | TFT_eSPI |
| 3.Animated_Eye1 | Simulated eye style1 | TFT_eSPI |
| 4.Animated_Eye2 | Simulated eye style2 | TFT_eSPI |
| 5.Animated_Eye12 | Simulated eye styles1 and 2, displayed alternately | TFT_eSPI |
| 6.Image_Display | Display image | TFT_eSPI and LVGL |
| 7.Clock | Clock | TFT_eSPI and LVGL |

【Demo description】
【Hardware connection】

【Code analysis】
setup function executes once when the program starts, primarily responsible for initializing the TFT display and performing some initial settingstft.init(); initializes the TFT display, preparing for subsequent display operationstft.fillScreen() and delay(), demonstrating the color filling capabilities of the TFT display, enhancing the visual appeal during program startuptft.fillScreen(0x04FF); sets a specific background color, tft.setTextColor(TFT_WHITE, 0x04FF); sets the text color, ensuring the text is clearly visible against the backgroundloop function continuously loops during the running process of the program, realizing the core functionality of displaying numberstft.drawString("Hello, Waveshare!", 30, 40, 2); displays a welcome message, enhancing the user experiencenumber to a string displayNumber, and add a leading zero when the number is a single digit, ensuring that single-digit numbers are displayed as two-digit numberstft.drawString(displayNumber, 55, 80, 6); displays formatted numbers at a specific font size at a specific location on the displaynumber++ realizes self-increment of numbers, and resets to 0 when number exceeds 99, ensuring that the number cycles between 00 and 99delay(1000) controls the speed at which the numbers are updated, allowing users to clearly see the changes in the numbers【Demo flashing】
【Result demonstration】

【Demo description】
【Hardware connection】
【Code analysis】
uint16_t squareColor = tft.color565(random(0, 255), random(0, 255), random(0, 255)); generates a random RGB565 color, ensuring that the square is different in color each time it is drawntft.fillRect(squareTopLeftX, squareTopLeftY, squareSize, squareSize, squareColor); fills the square with a random colortriangleX and triangleY arraystft.fillTriangle(triangleX[0], triangleY[0], triangleX[1], triangleY[1], triangleX[2], triangleY[2], triangleColor); fills the triangle with a random colortft.fillCircle(centerX, centerY, 30, circleColor); draws a circle with the screen center coordinates and a fixed radius, filling it with a random color【Demo flashing】
【Result demonstration】

【Demo description】
【Hardware connection】
【Code analysis】
LIGHT_PIN is definedint16_t v = analogRead(LIGHT_PIN);LIGHT_PIN_FLIP (#ifdef LIGHT_PIN_FLIP section)if (v < LIGHT_MIN) v = LIGHT_MIN; else if (v > LIGHT_MAX) v = LIGHT_MAX;), ensuring that the light sensitivity value is within a reasonable range.v = map(v, 0, (LIGHT_MAX - LIGHT_MIN), IRIS_MAX, IRIS_MIN);)LIGHT_CURVE is defined (#ifdef LIGHT_CURVE section)IRIS_SMOOTH is defined, choose the smoothing treatment (filtering method gradually adjusts the iris size) or directly set the iris sizenewIris = random(IRIS_MIN, IRIS_MAX);split(oldIris, newIris, micros(), 10000000L, IRIS_MAX - IRIS_MIN); function to achieve a gradual change in iris size from the old value to the new value through a recursive method, and update oldIris with the new value【Demo flashing】
【Result demonstration】

【Demo description】
【Hardware connection】
【Code analysis】
Demo_1 function multiple times, where the number of times the loop runs is controlled by the variable i , with the loop running 7 times The image is displayed through the pushImage function, and the corresponding device is selected using the chip select signal before each display.【Demo flashing】
【Result demonstration】

【Demo description】
【Hardware connection】
【Code analysis】
a == 1, then fill the screen with black first (tft.fillScreen(BLACK);), then call the Demo_1 function, and finally delay 2 seconds with delay(2000);a == 2, then use an inner loop to execute the Demo_2 function multiple times, where the number of times the loop runs is controlled by the variable i , with the loop running 7 times The Demo_2 function will sequentially display a series of images to achieve an animation effect. In this way, the two different animation sequences can be continuously executed in a loop during the operation of the program【Demo flashing】
【Result demonstration】


【Demo description】
【Hardware connection】
【Code analysis】
w and the height h of the area to be refreshed, ensuring accurate determination of the data rangetft.setAddrWindow, specifying the correct position for data writingtft.pushColors to push the color data to the display, this step determines the color and content of the displayed graphicsSerial.begin(115200) prepares the serial port communication for possible debugginglv_init() starts the core components of the LVGL libraryLV_USE_LOG is not 0, register the serial print function for debugging: lv_log_register_print_cb(my_print)tft.begin(): Initializes the TFT hardwaretft.setRotation(0): Sets the display orientation to landscapelv_disp_draw_buf_init(&draw_buf, buf, NULL, screenWidth * screenHeight / 10), preparing for storing graphic datalv_disp_drv_init(&disp_drv) initializes the display driver structureLV_IMG_DECLARE(A3), then creates an image object logo_img and sets its source to a declared image, and finally sets the position of the image object on the screen through lv_obj_center and lv_obj_align【Demo flashing】
【Result demonstration】

【Demo description】
【Hardware connection】
【Code analysis】
LV_USE_LOG is not 0, register the serial port print function to view the LVGL log informationui_init to initialize user interface elements【Demo flashing】
【Result demonstration】

| LCD Pin | Raspberry Pi Pico |
| VCC | 3.3V |
| GND | GND |
| DIN | GPIO11 |
| CLK | GPIO10 |
| CS1 | GPIO9 |
| CS2 | GPIO13 |
| DC | GPIO8 |
| RST1 | GPIO12 |
| RST2 | GPIO15 |
| BL1 | GPIO20 |
| BL2 | GPIO21 |
1. Install the (Thonny installation package)
2. Press the "BOOTSEL" key on the Raspberry Pi Pico, and release it after powering
3. A new disk will appear on your computer, extract the (Raspberry Pi Pico firmware) and copy the firmware (suffix uf2) to that disk (the disk will automatically disappear if the copy is successful)
4. Open Thonny, click on "Python x.x.x" at the bottom right, and select "Configure interpreter"
5. Select "Interpreter" in the pop-up window -> select "MicroPython (Raspberry Pi Pico)" as the interpreter -> select "Auto-detect port" as the port
6. Click on "Stop", and the Shell window will show "MicroPython v1.20.0-50-g786013d46 on 2023-05-04; Raspberry Pi Pico with RP2040 Type "help()" for more information. " It means the connection is successful


![]()
![]()
![]()
| LCD Pin | Arduino |
| VCC | 5V |
| GND | GND |
| DIN | D11 |
| CLK | D13 |
| CS1 | D6 |
| CS2 | D10 |
| DC | D7 |
| RST1 | D5 |
| RST2 | D8 |
| BL1 | NC |
| BL2 | NC |
| Library Name | Description | Library Installation Requirement |
|---|---|---|
| TFT_eSPI | LCD driver library | "Install Offline" |
![]()
- After successful flashing, it displays as following:![]()
..\xxx.bin
Modules equipped with this chip are the v2 version, while those without it are the v1 version.![]()
Monday-Friday (9:30-6:30) Saturday (9:30-5:30)
Email: services01@spotpear.com