oled??spi??esp8266??nodeMCU
閑言碎語(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種方案:
- u8g.disp:setFontPosBaseline()
- u8g.disp:setFontPosBottom()
- u8g.disp:setFontPosCenter()
- u8g.disp:setFontPosTop()
這幾個(gè)方案的區(qū)別在于Y坐標(biāo)與baseline的關(guān)系,默認(rèn)使用第一種方案被去。
圖片中的橫虛線就是指baseline了主儡。而31和-9則分別表示u8g.disp:getFontAscent()和u8g.disp:getFontDescent()兩個(gè)函數(shù)的返回值。
但是,這兩個(gè)函數(shù)的返回值還和另外的函數(shù)有關(guān)系:
- u8g.disp:setFontRefHeightAll()
- u8g.disp:setFontRefHeightExtendedText()
- u8g.disp:setFontRefHeightText()
這三個(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
上面啰啰嗦嗦的介紹了幾個(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