块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. 使用CEF(三)— 从CEF官方Demo源码入手解析CEF架构与CefApp、CefClient对象

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

  2. oracle数据导入"HIST_GRAM_LIST_ITEM"问题处理

    1.问题显示 处理对象类型 SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT ORA-39083: 对象类型 REF_CONSTRAINT 创建失败, 出现错 ...

  3. ArcPy数据列表遍历

    ArcPy数据列表遍历 批处理脚本的首要任务之一是为可用数据编写目录,以便在处理过程中可以遍历数据. ArcPy 具有多个专为创建此类列表而构建的函数. 函数 说明 ListFields(datase ...

  4. Tomcat实现自定义类加载器

    什么是类加载器? 这是官方给的定义 在 Java 虚拟机的实现中,初始类可以作为命令行参数提供. 或者,该实现可以提供一个初始类,该类设置一个类加载器,该类加载器依次加载应用程序. 初始类的其他选择也 ...

  5. AES解密尾部出现乱码问题

    说明 在使用AES解密的时候我发现解密出来的字符串尾部一直都有乱码 解决方案 尾部字符串的ascii码就是删除位索引 具体代码: cryptor = AES.new('AES_KEY'.encode( ...

  6. 学大数据一定要会Java开发吗?

    Java是目前使用广泛的编程语言之一,具有的众多特性,特别适合作为大数据应用的开发语言.Java语言功能强大和简单易用,不仅吸收了C++语言的各种优点还摒弃了C++里难以理解的多继承.指针等概念. J ...

  7. Servlet学习一(Servlet的使用流程)

    一.servlet运行流程 运行流程:浏览器发送请求到服务器,服务器根据url地址在webapps中寻找对应的项目文件夹然后再web.xml中检索对应的servlet,并进行调用二.servlet类写 ...

  8. 类图示例-订单系统 / Class Diagram - Order System

    类图示例-订单系统 / Class Diagram - Order System 什么是类图? 类图通过显示它的类和它们之间的关系来概述系统.类图是静态的 - 它们显示交互的内容,但不显示交互时会发生 ...

  9. [no_code][Beta] 中期组内总结

    $( "#cnblogs_post_body" ).catalog() 目前scrum meeting beta阶段目前共7次.在alpha阶段我们博客发布时间比较匆忙,是扣分项, ...

  10. elasticsearch地理位置查询

    elasticsearch地理位置查询 一.背景 二.geo数据类型 1.geo_point 2.geo_shape 三.此处对geo_point类型实战 1.背景 2.插入地点数据 1.创建索引 2 ...