wap網(wǎng)站怎么打開(kāi)求職
鶴壁市浩天電氣有限公司
2026/01/24 14:08:04
wap網(wǎng)站怎么打開(kāi),求職,百度搜索網(wǎng)站,福州網(wǎng)站設(shè)計(jì)招聘從零點(diǎn)亮一塊彩屏#xff1a;手把手教你用SPI驅(qū)動(dòng)ST7789顯示屏你有沒(méi)有想過(guò)#xff0c;自己親手讓一塊小小的彩色屏幕亮起來(lái)#xff0c;顯示文字、圖形甚至動(dòng)畫(huà)#xff1f;聽(tīng)起來(lái)像是高手才玩得轉(zhuǎn)的事#xff0c;但其實(shí)只要掌握正確的方法#xff0c;哪怕你是嵌入式開(kāi)發(fā)的…從零點(diǎn)亮一塊彩屏手把手教你用SPI驅(qū)動(dòng)ST7789顯示屏你有沒(méi)有想過(guò)自己親手讓一塊小小的彩色屏幕亮起來(lái)顯示文字、圖形甚至動(dòng)畫(huà)聽(tīng)起來(lái)像是高手才玩得轉(zhuǎn)的事但其實(shí)只要掌握正確的方法哪怕你是嵌入式開(kāi)發(fā)的“小白”也能在幾小時(shí)內(nèi)完成這個(gè)看似高深的操作。今天我們要聊的是ST7789—— 一塊在1.3英寸到2.0英寸小屏幕上幾乎無(wú)處不在的TFT控制器芯片。它被廣泛用于智能手表、便攜儀表、DIY項(xiàng)目中而最常用、也最適合初學(xué)者上手的方式就是通過(guò)SPI接口來(lái)控制它。別擔(dān)心沒(méi)基礎(chǔ)。這篇文章不堆術(shù)語(yǔ)、不甩理論只講你能看懂、能動(dòng)手、能成功的實(shí)戰(zhàn)路徑。我們會(huì)從接線開(kāi)始一步步走到屏幕全亮、刷出顏色最后告訴你怎么避免那些讓人抓狂的“黑屏”、“花屏”坑。為什么是 ST7789又為什么選 SPI先說(shuō)個(gè)現(xiàn)實(shí)現(xiàn)在做嵌入式項(xiàng)目誰(shuí)還愿意為一個(gè)屏幕拉十幾根線搞并口通信MCU引腳寶貴得很尤其是像ESP32-Sx系列或者STM32G0這類(lèi)資源緊張的芯片省一根是一根。ST7789 的好處就在于——功能強(qiáng)還省事。它支持最高 240×320 分辨率原生支持 RGB565 色彩格式也就是常說(shuō)的16位色約6.5萬(wàn)色內(nèi)置升壓電路和伽馬校正最關(guān)鍵的是它可以用四根線就跑起來(lái)SCK、MOSI、CS、DC。加上 RST 和電源總共也就七八個(gè)引腳搞定。而這四根核心信號(hào)線走的就是SPI 協(xié)議。SPI 是什么你可以把它想象成一種“對(duì)講機(jī)式”的通信方式主控比如你的單片機(jī)說(shuō)話屏幕聽(tīng)著不需要回話因?yàn)榇蠖鄶?shù)時(shí)候我們只寫(xiě)不讀。簡(jiǎn)單、高效、通用性強(qiáng)。更重要的是幾乎所有主流開(kāi)發(fā)平臺(tái)都原生支持 SPI- Arduino 有SPI.h- ESP32 支持硬件 SPI DMA 加速- 樹(shù)莓派 PicoRP2040用 C/C SDK 輕松配置- STM32 HAL 庫(kù)直接調(diào)用傳輸函數(shù)所以選擇 ST7789 SPI 組合等于選擇了低成本、低門(mén)檻、高兼容性的入門(mén)方案。接線很簡(jiǎn)單但每根線都有講究先來(lái)看一張最基礎(chǔ)的連接圖MCU 引腳→ST7789 模塊GPIOx (SCK)→SCK / CLKGPIOy (MOSI)→MOSI / DINGPIOz (CS)→CS / SSGPIOa (DC)→DC / A0GPIOb (RST)→RST3.3V→VCCGND→GND可選PWM→BLK / LED_K?? 注意有些模塊標(biāo)的是 VIN 而不是 VCC其實(shí)是同一個(gè)意思BLK 是背光控制腳接 PWM 可調(diào)亮度。這里面最容易忽略的細(xì)節(jié)是電平匹配。雖然 ST7789 支持 1.8V~3.3V IO 電壓但如果你用的是 5V 系統(tǒng)比如老款 Arduino Uno必須加電平轉(zhuǎn)換器或串電阻限流否則可能燒毀模塊另外RST 引腳不能省。雖然有些代碼里看到“不用硬件復(fù)位”但強(qiáng)烈建議接上。很多初始化失敗的問(wèn)題根源就是芯片沒(méi)真正重啟。SPI 模式怎么選Mode 0 還是 Mode 3這是新手最容易栽的第一個(gè)坑。SPI 有四種工作模式由兩個(gè)參數(shù)決定CPOL時(shí)鐘極性和 CPHA時(shí)鐘相位。ST7789 官方文檔寫(xiě)著支持 Mode 0 和 Mode 3那到底該用哪個(gè)答案是優(yōu)先試 Mode 0CPOL0, CPHA0什么意思- 空閑時(shí) SCK 為低電平- 數(shù)據(jù)在上升沿采樣即每個(gè)時(shí)鐘周期的后半段穩(wěn)定這幾乎是市面上絕大多數(shù)開(kāi)發(fā)板默認(rèn)的設(shè)置。你在 Arduino 或 STM32CubeMX 中啟用 SPI 外設(shè)時(shí)默認(rèn)就是這個(gè)模式。如果 Mode 0 不行再嘗試切換到 Mode 3CPOL1, CPHA1試試。有時(shí)候某些廠商改了內(nèi)部邏輯會(huì)要求空閑高電平。? 實(shí)戰(zhàn)提示可以用示波器抓一下 SCK 波形看看是否符合預(yù)期沒(méi)有設(shè)備的話就靠換代碼配置多試幾次。命令與數(shù)據(jù)交替?zhèn)鬏擲T7789 的“語(yǔ)言規(guī)則”理解這一點(diǎn)你就掌握了和屏幕“對(duì)話”的鑰匙。ST7789 并不像普通外設(shè)那樣收發(fā)固定協(xié)議的數(shù)據(jù)包它是靠命令 參數(shù)的方式工作的。就像點(diǎn)菜一樣- 先告訴它你要干嘛下命令- 再把具體信息傳過(guò)去送參數(shù)而區(qū)分“命令”和“數(shù)據(jù)”的關(guān)鍵就是那根叫DC的引腳。DC 狀態(tài)含義DC 0當(dāng)前傳輸?shù)氖敲钭止?jié)例如0x2A表示設(shè)置列地址DC 1當(dāng)前傳輸?shù)氖菙?shù)據(jù)參數(shù)或像素值舉個(gè)例子你想設(shè)置顯示區(qū)域?yàn)樽笊辖?(0,0) 到右下角 (239,319)拉低 CS → 發(fā)送 0x2A (DC0) → 發(fā)起始高位 (DC1) → 起始低位 → 結(jié)束高位 → 結(jié)束低位 → CS 拉高整個(gè)過(guò)程如下void ST7789_WriteCmd(uint8_t cmd) { CS_LOW; DC_LOW; // 命令模式 spi_write(cmd, 1); DC_HIGH; // 自動(dòng)切回?cái)?shù)據(jù)模式方便后續(xù)連續(xù)寫(xiě)數(shù)據(jù) } void ST7789_WriteData(uint8_t *buf, size_t len) { CS_LOW; spi_write(buf, len); // 此時(shí) DC 已為高表示數(shù)據(jù) CS_HIGH; }注意看我們?cè)诎l(fā)送完命令后立刻把 DC 拉高——這是一個(gè)小技巧因?yàn)榻酉聛?lái)大概率要寫(xiě)參數(shù)提前準(zhǔn)備好狀態(tài)可以減少一次 GPIO 切換提升效率。初始化序列讓屏幕“醒過(guò)來(lái)”的魔法咒語(yǔ)剛上電的 ST7789 是沉睡的。它需要一系列特定的命令才能進(jìn)入正常工作狀態(tài)。這些命令組合起來(lái)叫做初始化序列Initialization Sequence。你可以把它理解為“開(kāi)機(jī)自檢系統(tǒng)配置”。下面是典型的一段初始化流程適用于大多數(shù) 240x320 屏void ST7789_Init(void) { // 硬件復(fù)位 RST_LOW; delay_ms(10); RST_HIGH; delay_ms(150); // 軟件復(fù)位 ST7789_WriteCmd(0x01); delay_ms(150); // 退出睡眠模式 ST7789_WriteCmd(0x11); delay_ms(200); // 必須等夠手冊(cè)要求 ≥120ms // 設(shè)置色彩格式為 16-bit (RGB565) ST7789_WriteCmd(0x3A); ST7789_WriteByte(0x05); // 0x05 16位色 // 設(shè)置內(nèi)存訪問(wèn)方向旋轉(zhuǎn)/鏡像 ST7789_WriteCmd(0x36); ST7789_WriteByte(0xC0); // 常見(jiàn)豎屏方向可根據(jù)實(shí)際調(diào)整 // 設(shè)置列地址范圍0~239 ST7789_WriteCmd(0x2A); uint8_t col_addr[] {0x00, 0x00, 0x00, 0xEF}; // 240列 ST7789_WriteData(col_addr, 4); // 設(shè)置行地址范圍0~319 ST7789_WriteCmd(0x2B); uint8_t row_addr[] {0x00, 0x00, 0x01, 0x3F}; // 320行 ST7789_WriteData(row_addr, 4); // 開(kāi)啟顯示 ST7789_WriteCmd(0x29); }其中最關(guān)鍵的幾個(gè)點(diǎn)-0x11Sleep Out之后必須延時(shí)至少120ms-0x36MADCTL決定了屏幕怎么“躺著”顯示常見(jiàn)值有0x00,0x60,0xC0,0xA0分別對(duì)應(yīng)不同旋轉(zhuǎn)角度-0x29Display On才是真正點(diǎn)亮屏幕的開(kāi)關(guān)如果你的屏幕一直黑著先檢查是不是漏了0x11或者0x29或者延時(shí)不達(dá)標(biāo)。如何畫(huà)滿屏向 GRAM 寫(xiě)入像素?cái)?shù)據(jù)GRAM 是什么它是 Graphics RAM 的縮寫(xiě)即圖形內(nèi)存。雖然 ST7789 本身沒(méi)有大容量 RAM 存儲(chǔ)整幀圖像但它提供了一個(gè)“窗口機(jī)制”你告訴它一個(gè)區(qū)域然后往里面不停地寫(xiě)顏色數(shù)據(jù)它就會(huì)自動(dòng)映射到屏幕上。寫(xiě)像素的核心命令是0x2CWrite Memory Start意思是“接下來(lái)所有數(shù)據(jù)都是像素點(diǎn)了?!北热缥覀兿氚颜麄€(gè)屏幕刷成白色RGB565 下白色是0xFFFFvoid ST7789_FillScreen(uint16_t color) { ST7789_SetWindow(0, 0, 239, 319); // 設(shè)定區(qū)域 ST7789_WriteCmd(0x2C); // 開(kāi)始寫(xiě)顯存 uint8_t hi color 8; uint8_t lo color 0xFF; // 構(gòu)造重復(fù)顏色數(shù)組建議用DMA或緩沖區(qū)優(yōu)化 for (int i 0; i 240 * 320; i) { ST7789_WriteByte(hi); ST7789_WriteByte(lo); } }當(dāng)然這種輪詢寫(xiě)法非常慢尤其是在 SPI 頻率只有 4MHz 的情況下刷一屏可能要幾百毫秒。但在調(diào)試階段完全可用。 提升建議使用 DMA 傳輸、雙緩沖機(jī)制或?qū)㈩伾A(yù)存在數(shù)組中批量發(fā)送。屏幕方向怎么調(diào)MADCTL 寄存器詳解很多人第一次點(diǎn)亮屏幕發(fā)現(xiàn)圖像是倒的、歪的、鏡像的……別慌這很正常。這一切都由MADCTLMemory Access Control寄存器控制地址是0x36。它是一個(gè)8位寄存器每一位都有含義Bit名稱(chēng)功能7MY行掃描順序1從下往上6MX列掃描順序1從右往左5MVX/Y 是否交換1行列互換實(shí)現(xiàn)90度旋轉(zhuǎn)4ML掃描方向1從底到頂逐行3RGB接口顏色順序1RGB0BGR重要2:0-保留常用組合舉例值十六進(jìn)制效果說(shuō)明0x00默認(rèn)橫向左上起點(diǎn)0x60旋轉(zhuǎn)90度適合豎屏0xC0旋轉(zhuǎn)180度0xA0旋轉(zhuǎn)270度0x20水平翻轉(zhuǎn) 實(shí)戰(zhàn)經(jīng)驗(yàn)如果你發(fā)現(xiàn)顏色偏藍(lán)或偏紅很可能是 RGB/BGR 搞反了。試試把 bit3 取反。常見(jiàn)問(wèn)題排查清單那些年我們一起踩過(guò)的坑? 屏幕完全不亮檢查供電是否正常3.3V有無(wú)短路RST 是否有效觸發(fā)可用萬(wàn)用表測(cè)復(fù)位電平變化是否發(fā)送了0x11和0x29缺一不可SPI 是否工作可用示波器看 SCK 是否有波形? 顯示花屏、錯(cuò)位、條紋CASET和RASET設(shè)置的坐標(biāo)范圍是否正確MADCTL 配置是否與物理安裝方向一致SPI 速率是否過(guò)高面包板上超過(guò) 8MHz 就容易出錯(cuò)? 顏色不對(duì)發(fā)綠、發(fā)紅RGB565 字節(jié)順序是否顛倒試試交換高低字節(jié)MADCTL 的 RGB/BGR 位是否正確測(cè)試純色0xF800紅0x07E0綠0x001F藍(lán)? 刷新太慢卡頓放棄輪詢寫(xiě)法改用 DMA 或 SPI 雙緩沖減少全屏刷新改為局部更新Partial Update提高 SPI 主頻至 10~15MHz需確保線路質(zhì)量工程級(jí)設(shè)計(jì)建議不只是點(diǎn)亮更要穩(wěn)定可靠當(dāng)你不再滿足于“能亮”而是要做產(chǎn)品級(jí)應(yīng)用時(shí)以下幾點(diǎn)值得重視? 電源去耦不能省在 VCC 引腳附近加一個(gè)0.1μF 陶瓷電容離模塊越近越好。最好再并聯(lián)一個(gè) 10μF 鉭電容吸收瞬態(tài)電流波動(dòng)。? 背光單獨(dú)控制BLK 引腳通常連接背光LED陰極。若電流較大100mA建議用三極管或MOSFET驅(qū)動(dòng)避免直接由MCU引腳供電。? 使用分層架構(gòu)構(gòu)建清晰的軟件結(jié)構(gòu)底層SPI 讀寫(xiě)抽象 │ ├─ 中間層ST7789 控制初始化、窗口設(shè)置、旋轉(zhuǎn)等 │ └─ 上層圖形庫(kù)繪制點(diǎn)線圓、文字、UI框架如LVGL這樣未來(lái)?yè)Q平臺(tái)或換屏幕都更容易移植。? 區(qū)域更新優(yōu)于全屏刷新對(duì)于僅變動(dòng)一小部分畫(huà)面的應(yīng)用如儀表盤(pán)指針移動(dòng)只需重繪變化區(qū)域即可大幅降低帶寬占用。更進(jìn)一步結(jié)合 GUI 框架打造交互界面一旦你能穩(wěn)定驅(qū)動(dòng) ST7789下一步就可以接入輕量級(jí) GUI 框架比如LVGL功能強(qiáng)大支持觸摸、動(dòng)畫(huà)、主題適合 STM32/ESP32u8g2資源占用極低適合 AVR、nRF 等小內(nèi)存設(shè)備TFT_eSPI Arduino GFXESP32 上最受歡迎的組合之一它們的背后其實(shí)都是基于我們剛才講的這套 SPI 命令-數(shù)據(jù)模型。你現(xiàn)在打下的基礎(chǔ)正是通往更復(fù)雜應(yīng)用的跳板。寫(xiě)在最后每一個(gè)高手都曾從點(diǎn)亮第一塊屏開(kāi)始你看整個(gè)過(guò)程并沒(méi)有那么神秘。從認(rèn)識(shí)每一根線的作用到理解命令與數(shù)據(jù)的區(qū)別再到寫(xiě)出第一個(gè)FillScreen()函數(shù)——你已經(jīng)走完了從“看不懂”到“能做到”的全過(guò)程。技術(shù)從來(lái)不是天才的專(zhuān)利而是堅(jiān)持實(shí)踐的結(jié)果。也許你現(xiàn)在連 SPI 是什么都還不太清楚但只要?jiǎng)邮纸右淮尉€、燒錄一段代碼、看到屏幕真的亮起來(lái)那一刻那種成就感足以讓你愛(ài)上嵌入式開(kāi)發(fā)。如果你正在做一個(gè)天氣站、音樂(lè)播放器、或是帶界面的小工具不妨加上這塊 ST7789 屏。它不大卻能讓你的作品瞬間生動(dòng)起來(lái)。如果你在調(diào)試過(guò)程中遇到問(wèn)題歡迎留言交流。我們一起解決下一個(gè)“黑屏”難題。