新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > 單片機模塊——OLED模塊

        單片機模塊——OLED模塊

        作者:不吃早飯 時間:2024-05-27 來源:網絡 收藏

        在這里插入圖片描述

        本文引用地址:http://www.104case.com/article/202405/459209.htm

        在這里插入代碼片

        一、顯示原理
        了解屏幕,首先要了解屏幕可以控制的最小單元,他是一個有8個像素點組成的小豎棍,像素點的順序從上向下依次是第0位到第7位,是不是很像學習入門的時候學習的8位LED,
        沒錯,小豎棍上的8個像素點,同樣也是位0時熄滅,為1時點亮,給他不同的數值,就可以點亮相應的像素點,知道了這一點,就可以更進一步的了解屏幕的結構了

        在這里插入圖片描述


        如果我把被賦予不同數值的小豎棍,一條一條并列起來,就得到了一個簡單的圖案,給小豎棍賦予不同的數值,就會排列出截然不同的圖案

        在這里插入圖片描述


        再回到12964屏幕,由128條小豎棍橫向并排起來,就組成了屏幕的一行

        在這里插入圖片描述


        然后,又由8行同樣的小豎棍豎向排列起來,就組成了一個完整的屏幕

        在這里插入圖片描述


        將圖片按照一定的排列順序,轉換成數值的操作,叫做取模

        在這里插入圖片描述

        將取模得到的數值賦給每一條小豎棍,就又得到了一幅完整的圖片

        在這里插入圖片描述


        這就是屏幕顯示圖像的原理

        二、OLED屏幕的指令
        要點亮OLED屏幕,首先要做的是告訴屏幕,要開始工作了,以及需要做好那些準備,這個過程叫做屏幕的“初始化”,使用其他類型的屏幕,也要從這個步驟開始。
        這些指令按照功能劃分大致可以分為兩大類:
        第一類是對屏幕硬件的工作模式進行配置

        在這里插入圖片描述


        第二類是對于屏幕顯示進行控制的指令
        比如讓圖像反色顯示

        在這里插入圖片描述


        或者讓畫面在屏幕上的上下和左右鏡像反轉

        在這里插入圖片描述


        以及畫面在水平方向和垂直方向的滾動、還有淡出、閃爍效果等等

        在這里插入圖片描述


        三、顯存與屏幕
        前面提到,OLED12864顯示屏是由8行、每行128根小豎棍組成
        在OLED屏幕的控制芯片里,有一個用于圖形數據顯示的存儲區域(GDDRAM),叫做顯存

        在這里插入圖片描述


        顯存的每一位數據,可以跟屏幕上的像素點一一對應,我們給顯存發送數值,屏幕上就會立即顯示出對應的圖像

        在這里插入圖片描述


        因為顯存和屏幕的關系是實時的

        在這里插入圖片描述


        也就是顯存里對應屏幕上的某個像素點的數值是1或0,則屏幕上對應的像素點就是點亮或熄滅的,所以我們通過使用編程語言的一些邏輯算法,對顯存中的數據進行編輯,就實現了點亮屏幕,并且在屏幕上畫畫的目的

        在這里插入圖片描述

        四、IIC協議

        在這里插入圖片描述


        在這里插入圖片描述


        在這里插入圖片描述


        image.png


        在這里插入圖片描述


        在這里插入圖片描述

        不同協議的屏幕,以上初始化內容可能不同,但最終都會作用在這兩個向屏幕寫入數據或指令的函數上,這個函數十分重要,之后所有對屏幕的控制指令,以及發送的圖像數據,都離不開這個函數

        五、OLED屏幕的控制函數
        如果說以上兩個函數是讓跟屏幕對話的,那么接下來的這些控制函數,就是可以讓我們通過跟屏幕交流的部分

        首先介紹一個重磅的函數

        在這里插入圖片描述

        要了解這個函數,先要回到屏幕和顯存的結構上,前面提到過,顯存里的數據,都是跟屏幕上的像素點是一一對應的,即數據的排列,也是128位為一行,共8行

        在這里插入圖片描述


        為了便于查找定位顯存里的數據,控制芯片里為這一千多個數據的地址,制定了幾種排列規則,即幾種地址排列的模式

        在這里插入圖片描述


        首先說第一種模式,水平地址模式,設置指令為20、00,在這個模式下,數據是之字形排列,當數據地址超出屏幕有邊界的時候,會自動下移一行,并在最左邊顯示出來,當排到最后一行的最后一列之后,會重新回到第一行的第一列

        在這里插入圖片描述

        然后說一下第三種,頁地址模式,設置指令為20、02,跟水平地址模式類似,這個模式下,數據水平排列,區別在于,當數據地址超出屏幕右邊界的時候,會在同一行的最左邊顯示出來

        在這里插入圖片描述


        最后說第二種模式,垂直地址模式,設置指令為20、01,這種模式下的數據,是以列為單位排列的,當數據排滿某一行的8行之后,會右移一行,從第一行開始
        當排到最后一列的最后一行之后,會重新回到第一列的第一行

        在這里插入圖片描述


        因為屏幕在大多數使用中,都是橫向使用,所以在這三種模式中,水平地址模式和頁地址模式比較符合思考習慣,所以比較常用

        知道了顯存的結構和地址模式,再回到定位函數

        在這里插入圖片描述

        這個函數是通過這三條控制指令來實現的,第一行是用來設置顯示行的啟始位置的,在顯存地址中,第0行到第7行,是通過指令B0到B7來表示的,這里的B0就是指向第0行,通過加上參數y的數值0到7,就實現了對某一行的指定

        在這里插入圖片描述


        接下來的指令,是用來指定起始列的地址的,通過加上參數x的數值0到127,來實現對0到127列的指定

        在這里插入圖片描述


        指定高位的指令必須要有,否則就會在顯示時依次發生錯位

        說完定位函數,接下來的這個OLED_Clear();函數也是使用頻率非常高的一條函數

        在這里插入圖片描述

        六、圖案與字庫

        在這里插入圖片描述


        我們可以將類型和結構大小都相同的幾組數據,放在同一個數組里面,起名為Xin[],然后通過數據排列的規律,找到每組數據的起點,然后提取需要的數量的數據,這個大數組,就是我們在控制顯示屏時最常用到的,也是顯示屏的驅動程序中非常重要的一個組成部分“字庫”,通常建立一個字庫文件來專門定義這些字庫數組

        下面再來介紹幾個函數

        七、點亮OLED屏幕的像素點
        OLED12864顯示屏是由8行每行128根小豎棍組成,之前嘗試用直接賦值的方式,點亮一根小豎棍上的一個或幾個像素點,這些像素點的亮滅,就組成了我們看到的文字和圖片,我們要在屏幕上畫畫,其實也是對這些像素點的亮滅狀態進行操作,然而依照畫畫的習慣,我們更希望通過,直接指定每個像素點的xy坐標,來實現圖案的繪制,而不是一次操作8個像素點,于是就需要使用C語言中運算符來幫忙實現這個愿望

        1、第一個是位操作運算符里的左移運算符

        在這里插入圖片描述


        前面提到過,在小豎棍上的8個像素點,對應了顯存中的8個位
        點亮8個點從上至下依次是0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80

        在這里插入圖片描述


        通過以為運算符可以不去記憶這些數值,只需要將第一個點的數值(0x01),向左移動需要的位數,空出來的位會自動被0補全,就可以得到需要的數值

        列如指定第2位的點

        在這里插入圖片描述


        指定第5位的點

        在這里插入圖片描述


        示例:

        在這里插入圖片描述


        2、新的問題來了,如果小豎棍上已經有被點亮的像素點,卻需要再點亮另外一個,并且不會影響到已經點亮的像素點,要怎么辦呢?
        這就需要請另外一個運算符來幫忙了,他就是邏輯運算符的或運算

        在這里插入圖片描述


        假設以點亮的點A為0000 0001(第0位),新點亮的點為0001 0000(第4位),那么將A和B進行或運算,得到0001 0001,第0位和第4位同時點亮

        在這里插入圖片描述

        示例:

        在這里插入圖片描述


        3、現在我們可以自由畫一個點了,但是想要熄滅一個點,又該怎么辦呢,接下來的邏輯運算符與運算就可以幫我們完成這個任務

        在這里插入圖片描述

        在這里插入圖片描述


        4、不過新的疑問又出現了,移位運算智能做到對1進行移位,假如使用移位的方式來熄滅某一位上的點,就需要指定位為0,其余為為1的數值,于是最后一個幫手就有用武之地了
        ,他就是位運算符之一的按位取反運算符

        在這里插入圖片描述


        將其與移位運算符配合

        在這里插入圖片描述


        然后就可以將這個數值,使用到與運算中,從而實現將指定位置0的操作

        在這里插入圖片描述

        示例:

        在這里插入圖片描述


        八、刷新OLED屏幕上的顯存
        因為顯存中的數據只能被寫入,卻不能讀取出來進行二次修改,所以就需要我們在單片機的內存中,創建一個跟顯存一樣大的數組,先對數組中的數據進行操作,然后再將數組中編輯好的數據,一次性發送給顯存,從而實現在屏幕上畫畫

        在這里插入圖片描述


        創建的這個數組,作用相當于我們和顯存之間的緩沖區

        在這里插入圖片描述


        前者是依據顯存的結構,按照8組,每組128個數據的形式,將數據存放在一個二維數組里,后者則是將整個屏幕顯存中的1024個數據,存放進一個一維數組里面

        在這里插入圖片描述


        只要每次執行完對緩沖數組的編輯,緊跟著執行一下刷新函數,就可以將編輯結果顯示在屏幕上了,于是有了緩沖數組GRAM還有這個屏幕刷新函數OLED_Refresh(); 就為接下來在屏幕上畫畫做好了十分重要的準備工作,因為之后介紹的所有畫畫功能,都要通過這兩個基礎功能來讓屏幕反饋給我們

        在這里插入圖片描述


        (注意將圖中j的變量類型改成unsigned int)

        九、在OLED屏幕上畫點
        OLED12864顯示屏,是由8行,每行128根小豎棍構成的,假如我們從屏幕上,單獨取出第0列的小豎棍來看,每一根小豎棍都可以拆成第0位到第7位這八個點,如果將行號設成變量n,那么n的范圍是0到7,于是每一行小豎棍的第0列上,第0位的點的序號,恰好都是8的n倍,定義一個變量m用來表示每根小豎棍上的八個點的位置。
        可以看出像素點的y坐標0到63都可以表示成8*n+(0x01<<m)

        在這里插入圖片描述


        得到在屏幕任意位置點亮一個像素點的函數

        在這里插入圖片描述


        熄滅任意一點的函數

        在這里插入圖片描述


        示例:

        在這里插入圖片描述




        關鍵詞: 單片機 OLED PCB

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 双牌县| 千阳县| 定兴县| 娄烦县| 师宗县| 化德县| 白玉县| 南皮县| 东宁县| 仪征市| 资溪县| 南昌市| 永定县| 民权县| 玉山县| 龙山县| 许昌市| 仙游县| 马鞍山市| 庄河市| 泽库县| 长顺县| 江都市| 台中市| 英山县| 广西| 淅川县| 油尖旺区| 缙云县| 甘洛县| 黑山县| 都昌县| 兴安县| 五家渠市| 舟山市| 龙泉市| 南城县| 微山县| 永城市| 来凤县| 师宗县|