块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. HTML基本标记

    头部标记 <head></head> 说明:元素的作用范围是整篇文档.元素中可以有元信息定义.文档样式表定义和脚本等信息,定义在HTML语言头部的内容往往不会在网页上直接显示. ...

  2. 题解 CF1119H Tripe题解

    题目传送门 题目大意 给出\(n,t,x,y,z\),值域\(\le 2^t\),给出\(n\)个三元组\((a_i,b_i,c_i)\),表示有\(x\)个\(a_i\),\(y\)个\(b_i\) ...

  3. SpringBoot配置文件-多环境切换

    profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境: 多个文件-配置多环境: 需要多个配置文件,文件名可以是 application-{prof ...

  4. Vulnstack内网靶场2

    环境配置 内网2靶场由三台机器构成:WIN7.2008 server.2012 server 其中2008做为对外的web机,win7作为个人主机可上网,2012作为域控 网络适配器已经设置好了不用自 ...

  5. Salesforce 生命周期管理(一)应用生命周期浅谈

    本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/determine-which-application-lifecycle ...

  6. 重学c#系列——字典(十一)

    前言 重学c#系列继续更新,简单看一下字典的源码. 看源码主要是解释一下江湖中的两个传言: 字典foreach 顺序是字典添加的顺序 字典删除元素后,字典顺序将会改变 正文 那么就从实例化开始看起,这 ...

  7. Spring启动过程源码分析基本概念

    Spring启动过程源码分析基本概念 本文是通过AnnotationConfigApplicationContext读取配置类来一步一步去了解Spring的启动过程. 在看源码之前,我们要知道某些类的 ...

  8. [Git系列] 前言

    Git 简介 Git 是一个重视速度的分布式版本控制和代码管理系统,最初是由 Linus Torvalds 为开发 Linux 内核而设计并开发的,是一款遵循二代 GUN 协议的免费软件.这一教程会向 ...

  9. Convolutional Neural Network-week1编程题(TensorFlow实现手势数字识别)

    1. TensorFlow model import math import numpy as np import h5py import matplotlib.pyplot as plt impor ...

  10. 写了10000条Airtest截图脚本总结出来的截图经验,赶紧收藏!

    前言 今天想先给大家分享1个小白用户的Airtest从入门到放弃的故事: 小A是一个自动化的小白,在逛测试论坛的时候,偶然间发现了Airtest这个基于图像识别的UI自动化框架. 出于好奇,小A试用了 ...