色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > EDA/PCB > 設(shè)計(jì)應(yīng)用 > 單片機(jī)模塊——OLED模塊

          單片機(jī)模塊——OLED模塊

          作者:不吃早飯 時(shí)間:2024-05-27 來源:網(wǎng)絡(luò) 收藏

          在這里插入圖片描述

          本文引用地址:http://cafeforensic.com/article/202405/459209.htm

          在這里插入代碼片

          一、顯示原理
          了解屏幕,首先要了解屏幕可以控制的最小單元,他是一個(gè)有8個(gè)像素點(diǎn)組成的小豎棍,像素點(diǎn)的順序從上向下依次是第0位到第7位,是不是很像學(xué)習(xí)入門的時(shí)候?qū)W習(xí)的8位LED,
          沒錯,小豎棍上的8個(gè)像素點(diǎn),同樣也是位0時(shí)熄滅,為1時(shí)點(diǎn)亮,給他不同的數(shù)值,就可以點(diǎn)亮相應(yīng)的像素點(diǎn),知道了這一點(diǎn),就可以更進(jìn)一步的了解屏幕的結(jié)構(gòu)了

          在這里插入圖片描述


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

          在這里插入圖片描述


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

          在這里插入圖片描述


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

          在這里插入圖片描述


          將圖片按照一定的排列順序,轉(zhuǎn)換成數(shù)值的操作,叫做取模

          在這里插入圖片描述

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

          在這里插入圖片描述


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

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

          在這里插入圖片描述


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

          在這里插入圖片描述


          或者讓畫面在屏幕上的上下和左右鏡像反轉(zhuǎn)

          在這里插入圖片描述


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

          在這里插入圖片描述


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

          在這里插入圖片描述


          顯存的每一位數(shù)據(jù),可以跟屏幕上的像素點(diǎn)一一對應(yīng),我們給顯存發(fā)送數(shù)值,屏幕上就會立即顯示出對應(yīng)的圖像

          在這里插入圖片描述


          因?yàn)轱@存和屏幕的關(guān)系是實(shí)時(shí)的

          在這里插入圖片描述


          也就是顯存里對應(yīng)屏幕上的某個(gè)像素點(diǎn)的數(shù)值是1或0,則屏幕上對應(yīng)的像素點(diǎn)就是點(diǎn)亮或熄滅的,所以我們通過使用編程語言的一些邏輯算法,對顯存中的數(shù)據(jù)進(jìn)行編輯,就實(shí)現(xiàn)了點(diǎn)亮屏幕,并且在屏幕上畫畫的目的

          在這里插入圖片描述

          四、IIC協(xié)議

          在這里插入圖片描述


          在這里插入圖片描述


          在這里插入圖片描述


          image.png


          在這里插入圖片描述


          在這里插入圖片描述

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

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

          首先介紹一個(gè)重磅的函數(shù)

          在這里插入圖片描述

          要了解這個(gè)函數(shù),先要回到屏幕和顯存的結(jié)構(gòu)上,前面提到過,顯存里的數(shù)據(jù),都是跟屏幕上的像素點(diǎn)是一一對應(yīng)的,即數(shù)據(jù)的排列,也是128位為一行,共8行

          在這里插入圖片描述


          為了便于查找定位顯存里的數(shù)據(jù),控制芯片里為這一千多個(gè)數(shù)據(jù)的地址,制定了幾種排列規(guī)則,即幾種地址排列的模式

          在這里插入圖片描述


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

          在這里插入圖片描述

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

          在這里插入圖片描述


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

          在這里插入圖片描述


          因?yàn)槠聊辉诖蠖鄶?shù)使用中,都是橫向使用,所以在這三種模式中,水平地址模式和頁地址模式比較符合思考習(xí)慣,所以比較常用

          知道了顯存的結(jié)構(gòu)和地址模式,再回到定位函數(shù)

          在這里插入圖片描述

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

          在這里插入圖片描述


          接下來的指令,是用來指定起始列的地址的,通過加上參數(shù)x的數(shù)值0到127,來實(shí)現(xiàn)對0到127列的指定

          在這里插入圖片描述


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

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

          在這里插入圖片描述

          六、圖案與字庫

          在這里插入圖片描述


          我們可以將類型和結(jié)構(gòu)大小都相同的幾組數(shù)據(jù),放在同一個(gè)數(shù)組里面,起名為Xin[],然后通過數(shù)據(jù)排列的規(guī)律,找到每組數(shù)據(jù)的起點(diǎn),然后提取需要的數(shù)量的數(shù)據(jù),這個(gè)大數(shù)組,就是我們在控制顯示屏?xí)r最常用到的,也是顯示屏的驅(qū)動程序中非常重要的一個(gè)組成部分“字庫”,通常建立一個(gè)字庫文件來專門定義這些字庫數(shù)組

          下面再來介紹幾個(gè)函數(shù)

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

          1、第一個(gè)是位操作運(yùn)算符里的左移運(yùn)算符

          在這里插入圖片描述


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

          在這里插入圖片描述


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

          列如指定第2位的點(diǎn)

          在這里插入圖片描述


          指定第5位的點(diǎn)

          在這里插入圖片描述


          示例:

          在這里插入圖片描述


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

          在這里插入圖片描述


          假設(shè)以點(diǎn)亮的點(diǎn)A為0000 0001(第0位),新點(diǎn)亮的點(diǎn)為0001 0000(第4位),那么將A和B進(jìn)行或運(yùn)算,得到0001 0001,第0位和第4位同時(shí)點(diǎn)亮

          在這里插入圖片描述

          示例:

          在這里插入圖片描述


          3、現(xiàn)在我們可以自由畫一個(gè)點(diǎn)了,但是想要熄滅一個(gè)點(diǎn),又該怎么辦呢,接下來的邏輯運(yùn)算符與運(yùn)算就可以幫我們完成這個(gè)任務(wù)

          在這里插入圖片描述

          在這里插入圖片描述


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

          在這里插入圖片描述


          將其與移位運(yùn)算符配合

          在這里插入圖片描述


          然后就可以將這個(gè)數(shù)值,使用到與運(yùn)算中,從而實(shí)現(xiàn)將指定位置0的操作

          在這里插入圖片描述

          示例:

          在這里插入圖片描述


          八、刷新OLED屏幕上的顯存
          因?yàn)轱@存中的數(shù)據(jù)只能被寫入,卻不能讀取出來進(jìn)行二次修改,所以就需要我們在單片機(jī)的內(nèi)存中,創(chuàng)建一個(gè)跟顯存一樣大的數(shù)組,先對數(shù)組中的數(shù)據(jù)進(jìn)行操作,然后再將數(shù)組中編輯好的數(shù)據(jù),一次性發(fā)送給顯存,從而實(shí)現(xiàn)在屏幕上畫畫

          在這里插入圖片描述


          創(chuàng)建的這個(gè)數(shù)組,作用相當(dāng)于我們和顯存之間的緩沖區(qū)

          在這里插入圖片描述


          前者是依據(jù)顯存的結(jié)構(gòu),按照8組,每組128個(gè)數(shù)據(jù)的形式,將數(shù)據(jù)存放在一個(gè)二維數(shù)組里,后者則是將整個(gè)屏幕顯存中的1024個(gè)數(shù)據(jù),存放進(jìn)一個(gè)一維數(shù)組里面

          在這里插入圖片描述


          只要每次執(zhí)行完對緩沖數(shù)組的編輯,緊跟著執(zhí)行一下刷新函數(shù),就可以將編輯結(jié)果顯示在屏幕上了,于是有了緩沖數(shù)組GRAM還有這個(gè)屏幕刷新函數(shù)OLED_Refresh(); 就為接下來在屏幕上畫畫做好了十分重要的準(zhǔn)備工作,因?yàn)橹蠼榻B的所有畫畫功能,都要通過這兩個(gè)基礎(chǔ)功能來讓屏幕反饋給我們

          在這里插入圖片描述


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

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

          在這里插入圖片描述


          得到在屏幕任意位置點(diǎn)亮一個(gè)像素點(diǎn)的函數(shù)

          在這里插入圖片描述


          熄滅任意一點(diǎn)的函數(shù)

          在這里插入圖片描述


          示例:

          在這里插入圖片描述




          關(guān)鍵詞: 單片機(jī) OLED PCB

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉