stm32hal模塊驅動(3)ssd1305 oled驅動

SD1305 OLED 驅動芯片詳細介紹

SSD1305 是 Solomon Systech 公司生產的一款 OLED 顯示控制器/驅動器,專為 128x64 或 128x32 點陣的 OLED 顯示屏設計。下面我將從多個方面詳細介紹這款驅動芯片。

一、SSD1305 基本特性

  1. 顯示分辨率

    • 最大支持 128 segments × 64 commons

    • 常用于 0.96 寸 128x64 OLED 屏幕

  2. 接口類型

    • 支持 6800/8080 并行接口

    • 支持 3/4 線 SPI 接口

    • 支持 I2C 接口(最常用)

    • 本文示例使用的是 I2C 接口

  3. 供電要求

    • 邏輯電壓:1.65V~3.3V

    • OLED 驅動電壓:7.0V~15V(芯片內部有電荷泵)

  4. 灰度控制

    • 支持 256 級亮度控制

    • 通過軟件可調節對比度

  5. 顯存管理

    • 內置 128x64 bits 的 GDDRAM(Graphic Display Data RAM)

    • 支持水平/垂直/頁尋址模式

二、SSD1305 與 SSD1306 的區別

SSD1305 常被與 SSD1306 比較,主要區別如下:

特性SSD1305SSD1306
最大分辨率128x64128x64
接口I2C/SPI/并行I2C/SPI/并行
電荷泵內置內置
顯存組織頁模式(8頁)頁模式(8頁)
對比度調節支持支持
封裝COG (Chip On Glass)COG (Chip On Glass)
主要應用中小尺寸OLED中小尺寸OLED
指令集略有不同

更常用

頭文件 (ssd1305.h)

#ifndef __SSD1305_H
#define __SSD1305_H#include "stm32f1xx_hal.h"// OLED參數定義
#define SSD1305_I2C_ADDR        0x3C  
#define SSD1305_WIDTH           128
#define SSD1305_HEIGHT          64
#define SSD1305_PAGE_NUM       (SSD1305_HEIGHT/8)// 命令定義
#define SSD1305_SETCONTRAST     0x81
#define SSD1305_DISPLAYALLON_RESUME 0xA4
#define SSD1305_DISPLAYALLON    0xA5
#define SSD1305_NORMALDISPLAY   0xA6
#define SSD1305_INVERTDISPLAY   0xA7
#define SSD1305_DISPLAYOFF      0xAE
#define SSD1305_DISPLAYON       0xAF
#define SSD1305_SETDISPLAYOFFSET 0xD3
#define SSD1305_SETCOMPINS      0xDA
#define SSD1305_SETVCOMDETECT   0xDB
#define SSD1305_SETDISPLAYCLOCKDIV 0xD5
#define SSD1305_SETPRECHARGE    0xD9
#define SSD1305_SETMULTIPLEX    0xA8
#define SSD1305_SETLOWCOLUMN    0x00
#define SSD1305_SETHIGHCOLUMN   0x10
#define SSD1305_SETSTARTLINE    0x40
#define SSD1305_MEMORYMODE     0x20
#define SSD1305_COLUMNADDR      0x21
#define SSD1305_PAGEADDR        0x22
#define SSD1305_COMSCANINC      0xC0
#define SSD1305_COMSCANDEC      0xC8
#define SSD1305_SEGREMAP        0xA0
#define SSD1305_CHARGEPUMP      0x8D// 函數聲明
void SSD1305_Init(I2C_HandleTypeDef *hi2c);
void SSD1305_WriteCommand(uint8_t cmd);
void SSD1305_WriteData(uint8_t data);
void SSD1305_Clear(void);
void SSD1305_UpdateScreen(void);
void SSD1305_DrawPixel(uint8_t x, uint8_t y, uint8_t color);
void SSD1305_GotoXY(uint8_t x, uint8_t y);
void SSD1305_PutChar(char ch, uint8_t color);
void SSD1305_PutString(char *str, uint8_t color);
void SSD1305_DrawBitmap(const uint8_t *bitmap);#endif

源文件 (ssd1305.c)

#include "ssd1305.h"
#include "font.h"  static I2C_HandleTypeDef *hi2c_oled;
static uint8_t SSD1305_Buffer[SSD1305_WIDTH * SSD1305_PAGE_NUM];// 寫入命令
void SSD1305_WriteCommand(uint8_t cmd) {uint8_t buf[2] = {0x00, cmd};  // Co = 0, D/C = 0HAL_I2C_Master_Transmit(hi2c_oled, SSD1305_I2C_ADDR, buf, 2, HAL_MAX_DELAY);
}// 寫入數據
void SSD1305_WriteData(uint8_t data) {uint8_t buf[2] = {0x40, data};  // Co = 0, D/C = 1HAL_I2C_Master_Transmit(hi2c_oled, SSD1305_I2C_ADDR, buf, 2, HAL_MAX_DELAY);
}// 初始化OLED
void SSD1305_Init(I2C_HandleTypeDef *hi2c) {hi2c_oled = hi2c;// 初始化序列SSD1305_WriteCommand(SSD1305_DISPLAYOFF);                    // 0xAESSD1305_WriteCommand(SSD1305_SETDISPLAYCLOCKDIV);            // 0xD5SSD1305_WriteCommand(0x80);                                  // 建議比率SSD1305_WriteCommand(SSD1305_SETMULTIPLEX);                  // 0xA8SSD1305_WriteCommand(SSD1305_HEIGHT - 1);SSD1305_WriteCommand(SSD1305_SETDISPLAYOFFSET);              // 0xD3SSD1305_WriteCommand(0x00);                                  // 無偏移SSD1305_WriteCommand(SSD1305_SETSTARTLINE | 0x00);           // 0x40SSD1305_WriteCommand(SSD1305_CHARGEPUMP);                    // 0x8DSSD1305_WriteCommand(0x14);                                  // 使用內部VCCSSD1305_WriteCommand(SSD1305_MEMORYMODE);                    // 0x20SSD1305_WriteCommand(0x00);                                  // 水平尋址模式SSD1305_WriteCommand(SSD1305_SEGREMAP | 0x01);               // 0xA0/0xA1SSD1305_WriteCommand(SSD1305_COMSCANDEC);                    // 0xC8SSD1305_WriteCommand(SSD1305_SETCOMPINS);                    // 0xDASSD1305_WriteCommand(0x12);                                  // 64行模式SSD1305_WriteCommand(SSD1305_SETCONTRAST);                   // 0x81SSD1305_WriteCommand(0xCF);                                  // 對比度值SSD1305_WriteCommand(SSD1305_SETPRECHARGE);                  // 0xD9SSD1305_WriteCommand(0xF1);                                  // 預充電周期SSD1305_WriteCommand(SSD1305_SETVCOMDETECT);                 // 0xDBSSD1305_WriteCommand(0x40);                                  // VCOMH電平SSD1305_WriteCommand(SSD1305_DISPLAYALLON_RESUME);           // 0xA4SSD1305_WriteCommand(SSD1305_NORMALDISPLAY);                 // 0xA6SSD1305_WriteCommand(SSD1305_DISPLAYON);                     // 0xAF// 清屏SSD1305_Clear();SSD1305_UpdateScreen();
}// 清空顯示緩沖區
void SSD1305_Clear(void) {memset(SSD1305_Buffer, 0, sizeof(SSD1305_Buffer));
}// 更新屏幕顯示
void SSD1305_UpdateScreen(void) {uint8_t i;for(i = 0; i < SSD1305_PAGE_NUM; i++) {SSD1305_WriteCommand(0xB0 + i);                          // 設置頁地址SSD1305_WriteCommand(0x00);                              // 設置列地址低位SSD1305_WriteCommand(0x10);                              // 設置列地址高位HAL_I2C_Mem_Write(hi2c_oled, SSD1305_I2C_ADDR, 0x40, I2C_MEMADD_SIZE_8BIT, &SSD1305_Buffer[SSD1305_WIDTH * i], SSD1305_WIDTH, HAL_MAX_DELAY);}
}// 繪制像素點
void SSD1305_DrawPixel(uint8_t x, uint8_t y, uint8_t color) {if(x >= SSD1305_WIDTH || y >= SSD1305_HEIGHT) {return;  // 超出范圍}if(color) {SSD1305_Buffer[x + (y / 8) * SSD1305_WIDTH] |= 1 << (y % 8);} else {SSD1305_Buffer[x + (y / 8) * SSD1305_WIDTH] &= ~(1 << (y % 8));}
}// 設置光標位置
void SSD1305_GotoXY(uint8_t x, uint8_t y) {// 這里可以添加自己的光標位置跟蹤變量
}// 顯示單個字符
void SSD1305_PutChar(char ch, uint8_t color) {uint32_t i, b, j;// 檢查剩余空間// 這里需要實現光標跟蹤或使用全局變量// 只處理可打印字符if(ch < 32 || ch > 126) {ch = ' ';  // 不可打印字符顯示為空格}// 從字體數據中獲取字符for(i = 0; i < 6; i++) {if(i == 5) {b = 0x00;} else {b = Font[(ch - 32) * 5 + i];}for(j = 0; j < 8; j++) {if((b >> j) & 0x01) {SSD1305_DrawPixel(/*x + i*/, /*y + j*/, color);} else {SSD1305_DrawPixel(/*x + i*/, /*y + j*/, !color);}}}// 移動光標// 這里需要實現光標跟蹤
}// 顯示字符串
void SSD1305_PutString(char *str, uint8_t color) {while(*str) {SSD1305_PutChar(*str++, color);}
}// 顯示位圖
void SSD1305_DrawBitmap(const uint8_t *bitmap) {memcpy(SSD1305_Buffer, bitmap, sizeof(SSD1305_Buffer));
}

字體文件 (font.h)?

#ifndef __FONT_H
#define __FONT_H#include <stdint.h>// 標準ASCII 5x7字體
// 每個字符5字節寬,8像素高(最后1像素通常為空白行)
// 只包含可打印字符(32-126)
static const uint8_t Font[] = {0x00, 0x00, 0x00, 0x00, 0x00, // (space)0x00, 0x00, 0x5F, 0x00, 0x00, // !0x00, 0x07, 0x00, 0x07, 0x00, // "0x14, 0x7F, 0x14, 0x7F, 0x14, // #0x24, 0x2A, 0x7F, 0x2A, 0x12, // $0x23, 0x13, 0x08, 0x64, 0x62, // %0x36, 0x49, 0x55, 0x22, 0x50, // &0x00, 0x05, 0x03, 0x00, 0x00, // '0x00, 0x1C, 0x22, 0x41, 0x00, // (0x00, 0x41, 0x22, 0x1C, 0x00, // )0x08, 0x2A, 0x1C, 0x2A, 0x08, // *0x08, 0x08, 0x3E, 0x08, 0x08, // +0x00, 0x50, 0x30, 0x00, 0x00, // ,0x08, 0x08, 0x08, 0x08, 0x08, // -0x00, 0x60, 0x60, 0x00, 0x00, // .0x20, 0x10, 0x08, 0x04, 0x02, // /0x3E, 0x51, 0x49, 0x45, 0x3E, // 00x00, 0x42, 0x7F, 0x40, 0x00, // 10x42, 0x61, 0x51, 0x49, 0x46, // 20x21, 0x41, 0x45, 0x4B, 0x31, // 30x18, 0x14, 0x12, 0x7F, 0x10, // 40x27, 0x45, 0x45, 0x45, 0x39, // 50x3C, 0x4A, 0x49, 0x49, 0x30, // 60x01, 0x71, 0x09, 0x05, 0x03, // 70x36, 0x49, 0x49, 0x49, 0x36, // 80x06, 0x49, 0x49, 0x29, 0x1E, // 90x00, 0x36, 0x36, 0x00, 0x00, // :0x00, 0x56, 0x36, 0x00, 0x00, // ;0x00, 0x08, 0x14, 0x22, 0x41, // <0x14, 0x14, 0x14, 0x14, 0x14, // =0x41, 0x22, 0x14, 0x08, 0x00, // >0x02, 0x01, 0x51, 0x09, 0x06, // ?0x32, 0x49, 0x79, 0x41, 0x3E, // @0x7E, 0x11, 0x11, 0x11, 0x7E, // A0x7F, 0x49, 0x49, 0x49, 0x36, // B0x3E, 0x41, 0x41, 0x41, 0x22, // C0x7F, 0x41, 0x41, 0x22, 0x1C, // D0x7F, 0x49, 0x49, 0x49, 0x41, // E0x7F, 0x09, 0x09, 0x09, 0x01, // F0x3E, 0x41, 0x49, 0x49, 0x7A, // G0x7F, 0x08, 0x08, 0x08, 0x7F, // H0x00, 0x41, 0x7F, 0x41, 0x00, // I0x20, 0x40, 0x41, 0x3F, 0x01, // J0x7F, 0x08, 0x14, 0x22, 0x41, // K0x7F, 0x40, 0x40, 0x40, 0x40, // L0x7F, 0x02, 0x04, 0x02, 0x7F, // M0x7F, 0x04, 0x08, 0x10, 0x7F, // N0x3E, 0x41, 0x41, 0x41, 0x3E, // O0x7F, 0x09, 0x09, 0x09, 0x06, // P0x3E, 0x41, 0x51, 0x21, 0x5E, // Q0x7F, 0x09, 0x19, 0x29, 0x46, // R0x46, 0x49, 0x49, 0x49, 0x31, // S0x01, 0x01, 0x7F, 0x01, 0x01, // T0x3F, 0x40, 0x40, 0x40, 0x3F, // U0x1F, 0x20, 0x40, 0x20, 0x1F, // V0x7F, 0x20, 0x18, 0x20, 0x7F, // W0x63, 0x14, 0x08, 0x14, 0x63, // X0x03, 0x04, 0x78, 0x04, 0x03, // Y0x61, 0x51, 0x49, 0x45, 0x43, // Z0x00, 0x7F, 0x41, 0x41, 0x00, // [0x02, 0x04, 0x08, 0x10, 0x20, // "\"0x00, 0x41, 0x41, 0x7F, 0x00, // ]0x04, 0x02, 0x01, 0x02, 0x04, // ^0x40, 0x40, 0x40, 0x40, 0x40, // _0x00, 0x01, 0x02, 0x04, 0x00, // `0x20, 0x54, 0x54, 0x54, 0x78, // a0x7F, 0x48, 0x44, 0x44, 0x38, // b0x38, 0x44, 0x44, 0x44, 0x20, // c0x38, 0x44, 0x44, 0x48, 0x7F, // d0x38, 0x54, 0x54, 0x54, 0x18, // e0x08, 0x7E, 0x09, 0x01, 0x02, // f0x08, 0x14, 0x54, 0x54, 0x3C, // g0x7F, 0x08, 0x04, 0x04, 0x78, // h0x00, 0x44, 0x7D, 0x40, 0x00, // i0x20, 0x40, 0x44, 0x3D, 0x00, // j0x00, 0x7F, 0x10, 0x28, 0x44, // k0x00, 0x41, 0x7F, 0x40, 0x00, // l0x7C, 0x04, 0x18, 0x04, 0x78, // m0x7C, 0x08, 0x04, 0x04, 0x78, // n0x38, 0x44, 0x44, 0x44, 0x38, // o0x7C, 0x14, 0x14, 0x14, 0x08, // p0x08, 0x14, 0x14, 0x18, 0x7C, // q0x7C, 0x08, 0x04, 0x04, 0x08, // r0x48, 0x54, 0x54, 0x54, 0x20, // s0x04, 0x3F, 0x44, 0x40, 0x20, // t0x3C, 0x40, 0x40, 0x20, 0x7C, // u0x1C, 0x20, 0x40, 0x20, 0x1C, // v0x3C, 0x40, 0x30, 0x40, 0x3C, // w0x44, 0x28, 0x10, 0x28, 0x44, // x0x0C, 0x50, 0x50, 0x50, 0x3C, // y0x44, 0x64, 0x54, 0x4C, 0x44, // z0x00, 0x08, 0x36, 0x41, 0x00, // {0x00, 0x00, 0x7F, 0x00, 0x00, // |0x00, 0x41, 0x36, 0x08, 0x00, // }0x08, 0x08, 0x2A, 0x1C, 0x08, // →0x08, 0x1C, 0x2A, 0x08, 0x08  // ←
};#endif

使用示例 (main.c)

    // 初始化OLEDSSD1305_Init(&hi2c1);// 顯示內容SSD1305_Clear();SSD1305_GotoXY(0, 0);SSD1305_PutString("Hello OLED!", 1);SSD1305_GotoXY(0, 16);SSD1305_PutString("STM32 HAL I2C", 1);SSD1305_GotoXY(0, 32);SSD1305_PutString("SSD1305 Driver", 1);// 更新顯示SSD1305_UpdateScreen();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88150.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安全為先:如何在 Python 中安全處理數據庫連接與敏感信息

安全為先:如何在 Python 中安全處理數據庫連接與敏感信息 引言:Python 與安全的數據庫交互 自 1991 年誕生以來,Python 憑借其簡潔優雅的語法和強大的生態系統,成為 Web 開發、數據科學、人工智能和數據庫交互的首選語言。作為“膠水語言”,Python 不僅讓開發者能夠快速…

服務器經常出現藍屏是什么原因導致的?如何排查和修復?

服務器出現藍屏&#xff08;BSOD&#xff0c;Blue Screen of Death&#xff09;是一個嚴重的問題&#xff0c;通常表明系統內核或硬件發生了不可恢復的錯誤。藍屏不僅會導致服務器宕機&#xff0c;還可能對業務運行造成重大影響。要有效解決藍屏問題&#xff0c;需要先找到根本…

為什么elementui的<el-table-column label=“名稱“ prop=“name“ label不用寫成:label

在 Vue.js 中&#xff0c;label 和 prop 是 el-table-column 組件的普通屬性&#xff0c;而不是動態綁定的表達式。因此&#xff0c;不需要使用 : 來綁定它們。 1. Vue.js 中的屬性綁定 在 Vue.js 中&#xff0c;屬性綁定有兩種方式&#xff1a; 靜態屬性綁定&#xff1a;直接寫…

分布式光纖傳感:為儲能安全保駕護航

儲能系統是指一種能夠將電能、化學能、動能等形式的能量進行轉化、儲存和釋放的裝置&#xff0c;廣泛應用于可再生能源發電、智能電網、電動車等領域。儲能行業這幾年得到了穩步發展&#xff0c;受到政府機構、行業協會、大型能源企業、電網公司、系統集成商、檢測認證機構等業…

從歷史航拍圖像中去除陰影

在光學遙感中&#xff0c;陰影是影響土地覆蓋制圖精度和分辨率的一個因素&#xff0c;無論是歷史影像&#xff08;黑白影像&#xff09;還是近期影像&#xff08;全彩影像&#xff09;。陰影的產生取決于太陽光照&#xff08;太陽方位角和天頂角&#xff09;、相機視點&#xf…

UE material advance 學習筆記

如何體現輪胎速度的快速感&#xff1a;就是增加一個radial blur&#xff0c;會讓視覺效果感覺輪胎已經轉冒煙了&#xff0c;但是上面兩個輪胎的轉速其實是相同的這種磨砂的感覺&#xff0c;可以用上ditherAA來實現只看法線這一塊&#xff0c;ditherAA就是讓他的表面顏色有大量的…

Vue--2、Vue2 項目配置與組件化開發

一、Vue2 項目環境搭建1. 環境準備安裝 Node.js&#xff1a;推薦使用 nvm 管理多版本 Node# 安裝Node 16.20.2 nvm install 16.20.2 # 切換至指定版本 nvm use 16.20.2 # 驗證安裝 node -v && npm -v安裝 Vue CLI 腳手架&#xff1a;# 國內鏡像源安裝 npm install --re…

虛幻基礎:函數的返回節點

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄函數的返回節點&#xff1a;返回執行后的值返回執行后的值若不執行第一次 返回參數的默認值第二次 返回上一次執行值示例函數的返回節點&#xff1a;返回執行后的值 返回執行后的值 若不執行 第一次 返回參數的默…

FFmpeg 升級指北

近期我參與了部門底層庫依賴的 FFmpeg 從 3.4 升級至 7.0.2 的工作&#xff0c;在此分享一些經驗和遇到的 API 變動。 將 FFmpeg 升級到高版本后&#xff0c;編譯過程中遇到大量報錯是常態。這些錯誤通常源于 API 接口變更或結構體字段調整。此時不必驚慌&#xff0c;核心解決…

RISCV Linux 虛擬內存精講系列三 -- setup_vm()

在 Linux 使用虛擬地址前&#xff0c;需要先配置頁表&#xff0c;這就是 setup_vm() 的作用。然而&#xff0c;Linux 的頁表配置&#xff0c;并不是一次過完成的&#xff0c;分了兩個階段&#xff0c;如下&#xff1a;在 setup_vm() 中&#xff0c;主要初始化了&#xff1a;1. …

創客匠人:解析創始人 IP 打造的底層邏輯與知識變現路徑

在數字經濟時代&#xff0c;創始人 IP 的價值被不斷放大&#xff0c;而知識變現作為 IP 商業閉環的核心環節&#xff0c;正成為無數創業者探索的方向。創客匠人深耕知識付費領域多年&#xff0c;見證了大量創始人從 0 到 1 打造 IP 并實現變現的全過程&#xff0c;其背后的邏輯…

Visual Studio 2022 MFC Dialog 添加Toolbar及Tips提示

主要步驟&#xff1a;在主框架類中添加消息處理函數聲明在 OnCreate 函數中啟用工具欄提示在消息映射中注冊 TTN_NEEDTEXT 消息使用 OnToolTipText 函數實現自定義提示文本1.在主程序的.h文件中加入afx_msg BOOL OnToolTipText(UINT id, NMHDR* pNMHDR, LRESULT* pResult); 2.在…

2025Q2大模型更新匯總(大語言模型篇)

摘要 2025年Q2大語言模型更新匯總&#xff1a; Qwen3&#xff0c;Deepseek-R1-0528&#xff0c;Doubao-Seed-1.6, MiniMax-M1, GPT4.1/O3/O4&#xff0c;Claude4/Gemini2.5 Qwen3 ? 開源MOE模型&#xff0c; ? MOE模型&#xff1a;Qwen3-235B-A22B&#xff0c;Qwen3-30B-…

【STM32】定時器中斷 + 含常用寄存器和庫函數配置(提供完整實例代碼)

通用定時器基礎知識 參考資料:STM32F1xx官方資料:《STM32中文參考手冊V10》-第14章通用定時器 通用定時器工作過程: 時鐘選擇 計數器時鐘可以由下列時鐘源提供: ① 內部時鐘(CK_INT) ② 外部時鐘模式1:外部輸入腳(TIx) ③ 外部時鐘模式2:外部觸發輸入(ETR) ④ 內部觸…

集群Redis

文章目錄前言一、Redis主從復制配置1.1.配置文件redis_master.conf,redis_slave.conf1.2.啟動服務1.3.檢查成果二、Redis集群配置2.1.服務器40.240.34.91集群配置2.2.其它服務器xxx.92,xxx.93集群配置2.3.啟動服務2.3.啟動集群服務2.4.檢查成果三、優劣四、結束前言 提示&…

ORA-600 kokiasg1故障分析---惜分飛

故障總結:客戶正常關閉數據庫,然后啟動報ORA-600 kokiasg1錯誤,通過對啟動分析確認是由于IDGEN1$序列丟失導致,修復該故障之后,數據庫啟動成功,但是后臺大量報ORA-600 12803,ORA-600 15264等錯誤,業務用戶無法登錄.經過深入分析,發現數據庫字典obj$中所有核心字典的序列全部被刪…

[RPA] 影刀RPA基本知識

1.應用的構成一個應用&#xff1a;由多條指令疊加組成一條指令代表了一個操作動作許多條指令按照一定的邏輯關系編排起來&#xff0c;就構成了一個應用(這里的應用可理解為軟件機器人RPA)一個應用 多個自動化指令的集合 2. 指令的一般構成在XXX對象上&#xff0c;對XXX元素執行…

pytest中測試特定接口

在pytest中只測試特定接口有以下幾種常用方法&#xff1a; 1. 通過測試函數名精確匹配 直接指定測試文件和函數名&#xff1a; pytest test_api.py::test_upload_image_with_library這將只運行test_api.py文件中名為test_upload_image_with_library的測試函數。 2. 使用關鍵字匹…

HMI圖形渲染優化:OpenGL ES與Vulkan的性能對比實戰

HMI 圖形渲染優化&#xff1a;OpenGL ES 與 Vulkan 的性能對比實戰**摘要想讓 HMI 界面的圖形渲染又快又流暢&#xff0c;卻在 OpenGL ES 和 Vulkan 之間糾結不已&#xff01;用 OpenGL ES&#xff0c;擔心性能不夠強勁&#xff0c;無法滿足復雜場景需求&#xff1b;選 Vulkan&…

Python數據分析基礎01:描述性統計分析

下一篇&#xff1a; 《Python數據分析基礎04&#xff1a;預測性數據分析》 《Python數據分析基礎03&#xff1a;探索性數據分析》 《python數據分析基礎02&#xff1a;數據可視化分析》 《Python數據分析基礎01&#xff1a;描述性統計分析》 描述性統計分析是統計學中最基…