[導讀]網絡上配套STM32開發(fā)板有很多LCD例程,主要是TFTLCD跟OLED的。從這些例程,大家都能學會如何點亮一個LCD。但這代碼都有下面問題:分層不清晰,通俗講就是模塊化太差。接口亂。只要接口不亂,分層就會好很多了??梢浦残圆?。通用性差。為什么這樣說呢?如果你已經了解了LCD的操...
網絡上配套STM32開發(fā)板有很多LCD例程,主要是TFT LCD跟OLED的。從這些例程,大家都能學會如何點亮一個LCD。但這代碼都有下面問題:- 分層不清晰,通俗講就是模塊化太差。
- 接口亂。只要接口不亂,分層就會好很多了。
- 可移植性差。
- 通用性差。
為什么這樣說呢?如果你已經了解了LCD的操作,請思考如下情景:1、代碼空間不夠,只能保留9341的驅動,其他LCD驅動全部刪除。能一鍵(一個宏定義)刪除嗎?刪除后要改多少地方才能編譯通過?2、有一個新產品,收銀設備。系統(tǒng)有兩個LCD,都是OLED,驅動IC相同,但是一個是128x64,另一個是128x32像素,一個叫做主顯示,收銀員用;一個叫顧顯,顧客看金額。怎么辦?這些例程代碼要怎么改才能支持兩個屏幕?全部代碼復制粘貼然后改函數(shù)名稱?這樣確實能完成任務,只不過程序從此就進入惡性循環(huán)了。3、一個OLED,原來接在這些IO,后來改到別的IO,容易改嗎?4、原來只是支持中文,現(xiàn)在要賣到南美,要支持多米尼加語言,好改嗎?LCD種類概述
在討論怎么寫LCD驅動之前,我們先大概了解一下嵌入式常用LCD。概述一些跟驅動架構設計有關的概念,在此不對原理和細節(jié)做深入討論,會有專門文章介紹,或者參考網絡文檔。TFT lcd
TFT LCD,也就是我們常說的彩屏。通常像素較高,例如常見的2.8寸,320X240像素。4.0寸的,像素800X400。這些屏通常使用并口,也就是8080或6800接口(STM32 的FSMC接口);或者是RGB接口,STM32F429等芯片支持。其他例如手機上使用的有MIPI接口。總之,接口種類很多。也有一些支持SPI接口的。除非是比較小的屏幕,否則不建議使用SPI接口,速度慢,刷屏閃屏。玩STM32常用的TFT lcd屏幕驅動IC通常有:ILI9341/ILI9325等。tft lcd:IPS:COG lcd
很多人可能不知道COG LCD是什么,我覺得跟現(xiàn)在開發(fā)板銷售方向有關系,大家都出大屏,玩酷炫界面,對于更深的技術,例如軟件架構設計,都不涉及。使用單片機的產品,COG LCD其實占比非常大。COG是Chip On Glass的縮寫,就是驅動芯片直接綁定在玻璃上,透明的。實物像下圖:這種LCD通常像素不高,常用的有128X64,128X32。一般只支持黑白顯示,也有灰度屏。接口通常是SPI,I2C。也有號稱支持8位并口的,不過基本不會用,3根IO能解決的問題,沒必要用8根吧?常用的驅動IC:STR7565。OLED lcd
買過開發(fā)板的應該基本用過。新技術,大家都感覺高檔,在手環(huán)等產品常用。OLED目前屏幕較小,大一點的都很貴。在控制上跟COG LCD類似,區(qū)別是兩者的顯示方式不一樣。從我們程序角度來看,最大的差別就是,OLED LCD,不用控制背光。。。。。實物如下圖:常見的是SPI跟I2C接口。常見驅動IC:SSD1615。硬件場景
接下來的討論,都基于以下硬件信息:1、有一個TFT屏幕,接在硬件的FSMC接口,什么型號屏幕?不知道。2、有一個COG lcd,接在幾根普通IO口上,驅動IC是STR7565,128X32像素。3、有一個COG LCD,接在硬件SPI3跟幾根IO口上,驅動IC是STR7565,128x64像素。4、有一個OLED LCD,接在SPI3上,使用CS2控制片選,驅動IC是SSD1315。預備知識
在進入討論之前,我們先大概說一下下面幾個概念,對于這些概念,如果你想深入了解,請GOOGLE。面向對象
面向對象,是編程界的一個概念。什么叫面向對象呢?編程有兩種要素:程序(方法),數(shù)據(屬性)。例如:一個LED,我們可以點亮或者熄滅它,這叫方法。LED什么狀態(tài)?亮還是滅?這就是屬性。我們通常這樣編程:u8?ledsta?=?0;
void?ledset(u8?sta)
{
}
這樣的編程有一個問題,假如我們有10個這樣的LED,怎么寫?這時我們可以引入面向對象編程,將每一個LED封裝為一個對象。可以這樣做:/*
定義一個結構體,將LED這個對象的屬性跟方法封裝。
這個結構體就是一個對象。
但是這個不是一個真實的存在,而是一個對象的抽象。
*/
typedef?struct{
????u8?sta;
????void?(*setsta)(u8?sta);
}LedObj;
/*??聲明一個LED對象,名稱叫做LED1,并且實現(xiàn)它的方法drv_led1_setsta*/
void?drv_led1_setsta(u8?sta)
{
}
LedObj?LED1={
????????.sta?=?0,
????????.setsta?=?drv_led1_setsta,
????};
/*??聲明一個LED對象,名稱叫做LED2,并且實現(xiàn)它的方法drv_led2_setsta*/
void?drv_led2_setsta(u8?sta)
{
}
LedObj?LED2={
????????.sta?=?0,
????????.setsta?=?drv_led2_setsta,
????};
????
/*??操作LED的函數(shù),參數(shù)指定哪個led*/
void?ledset(LedObj?*led,?u8?sta)
{
????led->setsta(sta);
}
是的,在C語言中,實現(xiàn)面向對象的手段就是結構體的使用。上面的代碼,對于API來說,就很友好了。操作所有LED,使用同一個接口,只需告訴接口哪個LED。大家想想,前面說的LCD硬件場景。4個LCD,如果不面向對象,「顯示漢字的接口是不是要實現(xiàn)4個」?每個屏幕一個?驅動與設備分離
如果要深入了解驅動與設備分離,請看LINUX驅動的書籍。什么是設備?我認為的設備就是「屬性」,就是「參數(shù)」,就是「驅動程序要用到的數(shù)據和硬件接口信息」。那么驅動就是「控制這些數(shù)據和接口的代碼過程」。通常來說,如果LCD的驅動IC相同,就用相同的驅動。有些不同的IC也可以用相同的,例如SSD1315跟STR7565,除了初始化,其他都可以用相同的驅動。例如一個COG lcd:?驅動IC是STR7565 128 * 64 像素用SPI3背光用PF5 ,命令線用PF4 ,復位腳用PF3?
上面所有的信息綜合,就是一個設備。驅動就是STR7565的驅動代碼。為什么要驅動跟設備分離,因為要解決下面問題:?有一個新產品,收銀設備。系統(tǒng)有兩個LCD,都是OLED,驅動IC相同,但是一個是128x64,另一個是128x32像素,一個叫做主顯示,收銀員用;一個叫顧顯,顧客看金額。?
這個問題,「兩個設備用同一套程序控制」才是最好的解決辦法。驅動與設備分離的手段:?在驅動程序接口函數(shù)的參數(shù)中增加設備參數(shù),驅動用到的所有資源從設備參數(shù)傳入。?
驅動如何跟設備綁定呢?通過設備的驅動IC型號。模塊化
我認為模塊化就是將一段程序封裝,提供穩(wěn)定的接口給不同的驅動使用。不模塊化就是,在不同的驅動中都實現(xiàn)這段程序。例如字庫處理,在顯示漢字的時候,我們要找點陣,在打印機打印漢字的時候,我們也要找點陣,你覺得程序要怎么寫?把點陣處理做成一個模塊,就是模塊化。非模塊化的典型特征就是「一根線串到底,沒有任何層次感」。LCD到底是什么
前面我們說了面向對象,現(xiàn)在要對LCD進行抽象,得出一個對象,就需要知道LCD到底是什么。問自己下面幾個問題:- LCD能做什么?
- 要LCD做什么?
- 誰想要LCD做什么?
剛剛接觸嵌入式的朋友可能不是很了解,可能會想不通。我們模擬一下LCD的功能操作數(shù)據流。APP想要在LCD上顯示 一個漢字。1、首先,需要一個顯示漢字的接口,APP調用這個接口就可以顯示漢字,假設接口叫做lcd_display_hz。2、漢字從哪來?從點陣字庫來,所以在lcd_display_hz函數(shù)內就要調用一個叫做find_font的函數(shù)獲取點陣。3、獲取點陣后要將點陣顯示到LCD上,那么我們調用一個ILL9341_dis的接口,將點陣刷新到驅動IC型號為ILI9341的LCD上。4、ILI9341_dis怎么將點陣顯示上去?調用一個8080_WRITE的接口。好的,這個就是大概過程,我們從這個過程去抽象LCD功能接口。漢字跟LCD對象有關嗎?無關。在LCD眼里,無論漢字還是圖片,都是一個個點。那么前面問題的答案就是:- LCD可以一個點一個點顯示內容。
- 要LCD顯示漢字或圖片-----就是顯示一堆點
- APP想要LCD顯示圖片或文字。
結論就是:所有LCD對象的功能就是顯示點?!改敲打寗又灰峁╋@示點的接口就可以了,顯示一個點,顯示一片點?!?抽象接口如下:/*
????LCD驅動定義
*/
typedef?struct??
{
????u16?id;
????s32?(*init)(DevLcd?*lcd);
????s32?(*draw_point)(DevLcd?*lcd,?u16?x,?u16?y,?u16?color);
????s32?(*color_fill)(DevLcd?*lcd,?u16?sx,u16?ex,u16?sy,u16?ey,?u16?color);
????s32?(*fill)(DevLcd?*lcd,?u16?sx,u16?ex,u16?sy,u16?ey,u16?*color);
????s32?(*onoff)(DevLcd?*lcd,?u8?sta);
????s32?(*prepare_display)(DevLcd?*lcd,?u16?sx,?u16?ex,?u16?sy,?u16?ey);
????void?(*set_dir)(DevLcd?*lcd,?u8?scan_dir);
????void?(*backlight)(DevLcd?*lcd,?u8?sta);
}_lcd_drv;
上面的接口,也就是對應的驅動,包含了一個驅動id號。- id,驅動型號
- 初始化
- 畫點
- 將一片區(qū)域的點顯示某種顏色
- 將一片區(qū)域的點顯示某些顏色
- 顯示開關
- 準備刷新區(qū)域(主要彩屏直接DMA刷屏使用)
- 設置掃描方向
- 背光控制
顯示字符,劃線等功能,不屬于LCD驅動。應該歸類到GUI層。LCD驅動框架
我們設計了如下的驅動框架:設計思路:1、中間顯示驅動IC驅動程序提供統(tǒng)一接口,接口形式如前面說的_lcd_drv結構體。2、各顯示IC驅動根據設備參數(shù),調用不同的接口驅動。例如TFT就用8080驅動,其他的都用SPI驅動。SPI驅動只有一份,用IO口控制的我們也做成模擬SPI。3、LCD驅動層做LCD管理,例如完成TFT LCD的識別。并且將所有LCD接口封裝為一套接口。4、簡易GUI層封裝了一些顯示函數(shù),例如劃線、字符顯示。5、字體點陣模塊提供點陣獲取與處理接口。由于實際沒那么復雜,在例程中我們將GUI跟LCD驅動層放到一起。TFT LCD的兩個驅動也放到一個文件,但是邏輯是分開的。OLED除初始化,其他接口跟COG LCD基本一樣,因此這兩個驅動也放在一個文件。代碼分析
代碼分三層:1、GUI和LCD驅動層 dev_lcd.c dev_lcd.h2、顯示驅動IC層 dev_str7565.c
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。
關鍵字:
驅動電源
在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。
關鍵字:
工業(yè)電機
驅動電源
LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...
關鍵字:
驅動電源
照明系統(tǒng)
散熱
根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。
關鍵字:
LED
設計
驅動電源
電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...
關鍵字:
電動汽車
新能源
驅動電源
在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...
關鍵字:
發(fā)光二極管
驅動電源
LED
在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...
關鍵字:
LED照明技術
電磁干擾
驅動電源
開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源
關鍵字:
LED
驅動電源
開關電源
LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。
關鍵字:
LED
隧道燈
驅動電源
LED驅動電源在LED照明系統(tǒng)中扮演著至關重要的角色。由于LED具有節(jié)能、環(huán)保、長壽命等優(yōu)點,使得LED照明在各個領域得到廣泛應用。然而,LED的電流、電壓特性需要特定的驅動電源才能正常工作。本文將介紹常用的LED驅動電...
關鍵字:
LED驅動電源
led照明
LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電源轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。
關鍵字:
LED
驅動電源
高壓工頻交流
種種跡象都在表明,半導體行業(yè)或已提前進入寒冬時期,越來越多的廠商開始扛不住了……
關鍵字:
LED
半導體
驅動電源
崧盛股份9日發(fā)布投資者關系活動記錄表,就植物照明發(fā)展趨勢、行業(yè)壁壘等問題進行分享。植物照明未來市場需求廣闊崧盛股份指出,植物照明將會走向長期產業(yè)領域。主要原因有三:第一,LED植物照明賦能終端種植更具有經濟價值。由于LE...
關鍵字:
崧盛股份
驅動電源
在當今高度發(fā)展的技術中,電子產品的升級越來越快,LED燈技術也在不斷發(fā)展,這使我們的城市變得豐富多彩。 LED驅動電源將電源轉換為特定的電壓和電流,以驅動LED發(fā)光。通常情況下:LED驅動電源的輸入包括高壓工頻交流電(即...
關鍵字:
LED
驅動電源
高壓直流
人類社會的進步離不開社會上各行各業(yè)的努力,各種各樣的電子產品的更新?lián)Q代離不開我們的設計者的努力,其實很多人并不會去了解電子產品的組成,比如LED電源。
關鍵字:
LED
驅動電源
低壓直流
隨著科學技術的發(fā)展,LED技術也在不斷發(fā)展,為我們的生活帶來各種便利,為我們提供各種各樣生活信息,造福著我們人類。LED驅動電源實際上是一種電源,但是它是一種特定的電源,用于驅動LED發(fā)射帶有電壓或電流的光。 因此,LE...
關鍵字:
LED
驅動電源
電流
LED燈作為一種新型節(jié)能和無污染光源,由于其特有的發(fā)光照明特性,在現(xiàn)代照明應用中發(fā)揮著革命性的作用。作為 LED 照明產業(yè)鏈中最為核心的部件之一,LED 驅動電源的驅動控制技術所存在的可靠性低、成本高等典型問題一直制約著...
關鍵字:
多路
LED
驅動電源
隨著社會的快速發(fā)展,LED技術也在飛速發(fā)展,為我們的城市的燈光煥發(fā)光彩,讓我們的生活越來越有趣,那么你知道LED需要LED驅動電源嗎?那么你知道什么是LED驅動電源嗎?
關鍵字:
LED
開關電源
驅動電源
早前有新聞稱,Cree在2018年開始宣布轉型高科技半導體領域,并一邊逐漸脫離照明與LED相關業(yè)務,一邊持續(xù)投資半導體。在今日,Cree宣布與SMART Global Holdings, Inc.達成最終協(xié)議,擬將LED...
關鍵字:
cree
led照明