块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还是有一定优势的。

X-MagicBox-820的luatOS之路连载系列2的更多相关文章

  1. X-MagicBox-820的luatOS之路连载系列6

    继上次用Qt实现了显示地图和MQTT通信之后(X-MagicBox-820的luatOS之路连载系列5),说是要研究下地图的开放接口,也看了标记点和线的方法(地图上自定义标记点和轨迹线的实现).这次就 ...

  2. X-MagicBox-820的luatOS之路连载系列4

    上次说到定位成功后,显示的数据准确性问题.专门查询了下我所在地区的经纬度信息. MagicBox的显示数据是这样的: 网络上查到的经纬度数据是这样的: 可以看出定位精度还可以,毕竟我这个查询的数据没有 ...

  3. [js高手之路] es6系列教程 - 对象功能扩展详解

    第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...

  4. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  5. [js高手之路] es6系列教程 - 迭代器与生成器详解

    什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...

  6. [js高手之路] 设计模式系列课程 - jQuery的extend插件机制

    这里在之前的文章[js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数基础上增加一个extend浅拷贝,可以为对象方便的扩展属性和方法, jquery的插件扩展机制,大致就是这 ...

  7. [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解

    接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...

  8. [js高手之路] vue系列教程 - 事件专题(4)

    本文主要讲解事件冒泡,事件绑定的简写,事件默认行为,按键码等一系列与事件相关的知识. 一.事件绑定的简写,@事件类型.  之前我的[js高手之路] vue系列教程 - vue的事件绑定与方法(2) 用 ...

  9. [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

    所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...

随机推荐

  1. 11.3 LVS

    LVS是什么 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.o ...

  2. java8的新特性之lambda表达式和方法引用

    1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...

  3. 使用CEF(三)— 从CEF官方Demo源码入手解析CEF架构与CefApp、CefClient对象

    在上文<使用CEF(2)- 基于VS2019编写一个简单CEF样例>中,我们介绍了如何编写一个CEF的样例,在文章中提供了一些代码清单,在这些代码清单中提到了一些CEF的定义的类,例如Ce ...

  4. Hibernate的介绍及入门小案例

    1.Hibernate的诞生 在以前使用传统的JDBC开发应用系统时,如果是小型应用系统,并不觉得有什么麻烦,但是对于大型应用系统的开发,使用JDBC就会显得力不从心,例如对几十,几百张包含几十个字段 ...

  5. Netty 组件分析

    EventLoop 事件循环对象 EventLoop 本质是一个单线程执行器(同时维护了一个 Selector),里面有 run 方法处理 Channel 上源源不断的 io 事件. 它的继承关系比较 ...

  6. 【UE4 C++】打印字符串与输出日志

    打印屏幕 默认打印屏幕 // 打印至屏幕 FString screenMessage = "(AddOnScreenDebugMessage) Hello world!"; GEn ...

  7. 好好编程BUAA_SE(组/团队) Scrum Meeting 博客汇总

    好好编程BUAA_SE(组/团队) Scrum Meeting 博客汇总 一.Scrum Meeting 1. Alpha Alpha阶段 第一次Scrum Meeting Alpha阶段 第二次Sc ...

  8. Python ImportError: No module named '_tkinter', please install the python3-tk package

    ImportError: No module named '_tkinter', please install the python3-tk package 这个问题的原因是使用的python3环境内 ...

  9. uni-app使用wx-canvas实现微信小程序上显示地图map和坐标geo

    源码 <template> <view class="echart-box"> <canvas class="ec-canvas" ...

  10. 基于SpringBoot项目MyBatis分页插件实现分页总结

    前言 在使用Mybatis时,最头痛的就是写分页了,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真的不想花双倍的时间写 count 和 se ...