本帖最后由 BinWin 于 2021-11-18 14:27 编辑
这块MagicBox小巧但外设丰富,盖板上的小液晶屏竟有240*240的分辨率。
点亮后若是用最小字体,真有看瞎老王的不瞎之眼之势。
这种屏在某宝也是比较多的,大概就是长这样子:
我们这个820的盖板上的液晶用的就是常见的ST7789控制器,而且驱动程序也已经在资料中了,那么亮屏就是小菜一碟了。模块本身就内置了专用于LCD的SPI外设,只需要配置额外的复位引脚和命令控制选择引脚。
完整的初始化程序如下代码:
- function init()
- local para =
- {
- width = 240, --分辨率宽度,128像素;用户根据屏的参数自行修改
- height = 240, --分辨率高度,160像素;用户根据屏的参数自行修改
- bpp = 16, --位深度,彩屏仅支持16位
- bus = disp.BUS_SPI4LINE, --LCD专用SPI引脚接口,不可修改
- xoffset = 0, --X轴偏移
- yoffset = 0, --Y轴偏移
- freq = 50000000, --spi时钟频率,支持110K到13M(即110000到13000000)之间的整数(包含110000和13000000)
- pinrst = pio.P0_6, --reset,复位引脚
- pinrs = pio.P0_1, --rs,命令/数据选择引脚/268开发板为15
- --初始化命令
- --前两个字节表示类型:0001表示延时,0000或者0002表示命令,0003表示数据
- --延时类型:后两个字节表示延时时间(单位毫秒)
- --命令类型:后两个字节命令的值
- --数据类型:后两个字节数据的值
- initcmd =
- {
- 0x00010000 + 60,
- 0x00020011,
- 0x00020036,
- 0x00030000 + 0,--横屏控制 用盖板要用60 直接接屏用00
- 0x0002003A,
- 0x00030005,
- 0x000200B2,
- 0x0003000C,
- 0x0003000C,
- 0x00030000,
- 0x00030033,
- 0x00030033,
- 0x000200B7,
- 0x00030035,
- 0x000200BB,
- 0x00030032,
- 0x000200C2,
- 0x00030001,
- 0x000200C3,
- 0x00030015,
- 0x000200C4,
- 0x00030020,
- 0x000200C6,
- 0x0003000F,
- 0x000200D0,
- 0x000300A4,
- 0x000300A1,
- 0x000200E0,
- 0x000300D0,
- 0x00030008,
- 0x0003000E,
- 0x00030009,
- 0x00030009,
- 0x00030005,
- 0x00030031,
- 0x00030033,
- 0x00030048,
- 0x00030017,
- 0x00030014,
- 0x00030015,
- 0x00030031,
- 0x00030034,
- 0x000200E1,
- 0x000300D0,
- 0x00030008,
- 0x0003000E,
- 0x00030009,
- 0x00030009,
- 0x00030015,
- 0x00030031,
- 0x00030033,
- 0x00030048,
- 0x00030017,
- 0x00030014,
- 0x00030015,
- 0x00030031,
- 0x00030034,
- 0x00020021,
- 0x00020029,
- },
- --休眠命令
- sleepcmd = {
- 0x00020010,
- },
- --唤醒命令
- wakecmd = {
- 0x00020011,
- }
- }
- disp.init(para)
- disp.setbkcolor(0)
- disp.clear()
- disp.update()
- end
复制代码
此外,要注意设置一下SPI引脚的电压域。要留意低功耗的话,还可以使用PM控制外设的休眠。不过要在准备显示内容的时候记得退出休眠。
- --控制SPI引脚的电压域
- pmd.ldoset(15,pmd.LDO_VLCD)--2g为7
- pm.wake("lcd_init")
- init()
- pm.sleep("lcd_init")
复制代码
以上代码作为一个模块,可以在其他文件使用Lua的"require"加载模块,这样就可以使用模块中的全局内容,比如调用全局函数。可以类比C的"#include"来理解。
完成了以上部分,就可以测试屏幕显示了。LCD的几个API如下:
从字面就可以把功能看的差不多了,接下来直接添加几行内容到屏幕上测试一下驱动模块。为了便于老王计划的轨迹记录这个小制作的进行,这里直接把观测GPS要显示的内容展示到屏幕上来。
大致的内容如下,分行显示字符串:
- disp.puttext(common.utf8ToGb2312("定位功能-"),0,1)
- disp.puttext(common.utf8ToGb2312("定位状态-"),0,26)
- disp.puttext(common.utf8ToGb2312("经度信息-"),0,52)
- disp.puttext(common.utf8ToGb2312("纬度信息-"),0,78)
- disp.puttext(common.utf8ToGb2312("海拔高度-"),0,106)
- disp.puttext(common.utf8ToGb2312("当前速度-"),0,134)
- disp.puttext(common.utf8ToGb2312("当前角度-"),0,162)
- disp.puttext(common.utf8ToGb2312("可见卫星-"),0,190)
- disp.puttext(common.utf8ToGb2312("定位卫星-"),0,217)
-
- disp.puttext(gps.getLocation().lngType..":"..string.sub(gps.getLocation().lng,1,7),130,52)
- disp.puttext(gps.getLocation().latType..":"..string.sub(gps.getLocation().lat,1,6),130,78)
- disp.puttext(tostring(gps.getAltitude())..common.utf8ToGb2312("米"),130,106)
- disp.puttext(tostring(gps.getSpeed())..common.utf8ToGb2312("千米/时"),130,134)
- disp.puttext(tostring(gps.getCourse())..common.utf8ToGb2312("度"),130,162)
- disp.puttext(tostring(gps.getViewedSateCnt())..common.utf8ToGb2312("个"),130,190)
- disp.puttext(tostring(gps.getUsedSateCnt())..common.utf8ToGb2312("个"),130,217)
复制代码
以上显示代码放在一个任务中去保持LCD的刷新即可。看看实物上的效果如何
很明显这样的内容和效果是符合预期的,中间微调了下像素布局。有了屏幕,就有了更多的趣味,比如音乐,游戏等,老王慢慢琢磨下去,LuatOS还是有一定优势的。
|