17梁肿、nodeMCU學(xué)習(xí)筆記--u8glib模塊·二

oled??spi??esp8266??nodeMCU

圖片發(fā)自簡(jiǎn)書(shū)App

閑言碎語(yǔ)

接著上一篇戈次,繼續(xù)來(lái)說(shuō)u8glib模塊馆里。上回文末說(shuō)到使用drawStr()函數(shù)顯示字符串隘世,坐標(biāo)(x,y)并不是字符串左上角的坐標(biāo)。在u8glib官方wiki中的Font and String Handling提到了一些與字符串有關(guān)的內(nèi)容鸠踪,其中有個(gè)就提到了坐標(biāo)問(wèn)題丙者。另外,找到了之前例子中营密,液晶頭部10個(gè)像素左右的高度不顯示的原因械媒。

這篇文章就不細(xì)講API,直接來(lái)實(shí)踐评汰。

實(shí)踐一下

先來(lái)看字符串對(duì)齊的纷捞。模塊為字符串對(duì)齊提供了4種方案:

這幾個(gè)方案的區(qū)別在于Y坐標(biāo)與baseline的關(guān)系,默認(rèn)使用第一種方案被去。

來(lái)自官方wiki

圖片中的橫虛線就是指baseline了主儡。而31和-9則分別表示u8g.disp:getFontAscent()u8g.disp:getFontDescent()兩個(gè)函數(shù)的返回值。

但是,這兩個(gè)函數(shù)的返回值還和另外的函數(shù)有關(guān)系:

這三個(gè)函數(shù)使用了三種不同的計(jì)算算法惨缆,使得上面兩個(gè)函數(shù)的返回值不一樣糜值。具體的區(qū)別可以看這里丰捷,有圖示,一看便知寂汇,┏ (゜ω゜)=?病往。

下面來(lái)看個(gè)簡(jiǎn)單的例子,當(dāng)做開(kāi)胃菜骄瓣。以(2停巷, 1)為頂點(diǎn)坐標(biāo),顯示一段字符串榕栏。以(0畔勤, 0)為頂點(diǎn)坐標(biāo)畫(huà)一個(gè)方框,圈住字符串臼膏。

cs  = 8 
dc  = 2 -- D2
res = 0 -- D0
spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
gpio.mode(8, gpio.INPUT, gpio.PULLUP)
disp = u8g.ssd1306_128x64_hw_spi(cs, dc, res)
disp:setFont(u8g.font_6x10)
disp:setFontPosTop()
disp:setFontRefHeightExtendedText()

str = "Hello NodeMCU!"
h = disp:getFontAscent() - disp:getFontDescent()
w = disp:getStrWidth(str)

function draw()     
    disp:setDefaultForegroundColor()
    disp:drawStr(2, 1, str)
    disp:drawFrame(0, 0, w + 2, h + 2)
end

disp:begin()
disp:firstPage()
repeat 
    draw()
    print("draw")
until (disp:nextPage() ~= true)

首先硼被,設(shè)置成PosTop,將參照設(shè)置成為頂點(diǎn)渗磅,這樣.drawStr()函數(shù)的坐標(biāo)就變成字符串的頂點(diǎn)坐標(biāo)了。接著检访,在用函數(shù)得到字符串的寬度和高度始鱼。最后畫(huà)一個(gè)frame和顯示一個(gè)字符串。

另外脆贵,修復(fù)了一個(gè)顯示上的bug医清。u8glib是分區(qū)域刷新屏幕的,.nextPage()會(huì)將緩存設(shè)置成下一個(gè)區(qū)域卖氨。因此会烙,這里的picture loop應(yīng)該使用 do while循環(huán)才合適。在lua中筒捺,有個(gè)repeat until與do while循環(huán)對(duì)應(yīng)柏腻。改用循環(huán)后,便可以解決先前顯示的問(wèn)題系吭。

除了上面的幾個(gè)函數(shù)五嫂,u8glib還有其他有趣的函數(shù),配合著使用實(shí)現(xiàn)一些高級(jí)效果肯尺。比如u8g.disp:setDefaultBackgroundColor()u8g.disp:setDefaultForegroundColor()沃缘。從名字看,前者是背景色则吟,后者是前景色槐臀。說(shuō)得更簡(jiǎn)單一點(diǎn),在只有單色的液晶里面氓仲,前者可以擦除像素水慨,后者可以點(diǎn)亮像素得糜。配合著使用可以實(shí)現(xiàn)反顯效果。只需要把上面例子的draw函數(shù)改一改就可以了讥巡。

function draw()     
    disp:setDefaultForegroundColor()
    disp:drawStr(2, 1, str)
    disp:drawFrame(0, 0, w + 2, h + 2)

    disp:drawBox(0, 20, w + 2, h + 2)    
    disp:setDefaultBackgroundColor()
    disp:drawStr(2, 21, str)
end

這里畫(huà)了一個(gè)Box掀亩,然后設(shè)置成背景色,再顯示字符串(實(shí)際上是 )欢顷。效果如開(kāi)頭的圖標(biāo)所顯示的那樣槽棍。

在多行文本的環(huán)境下,設(shè)置下一行文本的Y坐標(biāo)總是要計(jì)算才能知道抬驴。u8glib提供了兩個(gè)函數(shù)可以快速得到行距炼七。分別是u8g.disp:setFontLineSpacingFactor()u8g.disp:getFontLineSpacing()。前者用于設(shè)置行距縮放因子布持,后者返回行距豌拙。如果放大因子是1倍的話题暖,返回的行距等于上例子中的h值按傅。

還有兩個(gè)函數(shù)也有點(diǎn)意思,u8g.disp:setScale2x2()u8g.disp:undoScale()將像素放大胧卤。需要注意的是,disp:getHeight()getWidth()返回的屏幕大小會(huì)比實(shí)際的小一倍枝誊。但是disp:getFontLineSpacing()的返回值還是一樣的况芒。所以這個(gè)放大可以理解為,在屏幕物理大小沒(méi)變化的情況下叶撒,改變像素的物理大小绝骚。

function draw()     
    disp:setScale2x2()
    disp:drawStr(2, 0, str)
    disp:undoScale()
    disp:drawStr(2, 20, str)
end
放大,沒(méi)拍清晰

上面啰啰嗦嗦的介紹了幾個(gè)函數(shù)祠够,內(nèi)容有些零散压汪。最后來(lái)看一個(gè)復(fù)雜一點(diǎn)的例子——實(shí)現(xiàn)一個(gè)菜單。原理其實(shí)很簡(jiǎn)單哪审,就是利用第二個(gè)例子蛾魄,實(shí)現(xiàn)對(duì)選中選進(jìn)行反顯。

menu = {"nodeMCU", "Xiemingmin", "u8glib"}
ls = disp:getFontLineSpacing()
w = disp:getWidth()
function draw(index)     
    for i, v in ipairs(menu)
    do
        disp:setDefaultForegroundColor()
        if index == i then
            disp:drawBox(0, (i - 1)*ls + 16, w, ls)
            disp:setDefaultBackgroundColor()
        end
        disp:drawStr(10, (i - 1)*ls + 16, v)
    end
end
local select = 1
disp:begin()
tmr.alarm(0, 2000, tmr.ALARM_AUTO, function()
    disp:firstPage()
    print(select)
    repeat 
        draw(select)
    until (disp:nextPage() ~= true)
    if select ~= 3 then
        select = select + 1
    else
        select = 1
    end    
end)

代碼有點(diǎn)長(zhǎng)湿滓,隱去了驅(qū)動(dòng)和初始化設(shè)置滴须。draw函數(shù)用于描繪菜單項(xiàng),正常下使用前景色來(lái)顯示字符串叽奥。選中項(xiàng)扔水,則先繪制一個(gè)Box,再設(shè)置背景色顯示字符串朝氓。簡(jiǎn)書(shū)知道怎么上動(dòng)態(tài)圖魔市,這里就不上圖了主届。直接下載進(jìn)去看效果吧。

更多內(nèi)容

↑ 點(diǎn)擊上面的標(biāo)題可用查看同文集的其它文章待德。

簡(jiǎn)書(shū)評(píng)論不能貼圖, 如有需要可以到我的GitHub上提issues

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末君丁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子将宪,更是在濱河造成了極大的恐慌绘闷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较坛,死亡現(xiàn)場(chǎng)離奇詭異印蔗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)丑勤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)华嘹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人法竞,你說(shuō)我怎么就攤上這事耙厚。” “怎么了岔霸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵颜曾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我秉剑,道長(zhǎng),這世上最難降的妖魔是什么稠诲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任侦鹏,我火速辦了婚禮,結(jié)果婚禮上臀叙,老公的妹妹穿的比我還像新娘略水。我一直安慰自己,他們只是感情好劝萤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布渊涝。 她就那樣靜靜地躺著,像睡著了一般床嫌。 火紅的嫁衣襯著肌膚如雪跨释。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天厌处,我揣著相機(jī)與錄音鳖谈,去河邊找鬼。 笑死阔涉,一個(gè)胖子當(dāng)著我的面吹牛缆娃,可吹牛的內(nèi)容都是我干的捷绒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贯要,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼暖侨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起崇渗,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤字逗,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后显押,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體扳肛,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年乘碑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挖息。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兽肤,死狀恐怖套腹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情资铡,我是刑警寧澤电禀,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站笤休,受9級(jí)特大地震影響尖飞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜店雅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一政基、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闹啦,春花似錦沮明、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至琳袄,卻和暖如春江场,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挚歧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工扛稽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滑负。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓在张,卻偏偏與公主長(zhǎng)得像用含,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帮匾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容