單片機(jī)之面向?qū)ο缶幊蹋ㄒ唬?/h1>
引言
? ? c語(yǔ)言本身雖然并不具備面向?qū)ο蟮奶匦裕俏覀兛梢酝ㄟ^(guò)某些技巧實(shí)現(xiàn)類似面向?qū)ο蟮奶匦裕ú⒉粐?yán)謹(jǐn))以提高代碼復(fù)用性和效率。
繼承
? ? 如果我們把C文件看做一個(gè)類,那么繼承這個(gè)概念是比較好實(shí)現(xiàn)的,通過(guò)對(duì)全局變量和函數(shù)添加static修飾符可以實(shí)現(xiàn)public繼承和private繼承。

? ?? ?oled類需要調(diào)用spi類(底層)的方法,其中g(shù)etConfig只在spi類中使用。而其它方法則可? 以通過(guò)引用頭文件或者extern來(lái)引用。
類的實(shí)現(xiàn)
? ? 回顧一下在單片機(jī)的底層開(kāi)發(fā)中,比如我們要開(kāi)發(fā)一個(gè)OLED的屏幕驅(qū)動(dòng),一般來(lái)說(shuō)相應(yīng)的流程是寫(xiě)一個(gè)"oled.h"、"oled.c",然后在我們的主循環(huán)中去調(diào)用。但是當(dāng)我們的項(xiàng)目中需要使用兩個(gè)相同的OLED的屏幕時(shí),比較簡(jiǎn)單粗暴的方法是將"oled.h"、"oled.c"復(fù)制成兩份"oled1.h","oled2.h"然后在具體文件中修改引腳定義等等,但是這樣的代碼重復(fù)性太高,一旦想要修改時(shí)四個(gè)文件都要修改很不方便。但是在C++中我們卻可以通過(guò)類的實(shí)例化生成任意個(gè)數(shù)的對(duì)象。比如:
? ? 通過(guò)將oled1和oled2的數(shù)據(jù)引腳(兩個(gè)oled的差異之處)分別記錄保存下來(lái)然后當(dāng)調(diào)用底層時(shí)去操作相應(yīng)的引腳以實(shí)現(xiàn)同一份代碼操作不同的硬件。
? ? C++中構(gòu)造方法主要作用是實(shí)例化時(shí)傳入?yún)?shù)(主要是變量),這樣可以得到不同對(duì)象。C++中對(duì)象變量和方法的分配由系統(tǒng)自動(dòng)完成。而C中我們可以通過(guò)malloc來(lái)為我們的對(duì)象分配內(nèi)存。具體構(gòu)造函數(shù)的實(shí)現(xiàn):
? ? 析構(gòu)函數(shù)的實(shí)現(xiàn):
? ? 通過(guò)對(duì)obj參數(shù)不斷地將具體操作的IO口或者片內(nèi)外設(shè)等參數(shù)傳遞到底層來(lái)實(shí)現(xiàn)同一個(gè)函數(shù)控制多個(gè)液晶屏:
? ? 主函數(shù)main.c中的使用方法,其中setup只會(huì)在上電后執(zhí)行一遍,loop會(huì)不斷循環(huán)執(zhí)行:
? ? 具體效果,畫(huà)面有斜線是相機(jī)拍攝原因,肉眼是沒(méi)有的,可以看到兩個(gè)屏幕雖然使用了不同的SPI外設(shè)(SPI2和SPI3),以及不同的rst,dc,cs引腳,但是通過(guò)同一套函數(shù)點(diǎn)亮了:

? ? 完整的代碼:
其中g(shù)pio_xxx和spi_xxx等api是對(duì)底層的控制函數(shù),該api框架是在stm32上開(kāi)發(fā)的類Arduino框架,目前不太完善,后續(xù)會(huì)在github上開(kāi)源(預(yù)告)。該文章是我的第一篇專欄,旨在分享一些我在開(kāi)發(fā)中的經(jīng)驗(yàn)。